diff --git a/core/server_store.py b/core/server_store.py index 8336a63..7a14bee 100644 --- a/core/server_store.py +++ b/core/server_store.py @@ -359,7 +359,6 @@ class ServerStore: if s["alias"] == alias: new_alias = updated.get("alias", alias) servers[i] = updated - # If alias changed, migrate status if new_alias != alias: with self._statuses_lock: old_status = self._statuses.pop(alias, None) diff --git a/gui/app.py b/gui/app.py index 06940b9..1998688 100644 --- a/gui/app.py +++ b/gui/app.py @@ -129,12 +129,9 @@ class App(ctk.CTk): if server: dialog = ServerDialog(self, self.store, server=server) self.wait_window(dialog) - # If alias was changed, re-select the new alias if dialog.result and dialog.result.get("alias") != alias: new_alias = dialog.result["alias"] - # Sidebar auto-refreshes via store subscription self.sidebar._select(new_alias) - # Migrate session pool reference self.session_pool.rename_server(alias, new_alias) else: self.info_tab.refresh() diff --git a/gui/server_dialog.py b/gui/server_dialog.py index 034156b..a1d5744 100644 --- a/gui/server_dialog.py +++ b/gui/server_dialog.py @@ -5,7 +5,6 @@ Server add/edit dialog — modal window with all server fields. import customtkinter as ctk from core.server_store import SERVER_TYPES, DEFAULT_PORTS from core.i18n import t -from gui.widgets.entry_undo import enable_undo def _get_network_interfaces() -> list[tuple[str, str]]: @@ -48,13 +47,11 @@ class ServerDialog(ctk.CTkToplevel): ctk.CTkLabel(self, text=t("alias"), anchor="w").pack(fill="x", **pad) self.alias_entry = ctk.CTkEntry(self, placeholder_text=t("placeholder_alias")) self.alias_entry.pack(fill="x", **entry_pad) - enable_undo(self.alias_entry) # IP ctk.CTkLabel(self, text=t("ip"), anchor="w").pack(fill="x", **pad) self.ip_entry = ctk.CTkEntry(self, placeholder_text=t("placeholder_ip")) self.ip_entry.pack(fill="x", **entry_pad) - enable_undo(self.ip_entry) # Type + Port row row = ctk.CTkFrame(self, fg_color="transparent") @@ -75,7 +72,6 @@ class ServerDialog(ctk.CTkToplevel): ctk.CTkLabel(port_frame, text=t("port"), anchor="w").pack(fill="x") self.port_entry = ctk.CTkEntry(port_frame, placeholder_text=t("placeholder_port")) self.port_entry.pack(fill="x") - enable_undo(self.port_entry) # Network interface ctk.CTkLabel(self, text=t("network_interface"), anchor="w").pack(fill="x", **pad) @@ -95,7 +91,6 @@ class ServerDialog(ctk.CTkToplevel): ctk.CTkLabel(self, text=t("username"), anchor="w").pack(fill="x", **pad) self.user_entry = ctk.CTkEntry(self, placeholder_text=t("placeholder_user")) self.user_entry.pack(fill="x", **entry_pad) - enable_undo(self.user_entry) # Password ctk.CTkLabel(self, text=t("password"), anchor="w").pack(fill="x", **pad) @@ -103,7 +98,6 @@ class ServerDialog(ctk.CTkToplevel): pass_frame.pack(fill="x", padx=20, pady=(2, 5)) self.password_entry = ctk.CTkEntry(pass_frame, show="*", placeholder_text=t("placeholder_password")) self.password_entry.pack(side="left", fill="x", expand=True, padx=(0, 5)) - enable_undo(self.password_entry) self.show_pass = ctk.CTkButton(pass_frame, text=t("show"), width=60, command=self._toggle_password) self.show_pass.pack(side="right") self._pass_visible = False @@ -113,7 +107,6 @@ class ServerDialog(ctk.CTkToplevel): self.totp_entry = ctk.CTkEntry(self, placeholder_text=t("placeholder_totp_secret"), font=ctk.CTkFont(family="Consolas", size=12)) self.totp_entry.pack(fill="x", **entry_pad) - enable_undo(self.totp_entry) # Skip status checks self.skip_check_var = ctk.BooleanVar(value=False) @@ -126,7 +119,6 @@ class ServerDialog(ctk.CTkToplevel): ctk.CTkLabel(self, text=t("notes"), anchor="w").pack(fill="x", **pad) self.notes_entry = ctk.CTkEntry(self, placeholder_text=t("placeholder_notes")) self.notes_entry.pack(fill="x", **entry_pad) - enable_undo(self.notes_entry) # Buttons btn_frame = ctk.CTkFrame(self, fg_color="transparent") @@ -221,7 +213,6 @@ class ServerDialog(ctk.CTkToplevel): try: if self.editing: - # Check for alias conflict if alias was changed if alias != self._original_alias and self.store.get_server(alias): self._show_error(t("alias_exists").format(alias=alias)) return diff --git a/gui/sidebar.py b/gui/sidebar.py index b432b0e..f95f44a 100644 --- a/gui/sidebar.py +++ b/gui/sidebar.py @@ -5,7 +5,6 @@ Sidebar — server list with search, add/edit/delete buttons. import customtkinter as ctk from core.i18n import t from gui.widgets.status_badge import StatusBadge -from gui.widgets.entry_undo import enable_undo class Sidebar(ctk.CTkFrame): @@ -30,7 +29,6 @@ class Sidebar(ctk.CTkFrame): self.search_var.trace_add("write", lambda *_: self._refresh_list()) self.search_entry = ctk.CTkEntry(self, placeholder_text=t("search"), textvariable=self.search_var) self.search_entry.pack(fill="x", padx=10, pady=(5, 10)) - enable_undo(self.search_entry) # Server list self.list_frame = ctk.CTkScrollableFrame(self, fg_color="transparent") diff --git a/gui/tabs/files_tab.py b/gui/tabs/files_tab.py index f33ebfd..20cd000 100644 --- a/gui/tabs/files_tab.py +++ b/gui/tabs/files_tab.py @@ -13,7 +13,6 @@ from tkinter import messagebox, filedialog import customtkinter as ctk from core.i18n import t -from gui.widgets.entry_undo import enable_undo from core.ssh_client import SFTPSession from gui.widgets.file_list import FileListWidget @@ -132,7 +131,6 @@ class FilesTab(ctk.CTkFrame): self._local_path_entry = ctk.CTkEntry(left_header, height=28) self._local_path_entry.pack(side="left", fill="x", expand=True, padx=(4, 0)) self._local_path_entry.bind("", lambda e: self._local_go_to_path()) - enable_undo(self._local_path_entry) self._local_list = FileListWidget( left_pane, @@ -179,7 +177,6 @@ class FilesTab(ctk.CTkFrame): self._remote_path_entry = ctk.CTkEntry(right_header, height=28) self._remote_path_entry.pack(side="left", fill="x", expand=True, padx=(4, 0)) self._remote_path_entry.bind("", lambda e: self._remote_go_to_path()) - enable_undo(self._remote_path_entry) self._remote_list = FileListWidget( right_pane, diff --git a/gui/tabs/totp_tab.py b/gui/tabs/totp_tab.py index bd38e13..703662f 100644 --- a/gui/tabs/totp_tab.py +++ b/gui/tabs/totp_tab.py @@ -6,7 +6,6 @@ Live countdown, one-click copy, per-server secrets. import threading import customtkinter as ctk from core.i18n import t -from gui.widgets.entry_undo import enable_undo class TOTPTab(ctk.CTkFrame): @@ -107,7 +106,6 @@ class TOTPTab(ctk.CTkFrame): font=ctk.CTkFont(family="Consolas", size=12) ) self.secret_entry.pack(side="left", fill="x", expand=True, padx=(0, 5)) - enable_undo(self.secret_entry) self.show_secret_btn = ctk.CTkButton( entry_row, text=t("show"), width=70, diff --git a/version.py b/version.py index d30403b..9793cb0 100644 --- a/version.py +++ b/version.py @@ -1,6 +1,6 @@ """Version info for ServerManager.""" -__version__ = "1.8.13" +__version__ = "1.8.17" __app_name__ = "ServerManager" __author__ = "aibot777" __description__ = "Desktop GUI for managing remote servers"