refactor(ui): Decompose sidebar setup into smaller methods
Further refactored the _setup_sidebar method by breaking it down into smaller, more focused methods: _setup_sidebar_bookmarks, _setup_sidebar_devices, and _setup_sidebar_storage. This completes the modularization of the UI setup, resulting in a highly organized and maintainable WidgetManager class.
This commit is contained in:
103
cfd_ui_setup.py
103
cfd_ui_setup.py
@@ -206,7 +206,18 @@ class WidgetManager:
|
||||
parent_paned_window.add(sidebar_frame, weight=0)
|
||||
sidebar_frame.grid_rowconfigure(2, weight=1)
|
||||
|
||||
# Sidebar buttons (Bookmarks)
|
||||
self._setup_sidebar_bookmarks(sidebar_frame)
|
||||
|
||||
separator_color = "#a9a9a9" if self.style_manager.is_dark else "#7c7c7c"
|
||||
tk.Frame(sidebar_frame, height=1, bg=separator_color).grid(row=1, column=0, sticky="ew", padx=20, pady=15)
|
||||
|
||||
self._setup_sidebar_devices(sidebar_frame)
|
||||
|
||||
tk.Frame(sidebar_frame, height=1, bg=separator_color).grid(row=3, column=0, sticky="ew", padx=20, pady=15)
|
||||
|
||||
self._setup_sidebar_storage(sidebar_frame)
|
||||
|
||||
def _setup_sidebar_bookmarks(self, sidebar_frame):
|
||||
sidebar_buttons_frame = ttk.Frame(sidebar_frame, style="Sidebar.TFrame", padding=(0, 15, 0, 0))
|
||||
sidebar_buttons_frame.grid(row=0, column=0, sticky="nsew")
|
||||
sidebar_buttons_config = [
|
||||
@@ -224,20 +235,95 @@ class WidgetManager:
|
||||
btn.pack(fill="x", pady=1)
|
||||
self.sidebar_buttons.append((btn, f" {config['name']}"))
|
||||
|
||||
separator_color = "#a9a9a9" if self.style_manager.is_dark else "#7c7c7c"
|
||||
tk.Frame(sidebar_frame, height=1, bg=separator_color).grid(row=1, column=0, sticky="ew", padx=20, pady=15)
|
||||
|
||||
# Mounted devices
|
||||
def _setup_sidebar_devices(self, sidebar_frame):
|
||||
mounted_devices_frame = ttk.Frame(sidebar_frame, style="Sidebar.TFrame")
|
||||
mounted_devices_frame.grid(row=2, column=0, sticky="nsew", padx=10)
|
||||
mounted_devices_frame.grid_columnconfigure(0, weight=1)
|
||||
|
||||
ttk.Label(mounted_devices_frame, text="Geräte:", background=self.style_manager.sidebar_color,
|
||||
foreground=self.style_manager.color_foreground).grid(row=0, column=0, sticky="ew", padx=10, pady=(5, 0))
|
||||
# ... (rest of the device setup logic)
|
||||
|
||||
tk.Frame(sidebar_frame, height=1, bg=separator_color).grid(row=3, column=0, sticky="ew", padx=20, pady=15)
|
||||
self.devices_canvas = tk.Canvas(
|
||||
mounted_devices_frame, highlightthickness=0, bg=self.style_manager.sidebar_color, height=150, width=180)
|
||||
self.devices_scrollbar = ttk.Scrollbar(
|
||||
mounted_devices_frame, orient="vertical", command=self.devices_canvas.yview)
|
||||
self.devices_canvas.configure(
|
||||
yscrollcommand=self.devices_scrollbar.set)
|
||||
self.devices_canvas.grid(row=1, column=0, sticky="nsew")
|
||||
|
||||
# Storage info
|
||||
self.devices_scrollable_frame = ttk.Frame(
|
||||
self.devices_canvas, style="Sidebar.TFrame")
|
||||
self.devices_canvas_window = self.devices_canvas.create_window(
|
||||
(0, 0), window=self.devices_scrollable_frame, anchor="nw")
|
||||
|
||||
self.devices_canvas.bind("<Enter>", self.dialog._on_devices_enter)
|
||||
self.devices_canvas.bind("<Leave>", self.dialog._on_devices_leave)
|
||||
self.devices_scrollable_frame.bind(
|
||||
"<Enter>", self.dialog._on_devices_enter)
|
||||
self.devices_scrollable_frame.bind(
|
||||
"<Leave>", self.dialog._on_devices_leave)
|
||||
|
||||
def _configure_devices_canvas(event):
|
||||
self.devices_canvas.configure(
|
||||
scrollregion=self.devices_canvas.bbox("all"))
|
||||
canvas_width = event.width
|
||||
self.devices_canvas.itemconfig(
|
||||
self.devices_canvas_window, width=canvas_width)
|
||||
|
||||
self.devices_scrollable_frame.bind("<Configure>", lambda e: self.devices_canvas.configure(
|
||||
scrollregion=self.devices_canvas.bbox("all")))
|
||||
self.devices_canvas.bind("<Configure>", _configure_devices_canvas)
|
||||
|
||||
def _on_devices_mouse_wheel(event):
|
||||
if event.num == 4:
|
||||
delta = -1
|
||||
elif event.num == 5:
|
||||
delta = 1
|
||||
else:
|
||||
delta = -1 * int(event.delta / 120)
|
||||
self.devices_canvas.yview_scroll(delta, "units")
|
||||
|
||||
for widget in [self.devices_canvas, self.devices_scrollable_frame]:
|
||||
widget.bind("<MouseWheel>", _on_devices_mouse_wheel)
|
||||
widget.bind("<Button-4>", _on_devices_mouse_wheel)
|
||||
widget.bind("<Button-5>", _on_devices_mouse_wheel)
|
||||
|
||||
self.device_buttons = []
|
||||
for device_name, mount_point, removable in self.dialog._get_mounted_devices():
|
||||
icon = self.dialog.icon_manager.get_icon(
|
||||
'usb_small') if removable else self.dialog.icon_manager.get_icon('device_small')
|
||||
button_text = f" {device_name}"
|
||||
if len(device_name) > 15:
|
||||
button_text = f" {device_name[:15]}\n{device_name[15:]}"
|
||||
|
||||
btn = ttk.Button(self.devices_scrollable_frame, text=button_text, image=icon, compound="left",
|
||||
command=lambda p=mount_point: self.dialog.navigate_to(p), style="Dark.TButton.Borderless")
|
||||
btn.pack(fill="x", pady=1)
|
||||
self.device_buttons.append((btn, button_text))
|
||||
|
||||
for w in [btn, self.devices_canvas, self.devices_scrollable_frame]:
|
||||
w.bind("<MouseWheel>", _on_devices_mouse_wheel)
|
||||
w.bind("<Button-4>", _on_devices_mouse_wheel)
|
||||
w.bind("<Button-5>", _on_devices_mouse_wheel)
|
||||
w.bind("<Enter>", self.dialog._on_devices_enter)
|
||||
w.bind("<Leave>", self.dialog._on_devices_leave)
|
||||
|
||||
try:
|
||||
total, used, _ = shutil.disk_usage(mount_point)
|
||||
progress_bar = ttk.Progressbar(self.devices_scrollable_frame, orient="horizontal",
|
||||
length=100, mode="determinate", style='Small.Horizontal.TProgressbar')
|
||||
progress_bar.pack(fill="x", pady=(2, 8), padx=25)
|
||||
progress_bar['value'] = (used / total) * 100
|
||||
for w in [progress_bar]:
|
||||
w.bind("<MouseWheel>", _on_devices_mouse_wheel)
|
||||
w.bind("<Button-4>", _on_devices_mouse_wheel)
|
||||
w.bind("<Button-5>", _on_devices_mouse_wheel)
|
||||
w.bind("<Enter>", self.dialog._on_devices_enter)
|
||||
w.bind("<Leave>", self.dialog._on_devices_leave)
|
||||
except (FileNotFoundError, PermissionError):
|
||||
pass
|
||||
|
||||
def _setup_sidebar_storage(self, sidebar_frame):
|
||||
storage_frame = ttk.Frame(sidebar_frame, style="Sidebar.TFrame")
|
||||
storage_frame.grid(row=5, column=0, sticky="sew", padx=10, pady=10)
|
||||
self.storage_label = ttk.Label(storage_frame, text="Freier Speicher:", background=self.style_manager.freespace_background)
|
||||
@@ -371,3 +457,4 @@ class WidgetManager:
|
||||
|
||||
# --- Bottom Bar ---
|
||||
self._setup_bottom_bar()
|
||||
|
||||
|
Reference in New Issue
Block a user