commit 40

This commit is contained in:
2025-08-02 21:40:06 +02:00
parent 07751e5c9a
commit 2b09721fec
5 changed files with 82 additions and 123 deletions

View File

@@ -8,7 +8,7 @@ import json
from shared_libs.message import MessageDialog
from shared_libs.common_tools import IconManager, Tooltip, ConfigManager, LxTools, ThemeManager
from cfd_app_config import AppConfig
from cfd_ui_setup import StyleManager, WidgetManager, get_xdg_user_dir, InputDialog
from cfd_ui_setup import StyleManager, WidgetManager, get_xdg_user_dir
# Helper to make icon paths robust, so the script can be run from anywhere
@@ -60,7 +60,7 @@ class CustomFileDialog(tk.Toplevel):
self.icon_manager = IconManager()
self.style_manager = StyleManager(self)
self.widget_manager = WidgetManager(self)
self.navigate_to(self.current_dir)
def get_file_icon(self, filename, size='large'):
@@ -88,11 +88,13 @@ class CustomFileDialog(tk.Toplevel):
if self.show_hidden_files.get():
self.widget_manager.hidden_files_button.config(
image=self.icon_manager.get_icon('unhide'))
Tooltip(self.widget_manager.hidden_files_button, "Versteckte Dateien ausblenden")
Tooltip(self.widget_manager.hidden_files_button,
"Versteckte Dateien ausblenden")
else:
self.widget_manager.hidden_files_button.config(
image=self.icon_manager.get_icon('hide'))
Tooltip(self.widget_manager.hidden_files_button, "Versteckte Dateien anzeigen")
Tooltip(self.widget_manager.hidden_files_button,
"Versteckte Dateien anzeigen")
self.populate_files()
def on_window_resize(self, event):
@@ -123,7 +125,8 @@ class CustomFileDialog(tk.Toplevel):
def _on_devices_enter(self, event):
"""Show scrollbar when mouse enters devices area"""
self.widget_manager.devices_scrollbar.grid(row=1, column=1, sticky="ns")
self.widget_manager.devices_scrollbar.grid(
row=1, column=1, sticky="ns")
def _on_devices_leave(self, event):
"""Hide scrollbar when mouse leaves devices area"""
@@ -148,11 +151,14 @@ class CustomFileDialog(tk.Toplevel):
self.original_path_text = self.widget_manager.path_entry.get()
self.widget_manager.path_entry.delete(0, tk.END)
self.widget_manager.path_entry.insert(0, "Suchbegriff eingeben...")
self.widget_manager.path_entry.bind("<Return>", self.execute_search)
self.widget_manager.path_entry.bind("<FocusIn>", self.clear_search_placeholder)
self.widget_manager.path_entry.bind(
"<Return>", self.execute_search)
self.widget_manager.path_entry.bind(
"<FocusIn>", self.clear_search_placeholder)
# Show search options
self.widget_manager.search_options_frame.pack(side="left", padx=(5, 0))
self.widget_manager.search_options_frame.pack(
side="left", padx=(5, 0))
else:
# Exit search mode
self.search_mode = False
@@ -170,7 +176,8 @@ class CustomFileDialog(tk.Toplevel):
def toggle_recursive_search(self):
"""Toggle recursive search on/off and update button style"""
self.widget_manager.recursive_search.set(not self.widget_manager.recursive_search.get())
self.widget_manager.recursive_search.set(
not self.widget_manager.recursive_search.get())
if self.widget_manager.recursive_search.get():
self.widget_manager.recursive_button.configure(
style="Header.TButton.Active.Round")
@@ -181,7 +188,8 @@ class CustomFileDialog(tk.Toplevel):
def set_icon_view(self):
"""Set icon view and update button styles"""
self.view_mode.set("icons")
self.widget_manager.icon_view_button.configure(style="Header.TButton.Active.Round")
self.widget_manager.icon_view_button.configure(
style="Header.TButton.Active.Round")
self.widget_manager.list_view_button.configure(
style="Header.TButton.Borderless.Round")
self.populate_files()
@@ -189,7 +197,8 @@ class CustomFileDialog(tk.Toplevel):
def set_list_view(self):
"""Set list view and update button styles"""
self.view_mode.set("list")
self.widget_manager.list_view_button.configure(style="Header.TButton.Active.Round")
self.widget_manager.list_view_button.configure(
style="Header.TButton.Active.Round")
self.widget_manager.icon_view_button.configure(
style="Header.TButton.Borderless.Round")
self.populate_files()
@@ -473,7 +482,8 @@ class CustomFileDialog(tk.Toplevel):
else:
icon = self.icon_manager.get_icon('folder_large') if is_dir else self.get_file_icon(
name, 'large')
icon_label = ttk.Label(item_frame, image=icon, style="Icon.TLabel")
icon_label = ttk.Label(
item_frame, image=icon, style="Icon.TLabel")
icon_label.pack(pady=(10, 5))
name_label = ttk.Label(item_frame, text=self.shorten_text(
name, 14), anchor="center", style="Item.TLabel")
@@ -488,7 +498,8 @@ class CustomFileDialog(tk.Toplevel):
widget.bind("<MouseWheel>", _on_mouse_wheel)
widget.bind("<Button-4>", _on_mouse_wheel)
widget.bind("<Button-5>", _on_mouse_wheel)
widget.bind("<F2>", lambda e, p=path, f=item_frame: self.on_rename_request(e, p, f))
widget.bind("<F2>", lambda e, p=path,
f=item_frame: self.on_rename_request(e, p, f))
col = (col + 1) % col_count
if col == 0:
@@ -598,9 +609,10 @@ class CustomFileDialog(tk.Toplevel):
if not self.tree.selection():
return
item_id = self.tree.selection()[0]
item_path = os.path.join(self.current_dir, self.tree.item(item_id, "text").strip())
item_path = os.path.join(
self.current_dir, self.tree.item(item_id, "text").strip())
self.start_rename(item_id, item_path)
else: # icon view
else: # icon view
if item_path and item_frame:
self.start_rename(item_frame, item_path)
@@ -693,7 +705,8 @@ class CustomFileDialog(tk.Toplevel):
try:
total, used, free = shutil.disk_usage(self.current_dir)
free_str = self._format_size(free)
self.widget_manager.storage_label.config(text=f"Freier Speicher: {free_str}")
self.widget_manager.storage_label.config(
text=f"Freier Speicher: {free_str}")
self.widget_manager.storage_bar['value'] = (used / total) * 100
status_text = ""
@@ -703,8 +716,10 @@ class CustomFileDialog(tk.Toplevel):
status_text = f"'{os.path.basename(self.selected_file)}' Größe: {size_str}"
self.widget_manager.status_bar.config(text=status_text)
except FileNotFoundError:
self.widget_manager.status_bar.config(text="Verzeichnis nicht gefunden")
self.widget_manager.storage_label.config(text="Freier Speicher: Unbekannt")
self.widget_manager.status_bar.config(
text="Verzeichnis nicht gefunden")
self.widget_manager.storage_label.config(
text="Freier Speicher: Unbekannt")
self.widget_manager.storage_bar['value'] = 0
def on_open(self):
@@ -744,7 +759,8 @@ class CustomFileDialog(tk.Toplevel):
open(new_path, 'a').close()
self.populate_files(item_to_rename=new_name)
except Exception as e:
self.widget_manager.status_bar.config(text=f"Fehler beim Erstellen: {e}")
self.widget_manager.status_bar.config(
text=f"Fehler beim Erstellen: {e}")
def _get_unique_name(self, base_name):
name, ext = os.path.splitext(base_name)
@@ -758,8 +774,8 @@ class CustomFileDialog(tk.Toplevel):
def start_rename(self, item_widget, item_path):
if self.view_mode.get() == "icons":
self._start_rename_icon_view(item_widget, item_path)
else: # list view
self._start_rename_list_view(item_widget) # item_widget is item_id
else: # list view
self._start_rename_list_view(item_widget) # item_widget is item_id
def _start_rename_icon_view(self, item_frame, item_path):
for child in item_frame.winfo_children():
@@ -776,13 +792,15 @@ class CustomFileDialog(tk.Toplevel):
new_path = os.path.join(self.current_dir, new_name)
if new_name and new_path != item_path:
if os.path.exists(new_path):
self.widget_manager.status_bar.config(text=f"'{new_name}' existiert bereits.")
self.widget_manager.status_bar.config(
text=f"'{new_name}' existiert bereits.")
self.populate_files()
return
try:
os.rename(item_path, new_path)
except Exception as e:
self.widget_manager.status_bar.config(text=f"Fehler beim Umbenennen: {e}")
self.widget_manager.status_bar.config(
text=f"Fehler beim Umbenennen: {e}")
self.populate_files()
def cancel_rename(event):
@@ -809,12 +827,14 @@ class CustomFileDialog(tk.Toplevel):
if new_name and new_path != old_path:
if os.path.exists(new_path):
self.widget_manager.status_bar.config(text=f"'{new_name}' existiert bereits.")
self.widget_manager.status_bar.config(
text=f"'{new_name}' existiert bereits.")
else:
try:
os.rename(old_path, new_path)
except Exception as e:
self.widget_manager.status_bar.config(text=f"Fehler beim Umbenennen: {e}")
self.widget_manager.status_bar.config(
text=f"Fehler beim Umbenennen: {e}")
entry.destroy()
self.populate_files()
@@ -842,8 +862,6 @@ class CustomFileDialog(tk.Toplevel):
return True
return False
def _format_size(self, size_bytes):
if size_bytes is None:
return ""