commit 48

This commit is contained in:
2025-08-03 18:04:21 +02:00
parent 2880e0d7a1
commit 30c200918d
7 changed files with 281 additions and 110 deletions

View File

@@ -7,27 +7,99 @@ import subprocess
import json
from shared_libs.message import MessageDialog
from shared_libs.common_tools import IconManager, Tooltip, ConfigManager, LxTools
from cfd_app_config import AppConfig
from cfd_app_config import AppConfig, CfdConfigManager
from cfd_ui_setup import StyleManager, WidgetManager, get_xdg_user_dir
class SettingsDialog(tk.Toplevel):
def __init__(self, parent):
super().__init__(parent)
self.transient(parent)
self.grab_set()
self.title("Einstellungen")
self.settings = CfdConfigManager.load()
# Variables
self.search_icon_pos = tk.StringVar(value=self.settings.get("search_icon_pos", "right"))
self.button_box_pos = tk.StringVar(value=self.settings.get("button_box_pos", "left"))
self.window_size_preset = tk.StringVar(value=self.settings.get("window_size_preset", "1050x850"))
self.default_view_mode = tk.StringVar(value=self.settings.get("default_view_mode", "icons"))
# --- UI Elements ---
main_frame = ttk.Frame(self, padding=10)
main_frame.pack(fill="both", expand=True)
# Search Icon Position
search_frame = ttk.LabelFrame(main_frame, text="Position der Such-Lupe", padding=10)
search_frame.pack(fill="x", pady=5)
ttk.Radiobutton(search_frame, text="Links", variable=self.search_icon_pos, value="left").pack(side="left", padx=5)
ttk.Radiobutton(search_frame, text="Rechts", variable=self.search_icon_pos, value="right").pack(side="left", padx=5)
# Button Box Position
button_box_frame = ttk.LabelFrame(main_frame, text="Position der Dialog-Buttons", padding=10)
button_box_frame.pack(fill="x", pady=5)
ttk.Radiobutton(button_box_frame, text="Links", variable=self.button_box_pos, value="left").pack(side="left", padx=5)
ttk.Radiobutton(button_box_frame, text="Rechts", variable=self.button_box_pos, value="right").pack(side="left", padx=5)
# Window Size
size_frame = ttk.LabelFrame(main_frame, text="Fenstergröße", padding=10)
size_frame.pack(fill="x", pady=5)
sizes = ["1050x850", "850x650", "650x450"]
size_combo = ttk.Combobox(size_frame, textvariable=self.window_size_preset, values=sizes, state="readonly")
size_combo.pack(fill="x")
# Default View Mode
view_mode_frame = ttk.LabelFrame(main_frame, text="Standardansicht", padding=10)
view_mode_frame.pack(fill="x", pady=5)
ttk.Radiobutton(view_mode_frame, text="Kacheln", variable=self.default_view_mode, value="icons").pack(side="left", padx=5)
ttk.Radiobutton(view_mode_frame, text="Liste", variable=self.default_view_mode, value="list").pack(side="left", padx=5)
# --- Action Buttons ---
button_frame = ttk.Frame(main_frame)
button_frame.pack(fill="x", pady=(10, 0))
ttk.Button(button_frame, text="Auf Standard zurücksetzen", command=self.reset_to_defaults).pack(side="left")
ttk.Button(button_frame, text="Speichern", command=self.save_settings).pack(side="right", padx=5)
ttk.Button(button_frame, text="Abbrechen", command=self.destroy).pack(side="right")
def save_settings(self):
new_settings = {
"search_icon_pos": self.search_icon_pos.get(),
"button_box_pos": self.button_box_pos.get(),
"window_size_preset": self.window_size_preset.get(),
"default_view_mode": self.default_view_mode.get()
}
CfdConfigManager.save(new_settings)
self.master.reload_config_and_rebuild_ui()
self.destroy()
def reset_to_defaults(self):
defaults = CfdConfigManager._default_settings
self.search_icon_pos.set(defaults["search_icon_pos"])
self.button_box_pos.set(defaults["button_box_pos"])
self.window_size_preset.set(defaults["window_size_preset"])
self.default_view_mode.set(defaults["default_view_mode"])
class CustomFileDialog(tk.Toplevel):
def __init__(self, parent, initial_dir=None, filetypes=None, dialog_mode="open", title="File Dialog"):
super().__init__(parent)
self.my_tool_tip = None
self.dialog_mode = dialog_mode
self.load_settings()
self.x_width = AppConfig.UI_CONFIG["window_size"][0]
self.y_height = AppConfig.UI_CONFIG["window_size"][1]
# Set the window size
self.geometry(f"{self.x_width}x{self.y_height}")
self.minsize(AppConfig.UI_CONFIG["window_min_size"][0],
AppConfig.UI_CONFIG["window_min_size"][1],
)
self.geometry(self.settings["window_size_preset"])
min_width, min_height = self.get_min_size_from_preset(self.settings["window_size_preset"])
self.minsize(min_width, min_height)
self.title(title)
self.image = IconManager()
LxTools.center_window_cross_platform(self, self.x_width, self.y_height)
width, height = map(int, self.settings["window_size_preset"].split('x'))
LxTools.center_window_cross_platform(self, width, height)
self.parent = parent
self.transient(parent)
self.grab_set()
@@ -39,7 +111,7 @@ class CustomFileDialog(tk.Toplevel):
self.current_filter_pattern = self.filetypes[0][1]
self.history = []
self.history_pos = -1
self.view_mode = tk.StringVar(value="icons")
self.view_mode = tk.StringVar(value=self.settings.get("default_view_mode", "icons"))
self.show_hidden_files = tk.BooleanVar(value=False)
self.resize_job = None
self.last_width = 0
@@ -51,10 +123,44 @@ class CustomFileDialog(tk.Toplevel):
self.icon_manager = IconManager()
self.style_manager = StyleManager(self)
self.widget_manager = WidgetManager(self)
self.widget_manager = WidgetManager(self, self.settings)
self._update_view_mode_buttons()
self.navigate_to(self.current_dir)
def load_settings(self):
self.settings = CfdConfigManager.load()
size_preset = self.settings.get("window_size_preset", "1050x850")
self.settings["window_size_preset"] = size_preset
if hasattr(self, 'view_mode'):
self.view_mode.set(self.settings.get("default_view_mode", "icons"))
def get_min_size_from_preset(self, preset):
w, h = map(int, preset.split('x'))
return max(650, w - 400), max(450, h - 400)
def reload_config_and_rebuild_ui(self):
self.load_settings()
# Update geometry and minsize
self.geometry(self.settings["window_size_preset"])
min_width, min_height = self.get_min_size_from_preset(self.settings["window_size_preset"])
self.minsize(min_width, min_height)
width, height = map(int, self.settings["window_size_preset"].split('x'))
LxTools.center_window_cross_platform(self, width, height)
# Re-create widgets
for widget in self.winfo_children():
widget.destroy()
self.style_manager = StyleManager(self)
self.widget_manager = WidgetManager(self, self.settings)
self._update_view_mode_buttons()
self.navigate_to(self.current_dir)
def open_settings_dialog(self):
SettingsDialog(self)
def get_file_icon(self, filename, size='large'):
ext = os.path.splitext(filename)[1].lower()
@@ -74,6 +180,7 @@ class CustomFileDialog(tk.Toplevel):
return self.icon_manager.get_icon(f'iso_{size}')
return self.icon_manager.get_icon(f'file_{size}')
def toggle_hidden_files(self):
self.show_hidden_files.set(not self.show_hidden_files.get())
if self.show_hidden_files.get():
@@ -142,15 +249,15 @@ 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.focus_set() # Set focus to path entry
self.widget_manager.path_entry.select_range(0, tk.END)
self.after(50, lambda: self.widget_manager.path_entry.focus_set()) # Set focus reliably
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=2)
else:
# Exit search mode
self.search_mode = False
@@ -177,22 +284,25 @@ class CustomFileDialog(tk.Toplevel):
self.widget_manager.recursive_button.configure(
style="Header.TButton.Borderless.Round")
def _update_view_mode_buttons(self):
"""Set the visual state of the view mode buttons."""
if self.view_mode.get() == "icons":
self.widget_manager.icon_view_button.configure(style="Header.TButton.Active.Round")
self.widget_manager.list_view_button.configure(style="Header.TButton.Borderless.Round")
else:
self.widget_manager.list_view_button.configure(style="Header.TButton.Active.Round")
self.widget_manager.icon_view_button.configure(style="Header.TButton.Borderless.Round")
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.list_view_button.configure(
style="Header.TButton.Borderless.Round")
self._update_view_mode_buttons()
self.populate_files()
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.icon_view_button.configure(
style="Header.TButton.Borderless.Round")
self._update_view_mode_buttons()
self.populate_files()
def clear_search_placeholder(self, event):