diff --git a/src/ccma/ui/sections.py b/src/ccma/ui/sections.py new file mode 100644 index 0000000..9d0fdb1 --- /dev/null +++ b/src/ccma/ui/sections.py @@ -0,0 +1,10 @@ +from __future__ import annotations + +import tkinter as tk +from tkinter import ttk + + +def titled_frame(parent: tk.Misc, title: str) -> ttk.LabelFrame: + frame = ttk.LabelFrame(parent, padding=(12, 10)) + frame.configure(labelwidget=ttk.Label(frame, text=title, style="TimelineHeader.TLabel")) + return frame diff --git a/src/ccma/ui/work_tabs.py b/src/ccma/ui/work_tabs.py index c89fdad..d61eb40 100644 --- a/src/ccma/ui/work_tabs.py +++ b/src/ccma/ui/work_tabs.py @@ -6,6 +6,7 @@ from tkinter import messagebox, ttk from ccma.domain.dates import format_date_for_display from ccma.domain.models import ASSET_STATUS_LABELS, MEMBERSHIP_STATUS_LABELS, Asset, HousekeeperFinding, Member from ccma.ui.labels import storage_key +from ccma.ui.sections import titled_frame MEMBER_TABLE_COLUMNS = ( @@ -67,6 +68,10 @@ def _selected_status_filter(label: str) -> str: return storage_key(MEMBERSHIP_STATUS_LABELS, label) +def _filter_label_frame(parent: tk.Misc) -> ttk.LabelFrame: + return titled_frame(parent, "// FILTER") + + def _asset_table_value(asset: Asset, column: str, holder_label: str) -> str: if column == "label": return asset.label @@ -228,10 +233,10 @@ class MembersTab(ttk.Frame): self.count_var = tk.StringVar() ttk.Label(header, textvariable=self.count_var, style="Mono.TLabel").grid(row=1, column=0, sticky="w") ttk.Button(header, text="Tab schließen", command=self.on_close).grid(row=0, column=1, rowspan=2) - filters = ttk.Frame(self, padding=(12, 10)) + filters = _filter_label_frame(self) filters.grid(row=1, column=0, sticky="ew", pady=(0, 10)) - filters.columnconfigure(1, weight=1) - ttk.Label(filters, text="Filter", style="Mono.TLabel").grid(row=0, column=0, sticky="w", padx=(0, 16)) + filter_row = ttk.Frame(filters) + filter_row.grid(row=0, column=0, sticky="w") self.tree = ttk.Treeview( self, columns=("number", "first_name", "last_name", "nickname", "email", "birth", "status"), @@ -240,15 +245,15 @@ class MembersTab(ttk.Frame): self.sort_column = "last_name" self.sort_descending = False self.status_filter_var = tk.StringVar(value=STATUS_FILTER_ALL) - ttk.Label(filters, text="Status").grid(row=0, column=1, sticky="w", padx=(0, 8)) + ttk.Label(filter_row, text="Status").grid(row=0, column=0, sticky="w", padx=(0, 8)) self.status_filter = ttk.Combobox( - filters, + filter_row, textvariable=self.status_filter_var, state="readonly", values=[STATUS_FILTER_ALL, *MEMBERSHIP_STATUS_LABELS.values()], width=28, ) - self.status_filter.grid(row=0, column=2, sticky="w") + self.status_filter.grid(row=0, column=1, sticky="w") self.status_filter.bind("<>", lambda _event: self._render_members()) for key, title, width in MEMBER_TABLE_COLUMNS: self.tree.heading(key, text=title, command=lambda column=key: self._toggle_sort(column)) @@ -349,11 +354,13 @@ class AssetsTab(ttk.Frame): button_row.grid(row=0, column=1, rowspan=2, sticky="e") ttk.Button(button_row, text="Neues Asset", command=self.on_new).pack(side="left", padx=(0, 8)) ttk.Button(button_row, text="Tab schließen", command=self.on_close).pack(side="left") - filters = ttk.Frame(self, padding=(12, 10)) + filters = _filter_label_frame(self) filters.grid(row=1, column=0, sticky="ew", pady=(0, 10)) - ttk.Label(filters, text="Status").grid(row=0, column=0, sticky="w", padx=(0, 8)) + filter_row = ttk.Frame(filters) + filter_row.grid(row=0, column=0, sticky="w") + ttk.Label(filter_row, text="Status").grid(row=0, column=0, sticky="w", padx=(0, 8)) self.status_filter = ttk.Combobox( - filters, + filter_row, textvariable=self.status_filter_var, state="readonly", values=[ASSET_FILTER_ALL, *ASSET_STATUS_LABELS.values()],