Skip to content

Commit 04f3808

Browse files
committed
FEATURE: allow sorting by columns in template overview
1 parent 486296c commit 04f3808

File tree

1 file changed

+28
-4
lines changed

1 file changed

+28
-4
lines changed

MethodicConfigurator/frontend_tkinter_template_overview.py

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,8 @@ def __init__(self, parent: tk.Tk):
5151
instruction_label = ttk.Label(self.main_frame, text=instruction_text, font=('Arial', 12))
5252
instruction_label.pack(pady=(10, 20))
5353

54+
self.sort_column = None
55+
5456
style = ttk.Style(self.root)
5557
# Add padding to Treeview heading style
5658
style.layout("Treeview.Heading", [
@@ -76,11 +78,14 @@ def __init__(self, parent: tk.Tk):
7678
values = (key,) + tuple(getattr(template_overview, attr, '') for attr in attribute_names)
7779
self.tree.insert('', 'end', text=key, values=values)
7880

79-
self.adjust_treeview_column_widths()
81+
self.__adjust_treeview_column_widths()
8082

81-
self.tree.bind('<Double-1>', self.on_row_double_click)
83+
self.tree.bind('<Double-1>', self.__on_row_double_click)
8284
self.tree.pack(fill=tk.BOTH, expand=True)
8385

86+
for col in self.tree["columns"]:
87+
self.tree.heading(col, text=col, command=lambda col=col: self.__sort_by_column(col, False))
88+
8489
if isinstance(self.root, tk.Toplevel):
8590
try:
8691
while self.root.children:
@@ -91,7 +96,7 @@ def __init__(self, parent: tk.Tk):
9196
else:
9297
self.root.mainloop()
9398

94-
def adjust_treeview_column_widths(self):
99+
def __adjust_treeview_column_widths(self):
95100
"""
96101
Adjusts the column widths of the Treeview to fit the contents of each column.
97102
"""
@@ -109,14 +114,33 @@ def adjust_treeview_column_widths(self):
109114
# Update the column's width property to accommodate the largest text width
110115
self.tree.column(col, width=int(max_width*0.6 + 10))
111116

112-
def on_row_double_click(self, event):
117+
def __on_row_double_click(self, event):
113118
"""Handle row double-click event."""
114119
item_id = self.tree.identify_row(event.y)
115120
if item_id:
116121
selected_template_relative_path = self.tree.item(item_id)['text']
117122
ProgramSettings.store_template_dir(selected_template_relative_path)
118123
self.root.destroy()
119124

125+
def __sort_by_column(self, col, reverse: bool):
126+
if self.sort_column and self.sort_column != col:
127+
self.tree.heading(self.sort_column, text=self.sort_column)
128+
self.tree.heading(col, text=col + (' ▼' if reverse else ' ▲'))
129+
self.sort_column = col
130+
131+
try:
132+
col_data = [(float(self.tree.set(k, col)), k) for k in self.tree.get_children('')]
133+
except ValueError:
134+
col_data = [(self.tree.set(k, col), k) for k in self.tree.get_children('')]
135+
col_data.sort(reverse=reverse)
136+
137+
# rearrange items in sorted positions
138+
for index, (_val, k) in enumerate(col_data):
139+
self.tree.move(k, '', index)
140+
141+
# reverse sort next time
142+
self.tree.heading(col, command=lambda: self.__sort_by_column(col, not reverse))
143+
120144

121145
def argument_parser():
122146
"""

0 commit comments

Comments
 (0)