v1.9.1: PNG Material Design icons — 28 icons, dark/light theme, HiDPI, graceful Unicode fallback
- 56 PNG icons (28 unique × 2 color variants) from Material Design Icons (round style, 96×96px) - core/icons.py: ctk_icon(), make_icon_button(), reconfigure_icon_button() with CTkImage cache - Updated 15 GUI files: app.py, sidebar.py, server_dialog.py, all tabs - build.py: auto-include assets/icons/ in PyInstaller bundle, patch rollover at 99→minor+1 - tools/download_icons.py: icon download script - Automatic dark↔light theme switching via CTkImage dual-image support Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -6,7 +6,7 @@ Form adapts visible fields based on selected server type.
|
||||
import customtkinter as ctk
|
||||
from core.server_store import SERVER_TYPES, DEFAULT_PORTS
|
||||
from core.i18n import t
|
||||
from core.icons import icon_text, type_display, type_from_display
|
||||
from core.icons import icon_text, type_display, type_from_display, make_icon_button, reconfigure_icon_button
|
||||
|
||||
|
||||
# Which conditional fields to show for each server type.
|
||||
@@ -160,7 +160,7 @@ class ServerDialog(ctk.CTkToplevel):
|
||||
pass_inner.pack(fill="x", padx=20, pady=(2, 5))
|
||||
self.password_entry = ctk.CTkEntry(pass_inner, show="*", placeholder_text=t("placeholder_password"))
|
||||
self.password_entry.pack(side="left", fill="x", expand=True, padx=(0, 5))
|
||||
self.show_pass = ctk.CTkButton(pass_inner, text=icon_text("eye", t("show")), width=70, command=self._toggle_password)
|
||||
self.show_pass = make_icon_button(pass_inner, "eye", t("show"), width=70, command=self._toggle_password)
|
||||
self.show_pass.pack(side="right")
|
||||
self._pass_visible = False
|
||||
self._field_frames["password"] = f
|
||||
@@ -286,8 +286,8 @@ class ServerDialog(ctk.CTkToplevel):
|
||||
# ── Always visible: Buttons ──
|
||||
btn_frame = ctk.CTkFrame(self, fg_color="transparent")
|
||||
btn_frame.pack(fill="x", padx=20, pady=(15, 20))
|
||||
ctk.CTkButton(btn_frame, text=icon_text("delete", t("cancel")), fg_color="#6b7280", command=self.destroy).pack(side="left", expand=True, padx=(0, 5))
|
||||
ctk.CTkButton(btn_frame, text=icon_text("confirm", t("save")), command=self._save).pack(side="right", expand=True, padx=(5, 0))
|
||||
make_icon_button(btn_frame, "close", t("cancel"), fg_color="#6b7280", command=self.destroy).pack(side="left", expand=True, padx=(0, 5))
|
||||
make_icon_button(btn_frame, "confirm", t("save"), command=self._save).pack(side="right", expand=True, padx=(5, 0))
|
||||
|
||||
# Fill values if editing
|
||||
if server:
|
||||
@@ -360,7 +360,7 @@ class ServerDialog(ctk.CTkToplevel):
|
||||
def _toggle_password(self):
|
||||
self._pass_visible = not self._pass_visible
|
||||
self.password_entry.configure(show="" if self._pass_visible else "*")
|
||||
self.show_pass.configure(text=icon_text("eye", t("hide") if self._pass_visible else t("show")))
|
||||
reconfigure_icon_button(self.show_pass, "eye", t("hide") if self._pass_visible else t("show"))
|
||||
|
||||
def _save(self):
|
||||
alias = self.alias_entry.get().strip()
|
||||
|
||||
Reference in New Issue
Block a user