diff --git a/__pycache__/cfd_ui_setup.cpython-312.pyc b/__pycache__/cfd_ui_setup.cpython-312.pyc index fccfdf0..9e4eecd 100644 Binary files a/__pycache__/cfd_ui_setup.cpython-312.pyc and b/__pycache__/cfd_ui_setup.cpython-312.pyc differ diff --git a/__pycache__/custom_file_dialog.cpython-312.pyc b/__pycache__/custom_file_dialog.cpython-312.pyc index dd120cb..90746ca 100644 Binary files a/__pycache__/custom_file_dialog.cpython-312.pyc and b/__pycache__/custom_file_dialog.cpython-312.pyc differ diff --git a/custom_file_dialog.py b/custom_file_dialog.py index f3e669a..723f978 100644 --- a/custom_file_dialog.py +++ b/custom_file_dialog.py @@ -96,7 +96,7 @@ class SettingsDialog(tk.Toplevel): delete_frame.pack(fill="x", pady=5) self.use_trash_checkbutton = ttk.Checkbutton(delete_frame, text="Dateien in den Papierkorb verschieben (empfohlen)", - variable=self.use_trash) + variable=self.use_trash) self.use_trash_checkbutton.pack(anchor="w") if not SEND2TRASH_AVAILABLE: @@ -105,11 +105,11 @@ class SettingsDialog(tk.Toplevel): font=("TkDefaultFont", 9, "italic")).pack(anchor="w", padx=(20, 0)) self.confirm_delete_checkbutton = ttk.Checkbutton(delete_frame, text="Löschen/Verschieben ohne Bestätigung", - variable=self.confirm_delete) + variable=self.confirm_delete) self.confirm_delete_checkbutton.pack(anchor="w") # Disable deletion options in "open" mode - if self.dialog_mode == "open": + if not self.dialog_mode == "save": self.use_trash_checkbutton.config(state=tk.DISABLED) self.confirm_delete_checkbutton.config(state=tk.DISABLED) info_label = ttk.Label(delete_frame, text="(Löschoptionen sind nur im Speichern-Modus verfügbar)", @@ -215,7 +215,8 @@ class CustomFileDialog(tk.Toplevel): self.after(10, initial_load) # Bind the intelligent return handler - self.widget_manager.path_entry.bind("", self.handle_path_entry_return) + self.widget_manager.path_entry.bind( + "", self.handle_path_entry_return) # Bind the delete key only in "save" mode if self.dialog_mode == "save": @@ -365,12 +366,16 @@ class CustomFileDialog(tk.Toplevel): def show_more_menu(self): # Create and display the dropdown menu for hidden buttons more_menu = tk.Menu(self, tearoff=0, background=self.style_manager.header, foreground=self.style_manager.color_foreground, - activebackground=self.style_manager.selection_color, activeforeground=self.style_manager.color_foreground, relief='flat', borderwidth=0) + activebackground=self.style_manager.selection_color, activeforeground=self.style_manager.color_foreground, relief='flat', borderwidth=0) + + # Determine the state for folder/file creation options + is_writable = os.access(self.current_dir, os.W_OK) + creation_state = tk.NORMAL if is_writable and self.dialog_mode != "open" else tk.DISABLED more_menu.add_command(label="Neuer Ordner", command=self.create_new_folder, - image=self.icon_manager.get_icon('new_folder_small'), compound='left') + image=self.icon_manager.get_icon('new_folder_small'), compound='left', state=creation_state) more_menu.add_command(label="Neues Dokument", command=self.create_new_file, - image=self.icon_manager.get_icon('new_document_small'), compound='left') + image=self.icon_manager.get_icon('new_document_small'), compound='left', state=creation_state) more_menu.add_separator() more_menu.add_command(label="Kachelansicht", command=self.set_icon_view, image=self.icon_manager.get_icon('icon_view'), compound='left') @@ -379,8 +384,10 @@ class CustomFileDialog(tk.Toplevel): more_menu.add_separator() # Toggle hidden files option - hidden_files_label = "Versteckte Dateien ausblenden" if self.show_hidden_files.get() else "Versteckte Dateien anzeigen" - hidden_files_icon = self.icon_manager.get_icon('unhide') if self.show_hidden_files.get() else self.icon_manager.get_icon('hide') + hidden_files_label = "Versteckte Dateien ausblenden" if self.show_hidden_files.get( + ) else "Versteckte Dateien anzeigen" + hidden_files_icon = self.icon_manager.get_icon( + 'unhide') if self.show_hidden_files.get() else self.icon_manager.get_icon('hide') more_menu.add_command(label=hidden_files_label, command=self.toggle_hidden_files, image=hidden_files_icon, compound='left') @@ -438,7 +445,8 @@ class CustomFileDialog(tk.Toplevel): self.widget_manager.path_entry.insert(0, "Suchbegriff eingeben...") # Use after() to ensure the focus is set after the UI has updated self.after(10, lambda: self.widget_manager.path_entry.focus_set()) - self.after(20, lambda: self.widget_manager.path_entry.select_range(0, tk.END)) + self.after( + 20, lambda: self.widget_manager.path_entry.select_range(0, tk.END)) self.widget_manager.path_entry.bind( "", self.clear_search_placeholder) @@ -1085,7 +1093,7 @@ class CustomFileDialog(tk.Toplevel): child.state(['selected']) self.selected_item_frame = item_frame self.selected_file = path - self.update_status_bar(path) # Pass selected path + self.update_status_bar(path) # Pass selected path self.bind("", lambda e, p=path, f=item_frame: self.on_rename_request(e, p, f)) if self.dialog_mode == "save" and not os.path.isdir(path): @@ -1100,7 +1108,7 @@ class CustomFileDialog(tk.Toplevel): item_text = self.tree.item(item_id, 'text').strip() path = os.path.join(self.current_dir, item_text) self.selected_file = path - self.update_status_bar(path) # Pass selected path + self.update_status_bar(path) # Pass selected path if self.dialog_mode == "save" and not os.path.isdir(self.selected_file): self.widget_manager.filename_entry.delete(0, tk.END) self.widget_manager.filename_entry.insert(0, item_text) @@ -1230,7 +1238,8 @@ class CustomFileDialog(tk.Toplevel): if selected_path and os.path.exists(selected_path): if os.path.isdir(selected_path): # Display item count for directories - content_count = self._get_folder_content_count(selected_path) + content_count = self._get_folder_content_count( + selected_path) if content_count is not None: status_text = f"'{os.path.basename(selected_path)}' ({content_count} Einträge)" else: @@ -1270,7 +1279,8 @@ class CustomFileDialog(tk.Toplevel): if not self.selected_file or not os.path.exists(self.selected_file): return - use_trash = self.settings.get("use_trash", False) and SEND2TRASH_AVAILABLE + use_trash = self.settings.get( + "use_trash", False) and SEND2TRASH_AVAILABLE confirm = self.settings.get("confirm_delete", False) action_text = "in den Papierkorb verschieben" if use_trash else "endgültig löschen" @@ -1475,7 +1485,7 @@ class CustomFileDialog(tk.Toplevel): def update_action_buttons_state(self): is_writable = os.access(self.current_dir, os.W_OK) - state = tk.NORMAL if is_writable else tk.DISABLED + state = tk.NORMAL if is_writable and self.dialog_mode != "open" else tk.DISABLED self.widget_manager.new_folder_button.config(state=state) self.widget_manager.new_file_button.config(state=state) diff --git a/mainwindow.py b/mainwindow.py index c7d103a..690e400 100755 --- a/mainwindow.py +++ b/mainwindow.py @@ -33,7 +33,7 @@ class GlotzMol(tk.Tk): dialog = CustomFileDialog(self, initial_dir=os.path.expanduser("~"), filetypes=[("All Files", "*.*") - ]) + ], dialog_mode="save") # This is the crucial part: wait for the dialog to be closed self.wait_window(dialog)