Skip to content

Commit 29b6816

Browse files
committed
refactor treeview
treeview.py - add single widget CanvasTreeview - replace function folder_treeview and other implementations peak_fit_analysis.py - further improvements, added ScanFitModel
1 parent 5bd0c7e commit 29b6816

10 files changed

Lines changed: 314 additions & 186 deletions

File tree

mmg_toolbox/__init__.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@
1313
__all__ = ['start_gui', 'version_info', 'title', 'module_info', 'data_file_reader', 'Experiment']
1414

1515

16-
def start_gui(beamline: str | None = None):
17-
from mmg_toolbox.tkguis import create_title_window
18-
create_title_window(beamline)
16+
def start_gui(*args: str):
17+
from mmg_toolbox.tkguis import run
18+
run(*args)
1919

2020

2121
def version_info():

mmg_toolbox/tkguis/__init__.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,14 @@
22
from .apps.data_viewer import create_data_viewer
33
from .apps.nexus import create_nexus_viewer
44
from .apps.file_browser import create_nexus_file_browser
5-
from .cli import cli_run
5+
from .cli import cli_run, run
66

77
__all__ = [
88
'create_nexus_file_browser',
99
'create_nexus_viewer',
1010
'create_data_viewer',
1111
'create_title_window',
12-
'cli_run'
12+
'cli_run',
13+
'run'
1314
]
1415

mmg_toolbox/tkguis/apps/data_viewer.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,6 @@ def start_multi_scan_plot():
8888
topmenu(root, menu, add_themes=True, add_about=True)
8989

9090
root.update()
91-
print(f"Window size (wxh): {root.winfo_reqwidth()}x{root.winfo_reqheight()}")
9291

9392
if parent is None:
9493
root.mainloop()

mmg_toolbox/tkguis/cli.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import sys
66
import os
77

8+
from .misc.config import BEAMLINE_CONFIG
89
from .apps.experiment import create_title_window
910
from .apps.data_viewer import create_data_viewer
1011
from .apps.nexus import create_nexus_viewer
@@ -30,6 +31,9 @@ def run(*args):
3031
elif os.path.isfile(arg):
3132
create_nexus_viewer(arg)
3233
return
34+
elif arg in BEAMLINE_CONFIG:
35+
create_title_window(arg)
36+
return
3337
create_title_window()
3438
return
3539

mmg_toolbox/tkguis/widgets/folder_treeview.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,15 @@
1111
from mmg_toolbox.utils.file_functions import list_files, list_path_time, display_timestamp, get_hdf_string, folder_summary
1212
from mmg_toolbox.utils.env_functions import open_terminal
1313
from ..misc.styles import create_hover
14-
from ..misc.functions import folder_treeview, post_right_click_menu, select_folder
14+
from ..misc.functions import select_folder, post_right_click_menu
1515
from ..misc.jupyter import launch_jupyter_notebook
1616
from ..misc.logging import create_logger
17+
from .treeview import CanvasTreeview
1718

1819
logger = create_logger(__file__)
1920

2021

21-
class FolderTreeViewFrame:
22+
class FolderTreeViewFrame(CanvasTreeview):
2223
"""Frame with TreeView and entry for Folders"""
2324

2425
def __init__(self, extension: str, root: tk.Misc, initial_directory: str | None = None):
@@ -38,7 +39,7 @@ def __init__(self, extension: str, root: tk.Misc, initial_directory: str | None
3839
self.search_label = tk.StringVar(root, '')
3940

4041
# Columns
41-
self.columns = [
42+
columns = [
4243
# (name, text, width, reverse, sort_col)
4344
("#0", 'Folder', 200, False, None),
4445
("modified", 'Modified', 150, True, "modified_time"),
@@ -50,8 +51,7 @@ def __init__(self, extension: str, root: tk.Misc, initial_directory: str | None
5051

5152
# Build widgets
5253
self.ini_folderpath()
53-
self.tree = folder_treeview(self.root, self.columns)
54-
self.tree.configure(displaycolumns=('modified', 'files', 'data')) # hide columns
54+
super().__init__(root, *columns)
5555
self.tree.bind("<<TreeviewOpen>>", self.populate_files)
5656
self.tree.bind("<Double-1>", self.on_double_click)
5757
self.tree.bind("<Return>", self.on_double_click)

mmg_toolbox/tkguis/widgets/nexus_treeview.py

Lines changed: 19 additions & 90 deletions
Original file line numberDiff line numberDiff line change
@@ -5,97 +5,29 @@
55
import os
66
import h5py
77
import tkinter as tk
8-
from tkinter import ttk
98

109
import hdfmap
1110
from hdfmap.eval_functions import generate_identifier
1211

13-
from ..misc.functions import post_right_click_menu
12+
from .treeview import CanvasTreeview
1413
from ..misc.logging import create_logger
1514

1615
logger = create_logger(__file__)
1716

18-
#TODO: merge this with misc.functions.folder_treeview
19-
class _Treeview:
20-
"""
21-
Treeview widget for NeXus file viewer
2217

23-
params
24-
root: tk frame
25-
"""
26-
def __init__(self, root: tk.Misc, *columns: str):
27-
frm = ttk.Frame(root)
28-
frm.pack(side=tk.LEFT, expand=tk.YES, fill=tk.BOTH)
29-
30-
tree = ttk.Treeview(frm, columns=columns, selectmode='browse')
31-
tree.pack(side=tk.LEFT, expand=tk.YES, fill=tk.BOTH)
32-
33-
var = ttk.Scrollbar(frm, orient="vertical", command=tree.yview)
34-
var.pack(side=tk.LEFT, fill=tk.Y)
35-
tree.configure(yscrollcommand=var.set)
36-
37-
self.columns = columns
38-
self._tree_frame = frm
39-
self.tree = tree
40-
# tree.bind("<<TreeviewSelect>>", self.tree_select)
41-
# tree.bind("<Double-1>", self.on_double_click)
42-
tree.bind("<Button-3>", self.right_click_menu())
43-
44-
def populate(self, **kwargs):
45-
pass
46-
47-
def delete(self):
48-
self.tree.delete(*self.tree.get_children())
49-
50-
def bind_select(self, function):
51-
self.tree.bind('<<TreeviewSelect>>', function)
52-
53-
def right_click_menu(self):
54-
"""
55-
Create right-click context menu for hdf_tree objects
56-
:return: menu_popup function
57-
"""
58-
59-
def copy_fun(tree_getter):
60-
def fun():
61-
for iid in self.tree.selection():
62-
self._tree_frame.master.clipboard_clear()
63-
self._tree_frame.master.clipboard_append(tree_getter(iid))
64-
return fun
65-
66-
m = tk.Menu(self._tree_frame, tearoff=0)
67-
header_name = self.tree.heading('#0', 'text')
68-
header_getter = lambda iid: self.tree.item(iid)['text']
69-
m.add_command(label="Copy " + header_name, command=copy_fun(header_getter))
70-
for column in self.columns:
71-
getter = lambda iid: self.tree.set(iid, column)
72-
m.add_command(label="Copy " + column, command=copy_fun(getter))
73-
74-
def menu_popup(event):
75-
# select item
76-
iid = self.tree.identify_row(event.y)
77-
if iid:
78-
self.tree.selection_set(iid)
79-
post_right_click_menu(m, event.x_root, event.y_root)
80-
81-
return menu_popup
82-
83-
84-
class HdfTreeview(_Treeview):
18+
class HdfTreeview(CanvasTreeview):
8519
"""
8620
HDF Treeview object
8721
"""
88-
def __init__(self, root: tk.Misc):
89-
super().__init__(root, 'type', 'name', 'value')
90-
# Populate tree
91-
self.tree.heading("#0", text="HDF Address")
92-
self.tree.column("#0", minwidth=50, width=400)
93-
self.tree.column("type", width=100, anchor='c')
94-
self.tree.column("name", width=100, anchor='c')
95-
self.tree.column("value", width=200, anchor='c')
96-
self.tree.heading("type", text="Type")
97-
self.tree.heading("name", text="Name")
98-
self.tree.heading("value", text="Value")
22+
def __init__(self, root: tk.Misc, width: int | None = None, height: int | None = None):
23+
columns = [
24+
('#0', 'HDF Address', 400, False, None),
25+
('type', 'Type', 100, False, None),
26+
('name', 'Name', 100, False, None),
27+
('value', 'Value', 200, False, None),
28+
]
29+
super().__init__(root, *columns, width=width, height=height)
30+
9931

10032
def populate(self, hdf_obj: h5py.File, openstate=True):
10133
"""Load HDF file, populate ttk.treeview object"""
@@ -144,21 +76,18 @@ def recur_func(hdf_group, tree_group="", top_address='/'):
14476
recur_func(hdf_obj, "")
14577

14678

147-
class HdfNameSpace(_Treeview):
79+
class HdfNameSpace(CanvasTreeview):
14880
"""
14981
HDF Namespace object
15082
"""
15183

152-
def __init__(self, root: tk.Misc):
153-
super().__init__(root, 'path', 'value')
154-
155-
# Populate tree
156-
self.tree.heading("#0", text="Name")
157-
self.tree.column("#0", minwidth=50, width=100)
158-
self.tree.column("path", width=300, anchor='c')
159-
self.tree.column("value", width=200, anchor='c')
160-
self.tree.heading("path", text="Path")
161-
self.tree.heading("value", text="Value")
84+
def __init__(self, root: tk.Misc, width: int | None = None, height: int | None = None):
85+
columns = [
86+
('#0', 'Name', 100, False, None),
87+
('path', 'Path', 300, False, None),
88+
('value', 'Value', 200, False, None),
89+
]
90+
super().__init__(root, *columns, width=width, height=height)
16291

16392
def populate(self, hdf_obj: h5py.File, hdf_map: hdfmap.NexusMap,
16493
all: bool = True, group: bool = False, combined: bool = False, values: bool = False,

0 commit comments

Comments
 (0)