diff --git a/extra/editor/image_frame.py b/extra/editor/image_frame.py new file mode 100644 index 0000000..820d450 --- /dev/null +++ b/extra/editor/image_frame.py @@ -0,0 +1,42 @@ +import tkinter as tk +from tkinter import ttk + +class ImageFrame: + """Create a frame with a cancas and scrollbars for displaying an image + """ + def __init__(self, master, image): + """Keyword arguments: + master - The root element that the frame must be attached to + image - The initial image""" + self.master = master + self.frame = ttk.Frame(master) + self.canvas = tk.Canvas(self.frame) + self.xscroll = ttk.Scrollbar(self.frame, orient=tk.HORIZONTAL, command=self.canvas.xview) + self.yscroll = ttk.Scrollbar(self.frame, orient=tk.VERTICAL, command=self.canvas.yview) + self.canvas.grid(row=1, column=0, sticky='nsew') + self.frame.columnconfigure(0, weight=1) + self.frame.rowconfigure(1, weight=1) + self.xscroll.grid(row=2, column=0, sticky='ew') + self.yscroll.grid(row=1, column=2, sticky='ns') + self.canvas.config(xscrollcommand=self.xscroll.set, yscrollcommand=self.yscroll.set) + self.set_image(image) + + def set_image(self, image): + """Set/Updates the image to display + ImageFrame will store a reference to the image to prevent it from going out of scope + This will also clear the canvas + """ + self.image_file = image + self.canvas.delete("all") + if self.image_file: + self.canvas.create_image(0, 0, image=self.image_file, anchor=tk.NW) + self.canvas.config(scrollregion=(0, 0, self.image_file.width(), self.image_file.height())) + else: + canvas_width=20 + canvas_height=20 + self.canvas.delete("all") + self.canvas.config(scrollregion=(0, 0, canvas_width, canvas_height)) + + def get_frame(self): + """Retruns a reference to the frame""" + return self.frame diff --git a/extra/editor/image_viewer.py b/extra/editor/image_viewer.py new file mode 100644 index 0000000..f194028 --- /dev/null +++ b/extra/editor/image_viewer.py @@ -0,0 +1,23 @@ +#! /bin/python3 + +import tkinter as tk +from tkinter import ttk +from image_frame import * + +#This is the raltive directory to the base of the SagoSprite dir +#I am launching from extra/editor so I need to go two levels up +BASEDIR = '../..' + +root = tk.Tk() +image = tk.PhotoImage(file=BASEDIR+'/data/textures/terrain.png') +imageFrame = ImageFrame(root, image) +imageFrame.get_frame().pack(expand=tk.YES, fill=tk.BOTH) + +import os +textures = os.listdir(BASEDIR+"/data/textures") +textures = list(filter(lambda x: x.endswith('.png'), textures)) +sprites = os.listdir(BASEDIR+"/data/sprites") +sprites = list(filter(lambda x: x.endswith('.sprite'), sprites)) +print(textures, sprites) + +root.mainloop() diff --git a/extra/editor/texture_selector.py b/extra/editor/texture_selector.py new file mode 100644 index 0000000..b4a0efc --- /dev/null +++ b/extra/editor/texture_selector.py @@ -0,0 +1,69 @@ +#! /bin/python3 + +import tkinter as tk +from tkinter import ttk +from image_frame import * +from tree_frame import * + +#This is the raltive directory to the base of the SagoSprite dir +#I am launching from extra/editor so I need to go two levels up +BASEDIR = '../..' + +import os +#textures_filenames = os.listdir(BASEDIR+"/data/textures") +#textures = list(filter(lambda x: x.endswith('.png'), textures_filenames)) +#textures.sort() + + +def addFolderToList(theFolder, theList, filter2 = None): + textures_filenames = os.listdir(BASEDIR+"/data/textures/"+theFolder) + for x in textures_filenames: + if x.endswith('.png'): + if not filter2 or filter2 in x or filter2 in theFolder: + theList.append(theFolder+"/"+x) + folders = list(filter(lambda x: os.path.isdir(BASEDIR+"/data/textures/"+theFolder+"/"+x), textures_filenames)) + print(folders) + for f in folders: + addFolderToList(theFolder+"/"+f, theList, filter2) + +def populateTree(filter2 = None): + textures = [] + addFolderToList("", textures, filter2) + return textures +#folders = list(filter(lambda x: os.path.isdir(BASEDIR+"/data/textures/"+x), textures_filenames)) +#addFolderToList() +#print(folders) + +textures = populateTree() + +def callback_select(event): + if not treeview.selection(): + return + image = tk.PhotoImage(file=BASEDIR+'/data/textures/'+treeview.selection()[0]) + imageFrame.set_image(image) + + +def callback_filter(sv): + print( sv.get() ) + for i in treeview.get_children(): + treeview.delete(i) + textures = populateTree(sv.get()) + for t in textures: + treeview.insert('','end',t, text = t) + + +root = tk.Tk() +treeFrame = TreeFrame(root) +treeview = treeFrame.get_treeview() +treeFrame.get_frame().grid(row=0, column=0, sticky='ns') +for t in textures: + treeview.insert('','end',t, text = t) +root.columnconfigure(1, weight=1) +root.rowconfigure(0, weight=1) +treeview.bind('<>', callback_select) + +imageFrame = ImageFrame(root, None) +imageFrame.get_frame().grid(row=0, column=1, sticky='nsew') + +treeFrame.filterString.trace("w", lambda name, index, mode, sv=treeFrame.filterString: callback_filter(treeFrame.filterString)) +root.mainloop() \ No newline at end of file diff --git a/extra/editor/tree_frame.py b/extra/editor/tree_frame.py new file mode 100644 index 0000000..0b0681c --- /dev/null +++ b/extra/editor/tree_frame.py @@ -0,0 +1,30 @@ +import tkinter as tk +from tkinter import ttk + +class TreeFrame: + """Create a frame with a tree view + """ + def __init__(self, master): + self.master = master + self.frame = ttk.Frame(master) + self.treeview = ttk.Treeview(self.frame) + self.xscroll = ttk.Scrollbar(self.frame, orient=tk.HORIZONTAL, command=self.treeview.xview) + self.yscroll = ttk.Scrollbar(self.frame, orient=tk.VERTICAL, command=self.treeview.yview) + self.treeview.grid(row=1, column=0, sticky='nsew') + self.frame.columnconfigure(0, weight=1) + self.frame.rowconfigure(1, weight=1) + self.xscroll.grid(row=2, column=0, sticky='ew') + self.yscroll.grid(row=1, column=2, sticky='ns') + self.treeview.config(xscrollcommand=self.xscroll.set, yscrollcommand=self.yscroll.set) + #Add filter box + self.filterString = tk.StringVar() + self.filterEntryBox = tk.Entry (self.frame, textvariable=self.filterString) + self.filterEntryBox.grid(row=3, column=0, sticky='nsew') + + + def get_treeview(self): + return self.treeview + + def get_frame(self): + """Retruns a reference to the frame""" + return self.frame \ No newline at end of file