This commit is contained in:
_bryan 2023-02-17 22:40:15 +01:00
parent 48a0d4e20c
commit a1cf6a7e05

View File

@ -1,10 +1,9 @@
import posixpath import posixpath
import tkinter as tk import tkinter as tk
import tkinter.ttk as ttk import tkinter.ttk as ttk
from source.packages import PackageManager from source.packages import PackageManager
from direct.showbase.ShowBase import ShowBase from direct.showbase.ShowBase import ShowBase
from panda3d.core import VirtualFileSystem, Material from panda3d.core import VirtualFileSystem, Material, WindowProperties
from direct.stdpy.file import walk from direct.stdpy.file import walk
import simplepbr import simplepbr
@ -26,15 +25,6 @@ def get_icons():
'color_swatch': tk.PhotoImage(file='icons/color_swatch.png') 'color_swatch': tk.PhotoImage(file='icons/color_swatch.png')
})() })()
class PandaApp(ShowBase):
def __init__(self, fStartDirect=True, windowType=None):
super().__init__(fStartDirect, windowType)
running = True
def on_tk_closed():
global running
running = False
def add_package_contents_to_tree(tree, package, type, name, extensions, icon_folder, icon_group, icon_item): def add_package_contents_to_tree(tree, package, type, name, extensions, icon_folder, icon_group, icon_item):
data_path = posixpath.join(package.mount_dir, type) data_path = posixpath.join(package.mount_dir, type)
tree.insert(package.mount_dir, 'end', data_path, text=f' {name}', image=icon_group) tree.insert(package.mount_dir, 'end', data_path, text=f' {name}', image=icon_group)
@ -62,8 +52,7 @@ def add_package_to_tree(tree, package, icons):
add_package_textures_to_tree(tree, package, icons) add_package_textures_to_tree(tree, package, icons)
add_package_materials_to_tree(tree, package, icons) add_package_materials_to_tree(tree, package, icons)
def create_tk_treeview(parent, packages, icons): def init_packages_tree(tree, packages, icons):
tree = ttk.Treeview(parent, show="tree")
tree.insert('', 'end', '/', text=' /', open=True, image=icons.app) tree.insert('', 'end', '/', text=' /', open=True, image=icons.app)
tree.insert('/', 'end', '/main/', text=f' Main Package "{packages.main_package.meta.name}" - {packages.main_package.meta.version}', image=icons.computer) tree.insert('/', 'end', '/main/', text=f' Main Package "{packages.main_package.meta.name}" - {packages.main_package.meta.version}', image=icons.computer)
tree.insert('/', 'end', '/include/', text=f' Included Packages ({len(packages.package_list)})', image=icons.bricks) tree.insert('/', 'end', '/include/', text=f' Included Packages ({len(packages.package_list)})', image=icons.bricks)
@ -71,121 +60,88 @@ def create_tk_treeview(parent, packages, icons):
for package in packages.package_list: for package in packages.package_list:
tree.insert('/include/', 'end', package.mount_dir, text=f' "{package.meta.name}" - {package.meta.version}', image=icons.brick) tree.insert('/include/', 'end', package.mount_dir, text=f' "{package.meta.name}" - {package.meta.version}', image=icons.brick)
add_package_to_tree(tree, package, icons) add_package_to_tree(tree, package, icons)
#tree.pack(fill='x')
return tree return tree
class TreeEvents: def init_gui(app, args):
def __init__(self, tree, panda): app.gui.geometry("700x500")
self.tree = tree app.gui.grid_rowconfigure(0, weight=10)
self.panda = panda app.gui.grid_rowconfigure(0, weight=1)
self.tree.bind('<Double-1>', self.on_double_click) app.gui.grid_columnconfigure(0, weight=1)
self.nodes = [] package_frame = tk.Frame(app.gui, padx=4, pady=4)
package_frame.grid(column=0, row=0, sticky="news")
package_frame.grid_columnconfigure(0, weight=1)
package_frame.grid_rowconfigure(0, weight=1)
package_frame.grid_rowconfigure(1, weight=1000)
packages_label = tk.Label(package_frame, text="Packages")
packages_label.grid(column=0, row=0, sticky="w")
packagetree_frame = tk.Frame(package_frame)
packagetree_frame.grid(column=0, row=1, sticky="news")
packagetree_frame.grid_columnconfigure(0, weight=1000)
packagetree_frame.grid_columnconfigure(1, weight=1)
packagetree_frame.grid_rowconfigure(0, weight=1)
app.tree_packages = ttk.Treeview(packagetree_frame, show="tree")
app.tree_packages.grid(column=0, row=0, sticky="news")
packagetree_scrollbar = ttk.Scrollbar(packagetree_frame, orient="vertical", command=app.tree_packages.yview)
packagetree_scrollbar.grid(column=1, row=0)
app.tree_packages.bind('<Double-1>', app.on_packagetree_doubleclick)
def on_double_click(self, event): scene_frame = tk.Frame(app.gui, padx=4, pady=4)
item = self.tree.selection()[0] scene_frame.grid(column=0, row=1, sticky="news")
scene_frame.grid_columnconfigure(0, weight=1)
scene_frame.grid_rowconfigure(0, weight=1)
scene_frame.grid_rowconfigure(1, weight=1000)
scene_label = tk.Label(scene_frame, text="Scene Graph")
scene_label.grid(column=0, row=0, sticky="w")
scenetree_frame = tk.Frame(scene_frame)
scenetree_frame.grid(column=0, row=1, sticky="news")
scenetree_frame.grid_columnconfigure(0, weight=10000)
scenetree_frame.grid_columnconfigure(1, weight=1)
scenetree_frame.grid_rowconfigure(0, weight=1)
app.tree_scene = ttk.Treeview(scenetree_frame, show="tree")
app.tree_scene.grid(column=0, row=0, sticky="news")
scenetree_scrollbar = ttk.Scrollbar(scenetree_frame, orient="vertical", command=app.tree_scene.yview)
scenetree_scrollbar.grid(column=1, row=0)
class PackageExplorer:
def __init__(self, args):
self.gui = tk.Tk()
self.panda = ShowBase()
self.package_manager = PackageManager(VirtualFileSystem.getGlobalPtr())
self.package_manager.set_main_package(args.main)
if args.package:
for include in args.package:
self.package_manager.include_package(include)
self.tree_packages = None
self.tree_scene = None
self.running = True
simplepbr.init()
gltf.patch_loader(self.panda.loader)
init_gui(self, args)
init_packages_tree(self.tree_packages, self.package_manager, get_icons())
self.gui.protocol("WM_DELETE_WINDOW", self.on_tk_close)
def on_tk_close(self):
self.running = False
def on_packagetree_doubleclick(self, event):
item = self.tree_packages.selection()[0]
if item.lower().endswith(('.glb', '.gltf', '.obj', '.egg')): if item.lower().endswith(('.glb', '.gltf', '.obj', '.egg')):
mat = Material() mat = Material()
mat.setAmbient((1, 0, 0, 1)) mat.setAmbient((1, 0, 0, 1))
node = self.panda.loader.loadModel(item) node = self.panda.loader.loadModel(item)
node.reparentTo(self.panda.render) node.reparentTo(self.panda.render)
node.setMaterial(mat) node.setMaterial(mat)
self.nodes.append(node)
def loop(self):
try:
while self.running:
self.panda.taskMgr.step()
self.gui.update_idletasks()
self.gui.update()
except KeyboardInterrupt:
return
def start_explorer(args): def start_explorer(args):
tk_app = tk.Tk() app = PackageExplorer(args)
tk_app.geometry("700x500") app.loop()
tk_app.protocol('WM_DELETE_WINDOW', on_tk_closed)
#tk_app = tk.Frame(tk_app, width=500)
tk_app.grid_rowconfigure(0, weight=1)
tk_app.grid_columnconfigure(0, weight=1)
tk_app.grid_columnconfigure(1, weight=1)
package_frame = tk.Frame(tk_app, highlightbackground="black", highlightthickness=1, padx=4, pady=4)
package_frame.grid(column=0, row=0, sticky="news")
package_frame.grid_columnconfigure(0, weight=1)
package_frame.grid_rowconfigure(0, weight=1)
package_frame.grid_rowconfigure(1, weight=1000)
label1 = tk.Label(package_frame, text='Packages')
label1.grid(row=0, column=0, sticky='n')
scene_frame = tk.Frame(tk_app, highlightbackground="black", highlightthickness=1, padx=4, pady=4)
scene_frame.grid(column=1, row=0, sticky="news")
scene_frame.grid_columnconfigure(0, weight=1)
scene_frame.grid_rowconfigure(0, weight=1)
scene_frame.grid_rowconfigure(1, weight=10000)
label2 = tk.Label(scene_frame, text='Scene Graph')
label2.grid(row=0, column=0)
scene_tree = ttk.Treeview(scene_frame)
scene_tree.grid(row=1, column=0, sticky="news")
panda_app = PandaApp()
simplepbr.init()
gltf.patch_loader(panda_app.loader)
packages = PackageManager(VirtualFileSystem.getGlobalPtr())
packages.set_main_package(args.main)
if args.package:
for include in args.package:
packages.include_package(include)
icons = get_icons()
tree = create_tk_treeview(package_frame, packages, icons)
tree.grid(row=1, column=0, sticky="news")
events = TreeEvents(tree, panda_app)
try:
while running:
panda_app.taskMgr.step()
tk_app.update_idletasks()
tk_app.update()
except KeyboardInterrupt as stop:
pass
'''
window = tk.Tk()
icons = get_icons()
fs = PackageManager(VirtualFileSystem.getGlobalPtr())
fs.set_main_package('assets')
mdls = fs.main_package.all_models()
txts = fs.main_package.all_textures()
print(mdls, txts, loader)
menu = tk.Menu(window)
menu.add_command(label="Exit", command=window.quit)
window.config(menu=menu)
mainframe = tk.Frame(window, borderwidth=5)
mainframe.grid(column=0, row=0)
mainframe.columnconfigure(0, weight=3)
packageTree = ttk.Treeview(mainframe, show="tree")
packageTree.insert('', 'end', '/', text=' Virtual FS', image=icons.app)
packageTree.pack()
window.mainloop()
frame = tk.Frame(window, borderwidth=5)
frame.pack()
frame.columnconfigure(0, weight=1)
frame.columnconfigure(1, weight=3)
tree = ttk.Treeview(frame, show="tree")
tree.grid(column=0, row=0, sticky=tk.NW)
tree.insert('', 'end', '/', text=' Virtual Filesystem', open=True, image=icons.app)
tree.insert('/', 'end', '/main/', text=' main/', image=icons.computer)
tree.insert('/main/', 'end', '/main/models/', text=' models/', image=icons.folder)
tree.insert('/main/', 'end', '/main/textures/', text=' textures/', image=icons.folder)
tree.insert('/', 'end', '/packages/', text=' packages/', image=icons.bricks)
tree.insert('/packages/', 'end', '/packages/user-package-1/', text=' user-package-1/', image=icons.brick)
tree.insert('/packages/', 'end', '/packages/user-package-2/', text=' user-package-2/', image=icons.brick)
tree.insert('/packages/', 'end', '/packages/user-package-3/', text=' user-package-3/', image=icons.brick)
window.mainloop()
'''