commit 48
This commit is contained in:
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -47,7 +47,7 @@ class AppConfig:
|
||||
# UI configuration
|
||||
UI_CONFIG: Dict[str, Any] = {
|
||||
"window_size": (1050, 850),
|
||||
"window_min_size": (750, 550),
|
||||
"window_min_size": (650, 550),
|
||||
"font_family": "Ubuntu",
|
||||
"font_size": 11,
|
||||
"resizable_window": (True, True),
|
||||
@@ -69,10 +69,62 @@ class AppConfig:
|
||||
cls.SETTINGS_FILE.write_text(content)
|
||||
|
||||
|
||||
import json
|
||||
|
||||
# here is initializing the class for translation strings
|
||||
_ = Translate.setup_translations("custom_file_fialog")
|
||||
|
||||
|
||||
class CfdConfigManager:
|
||||
"""
|
||||
Manages CFD-specific settings using a JSON file for flexibility.
|
||||
"""
|
||||
_config = None
|
||||
_config_file = AppConfig.CONFIG_DIR / "cfd_settings.json"
|
||||
_default_settings = {
|
||||
"search_icon_pos": "left", # 'left' or 'right'
|
||||
"button_box_pos": "left", # 'left' or 'right'
|
||||
"window_size_preset": "1050x850", # e.g., "1050x850"
|
||||
"default_view_mode": "icons" # 'icons' or 'list'
|
||||
}
|
||||
|
||||
@classmethod
|
||||
def _ensure_config_file(cls):
|
||||
"""Ensures the config file exists with default values if not present."""
|
||||
if not cls._config_file.exists():
|
||||
try:
|
||||
cls._config_file.parent.mkdir(parents=True, exist_ok=True)
|
||||
with open(cls._config_file, 'w', encoding='utf-8') as f:
|
||||
json.dump(cls._default_settings, f, indent=4)
|
||||
except IOError as e:
|
||||
print(f"Error creating default settings file: {e}")
|
||||
|
||||
@classmethod
|
||||
def load(cls):
|
||||
"""Loads settings from the JSON file, applying defaults for missing keys."""
|
||||
cls._ensure_config_file()
|
||||
if cls._config is None:
|
||||
try:
|
||||
with open(cls._config_file, 'r', encoding='utf-8') as f:
|
||||
loaded_config = json.load(f)
|
||||
# Merge with defaults to ensure all keys are present
|
||||
cls._config = cls._default_settings.copy()
|
||||
cls._config.update(loaded_config)
|
||||
except (IOError, json.JSONDecodeError):
|
||||
cls._config = cls._default_settings.copy()
|
||||
return cls._config
|
||||
|
||||
@classmethod
|
||||
def save(cls, settings):
|
||||
"""Saves the given settings dictionary to the JSON file."""
|
||||
try:
|
||||
with open(cls._config_file, 'w', encoding='utf-8') as f:
|
||||
json.dump(settings, f, indent=4)
|
||||
cls._config = settings # Update cached config
|
||||
except IOError as e:
|
||||
print(f"Error saving settings: {e}")
|
||||
|
||||
|
||||
class Msg:
|
||||
|
||||
STR: Dict[str, str] = {
|
||||
|
181
cfd_ui_setup.py
181
cfd_ui_setup.py
@@ -101,9 +101,10 @@ class StyleManager:
|
||||
|
||||
|
||||
class WidgetManager:
|
||||
def __init__(self, dialog):
|
||||
def __init__(self, dialog, settings):
|
||||
self.dialog = dialog
|
||||
self.style_manager = dialog.style_manager
|
||||
self.settings = settings
|
||||
self.setup_widgets()
|
||||
|
||||
def setup_widgets(self):
|
||||
@@ -114,78 +115,74 @@ class WidgetManager:
|
||||
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 = ttk.Frame(main_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)
|
||||
top_bar.grid_columnconfigure(2, weight=1) # Make path entry column expandable
|
||||
|
||||
# Navigation buttons
|
||||
nav_buttons_container = ttk.Frame(top_bar, style='Accent.TFrame')
|
||||
nav_buttons_container.grid(row=0, column=0, sticky="w")
|
||||
# Left navigation buttons
|
||||
left_nav_container = ttk.Frame(top_bar, style='Accent.TFrame')
|
||||
left_nav_container.grid(row=0, column=0, sticky="w")
|
||||
|
||||
self.back_button = ttk.Button(nav_buttons_container, image=self.dialog.icon_manager.get_icon(
|
||||
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=20)
|
||||
self.back_button.pack(side="left", padx=(10, 5))
|
||||
Tooltip(self.back_button, "Zurück")
|
||||
|
||||
self.forward_button = ttk.Button(nav_buttons_container, image=self.dialog.icon_manager.get_icon(
|
||||
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=(0, 25))
|
||||
self.forward_button.pack(side="left", padx=5)
|
||||
Tooltip(self.forward_button, "Vorwärts")
|
||||
|
||||
self.home_button = ttk.Button(nav_buttons_container, image=self.dialog.icon_manager.get_icon(
|
||||
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=10)
|
||||
self.home_button.pack(side="left", padx=(5, 10))
|
||||
Tooltip(self.home_button, "Home")
|
||||
|
||||
# Search button (left position)
|
||||
search_icon_pos = self.settings.get("search_icon_pos", "left")
|
||||
if search_icon_pos == 'left':
|
||||
search_container_left = ttk.Frame(top_bar, style='Accent.TFrame')
|
||||
search_container_left.grid(row=0, column=1, sticky="w")
|
||||
self.search_button = ttk.Button(search_container_left, image=self.dialog.icon_manager.get_icon(
|
||||
'search_small'), command=self.dialog.toggle_search_mode, style="Header.TButton.Borderless.Round")
|
||||
self.search_button.pack(side="left", padx=5)
|
||||
Tooltip(self.search_button, "Suchen")
|
||||
|
||||
# Path entry
|
||||
self.path_entry = ttk.Entry(top_bar)
|
||||
self.path_entry.grid(row=0, column=1, sticky="ew")
|
||||
self.path_entry.bind(
|
||||
"<Return>", lambda e: self.dialog.navigate_to(self.path_entry.get()))
|
||||
self.path_entry.grid(row=0, column=2, sticky="ew")
|
||||
self.path_entry.bind("<Return>", lambda e: self.dialog.navigate_to(self.path_entry.get()))
|
||||
|
||||
# Search, view switch and hidden files button
|
||||
right_top_bar_frame = ttk.Frame(top_bar, style='Accent.TFrame')
|
||||
right_top_bar_frame.grid(row=0, column=2, sticky="e")
|
||||
# Right-side controls
|
||||
right_controls_container = ttk.Frame(top_bar, style='Accent.TFrame')
|
||||
right_controls_container.grid(row=0, column=3, sticky="e")
|
||||
|
||||
# Search button and options container
|
||||
search_container = ttk.Frame(
|
||||
right_top_bar_frame, style='Accent.TFrame')
|
||||
search_container.pack(side="left", padx=(0, 10))
|
||||
# Search button (right position)
|
||||
if search_icon_pos == 'right':
|
||||
search_container_right = ttk.Frame(right_controls_container, style='Accent.TFrame')
|
||||
search_container_right.pack(side="left", padx=5)
|
||||
self.search_button = ttk.Button(search_container_right, image=self.dialog.icon_manager.get_icon(
|
||||
'search_small'), command=self.dialog.toggle_search_mode, style="Header.TButton.Borderless.Round")
|
||||
self.search_button.pack(side="left")
|
||||
Tooltip(self.search_button, "Suchen")
|
||||
|
||||
self.search_button = ttk.Button(search_container, image=self.dialog.icon_manager.get_icon(
|
||||
'search_small'), command=self.dialog.toggle_search_mode, style="Header.TButton.Borderless.Round")
|
||||
self.search_button.pack(side="left")
|
||||
Tooltip(self.search_button, "Suchen")
|
||||
|
||||
# Search options frame (initially hidden, next to search button)
|
||||
self.search_options_frame = ttk.Frame(
|
||||
search_container, style='Accent.TFrame')
|
||||
|
||||
# Recursive search toggle button
|
||||
self.recursive_search = tk.BooleanVar(value=True)
|
||||
self.recursive_button = ttk.Button(self.search_options_frame, 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)
|
||||
Tooltip(self.recursive_button, "Rekursive Suche ein/ausschalten")
|
||||
|
||||
self.new_folder_button = ttk.Button(right_top_bar_frame, image=self.dialog.icon_manager.get_icon(
|
||||
# Other right-side buttons
|
||||
self.new_folder_button = ttk.Button(right_controls_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(right_top_bar_frame, image=self.dialog.icon_manager.get_icon(
|
||||
self.new_file_button = ttk.Button(right_controls_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=(0, 10))
|
||||
self.new_file_button.pack(side="left", padx=5)
|
||||
Tooltip(self.new_file_button, "Neues Dokument erstellen")
|
||||
|
||||
view_switch = ttk.Frame(right_top_bar_frame,
|
||||
padding=(5, 0), style='Accent.TFrame')
|
||||
view_switch = ttk.Frame(right_controls_container, padding=(5, 0), style='Accent.TFrame')
|
||||
view_switch.pack(side="left")
|
||||
|
||||
self.icon_view_button = ttk.Button(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, 10))
|
||||
self.icon_view_button.pack(side="left", padx=5)
|
||||
Tooltip(self.icon_view_button, "Kachelansicht")
|
||||
|
||||
self.list_view_button = ttk.Button(view_switch, image=self.dialog.icon_manager.get_icon(
|
||||
@@ -193,11 +190,24 @@ class WidgetManager:
|
||||
self.list_view_button.pack(side="left")
|
||||
Tooltip(self.list_view_button, "Listenansicht")
|
||||
|
||||
self.hidden_files_button = ttk.Button(right_top_bar_frame, image=self.dialog.icon_manager.get_icon(
|
||||
self.hidden_files_button = ttk.Button(right_controls_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.settings_button = ttk.Button(right_controls_container, image=self.dialog.icon_manager.get_icon(
|
||||
'settings-2_small'), command=self.dialog.open_settings_dialog, style="Header.TButton.Borderless.Round")
|
||||
self.settings_button.pack(side="left", padx=(0, 10))
|
||||
Tooltip(self.settings_button, "Einstellungen")
|
||||
|
||||
# Search options frame (initially hidden)
|
||||
self.search_options_frame = ttk.Frame(top_bar, style='Accent.TFrame')
|
||||
self.recursive_search = tk.BooleanVar(value=True)
|
||||
self.recursive_button = ttk.Button(self.search_options_frame, 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)
|
||||
Tooltip(self.recursive_button, "Rekursive Suche ein/ausschalten")
|
||||
|
||||
# Horizontal separator
|
||||
separator_color = "#000000" if self.style_manager.is_dark else "#9c9c9c"
|
||||
tk.Frame(main_frame, height=1, bg=separator_color).grid(
|
||||
@@ -360,59 +370,58 @@ class WidgetManager:
|
||||
bottom_controls_frame.grid(row=1, column=0, sticky="ew", pady=(5, 0))
|
||||
bottom_controls_frame.grid_columnconfigure(1, weight=1)
|
||||
|
||||
# Main action buttons (bottom-left)
|
||||
left_bottom_buttons = ttk.Frame(
|
||||
bottom_controls_frame, style="AccentBottom.TFrame")
|
||||
left_bottom_buttons.grid(row=0, column=0, sticky="w", pady=(5, 10))
|
||||
button_box_pos = self.settings.get("button_box_pos", "left")
|
||||
action_buttons_col = 0 if button_box_pos == 'left' else 2
|
||||
action_buttons_sticky = "w" if button_box_pos == 'left' else "e"
|
||||
|
||||
self.status_bar = ttk.Label(
|
||||
left_bottom_buttons, text="", anchor="w", style="AccentBottom.TLabel")
|
||||
action_buttons_frame = ttk.Frame(bottom_controls_frame, style="AccentBottom.TFrame")
|
||||
action_buttons_frame.grid(row=0, column=action_buttons_col, sticky=action_buttons_sticky, pady=(5, 10))
|
||||
|
||||
self.status_bar = ttk.Label(bottom_controls_frame, text="", anchor="w", style="AccentBottom.TLabel")
|
||||
self.status_bar.grid(row=0, column=1, sticky="ew", padx=10)
|
||||
|
||||
if self.dialog.dialog_mode == "save":
|
||||
left_bottom_buttons.grid_columnconfigure(1, weight=1)
|
||||
# Create a container for the top row (entry and save button)
|
||||
top_row = ttk.Frame(action_buttons_frame, style="AccentBottom.TFrame")
|
||||
top_row.pack(fill="x", expand=True)
|
||||
|
||||
# Widgets for save mode
|
||||
self.filename_entry = ttk.Entry(left_bottom_buttons, width=60)
|
||||
self.filename_entry.grid(row=0, column=1, padx=(
|
||||
0, 5), pady=(10, 10), sticky="ew")
|
||||
self.filename_entry = ttk.Entry(top_row)
|
||||
self.filename_entry.pack(side="left", fill="x", expand=True, padx=(10, 5))
|
||||
# Limit max width of the entry field
|
||||
self.filename_entry.bind("<Configure>", lambda e: e.widget.config(width=min(80, int(e.width/8))))
|
||||
|
||||
save_button = ttk.Button(
|
||||
left_bottom_buttons, text="Speichern", command=self.dialog.on_save)
|
||||
save_button.grid(row=0, column=0, padx=(10, 5), pady=10)
|
||||
save_button = ttk.Button(top_row, text="Speichern", command=self.dialog.on_save)
|
||||
save_button.pack(side="left", padx=(0, 10))
|
||||
|
||||
cancel_button = ttk.Button(
|
||||
left_bottom_buttons, text="Abbrechen", command=self.dialog.on_cancel)
|
||||
cancel_button.grid(row=1, column=0, padx=(10, 5), pady=(0, 10))
|
||||
# Create a container for the bottom row (cancel button and combobox)
|
||||
bottom_row = ttk.Frame(action_buttons_frame, style="AccentBottom.TFrame")
|
||||
bottom_row.pack(fill="x", expand=True, pady=(5,0))
|
||||
|
||||
self.filter_combobox = ttk.Combobox(left_bottom_buttons, values=[
|
||||
cancel_button = ttk.Button(bottom_row, text="Abbrechen", command=self.dialog.on_cancel)
|
||||
cancel_button.pack(side="left", padx=(10, 5))
|
||||
|
||||
self.filter_combobox = ttk.Combobox(bottom_row, values=[
|
||||
ft[0] for ft in self.dialog.filetypes], state="readonly")
|
||||
self.filter_combobox.grid(
|
||||
row=1, column=1, sticky="w", padx=(0, 10), pady=(0, 10))
|
||||
self.filter_combobox.bind(
|
||||
"<<ComboboxSelected>>", self.dialog.on_filter_change)
|
||||
self.filter_combobox.pack(side="left", padx=(0, 10))
|
||||
self.filter_combobox.bind("<<ComboboxSelected>>", self.dialog.on_filter_change)
|
||||
self.filter_combobox.set(self.dialog.filetypes[0][0])
|
||||
|
||||
self.status_bar.grid(
|
||||
row=0, column=1, sticky="w", padx=0, pady=(0, 5))
|
||||
else: # Open mode
|
||||
top_row = ttk.Frame(action_buttons_frame, style="AccentBottom.TFrame")
|
||||
top_row.pack(fill="x", expand=True)
|
||||
|
||||
open_button = ttk.Button(top_row, text="Öffnen", command=self.dialog.on_open)
|
||||
open_button.pack(side="left", padx=(10, 5))
|
||||
|
||||
else:
|
||||
# Open mode layout
|
||||
left_bottom_buttons.grid_columnconfigure(1, weight=1)
|
||||
bottom_row = ttk.Frame(action_buttons_frame, style="AccentBottom.TFrame")
|
||||
bottom_row.pack(fill="x", expand=True, pady=(5,0))
|
||||
|
||||
open_button = ttk.Button(
|
||||
left_bottom_buttons, text="Öffnen", command=self.dialog.on_open)
|
||||
open_button.grid(row=0, column=0, padx=(10, 5), pady=10)
|
||||
cancel_button = ttk.Button(bottom_row, text="Abbrechen", command=self.dialog.on_cancel)
|
||||
cancel_button.pack(side="left", padx=(10, 5))
|
||||
|
||||
cancel_button = ttk.Button(
|
||||
left_bottom_buttons, text="Abbrechen", command=self.dialog.on_cancel)
|
||||
cancel_button.grid(row=1, column=0, padx=(10, 5), pady=(0, 10))
|
||||
|
||||
self.filter_combobox = ttk.Combobox(left_bottom_buttons, values=[
|
||||
self.filter_combobox = ttk.Combobox(bottom_row, values=[
|
||||
ft[0] for ft in self.dialog.filetypes], state="readonly")
|
||||
self.filter_combobox.grid(
|
||||
row=1, column=1, sticky="w", padx=(0, 10), pady=(0, 10))
|
||||
self.filter_combobox.bind(
|
||||
"<<ComboboxSelected>>", self.dialog.on_filter_change)
|
||||
self.filter_combobox.pack(side="left", padx=(0, 10))
|
||||
self.filter_combobox.bind("<<ComboboxSelected>>", self.dialog.on_filter_change)
|
||||
self.filter_combobox.set(self.dialog.filetypes[0][0])
|
||||
|
||||
self.status_bar.grid(row=0, column=1, sticky="w", padx=0, pady=5)
|
||||
|
@@ -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):
|
||||
|
@@ -33,7 +33,7 @@ class GlotzMol(tk.Tk):
|
||||
dialog = CustomFileDialog(self,
|
||||
initial_dir=os.path.expanduser("~"),
|
||||
filetypes=[("All Files", "*.*")
|
||||
], dialog_mode="save", title="Save File")
|
||||
])
|
||||
|
||||
# This is the crucial part: wait for the dialog to be closed
|
||||
self.wait_window(dialog)
|
||||
@@ -55,7 +55,7 @@ if __name__ == "__main__":
|
||||
style = ttk.Style(root)
|
||||
root.tk.call('source', f"{theme_path}/water.tcl")
|
||||
try:
|
||||
root.tk.call('set_theme', 'light')
|
||||
root.tk.call('set_theme', 'dark')
|
||||
except tk.TclError:
|
||||
pass
|
||||
root.mainloop()
|
||||
|
Reference in New Issue
Block a user