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