From dba6138aa78297fae174032abe9c0ab971a053bc Mon Sep 17 00:00:00 2001 From: punix Date: Tue, 6 May 2025 19:47:14 +0200 Subject: [PATCH] optimize performance 06-05-2025 --- .idea/workspace.xml | 4 +- .vscode/settings.json | 2 +- Changelog | 2 +- __pycache__/cls_mth_fc.cpython-312.pyc | Bin 29714 -> 30387 bytes __pycache__/common_tools.cpython-312.pyc | Bin 0 -> 30660 bytes __pycache__/wp_app_config.cpython-312.pyc | Bin 9170 -> 9040 bytes cls_mth_fc.py => common_tools.py | 71 ++++++----- install | 10 +- manage_tunnel.py | 2 +- ssl_encrypt.py | 2 +- wirepy.py | 138 ++++++++++++++-------- wp_app_config.py | 7 -- 12 files changed, 140 insertions(+), 98 deletions(-) create mode 100644 __pycache__/common_tools.cpython-312.pyc rename cls_mth_fc.py => common_tools.py (92%) diff --git a/.idea/workspace.xml b/.idea/workspace.xml index e22a54e..dba3213 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -6,7 +6,7 @@ - + @@ -51,7 +51,7 @@ "keyToString": { "ASKED_ADD_EXTERNAL_FILES": "true", "Python.INSTALL.executor": "Run", - "Python.cls_mth_fc.executor": "Run", + "Python.common_tools.executor": "Run", "Python.install.executor": "Run", "Python.main.executor": "Run", "Python.messagebox.executor": "Run", diff --git a/.vscode/settings.json b/.vscode/settings.json index 34dfa2f..18313e7 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -2,5 +2,5 @@ "workbench.settings.openDefaultSettings": true "workbench.startupEditor": "none" "update.showReleaseNotes": false - "terminal.integrated.fontSize": 22 + "terminal.integrated.fontSize": 18 } \ No newline at end of file diff --git a/Changelog b/Changelog index f5c3d3e..8c67e92 100644 --- a/Changelog +++ b/Changelog @@ -3,7 +3,7 @@ My standard System: Linux Mint 22 Cinnamon ## [Unreleased] - - os import in cls_mth_fc.py replaced by other methods + - os import in common_tools.py replaced by other methods - If Wire-Py already runs, prevent further start - for loops with lists replaced by List Comprehensions diff --git a/__pycache__/cls_mth_fc.cpython-312.pyc b/__pycache__/cls_mth_fc.cpython-312.pyc index d1ce12316f634408ba823cf598851ce560a9e523..f8af799729cc47d1be98d439fc0730bd9991e94f 100644 GIT binary patch delta 1293 zcmZuwO>7%Q6rNe{+H3FH{mY*nH*AtRi4jeqgogCTf)pA=6PG|RZ6q3PJey`s{F7Oy zZK6m{qzDpPDWxOSNWG+Rs1cV&1`(tl0v8TkY7}J4Tzufb1>rP3zyXQ3>$FNMo;35` ze)D$U_r5oK^ADW+6MKGkyIlyZzSlSYYGln*9>8|?*T5@SW`Xc>?%Qx5#%;NO&wW$h zG7D+9kcNgaLBkxu!!{xlo5mAf6NsSMH3xhBxtfd@(ukdKV3?tuaCw>wdP{r)KU)Cse~w#*$Rofm{lh9#17{dN;%d$G>zr zjkKE9MlP$A{WIQ(e`K}#OM7S0h|O%(v{@8$vbB`o4}rZ3?cV3xO`L7=ZH($ItgH(S zwi)+MVdb<*C0r7&P(7_NU(DZ3qZpymo~aZu%Z};^q9-mHC1;wdQEfyegq@F_$TV>X z8RwzS94a?9FY?!=qW2&;XYuHr3-Y17d}#H9EGcyM<~w_Tl}}e}NN%Go@NtvM6XPLrz}k*r#NO@qvP`6og=#&Pn^L|UUE2>Lbk zvK9&l9dy)`(LR+hKVWG}?*VysEY_Og=pcmjENlkoh!lk?CU6N}nW^6yP3JQcc)?WM zyti}65_MTxk_w_PFZxz`HpM_ul%GL%iQT+9bob(&i-kaUKG40%1$x-`v2L#Ichv) z)`ib5WKVAN6%Y8b_#R%zj|5wzYf-3($mv;jExE4CW%hPzrDxw;I?e z!=V#qi8#AI*_??1xPZ1eK@hiOS$G4l7!_ptY-`o8cWfN}>C_LW^2Z0Oz=IFfZ7XBj z?-WjK)insA)sF1TcMew&gzH_~rrYY`h4#lVgzH_85IF01pemFPcF;a3o$IF#jBm0b OW6d4H?GF)bR?>eQop6Q# delta 839 zcmZvYO-vI}5Xax!?zYSB77OxKp|}(jn;(sX%Awv&yqKs-LrkoVCLFyOT8oJX56%{-7be*^|M}0`nO|P)C!YO* z3qRQH0)psHR0JOOLDl3Wc#8eZSAG?D z&}*Yd7|9WPI;t^swfW&afzY@v8v#`|Hl8Eji4~2B7GF!nBm6DKdBNKl2$)QMYIIc^IMs zA9(@@pf8$anh6YCNR~HH1N5ctbaa}i4PbAQ(iOdl@rX1!SV~<+VR4G>hZiB;=7=G4 zW`KH)nyY@OCsBssIX+V&aBXvX8bMmD&84NwaV2^^C*K=cvyrJN<=P|r77xwuPa}}= nmaLgFjaIIH%LW;5Sx44b%GibRWBU7c)ZT*Ye<3)C8y5ZpIo0T| diff --git a/__pycache__/common_tools.cpython-312.pyc b/__pycache__/common_tools.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bb299c76a01a906ddd52909e90bb88d195b8629c GIT binary patch literal 30660 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 s>t;)m1?!Xi z`nc(F-#%+-qRXDM(I39~;hXafI}`j)cDPRuq$MQQfgn-CpW&zj~;H%#|!mesDf4H9K%A(X9FrKw+7}#==cOxUfc`qKhG$x6~vh;wb@T$5pWCHu?0d|@)P?M>Jx#Xvx z;>fF{M$!-x`RTOrcgj4ry{2hUko25w(4IG1Zf^e5T|e2C?0iX!NSyTFV=3;{IBh%c zR8-lXn`xQd@?QHghv1E^_vmqFtJT(QL?d`(>wOLnt&>!FYYQWqnF${DBS3a$Oh=Oc zj(SL&j%I*_v1ERiy6K3XW*i(%GHxf+^AJN4oM;NqY-mVhDobOU4nWyS9j0TN>>@@_ zg@OYbZBF=-Oq&TaFR1MV1>>U-eU9pytD1S`VoGuVg{UQvV~vgafMJIfh*s#A0W|Iq z?TMEqe$%%2z$Ix4R%;a*63QzirqNJPw~|^rTMB^|w@YHZP!r;v z%+2&j^x#F)s|WPrfs2oW$$IkQ!4rDWXky~`Eof@z@SFMm^Zy<*@8;jkIS%c1iw+j& z?JDf~_8ebG@AID%WQTUw3}TzqE*T_GUf&50$w>XmlNKIfkN_eR6o&6K9AlvqNVZYWBF|#1n!$*@nO`DiZ)C zFvUGUR@lD#8u-4uJBS;9?SG5Eb2Ehz+8rS(x(>(B>+ zYAY*QWi7WUDTNZ1he49#s9SRz*>d?roxB5e>X1ibi_YNq X!0~T6{yi70k{{eCF@Dnlv|s%Lp6Is| delta 973 zcmZ9J&rcIU6vubk-IhXWDfAb#v`f*-f{2Php|nH;#Tr9mC^1$PYv0z^v|Zd?5Pn&T++!!a0u<8T5_!XTW2p*2&o{lHt=YdK8Jd4`)R)!6b%+ zh#7mGwgCi6%yt2HTD7^6ja>ErmN%_of067lVk}ctgQ>+MMsUpOMDiLlTtM-(Jt+lo zENX3raHN{?dF5QXz{^8^#L)EamyA_(-9<1HHEp^6XNC c)vTUkEZa2ufo8Ypz%u$thmherg`qvkU%v?9^#A|> diff --git a/cls_mth_fc.py b/common_tools.py similarity index 92% rename from cls_mth_fc.py rename to common_tools.py index ba9cb42..1be0ade 100755 --- a/cls_mth_fc.py +++ b/common_tools.py @@ -394,7 +394,7 @@ class ConfigManager: cls._config = { 'updates': lines[1].strip(), 'theme': lines[3].strip(), - 'tooltips': lines[5].strip() == 'True', + 'tooltips': lines[5].strip() == "True", # is converted here to boolean!!! 'autostart': lines[7].strip() if len(lines) > 7 else 'off' } except (IndexError, FileNotFoundError): @@ -402,7 +402,7 @@ class ConfigManager: cls._config = { 'updates': 'on', 'theme': 'light', - 'tooltips': True, + 'tooltips': "True", # Default Value as string ! 'autostart': 'off' } return cls._config @@ -532,57 +532,72 @@ class GiteaUpdate: LxTools.msg_window(AppConfig.IMAGE_PATHS["icon_error"], AppConfig.IMAGE_PATHS["icon_msg"], wt, msg_t) -class Tooltip: - """ - class for Tooltip - - import Tooltip - +class Tooltip(): + """Class for Tooltip + from common_tools.py import Tooltip example: Tooltip(label, "Show tooltip on label") example: Tooltip(button, "Show tooltip on button") - info: label and button are parent. + example: Tooltip(widget, "Text", state_var=tk.BooleanVar()) + + info: label and button are parent widgets. + NOTE: When using with state_var, pass the tk.BooleanVar object directly, + NOT its value. For example: use state_var=my_bool_var, NOT state_var=my_bool_var.get() """ - - def __init__(self, widget: Any, text: str, tips: Optional[bool] = None) -> None: - """ - Tooltip Class - """ - + def __init__(self, widget: Any, text: str, state_var: Optional[tk.BooleanVar] = None) -> None: + """Tooltip Class""" self.widget: Any = widget self.text: str = text self.tooltip_window: Optional[Toplevel] = None - if tips: + self.state_var = state_var + + # Initial binding based on current state + self.update_bindings() + + # Add trace to the state_var if provided + if self.state_var is not None: + self.state_var.trace_add("write", self.update_bindings) + + def update_bindings(self, *args) -> None: + """Updates the bindings based on the current state""" + # Remove existing bindings first + self.widget.unbind("") + self.widget.unbind("") + + # Add new bindings if tooltips are enabled + if self.state_var is None or self.state_var.get(): self.widget.bind("", self.show_tooltip) self.widget.bind("", self.hide_tooltip) - + def show_tooltip(self, event: Optional[Any] = None) -> None: - """ - Shows the tooltip - """ + """Shows the tooltip""" if self.tooltip_window or not self.text: return - + x: int y: int cx: int cy: int + x, y, cx, cy = self.widget.bbox("insert") x += self.widget.winfo_rootx() + 65 y += self.widget.winfo_rooty() + 40 + self.tooltip_window = tw = tk.Toplevel(self.widget) tw.wm_overrideredirect(True) tw.wm_geometry(f"+{x}+{y}") - - label: tk.Label = tk.Label(tw, text=self.text, background="lightgreen", foreground="black", relief="solid", - borderwidth=1, padx=5, pady=5) + + label: tk.Label = tk.Label( + tw, text=self.text, background="lightgreen", foreground="black", + relief="solid", borderwidth=1, padx=5, pady=5 + ) label.grid() + self.tooltip_window.after(2200, lambda: tw.destroy()) - + def hide_tooltip(self, event: Optional[Any] = None) -> None: - """ - Hides the tooltip - """ + """Hides the tooltip""" if self.tooltip_window: self.tooltip_window.destroy() self.tooltip_window = None + \ No newline at end of file diff --git a/install b/install index 8ca2607..0495dde 100755 --- a/install +++ b/install @@ -17,7 +17,7 @@ install_file_with(){ exit 0 else sudo apt install python3-tk && \ - sudo cp -fv wirepy.py start_wg.py wp_app_config.py cls_mth_fc.py ssl_encrypt.py ssl_decrypt.py /usr/local/bin/ && \ + sudo cp -fv wirepy.py start_wg.py wp_app_config.py common_tools.py ssl_encrypt.py ssl_decrypt.py /usr/local/bin/ && \ sudo cp -uR lx-icons /usr/share/icons/ && sudo cp -uR TK-Themes /usr/share/ && \ sudo cp -u languages/de/*.mo /usr/share/locale/de/LC_MESSAGES/ && \ sudo cp -fv Wire-Py.desktop /usr/share/applications/ && \ @@ -43,7 +43,7 @@ install_arch_d(){ exit 0 else sudo pacman -S --noconfirm tk python3 python-requests && \ - sudo cp -fv wirepy.py start_wg.py wp_app_config.py cls_mth_fc.py ssl_encrypt.py ssl_decrypt.py /usr/local/bin/ && \ + sudo cp -fv wirepy.py start_wg.py wp_app_config.py common_tools.py ssl_encrypt.py ssl_decrypt.py /usr/local/bin/ && \ sudo cp -uR lx-icons /usr/share/icons/ && sudo cp -uR TK-Themes /usr/share/ && \ sudo cp -u languages/de/*.mo /usr/share/locale/de/LC_MESSAGES/ && \ sudo cp -fv Wire-Py.desktop /usr/share/applications/ && \ @@ -120,7 +120,7 @@ install(){ exit 0 else sudo dnf install python3-tkinter -y - sudo cp -fv wirepy.py start_wg.py wp_app_config.py cls_mth_fc.py ssl_encrypt.py ssl_decrypt.py /usr/local/bin/ && \ + sudo cp -fv wirepy.py start_wg.py wp_app_config.py common_tools.py ssl_encrypt.py ssl_decrypt.py /usr/local/bin/ && \ sudo cp -uR lx-icons /usr/share/icons/ && sudo cp -uR TK-Themes /usr/share/ && \ sudo cp -u languages/de/*.mo /usr/share/locale/de/LC_MESSAGES/ && \ sudo cp -fv Wire-Py.desktop /usr/share/applications/ && \ @@ -145,7 +145,7 @@ install(){ rm -r ~/.config/wire_py && rm -r ~/.config/systemd exit 0 else - sudo cp -fv wirepy.py start_wg.py wp_app_config.py cls_mth_fc.py ssl_encrypt.py ssl_decrypt.py /usr/local/bin/ && \ + sudo cp -fv wirepy.py start_wg.py wp_app_config.py common_tools.py ssl_encrypt.py ssl_decrypt.py /usr/local/bin/ && \ sudo cp -uR lx-icons /usr/share/icons/ && sudo cp -uR TK-Themes /usr/share/ && \ sudo cp -u languages/de/*.mo /usr/share/locale/de/LC_MESSAGES/ && \ sudo cp -fv Wire-Py.desktop /usr/share/applications/ && \ @@ -181,7 +181,7 @@ install(){ remove(){ sudo rm -f /usr/local/bin/wirepy /usr/local/bin/wirepy.py /usr/local/bin/start_wg.py \ - /usr/local/bin/wp_app_config.py cls_mth_fc.py /usr/local/bin/ssl_encrypt.py /usr/local/bin/ssl_decrypt.py + /usr/local/bin/wp_app_config.py common_tools.py /usr/local/bin/ssl_encrypt.py /usr/local/bin/ssl_decrypt.py if [ $? -ne 0 ] then exit 0 diff --git a/manage_tunnel.py b/manage_tunnel.py index 04cdcb2..7199260 100644 --- a/manage_tunnel.py +++ b/manage_tunnel.py @@ -2,7 +2,7 @@ from pathlib import Path from subprocess import check_call from tkinter import filedialog, ttk -from cls_mth_fc import Create, LxTools +from common_tools import Create, LxTools from wp_app_config import AppConfig, Msg import gettext import locale diff --git a/ssl_encrypt.py b/ssl_encrypt.py index df62157..9710ece 100755 --- a/ssl_encrypt.py +++ b/ssl_encrypt.py @@ -5,7 +5,7 @@ import os import shutil from pathlib import Path from subprocess import check_call -from cls_mth_fc import LxTools +from common_tools import LxTools from wp_app_config import AppConfig #uname: Path = Path("/tmp/.log_user") diff --git a/wirepy.py b/wirepy.py index 181d298..fe4549c 100755 --- a/wirepy.py +++ b/wirepy.py @@ -14,7 +14,7 @@ from pathlib import Path from subprocess import check_call from tkinter import TclError, filedialog, ttk -from cls_mth_fc import (ConfigManager, ThemeManager, Create, GiteaUpdate, Tunnel, Tooltip, LxTools) +from common_tools import (ConfigManager, ThemeManager, Create, GiteaUpdate, Tunnel, Tooltip, LxTools) from wp_app_config import AppConfig, Msg LxTools.uos() @@ -43,6 +43,7 @@ class Wirepy(tk.Tk): ConfigManager.init(AppConfig.SETTINGS_FILE) theme = ConfigManager.get("theme") ThemeManager.change_theme(self, theme) + # Load the image file from the disk self.wg_icon = tk.PhotoImage(file=AppConfig.IMAGE_PATHS["icon_vpn"]) @@ -56,16 +57,15 @@ class FrameWidgets(ttk.Frame): """ ttk frame class for better structure """ - def __init__(self, container, tips_enabled=None, **kwargs): + def __init__(self, container, **kwargs): super().__init__(container, **kwargs) - + self.lb_tunnel = None self.btn_stst = None self.endpoint = None self.dns = None self.address = None self.auto_con = None - self.tips_enabled = tips_enabled self.style = ttk.Style() self.wg_vpn_start = tk.PhotoImage(file=AppConfig.IMAGE_PATHS["icon_start"]) self.wg_vpn_stop = tk.PhotoImage(file=AppConfig.IMAGE_PATHS["icon_stop"]) @@ -73,10 +73,26 @@ class FrameWidgets(ttk.Frame): self.tr_pic = tk.PhotoImage(file=AppConfig.IMAGE_PATHS["icon_trash"]) self.exp_pic = tk.PhotoImage(file=AppConfig.IMAGE_PATHS["icon_export"]) self.warning_pic = tk.PhotoImage(file=AppConfig.IMAGE_PATHS["icon_error"]) - self.tips_enabled = tips_enabled if tips_enabled is not None else ConfigManager.get("tooltip") + # StringVar-Variables initialization - self.update_label = tk.StringVar() - self.update_tooltip = tk.StringVar() + self.tooltip_state = tk.BooleanVar() + # Get value from configuration + state = ConfigManager.get("tooltips") + # NOTE: ConfigManager.get("tooltips") can return either a boolean value or a string, + # depending on whether the value was loaded from the file (bool) or the default value is used (string). + # The expression 'lines[5].strip() == "True"' in ConfigManager.load() converts the string to a boolean. + # Convert to boolean and set + if isinstance(state, bool): + # If it's already a boolean, use directly + self.tooltip_state.set(state) + else: + # If it's a string or something else + self.tooltip_state.set(str(state) == "True") + + self.tooltip_label = tk.StringVar() # StringVar-Variable for tooltip label for view Disabled/Enabled + self.tooltip_update_label() + self.update_label = tk.StringVar() # StringVar-Variable for update label + self.update_tooltip = tk.StringVar() # StringVar-Variable for update tooltip please not remove! self.update_foreground = tk.StringVar(value="red") # Frame for Menu @@ -89,25 +105,25 @@ class FrameWidgets(ttk.Frame): self.version_lb.config(font=("Ubuntu", 11), foreground="#00c4ff") self.version_lb.grid(column=0, row=0, rowspan=4, padx=10) - Tooltip(self.version_lb, f"Version: {AppConfig.VERSION[2:]}", self.tips_enabled) + Tooltip(self.version_lb, f"Version: {AppConfig.VERSION[2:]}", self.tooltip_state) self.options_btn = ttk.Menubutton(self.menu_frame, text=_("Options")) self.options_btn.grid(column=1, columnspan=1, row=0) - Tooltip(self.options_btn, _("Click for Settings"), self.tips_enabled) + Tooltip(self.options_btn, _("Click for Settings"), self.tooltip_state) self.set_update = tk.IntVar() - self.set_tip = tk.BooleanVar() self.settings = tk.Menu(self, relief="flat") self.options_btn.configure(menu=self.settings, style="Toolbutton") self.settings.add_checkbutton(label=_("Disable Updates"), command=lambda: self.update_setting(self.set_update.get()), variable=self.set_update) - self.settings.add_command(label=_("Disable Tooltips"), - command=lambda: self.tooltip(self.set_tip.get()), variable=self.set_tip) self.updates_lb = ttk.Label(self.menu_frame) res = GiteaUpdate.api_down(AppConfig.UPDATE_URL, AppConfig.VERSION, ConfigManager.get("updates")) self.update_ui_for_update(res) + + # Tooltip Menu + self.settings.add_command(label=self.tooltip_label.get(), command=self.tooltips_toggle) # Label show dark or light self.theme_label = tk.StringVar() self.update_theme_label() @@ -119,10 +135,6 @@ class FrameWidgets(ttk.Frame): self.about_btn.grid(column=2, columnspan=2, row=0) self.readme = tk.Menu(self) - - # View Checkbox to enable or disable Tooltip - self.set_tip.set(value=not self.tips_enabled) - self.a = Tunnel.active() # Label Frame 1 @@ -204,7 +216,7 @@ class FrameWidgets(ttk.Frame): self.btn_i = ttk.Button(self.lb_frame_btn_lbox, image=self.imp_pic, command=self.import_sl, padding=0) self.btn_i.grid(column=0, row=1, padx=15, pady=8) - Tooltip(self.btn_i, _("Click to import a Wireguard Tunnel"), self.tips_enabled) + Tooltip(self.btn_i, _("Click to import a Wireguard Tunnel"), self.tooltip_state) # Button Trash self.btn_tr = ttk.Button(self.lb_frame_btn_lbox, image=self.tr_pic, command=self.delete, padding=0, @@ -212,9 +224,9 @@ class FrameWidgets(ttk.Frame): self.btn_tr.grid(column=0, row=2, padx=15, pady=8) if self.l_box.size() == 0: - Tooltip(self.btn_tr, _("No tunnels to delete in the list"), self.tips_enabled) + Tooltip(self.btn_tr, _("No tunnels to delete in the list"), self.tooltip_state) else: - Tooltip(self.btn_tr, _("Click to delete a Wireguard Tunnel\nSelect from the list!"), self.tips_enabled) + Tooltip(self.btn_tr, _("Click to delete a Wireguard Tunnel\nSelect from the list!"), self.tooltip_state) # Button Export self.btn_exp = ttk.Button(self.lb_frame_btn_lbox, image=self.exp_pic, @@ -226,9 +238,9 @@ class FrameWidgets(ttk.Frame): self.btn_exp.grid(column=0, row=3, padx=15, pady=8) if self.l_box.size() == 0: - Tooltip(self.btn_exp, _("No Tunnels in List for Export"), self.tips_enabled) + Tooltip(self.btn_exp, _("No Tunnels in List for Export"), self.tooltip_state) else: - Tooltip(self.btn_exp, _("Click to export all\nWireguard Tunnel to Zipfile"), self.tips_enabled) + Tooltip(self.btn_exp, _("Click to export all\nWireguard Tunnel to Zipfile"), self.tooltip_state) # Label Entry self.lb_rename = ttk.Entry(self.lb_frame4, width=20) @@ -237,9 +249,9 @@ class FrameWidgets(ttk.Frame): self.lb_rename.config(state="disable") if self.l_box.size() != 0: - Tooltip(self.lb_rename, _("To rename a tunnel, you need to\nselect a tunnel from the list"), self.tips_enabled) + Tooltip(self.lb_rename, _("To rename a tunnel, you need to\nselect a tunnel from the list"), self.tooltip_state) else: - Tooltip(self.lb_rename, _("To rename a tunnel, at least one must be in the list"), self.tips_enabled) + Tooltip(self.lb_rename, _("To rename a tunnel, at least one must be in the list"), self.tooltip_state) # Button Rename self.btn_rename = ttk.Button(self.lb_frame4, text=_("Rename"), state="disable", command=self.tl_rename, @@ -260,14 +272,14 @@ class FrameWidgets(ttk.Frame): self.wg_autostart.grid(column=0, row=0, pady=15, padx=15, sticky="nw") if self.l_box.size() >= 1 and len(self.l_box.curselection()) >= 1: - Tooltip(self.wg_autostart, Msg.TTIP["autostart"], tself.tips_enabled) + Tooltip(self.wg_autostart, Msg.TTIP["autostart"], self.tooltip_state) if self.l_box.size() == 0: - Tooltip(self.wg_autostart, Msg.TTIP["autostart_info"], self.tips_enabled) + Tooltip(self.wg_autostart, Msg.TTIP["autostart_info"], self.tooltip_state) else: - Tooltip(self.wg_autostart, Msg.TTIP["autostart"], self.tips_enabled) + Tooltip(self.wg_autostart, Msg.TTIP["autostart"], self.tooltip_state) self.on_off() @@ -290,7 +302,7 @@ class FrameWidgets(ttk.Frame): foreground=self.update_foreground.get() ) self.updates_lb.grid(column=4, columnspan=3, row=0, padx=10) - Tooltip(self.updates_lb, self.update_tooltip.get(), self.tips_enabled) + Tooltip(self.updates_lb, self.update_tooltip.get(), self.tooltip_state) elif res == "No Internet Connection!": self.update_label.set(_("No Server Connection!")) @@ -322,7 +334,7 @@ class FrameWidgets(ttk.Frame): foreground=self.update_foreground.get() ) self.updates_lb.grid(column=4, columnspan=3, row=0, padx=10) - Tooltip(self.updates_lb, self.update_tooltip.get(), self.tips_enabled) + Tooltip(self.updates_lb, self.update_tooltip.get(), self.tooltip_state) else: self.set_update.set(value=0) @@ -336,7 +348,7 @@ class FrameWidgets(ttk.Frame): # Create the update button if it doesn't exist yet self.update_btn = ttk.Menubutton(self.menu_frame, text=update_text) self.update_btn.grid(column=4, columnspan=3, row=0, padx=0) - Tooltip(self.update_btn, _("Click to download new version"), self.tips_enabled) + Tooltip(self.update_btn, _("Click to download new version"), self.tooltip_state) self.download = tk.Menu(self, relief="flat") self.update_btn.configure(menu=self.download, style="Toolbutton") @@ -350,8 +362,8 @@ class FrameWidgets(ttk.Frame): AppConfig.IMAGE_PATHS["icon_error"], AppConfig.IMAGE_PATHS["icon_msg"] ) - ) -} + ) + def tooltip(self, tip) -> None: """ Aktualisiert die Tooltip-Einstellung im ConfigManager @@ -361,7 +373,7 @@ class FrameWidgets(ttk.Frame): # Beachten Sie die umgekehrte Logik: tip=True bedeutet Tooltips deaktivieren ConfigManager.set("tooltip", not tip) # Aktualisieren Sie die lokale Variable für sofortige Wirkung - self.tips_enabled = not tip + self.tooltip_state = not tip @staticmethod def about() -> None: @@ -403,7 +415,7 @@ class FrameWidgets(ttk.Frame): foreground=self.update_foreground.get() ) self.updates_lb.grid(column=4, columnspan=3, row=0, padx=10) - Tooltip(self.updates_lb, self.update_tooltip.get(), self.tips_enabled) + Tooltip(self.updates_lb, self.update_tooltip.get(), self.tooltip_state) elif res == "No Internet Connection!": self.update_label.set(_("No Server Connection!")) @@ -427,7 +439,7 @@ class FrameWidgets(ttk.Frame): foreground=self.update_foreground.get() ) self.updates_lb.grid(column=4, columnspan=3, row=0, padx=10) - Tooltip(self.updates_lb, self.update_tooltip.get(), self.tips_enabled) + Tooltip(self.updates_lb, self.update_tooltip.get(), self.tooltip_state) else: # We have an update available @@ -443,7 +455,7 @@ class FrameWidgets(ttk.Frame): # Create the update button if it doesn't exist yet self.update_btn = ttk.Menubutton(self.menu_frame, text=update_text) self.update_btn.grid(column=4, columnspan=3, row=0, padx=0) - Tooltip(self.update_btn, _("Click to download new version"), self.tips_enabled) + Tooltip(self.update_btn, _("Click to download new version"), self.tooltip_state) self.download = tk.Menu(self, relief="flat") self.update_btn.configure(menu=self.download, style="Toolbutton") @@ -510,13 +522,35 @@ class FrameWidgets(ttk.Frame): # Fallback to a default message if there's an error self.update_ui_for_update_status("No Internet Connection!") - def update_tooletip_label(self) -> str: - """Update the theme label based on current theme""" - current_value = ConfigManager.get("tooletip") - if current_value == "True": - self.set_tip.set(_("Enable Tooltips")) + def tooltip_update_label(self) -> None: + """Updates the tooltip menu label based on the current tooltip status""" + # Set the menu text based on the current status + if self.tooltip_state.get(): + # If tooltips are enabled, the menu option should be to disable them + self.tooltip_label.set(_("Disable Tooltips")) else: - self.set_tip.set(_("Disable Tooltips")) + # If tooltips are disabled, the menu option should be to enable them + self.tooltip_label.set(_("Enable Tooltips")) + + + def tooltips_toggle(self): + """Toggles tooltips on/off and updates the menu label""" + # Toggle the boolean state + new_bool_state = not self.tooltip_state.get() + + # Save the converted value in the configuration + ConfigManager.set("tooltips", str(new_bool_state)) + print(f"Tooltips are now: {new_bool_state} in ConfigManager") + # Update the tooltip_state variable for immediate effect + self.tooltip_state.set(new_bool_state) + + # Update the menu label + self.tooltip_update_label() + + # Update the menu entry - find the correct index + # This assumes it's the third item (index 2) in your menu + self.settings.entryconfigure(1, label=self.tooltip_label.get()) + def update_theme_label(self) -> str: """Update the theme label based on current theme""" @@ -546,9 +580,9 @@ class FrameWidgets(ttk.Frame): tl = LxTools.get_file_name(AppConfig.TEMP_DIR) if len(self.tl) == 0: - Tooltip(self.btn_stst, Msg.TTIP["empty_list"], self.tips_enabled) + Tooltip(self.btn_stst, Msg.TTIP["empty_list"], self.tooltip_state) else: - Tooltip(self.btn_stst, Msg.TTIP["start_tl"], self.tips_enabled) + Tooltip(self.btn_stst, Msg.TTIP["start_tl"], self.tooltip_state) def handle_tunnel_data(self, tunnel_name: str) -> tuple[str, str, str, str | None]: """_summary_ @@ -588,7 +622,7 @@ class FrameWidgets(ttk.Frame): command=lambda: self.wg_switch("stop"), padding=0) self.btn_stst.grid(column=0, row=0, padx=5, pady=8) - Tooltip(self.btn_stst, Msg.TTIP["stop_tl"], self.tips_enabled) + Tooltip(self.btn_stst, Msg.TTIP["stop_tl"], self.tooltip_state) def reset_fields(self) -> None: """ @@ -664,10 +698,10 @@ class FrameWidgets(ttk.Frame): self.l_box.update() self.l_box.selection_set(0) - Tooltip(self.wg_autostart, Msg.TTIP["autostart"], self.tips_enabled) - Tooltip(self.btn_tr, Msg.TTIP["trash_tl"], self.tips_enabled) - Tooltip(self.btn_exp, Msg.TTIP["export_tl"], self.tips_enabled) - Tooltip(self.btn_rename, Msg.TTIP["rename_tl"], self.tips_enabled) + Tooltip(self.wg_autostart, Msg.TTIP["autostart"], self.tooltip_state) + Tooltip(self.btn_tr, Msg.TTIP["trash_tl"], self.tooltip_state) + Tooltip(self.btn_exp, Msg.TTIP["export_tl"], self.tooltip_state) + Tooltip(self.btn_rename, Msg.TTIP["rename_tl"], self.tooltip_state) self.lb_rename.insert(0, "Max. 12 characters!") self.str_var = tk.StringVar() @@ -730,11 +764,11 @@ class FrameWidgets(ttk.Frame): self.wg_autostart.configure(state="disabled") self.lb_rename.configure(state="disabled") Tooltip(self.wg_autostart, _("You must have at least one\ntunnel in the list,to use the autostart") - , self.tips_enabled) + , self.tooltip_state) - Tooltip(self.btn_exp, _("No Tunnels in List for Export"), self.tips_enabled) - Tooltip(self.btn_stst, _("No tunnels to start in the list"), self.tips_enabled) - Tooltip(self.lb_rename, _("To rename a tunnel, at least one must be in the list"), tips, ) + Tooltip(self.btn_exp, _("No Tunnels in List for Export"), self.tooltip_state) + Tooltip(self.btn_stst, _("No tunnels to start in the list"), self.tooltip_state) + Tooltip(self.lb_rename, _("To rename a tunnel, at least one must be in the list"), self.tooltip_state) self.lb_rename.insert(0, _("Max. 12 characters!")) if self.a != "" and self.a == select_tl: diff --git a/wp_app_config.py b/wp_app_config.py index aa68942..f9f3684 100644 --- a/wp_app_config.py +++ b/wp_app_config.py @@ -30,13 +30,6 @@ class AppConfig: UPDATE_URL: str = "https://git.ilunix.de/api/v1/repos/punix/Wire-Py/releases" DOWNLOAD_URL: str = "https://git.ilunix.de/punix/Wire-Py/archive" - # Default settings - DEFAULT_SETTINGS: Dict[str, Any] = { - "updates": "on", - "theme": "light", - "tooltip": True, - "autostart": "off" - } # UI configuration UI_CONFIG: Dict[str, Any] = {