git repos / saland

commit 652b324f

Poul Sander · 2020-06-13 16:39
652b324f02edf62fc5f8a14bb2d817a951bc1a23 patch · browse files
parent 661498336c98ca1cb6b7d2b6ac3cfa91fffeb6d2

Add the editor files to the main repository. In the future more cross development might be needed
Squashed commit of the following:

commit 8823d0fd9f409b95d0188a61f386038f16b43ab2
Author: Poul Sander <poul@poulsander.com>
Date:   Sat Jun 13 17:26:04 2020 +0200

    Moved filter into the treeview frame

commit 99df6d96104fb39ae13d2482664297e7d33112a4
Author: Poul Sander <poul@poulsander.com>
Date:   Thu Jun 11 20:27:30 2020 +0200

    Add filter command for textures

commit e87e8dbf66e0d397746bdb393a9ba5d0bcaf6859
Author: Poul Sander <poul@poulsander.com>
Date:   Wed Jun 10 23:24:22 2020 +0200

    List all textures. Also in sub dirs

commit 17871a610a721e51de3097f305a735dae613b435
Author: Poul Sander <poul@poulsander.com>
Date:   Sat Apr 11 22:29:12 2020 +0200

    Add scrollbars and extract treeview to seperate file

commit f64a5caf94e865dc05a306b6009331e68bfa7fbf
Author: Poul Sander <poul@poulsander.com>
Date:   Fri Apr 10 22:52:29 2020 +0200

    Place tree and image canvas side by side

commit 2f190b5f0c35e202157ef5a71084151dd6ea37f5
Author: Poul Sander <poul@poulsander.com>
Date:   Fri Apr 10 18:56:35 2020 +0200

    Add a texture selector

commit 24aeb5b5c8c6592e6f133dc7c0609d452bdf87b4
Author: Poul Sander <poul@poulsander.com>
Date:   Sun Apr 5 14:11:57 2020 +0200

    List sprites and textures

commit 686533f640dcc969f23523035de0307d2e87d47a
Author: Poul Sander <poul@poulsander.com>
Date:   Sun Apr 5 10:46:04 2020 +0200

    Moved ImageFrame into a seperate unit

commit 19ac65e8f5b017375fd1ba92efd8655e8e80a233
Author: Poul Sander <poul@poulsander.com>
Date:   Sun Apr 5 10:34:01 2020 +0200

    pylint

commit 866eb694b314945133af1a22ac9a83f37a31ef69
Author: Poul Sander <poul@poulsander.com>
Date:   Sun Apr 5 10:27:35 2020 +0200

    Started creating some python helper tools

Changed files

A extra/editor/image_frame.py
A extra/editor/image_viewer.py
A extra/editor/texture_selector.py
A extra/editor/tree_frame.py
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('<<TreeviewSelect>>', 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