diff --git a/cfd_ui_setup.py b/cfd_ui_setup.py index f52152d..e7705bc 100644 --- a/cfd_ui_setup.py +++ b/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("", self.dialog._on_devices_enter) + self.devices_canvas.bind("", self.dialog._on_devices_leave) + self.devices_scrollable_frame.bind( + "", self.dialog._on_devices_enter) + self.devices_scrollable_frame.bind( + "", 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("", lambda e: self.devices_canvas.configure( + scrollregion=self.devices_canvas.bbox("all"))) + self.devices_canvas.bind("", _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("", _on_devices_mouse_wheel) + widget.bind("", _on_devices_mouse_wheel) + widget.bind("", _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("", _on_devices_mouse_wheel) + w.bind("", _on_devices_mouse_wheel) + w.bind("", _on_devices_mouse_wheel) + w.bind("", self.dialog._on_devices_enter) + w.bind("", 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("", _on_devices_mouse_wheel) + w.bind("", _on_devices_mouse_wheel) + w.bind("", _on_devices_mouse_wheel) + w.bind("", self.dialog._on_devices_enter) + w.bind("", 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() +