commit 40
This commit is contained in:
@@ -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 ""
|
||||
|
||||
Reference in New Issue
Block a user