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

@@ -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] = {

View File

@@ -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)

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):

View File

@@ -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()