diff --git a/__pycache__/cfd_ui_setup.cpython-312.pyc b/__pycache__/cfd_ui_setup.cpython-312.pyc index 5fb54a4..d181f4b 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 2b8b8a6..a0620e7 100644 Binary files a/__pycache__/custom_file_dialog.cpython-312.pyc and b/__pycache__/custom_file_dialog.cpython-312.pyc differ diff --git a/cfd_ui_setup.py b/cfd_ui_setup.py index 7d9d06d..a63af08 100644 --- a/cfd_ui_setup.py +++ b/cfd_ui_setup.py @@ -342,30 +342,27 @@ class WidgetManager: self.action_status_frame.grid_columnconfigure(1, weight=1) self.action_status_frame.grid_rowconfigure(0, weight=1) - - self.left_container.grid(row=0, column=0, sticky='nsw', pady=(5,0)) - self.center_container.grid(row=0, column=1, sticky='nsew', padx=5, pady=(5,0)) - self.right_container.grid(row=0, column=2, sticky='nse', pady=(5,0)) + + self.left_container.grid(row=0, column=0, sticky='nsw', pady=(5, 0)) + self.center_container.grid(row=0, column=1, sticky='nsew', padx=5, pady=(5, 0)) + self.right_container.grid(row=0, column=2, sticky='nse', pady=(5, 0)) self.separator_color = "#a9a9a9" if self.style_manager.is_dark else "#7c7c7c" self.separator = tk.Frame(self.action_status_frame, height=1, bg=self.separator_color) - self.separator.grid(row=1, column=0, columnspan=3, sticky="ew", pady=(4,0)) + self.separator.grid(row=1, column=0, columnspan=3, sticky="ew", pady=(4, 0)) self.status_container.grid(row=2, column=0, columnspan=3, sticky='ew') - # --- Define Widgets --- self.search_status_label = ttk.Label(self.status_container, text="", style="AccentBottom.TLabel") - self.status_bar = ttk.Label(self.center_container, text="", anchor="w", style="AccentBottom.TLabel") - self.search_entry = ttk.Entry(self.center_container) + self.filename_entry = ttk.Entry(self.center_container) self.settings_button = ttk.Button(self.action_status_frame, image=self.dialog.icon_manager.get_icon('settings-2_small'), command=self.dialog.open_settings_dialog, style="Bottom.TButton.Borderless.Round") - self.trash_button = ttk.Button(self.action_status_frame, image=self.dialog.icon_manager.get_icon('trash_small2'), - command=self.dialog.delete_selected_item, style="Bottom.TButton.Borderless.Round") - Tooltip(self.trash_button, "Ausgewähltes Element löschen/verschieben") button_box_pos = self.settings.get("button_box_pos", "left") if self.dialog.dialog_mode == "save": - self.filename_entry = ttk.Entry(self.center_container) + self.trash_button = ttk.Button(self.action_status_frame, image=self.dialog.icon_manager.get_icon('trash_small2'), + command=self.dialog.delete_selected_item, style="Bottom.TButton.Borderless.Round") + Tooltip(self.trash_button, "Ausgewähltes Element löschen/verschieben") self.save_button = ttk.Button(self.action_status_frame, text="Speichern", command=self.dialog.on_save) self.cancel_button = ttk.Button(self.action_status_frame, text="Abbrechen", command=self.dialog.on_cancel) self.filter_combobox = ttk.Combobox(self.center_container, values=[ft[0] for ft in self.dialog.filetypes], state="readonly") @@ -387,9 +384,7 @@ class WidgetManager: self.filter_combobox.set(self.dialog.filetypes[0][0]) self.center_container.grid_rowconfigure(0, weight=1) - self.status_bar.grid(row=0, column=0, columnspan=2, sticky="ew") - self.search_entry.grid(row=0, column=0, columnspan=2, sticky="ew") - self.search_entry.grid_forget() + self.filename_entry.grid(row=0, column=0, columnspan=2, sticky="ew") if button_box_pos == 'left': self._layout_open_buttons_left() @@ -402,27 +397,26 @@ class WidgetManager: self.cancel_button.grid(in_=self.left_container, row=1, column=0) self.center_container.grid_columnconfigure(0, weight=1) - self.filter_combobox.grid(in_=self.center_container, row=1, column=0, sticky="w", pady=(5,0)) - self.search_status_label.grid(row=0, column=0, sticky="w", pady=(5,0), padx=(5,0)) + self.filter_combobox.grid(in_=self.center_container, row=1, column=0, sticky="w", pady=(5, 0)) + self.search_status_label.grid(row=0, column=0, sticky="w", pady=(5, 0), padx=(5, 0)) self.right_container.grid_rowconfigure(0, weight=1) self.settings_button.grid(in_=self.right_container, row=0, column=0, sticky="se") - self.trash_button.grid(in_=self.right_container, row=1, column=0, sticky="se", padx=(5,0)) + self.trash_button.grid(in_=self.right_container, row=1, column=0, sticky="se", padx=(5, 0)) def _layout_save_buttons_right(self): self.right_container.grid_rowconfigure(0, weight=1) self.left_container.grid_rowconfigure(0, weight=1) self.save_button.grid(in_=self.right_container, row=0, column=0, pady=(0, 5)) self.cancel_button.grid(in_=self.right_container, row=1, column=0) - self.settings_button.grid(in_=self.right_container, row=0, column=1, sticky="ne", padx=(5,0)) + self.settings_button.grid(in_=self.right_container, row=0, column=1, sticky="ne", padx=(5, 0)) self.left_container.grid_rowconfigure(0, weight=1) self.trash_button.grid(in_=self.left_container, row=0, column=0, sticky="sw") self.center_container.grid_columnconfigure(1, weight=1) - self.filter_combobox.grid(in_=self.center_container, row=1, column=1, sticky="e", pady=(5,0)) - self.search_status_label.grid(row=0, column=0, sticky="w", pady=(5,0), padx=(5,0)) - + self.filter_combobox.grid(in_=self.center_container, row=1, column=1, sticky="e", pady=(5, 0)) + self.search_status_label.grid(row=0, column=0, sticky="w", pady=(5, 0), padx=(5, 0)) def _layout_open_buttons_left(self): self.left_container.grid_rowconfigure(0, weight=1) @@ -430,8 +424,8 @@ class WidgetManager: self.cancel_button.grid(in_=self.left_container, row=1, column=0) self.center_container.grid_columnconfigure(0, weight=1) - self.filter_combobox.grid(in_=self.center_container, row=1, column=0, sticky="w", pady=(5,0)) - self.search_status_label.grid(row=0, column=1, sticky="w", pady=(5,0), padx=(5,0)) + self.filter_combobox.grid(in_=self.center_container, row=1, column=0, sticky="w", pady=(5, 0)) + self.search_status_label.grid(row=0, column=0, sticky="w", pady=(5, 0), padx=(5, 0)) self.right_container.grid_rowconfigure(0, weight=1) self.settings_button.grid(in_=self.right_container, row=0, column=0, sticky="ne") @@ -440,13 +434,13 @@ class WidgetManager: self.right_container.grid_rowconfigure(0, weight=1) self.open_button.grid(in_=self.right_container, row=0, column=0, pady=(0, 5)) self.cancel_button.grid(in_=self.right_container, row=1, column=0) - self.settings_button.grid(in_=self.right_container, row=0, column=1, sticky="ne", padx=(5,0)) + self.settings_button.grid(in_=self.right_container, row=0, column=1, sticky="ne", padx=(5, 0)) self.left_container.grid_rowconfigure(0, weight=1) self.center_container.grid_columnconfigure(1, weight=1) - self.filter_combobox.grid(in_=self.center_container, row=1, column=1, sticky="e", pady=(5,0)) - self.search_status_label.grid(row=0, column=0, sticky="w", pady=(5,0), padx=(5,0)) + self.filter_combobox.grid(in_=self.center_container, row=1, column=1, sticky="e", pady=(5, 0)) + self.search_status_label.grid(row=0, column=0, sticky="w", pady=(5, 0), padx=(5, 0)) diff --git a/custom_file_dialog.py b/custom_file_dialog.py index d8f5f92..7403b2e 100644 --- a/custom_file_dialog.py +++ b/custom_file_dialog.py @@ -241,37 +241,28 @@ class CustomFileDialog(tk.Toplevel): return self.search_mode = True - if self.dialog_mode == "open": - self.widget_manager.status_bar.grid_remove() - self.widget_manager.search_entry.grid(row=1, column=0, sticky="ew", in_=self.widget_manager.center_container) - self.widget_manager.center_container.grid_rowconfigure(1, weight=0) - self.widget_manager.search_entry.focus_set() - self.widget_manager.search_entry.insert(0, event.char) - self.widget_manager.search_entry.bind("", self.execute_search) - self.widget_manager.search_entry.bind("", self.hide_search_bar) - else: # save mode - self.widget_manager.filename_entry.focus_set() - self.widget_manager.filename_entry.insert(tk.END, event.char) - self.widget_manager.filename_entry.bind("", self.execute_search) - self.widget_manager.filename_entry.bind("", self.hide_search_bar) + self.widget_manager.filename_entry.focus_set() + # Clear the field before inserting the new character to start a fresh search + self.widget_manager.filename_entry.delete(0, tk.END) + self.widget_manager.filename_entry.insert(0, event.char) + self.widget_manager.filename_entry.bind("", self.execute_search) + self.widget_manager.filename_entry.bind("", self.hide_search_bar) def hide_search_bar(self, event=None): self.search_mode = False - if self.dialog_mode == "open": - self.widget_manager.search_entry.grid_forget() - self.widget_manager.status_bar.grid(row=1, column=0, sticky="ew", in_=self.widget_manager.center_container) - self.widget_manager.center_container.grid_rowconfigure(1, weight=0) - self.widget_manager.search_entry.delete(0, tk.END) - else: # save mode - self.widget_manager.filename_entry.delete(0, tk.END) + self.widget_manager.filename_entry.delete(0, tk.END) self.widget_manager.search_status_label.config(text="") + # Unbind search-specific events to restore normal behavior + self.widget_manager.filename_entry.unbind("") + self.widget_manager.filename_entry.unbind("") + # Re-bind the default save action for the save dialog + if self.dialog_mode == "save": + self.widget_manager.filename_entry.bind("", lambda e: self.on_save()) self.populate_files() def toggle_search_mode(self, event=None): - if self.search_mode: - self.hide_search_bar(event) - else: - self.show_search_bar(event) + # This method might not be needed anymore if search is always active in the entry + pass def handle_path_entry_return(self, event): """Handles the Enter key in the path entry to navigate. @@ -517,10 +508,7 @@ class CustomFileDialog(tk.Toplevel): def execute_search(self, event=None): - if self.dialog_mode == "open": - search_term = self.widget_manager.search_entry.get().strip() - else: - search_term = self.widget_manager.filename_entry.get().strip() + search_term = self.widget_manager.filename_entry.get().strip() if not search_term: self.hide_search_bar() @@ -714,20 +702,19 @@ class CustomFileDialog(tk.Toplevel): directory = item['values'][0] full_path = os.path.join(directory, filename) - # Update status bar + # Update status bar with details try: stat = os.stat(full_path) size_str = self._format_size(stat.st_size) - self.widget_manager.status_bar.config( + self.widget_manager.search_status_label.config( text=f"'{filename}' Größe: {size_str}") except (FileNotFoundError, PermissionError): - self.widget_manager.status_bar.config( + self.widget_manager.search_status_label.config( text=f"'{filename}' nicht zugänglich") - # If in save mode, update filename entry - if self.dialog_mode == "save": - self.widget_manager.filename_entry.delete(0, tk.END) - self.widget_manager.filename_entry.insert(0, filename) + # Update filename entry + self.widget_manager.filename_entry.delete(0, tk.END) + self.widget_manager.filename_entry.insert(0, filename) search_tree.bind("<>", on_search_select) @@ -909,7 +896,7 @@ class CustomFileDialog(tk.Toplevel): widget.bind("", _on_mouse_wheel) if warning: - self.widget_manager.status_bar.config(text=warning) + self.widget_manager.search_status_label.config(text=warning) if error: ttk.Label(container_frame, text=error).pack(pady=20) return @@ -1051,7 +1038,7 @@ class CustomFileDialog(tk.Toplevel): self.tree.bind("", self.on_list_context_menu) if warning: - self.widget_manager.status_bar.config(text=warning) + self.widget_manager.search_status_label.config(text=warning) if error: self.tree.insert("", "end", text=error, values=()) return @@ -1113,12 +1100,9 @@ class CustomFileDialog(tk.Toplevel): self.selected_item_frame = item_frame self.selected_file = 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): + if not os.path.isdir(path): self.widget_manager.filename_entry.delete(0, tk.END) - self.widget_manager.filename_entry.insert( - 0, os.path.basename(path)) + self.widget_manager.filename_entry.insert(0, os.path.basename(path)) def on_list_select(self, event): if not self.tree.selection(): @@ -1128,7 +1112,7 @@ class CustomFileDialog(tk.Toplevel): path = os.path.join(self.current_dir, item_text) self.selected_file = path self.update_status_bar(path) # Pass selected path - if self.dialog_mode == "save" and not os.path.isdir(self.selected_file): + if 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) @@ -1195,11 +1179,11 @@ class CustomFileDialog(tk.Toplevel): real_path = os.path.realpath( os.path.abspath(os.path.expanduser(path))) if not os.path.isdir(real_path): - self.widget_manager.status_bar.config( + self.widget_manager.search_status_label.config( text=f"Fehler: Verzeichnis '{os.path.basename(path)}' nicht gefunden.") return if not os.access(real_path, os.R_OK): - self.widget_manager.status_bar.config( + self.widget_manager.search_status_label.config( text=f"Zugriff auf '{os.path.basename(path)}' verweigert.") return self.current_dir = real_path @@ -1213,7 +1197,7 @@ class CustomFileDialog(tk.Toplevel): self.update_status_bar() self.update_action_buttons_state() except Exception as e: - self.widget_manager.status_bar.config(text=f"Fehler: {e}") + self.widget_manager.search_status_label.config(text=f"Fehler: {e}") def go_back(self): if self.history_pos > 0: @@ -1268,9 +1252,9 @@ class CustomFileDialog(tk.Toplevel): size = os.path.getsize(selected_path) size_str = self._format_size(size) status_text = f"'{os.path.basename(selected_path)}' Größe: {size_str}" - self.widget_manager.status_bar.config(text=status_text) + self.widget_manager.search_status_label.config(text=status_text) except FileNotFoundError: - self.widget_manager.status_bar.config( + self.widget_manager.search_status_label.config( text="Verzeichnis nicht gefunden") self.widget_manager.storage_label.config( text="Freier Speicher: Unbekannt") @@ -1325,7 +1309,7 @@ class CustomFileDialog(tk.Toplevel): os.remove(self.selected_file) self.populate_files() - self.widget_manager.status_bar.config( + self.widget_manager.search_status_label.config( text=f"'{item_name}' wurde erfolgreich entfernt.") except Exception as e: @@ -1354,7 +1338,7 @@ class CustomFileDialog(tk.Toplevel): open(new_path, 'a').close() self.populate_files(item_to_rename=new_name) except Exception as e: - self.widget_manager.status_bar.config( + self.widget_manager.search_status_label.config( text=f"Fehler beim Erstellen: {e}") def _get_unique_name(self, base_name): @@ -1369,7 +1353,7 @@ class CustomFileDialog(tk.Toplevel): def _copy_to_clipboard(self, data): self.clipboard_clear() self.clipboard_append(data) - self.widget_manager.status_bar.config( + self.widget_manager.search_status_label.config( text=f"'{self.shorten_text(data, 50)}' in Zwischenablage kopiert.") def _show_context_menu(self, event, item_path): @@ -1427,7 +1411,7 @@ class CustomFileDialog(tk.Toplevel): new_path = os.path.join(self.current_dir, new_name) if new_name and new_path != item_path: if os.path.exists(new_path): - self.widget_manager.status_bar.config( + self.widget_manager.search_status_label.config( text=f"'{new_name}' existiert bereits.") self.populate_files( item_to_select=os.path.basename(item_path)) @@ -1436,7 +1420,7 @@ class CustomFileDialog(tk.Toplevel): os.rename(item_path, new_path) self.populate_files(item_to_select=new_name) except Exception as e: - self.widget_manager.status_bar.config( + self.widget_manager.search_status_label.config( text=f"Fehler beim Umbenennen: {e}") self.populate_files() else: @@ -1480,7 +1464,7 @@ class CustomFileDialog(tk.Toplevel): if new_name and new_path != old_path: if os.path.exists(new_path): - self.widget_manager.status_bar.config( + self.widget_manager.search_status_label.config( text=f"'{new_name}' existiert bereits.") self.populate_files(item_to_select=item_text) else: @@ -1488,7 +1472,7 @@ class CustomFileDialog(tk.Toplevel): os.rename(old_path, new_path) self.populate_files(item_to_select=new_name) except Exception as e: - self.widget_manager.status_bar.config( + self.widget_manager.search_status_label.config( text=f"Fehler beim Umbenennen: {e}") self.populate_files() else: