fix: editable alias in server dialog + Ctrl+Z undo for all input fields

- Alias field no longer disabled when editing server profile
- Duplicate alias check on rename, session pool migration
- Enable undo (Ctrl+Z) on all CTkEntry widgets across the project

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
chrome-storm-c442
2026-02-24 05:17:21 -05:00
parent efb508c982
commit 7b0e7dd6ac
9 changed files with 240 additions and 3 deletions

View File

@@ -90,6 +90,7 @@ _EN = {
"show": "Show",
"hide": "Hide",
"alias_required": "Alias is required",
"alias_exists": "Alias '{alias}' already exists",
"ip_required": "IP is required",
"port_must_be_number": "Port must be a number",
"error_prefix": "Error: {msg}",
@@ -355,6 +356,7 @@ _RU = {
"show": "Показать",
"hide": "Скрыть",
"alias_required": "Алиас обязателен",
"alias_exists": "Алиас '{alias}' уже существует",
"ip_required": "IP обязателен",
"port_must_be_number": "Порт должен быть числом",
"error_prefix": "Ошибка: {msg}",
@@ -620,6 +622,7 @@ _ZH = {
"show": "显示",
"hide": "隐藏",
"alias_required": "别名不能为空",
"alias_exists": "别名 '{alias}' 已存在",
"ip_required": "IP不能为空",
"port_must_be_number": "端口必须是数字",
"error_prefix": "错误:{msg}",

View File

@@ -357,7 +357,14 @@ class ServerStore:
servers = self._data.get("servers", [])
for i, s in enumerate(servers):
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)
if old_status:
self._statuses[new_alias] = old_status
self._save()
self._notify()
return

View File

@@ -214,6 +214,17 @@ class SessionPool:
"""Clean up sessions when a server is deleted."""
self.disconnect_session(alias)
def rename_server(self, old_alias: str, new_alias: str):
"""Rename a server's session references (after alias change)."""
with self._lock:
if old_alias in self._sessions:
session_data = self._sessions.pop(old_alias)
session_data.alias = new_alias
self._sessions[new_alias] = session_data
if old_alias in self._last_used_order:
ts = self._last_used_order.pop(old_alias)
self._last_used_order[new_alias] = ts
def get_active_sessions(self) -> list:
"""Get list of aliases for active sessions."""
with self._lock: