refactor(ui): Modularize UI setup into distinct methods
Further refactored the WidgetManager class by extracting the setup logic for the top bar and the sidebar into their own dedicated methods: _setup_top_bar and _setup_sidebar. This simplifies the main setup_widgets method into a high-level blueprint, significantly improving code organization and readability.
This commit is contained in:
390
cfd_ui_setup.py
390
cfd_ui_setup.py
@@ -115,6 +115,136 @@ class WidgetManager:
|
||||
self.settings = settings
|
||||
self.setup_widgets()
|
||||
|
||||
def _setup_top_bar(self, parent_frame):
|
||||
top_bar = ttk.Frame(parent_frame, style='Accent.TFrame', padding=(0, 5, 0, 5))
|
||||
top_bar.grid(row=0, column=0, columnspan=2, sticky="ew")
|
||||
top_bar.grid_columnconfigure(1, weight=1)
|
||||
|
||||
# Left navigation
|
||||
left_nav_container = ttk.Frame(top_bar, style='Accent.TFrame')
|
||||
left_nav_container.grid(row=0, column=0, sticky="w")
|
||||
left_nav_container.grid_propagate(False)
|
||||
|
||||
self.back_button = ttk.Button(left_nav_container, image=self.dialog.icon_manager.get_icon(
|
||||
'back'), command=self.dialog.go_back, state=tk.DISABLED, style="Header.TButton.Borderless.Round")
|
||||
self.back_button.pack(side="left", padx=(10, 5))
|
||||
Tooltip(self.back_button, "Zurück")
|
||||
|
||||
self.forward_button = ttk.Button(left_nav_container, image=self.dialog.icon_manager.get_icon(
|
||||
'forward'), command=self.dialog.go_forward, state=tk.DISABLED, style="Header.TButton.Borderless.Round")
|
||||
self.forward_button.pack(side="left", padx=5)
|
||||
Tooltip(self.forward_button, "Vorwärts")
|
||||
|
||||
self.up_button = ttk.Button(left_nav_container, image=self.dialog.icon_manager.get_icon(
|
||||
'up'), command=self.dialog.go_up_level, style="Header.TButton.Borderless.Round")
|
||||
self.up_button.pack(side="left", padx=5)
|
||||
Tooltip(self.up_button, "Eine Ebene höher")
|
||||
|
||||
self.home_button = ttk.Button(left_nav_container, image=self.dialog.icon_manager.get_icon(
|
||||
'home'), command=lambda: self.dialog.navigate_to(os.path.expanduser("~")), style="Header.TButton.Borderless.Round")
|
||||
self.home_button.pack(side="left", padx=(5, 10))
|
||||
Tooltip(self.home_button, "Home")
|
||||
|
||||
# Path and search
|
||||
path_search_container = ttk.Frame(top_bar, style='Accent.TFrame')
|
||||
path_search_container.grid(row=0, column=1, sticky="ew")
|
||||
self.path_entry = ttk.Entry(path_search_container)
|
||||
self.path_entry.bind("<Return>", lambda e: self.dialog.navigate_to(self.path_entry.get()))
|
||||
|
||||
search_icon_pos = self.settings.get("search_icon_pos", "left")
|
||||
if search_icon_pos == 'left':
|
||||
path_search_container.grid_columnconfigure(1, weight=1)
|
||||
self.path_entry.grid(row=0, column=1, sticky="ew")
|
||||
else: # right
|
||||
path_search_container.grid_columnconfigure(0, weight=1)
|
||||
self.path_entry.grid(row=0, column=0, sticky="ew")
|
||||
|
||||
# Right controls
|
||||
right_controls_container = ttk.Frame(top_bar, style='Accent.TFrame')
|
||||
right_controls_container.grid(row=0, column=2, sticky="e")
|
||||
self.responsive_buttons_container = ttk.Frame(right_controls_container, style='Accent.TFrame')
|
||||
self.responsive_buttons_container.pack(side="left")
|
||||
|
||||
self.new_folder_button = ttk.Button(self.responsive_buttons_container, image=self.dialog.icon_manager.get_icon(
|
||||
'new_folder_small'), command=self.dialog.create_new_folder, style="Header.TButton.Borderless.Round")
|
||||
self.new_folder_button.pack(side="left", padx=5)
|
||||
Tooltip(self.new_folder_button, "Neuen Ordner erstellen")
|
||||
|
||||
self.new_file_button = ttk.Button(self.responsive_buttons_container, image=self.dialog.icon_manager.get_icon(
|
||||
'new_document_small'), command=self.dialog.create_new_file, style="Header.TButton.Borderless.Round")
|
||||
self.new_file_button.pack(side="left", padx=5)
|
||||
Tooltip(self.new_file_button, "Neues Dokument erstellen")
|
||||
|
||||
if self.dialog.dialog_mode == "open":
|
||||
self.new_folder_button.config(state=tk.DISABLED)
|
||||
self.new_file_button.config(state=tk.DISABLED)
|
||||
|
||||
self.view_switch = ttk.Frame(self.responsive_buttons_container, padding=(5, 0), style='Accent.TFrame')
|
||||
self.view_switch.pack(side="left")
|
||||
self.icon_view_button = ttk.Button(self.view_switch, image=self.dialog.icon_manager.get_icon(
|
||||
'icon_view'), command=self.dialog.set_icon_view, style="Header.TButton.Active.Round")
|
||||
self.icon_view_button.pack(side="left", padx=5)
|
||||
Tooltip(self.icon_view_button, "Kachelansicht")
|
||||
|
||||
self.list_view_button = ttk.Button(self.view_switch, image=self.dialog.icon_manager.get_icon(
|
||||
'list_view'), command=self.dialog.set_list_view, style="Header.TButton.Borderless.Round")
|
||||
self.list_view_button.pack(side="left")
|
||||
Tooltip(self.list_view_button, "Listenansicht")
|
||||
|
||||
self.hidden_files_button = ttk.Button(self.responsive_buttons_container, image=self.dialog.icon_manager.get_icon(
|
||||
'hide'), command=self.dialog.toggle_hidden_files, style="Header.TButton.Borderless.Round")
|
||||
self.hidden_files_button.pack(side="left", padx=10)
|
||||
Tooltip(self.hidden_files_button, "Versteckte Dateien anzeigen")
|
||||
|
||||
self.more_button = ttk.Button(right_controls_container, text="...",
|
||||
command=self.dialog.show_more_menu, style="Header.TButton.Borderless.Round", width=3)
|
||||
|
||||
def _setup_sidebar(self, parent_paned_window):
|
||||
sidebar_frame = ttk.Frame(parent_paned_window, style="Sidebar.TFrame", padding=(0, 0, 0, 0), width=200)
|
||||
sidebar_frame.grid_propagate(False)
|
||||
sidebar_frame.bind("<Configure>", self.dialog.on_sidebar_resize)
|
||||
parent_paned_window.add(sidebar_frame, weight=0)
|
||||
sidebar_frame.grid_rowconfigure(2, weight=1)
|
||||
|
||||
# Sidebar buttons (Bookmarks)
|
||||
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 = [
|
||||
{'name': 'Computer', 'icon': self.dialog.icon_manager.get_icon('computer_small'), 'path': '/'},
|
||||
{'name': 'Downloads', 'icon': self.dialog.icon_manager.get_icon('downloads_small'), 'path': get_xdg_user_dir("XDG_DOWNLOAD_DIR", "Downloads")},
|
||||
{'name': 'Dokumente', 'icon': self.dialog.icon_manager.get_icon('documents_small'), 'path': get_xdg_user_dir("XDG_DOCUMENTS_DIR", "Documents")},
|
||||
{'name': 'Bilder', 'icon': self.dialog.icon_manager.get_icon('pictures_small'), 'path': get_xdg_user_dir("XDG_PICTURES_DIR", "Pictures")},
|
||||
{'name': 'Musik', 'icon': self.dialog.icon_manager.get_icon('music_small'), 'path': get_xdg_user_dir("XDG_MUSIC_DIR", "Music")},
|
||||
{'name': 'Videos', 'icon': self.dialog.icon_manager.get_icon('video_small'), 'path': get_xdg_user_dir("XDG_VIDEO_DIR", "Videos")},
|
||||
]
|
||||
self.sidebar_buttons = []
|
||||
for config in sidebar_buttons_config:
|
||||
btn = ttk.Button(sidebar_buttons_frame, text=f" {config['name']}", image=config['icon'], compound="left",
|
||||
command=lambda p=config['path']: self.dialog.navigate_to(p), style="Dark.TButton.Borderless")
|
||||
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
|
||||
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)
|
||||
|
||||
# Storage info
|
||||
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)
|
||||
self.storage_label.pack(fill="x", padx=10)
|
||||
self.storage_bar = ttk.Progressbar(storage_frame, orient="horizontal", length=100, mode="determinate")
|
||||
self.storage_bar.pack(fill="x", pady=(2, 5), padx=15)
|
||||
|
||||
def _setup_bottom_bar(self):
|
||||
"""Sets up the bottom bar including containers and widgets based on dialog mode."""
|
||||
self.action_status_frame = ttk.Frame(self.content_frame, style="AccentBottom.TFrame")
|
||||
@@ -209,129 +339,14 @@ class WidgetManager:
|
||||
self.cancel_button.pack(in_=action_button_frame, side="left")
|
||||
self.settings_button.pack(in_=self.right_container, side="top", anchor="ne", pady=(0,5))
|
||||
|
||||
|
||||
def setup_widgets(self):
|
||||
# ... (rest of the setup_widgets method up to the bottom bar)
|
||||
# Main container
|
||||
main_frame = ttk.Frame(self.dialog, style='Accent.TFrame')
|
||||
main_frame.pack(fill="both", expand=True)
|
||||
main_frame.grid_rowconfigure(2, weight=1)
|
||||
main_frame.grid_columnconfigure(0, weight=1)
|
||||
|
||||
# Top bar for navigation and path
|
||||
top_bar = ttk.Frame(
|
||||
main_frame, style='Accent.TFrame', padding=(0, 5, 0, 5))
|
||||
top_bar.grid(row=0, column=0, columnspan=2, sticky="ew")
|
||||
|
||||
# Left navigation buttons
|
||||
left_nav_container = ttk.Frame(top_bar, style='Accent.TFrame')
|
||||
left_nav_container.grid(row=0, column=0, sticky="w")
|
||||
# Prevent this container from changing size
|
||||
left_nav_container.grid_propagate(False)
|
||||
|
||||
self.back_button = ttk.Button(left_nav_container, image=self.dialog.icon_manager.get_icon(
|
||||
'back'), command=self.dialog.go_back, state=tk.DISABLED, style="Header.TButton.Borderless.Round")
|
||||
self.back_button.pack(side="left", padx=(10, 5))
|
||||
Tooltip(self.back_button, "Zurück")
|
||||
|
||||
self.forward_button = ttk.Button(left_nav_container, image=self.dialog.icon_manager.get_icon(
|
||||
'forward'), command=self.dialog.go_forward, state=tk.DISABLED, style="Header.TButton.Borderless.Round")
|
||||
self.forward_button.pack(side="left", padx=5)
|
||||
Tooltip(self.forward_button, "Vorwärts")
|
||||
|
||||
self.up_button = ttk.Button(left_nav_container, image=self.dialog.icon_manager.get_icon(
|
||||
'up'), command=self.dialog.go_up_level, style="Header.TButton.Borderless.Round")
|
||||
self.up_button.pack(side="left", padx=5)
|
||||
Tooltip(self.up_button, "Eine Ebene höher")
|
||||
|
||||
self.home_button = ttk.Button(left_nav_container, image=self.dialog.icon_manager.get_icon(
|
||||
'home'), command=lambda: self.dialog.navigate_to(os.path.expanduser("~")), style="Header.TButton.Borderless.Round")
|
||||
self.home_button.pack(side="left", padx=(5, 10))
|
||||
Tooltip(self.home_button, "Home")
|
||||
|
||||
# Path and search widgets container
|
||||
path_search_container = ttk.Frame(top_bar, style='Accent.TFrame')
|
||||
path_search_container.grid(row=0, column=1, sticky="ew")
|
||||
|
||||
# Right-side controls container
|
||||
right_controls_container = ttk.Frame(top_bar, style='Accent.TFrame')
|
||||
right_controls_container.grid(row=0, column=2, sticky="e")
|
||||
|
||||
# Make the middle column (path_search_container) expand
|
||||
top_bar.grid_columnconfigure(1, weight=1)
|
||||
|
||||
search_icon_pos = self.settings.get("search_icon_pos", "left")
|
||||
self.recursive_search = tk.BooleanVar(value=True)
|
||||
|
||||
# Path entry
|
||||
self.path_entry = ttk.Entry(path_search_container)
|
||||
self.path_entry.bind(
|
||||
"<Return>", lambda e: self.dialog.navigate_to(self.path_entry.get()))
|
||||
|
||||
# Function to create search widgets
|
||||
def create_search_widgets(parent_frame):
|
||||
container = ttk.Frame(parent_frame, style='Accent.TFrame')
|
||||
self.recursive_button = ttk.Button(container, image=self.dialog.icon_manager.get_icon(
|
||||
'recursive_small'), command=self.dialog.toggle_recursive_search, style="Header.TButton.Active.Round")
|
||||
self.recursive_button.pack(side="left", padx=2)
|
||||
self.recursive_button.pack_forget() # Initially hidden
|
||||
Tooltip(self.recursive_button, "Rekursive Suche ein/ausschalten")
|
||||
return container
|
||||
|
||||
# Place search and path entry based on settings
|
||||
if search_icon_pos == 'left':
|
||||
path_search_container.grid_columnconfigure(1, weight=1)
|
||||
search_container = create_search_widgets(path_search_container)
|
||||
search_container.grid(row=0, column=0, sticky="w", padx=(0, 5))
|
||||
self.path_entry.grid(row=0, column=1, sticky="ew")
|
||||
else: # right
|
||||
path_search_container.grid_columnconfigure(0, weight=1)
|
||||
search_container = create_search_widgets(path_search_container)
|
||||
search_container.grid(row=0, column=1, sticky="e", padx=(5, 0))
|
||||
self.path_entry.grid(row=0, column=0, sticky="ew")
|
||||
|
||||
# --- Responsive Buttons ---
|
||||
self.responsive_buttons_container = ttk.Frame(
|
||||
right_controls_container, style='Accent.TFrame')
|
||||
self.responsive_buttons_container.pack(side="left")
|
||||
|
||||
self.new_folder_button = ttk.Button(self.responsive_buttons_container, image=self.dialog.icon_manager.get_icon(
|
||||
'new_folder_small'), command=self.dialog.create_new_folder, style="Header.TButton.Borderless.Round")
|
||||
self.new_folder_button.pack(side="left", padx=5)
|
||||
Tooltip(self.new_folder_button, "Neuen Ordner erstellen")
|
||||
|
||||
self.new_file_button = ttk.Button(self.responsive_buttons_container, image=self.dialog.icon_manager.get_icon(
|
||||
'new_document_small'), command=self.dialog.create_new_file, style="Header.TButton.Borderless.Round")
|
||||
self.new_file_button.pack(side="left", padx=5)
|
||||
Tooltip(self.new_file_button, "Neues Dokument erstellen")
|
||||
|
||||
if self.dialog.dialog_mode == "open":
|
||||
self.new_folder_button.config(state=tk.DISABLED)
|
||||
self.new_file_button.config(state=tk.DISABLED)
|
||||
|
||||
self.view_switch = ttk.Frame(self.responsive_buttons_container,
|
||||
padding=(5, 0), style='Accent.TFrame')
|
||||
self.view_switch.pack(side="left")
|
||||
|
||||
self.icon_view_button = ttk.Button(self.view_switch, image=self.dialog.icon_manager.get_icon(
|
||||
'icon_view'), command=self.dialog.set_icon_view, style="Header.TButton.Active.Round")
|
||||
self.icon_view_button.pack(side="left", padx=5)
|
||||
Tooltip(self.icon_view_button, "Kachelansicht")
|
||||
|
||||
self.list_view_button = ttk.Button(self.view_switch, image=self.dialog.icon_manager.get_icon(
|
||||
'list_view'), command=self.dialog.set_list_view, style="Header.TButton.Borderless.Round")
|
||||
self.list_view_button.pack(side="left")
|
||||
Tooltip(self.list_view_button, "Listenansicht")
|
||||
|
||||
self.hidden_files_button = ttk.Button(self.responsive_buttons_container, image=self.dialog.icon_manager.get_icon(
|
||||
'hide'), command=self.dialog.toggle_hidden_files, style="Header.TButton.Borderless.Round")
|
||||
self.hidden_files_button.pack(side="left", padx=10)
|
||||
Tooltip(self.hidden_files_button, "Versteckte Dateien anzeigen")
|
||||
|
||||
# "More" button for responsive UI
|
||||
self.more_button = ttk.Button(right_controls_container, text="...",
|
||||
command=self.dialog.show_more_menu, style="Header.TButton.Borderless.Round", width=3)
|
||||
# self.more_button is managed by _handle_responsive_buttons
|
||||
self._setup_top_bar(main_frame)
|
||||
|
||||
# Horizontal separator
|
||||
separator_color = "#000000" if self.style_manager.is_dark else "#9c9c9c"
|
||||
@@ -343,151 +358,14 @@ class WidgetManager:
|
||||
main_frame, orient=tk.HORIZONTAL, style="Sidebar.TFrame")
|
||||
paned_window.grid(row=2, column=0, columnspan=2, sticky="nsew")
|
||||
|
||||
# Sidebar
|
||||
sidebar_frame = ttk.Frame(
|
||||
paned_window, style="Sidebar.TFrame", padding=(0, 0, 0, 0), width=200)
|
||||
sidebar_frame.grid_propagate(False)
|
||||
sidebar_frame.bind("<Configure>", self.dialog.on_sidebar_resize)
|
||||
paned_window.add(sidebar_frame, weight=0)
|
||||
sidebar_frame.grid_rowconfigure(2, weight=1)
|
||||
self._setup_sidebar(paned_window)
|
||||
|
||||
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 = [
|
||||
{'name': 'Computer', 'icon': self.dialog.icon_manager.get_icon(
|
||||
'computer_small'), 'path': '/'},
|
||||
{'name': 'Downloads', 'icon': self.dialog.icon_manager.get_icon(
|
||||
'downloads_small'), 'path': get_xdg_user_dir("XDG_DOWNLOAD_DIR", "Downloads")},
|
||||
{'name': 'Dokumente', 'icon': self.dialog.icon_manager.get_icon(
|
||||
'documents_small'), 'path': get_xdg_user_dir("XDG_DOCUMENTS_DIR", "Documents")},
|
||||
{'name': 'Bilder', 'icon': self.dialog.icon_manager.get_icon(
|
||||
'pictures_small'), 'path': get_xdg_user_dir("XDG_PICTURES_DIR", "Pictures")},
|
||||
{'name': 'Musik', 'icon': self.dialog.icon_manager.get_icon(
|
||||
'music_small'), 'path': get_xdg_user_dir("XDG_MUSIC_DIR", "Music")},
|
||||
{'name': 'Videos', 'icon': self.dialog.icon_manager.get_icon(
|
||||
'video_small'), 'path': get_xdg_user_dir("XDG_VIDEO_DIR", "Videos")},
|
||||
]
|
||||
self.sidebar_buttons = []
|
||||
for config in sidebar_buttons_config:
|
||||
btn = ttk.Button(sidebar_buttons_frame, text=f" {config['name']}", image=config['icon'], compound="left",
|
||||
command=lambda p=config['path']: self.dialog.navigate_to(p), style="Dark.TButton.Borderless")
|
||||
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_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))
|
||||
|
||||
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")
|
||||
|
||||
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
|
||||
|
||||
tk.Frame(sidebar_frame, height=1, bg=separator_color).grid(
|
||||
row=3, column=0, sticky="ew", padx=20, pady=15)
|
||||
|
||||
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)
|
||||
self.storage_label.pack(fill="x", padx=10)
|
||||
self.storage_bar = ttk.Progressbar(
|
||||
storage_frame, orient="horizontal", length=100, mode="determinate")
|
||||
self.storage_bar.pack(fill="x", pady=(2, 5), padx=15)
|
||||
|
||||
self.content_frame = ttk.Frame(paned_window, padding=(
|
||||
0, 0, 0, 0), style="AccentBottom.TFrame")
|
||||
self.content_frame = ttk.Frame(paned_window, padding=(0, 0, 0, 0), style="AccentBottom.TFrame")
|
||||
paned_window.add(self.content_frame, weight=1)
|
||||
self.content_frame.grid_rowconfigure(0, weight=1)
|
||||
self.content_frame.grid_columnconfigure(0, weight=1)
|
||||
|
||||
self.file_list_frame = ttk.Frame(
|
||||
# Use Content.TFrame for consistent bg color
|
||||
self.content_frame, style="Content.TFrame")
|
||||
self.file_list_frame = ttk.Frame(self.content_frame, style="Content.TFrame")
|
||||
self.file_list_frame.grid(row=0, column=0, sticky="nsew")
|
||||
self.dialog.bind("<Configure>", self.dialog.on_window_resize)
|
||||
|
||||
|
Reference in New Issue
Block a user