add class Image for icon managment
This commit is contained in:
		@@ -19,6 +19,8 @@ My standard System: Linux Mint 22 Cinnamon
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 - ui works now better with rename button
 | 
					 - ui works now better with rename button
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 - add Image class for manage Images
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   ### Added
 | 
					   ### Added
 | 
				
			||||||
23-06-2025
 | 
					23-06-2025
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										41
									
								
								wirepy.py
									
									
									
									
									
								
							
							
						
						
									
										41
									
								
								wirepy.py
									
									
									
									
									
								
							@@ -24,7 +24,7 @@ from shared_libs.common_tools import (
 | 
				
			|||||||
    Tooltip,
 | 
					    Tooltip,
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from wp_app_config import AppConfig, Msg
 | 
					from shared_libs.wp_app_config import AppConfig, Image, Msg
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class Wirepy(tk.Tk):
 | 
					class Wirepy(tk.Tk):
 | 
				
			||||||
@@ -39,6 +39,7 @@ class Wirepy(tk.Tk):
 | 
				
			|||||||
        self.withdraw()
 | 
					        self.withdraw()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        self.my_tool_tip = None
 | 
					        self.my_tool_tip = None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        self.x_width = AppConfig.UI_CONFIG["window_size"][0]
 | 
					        self.x_width = AppConfig.UI_CONFIG["window_size"][0]
 | 
				
			||||||
        self.y_height = AppConfig.UI_CONFIG["window_size"][1]
 | 
					        self.y_height = AppConfig.UI_CONFIG["window_size"][1]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -53,17 +54,19 @@ class Wirepy(tk.Tk):
 | 
				
			|||||||
            AppConfig.UI_CONFIG["window_size"][1],
 | 
					            AppConfig.UI_CONFIG["window_size"][1],
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
        self.title(AppConfig.UI_CONFIG["window_title"])
 | 
					        self.title(AppConfig.UI_CONFIG["window_title"])
 | 
				
			||||||
 | 
					        self.image_manager = Image()
 | 
				
			||||||
        self.tk.call("source", f"{AppConfig.SYSTEM_PATHS['tcl_path']}/water.tcl")
 | 
					        self.tk.call("source", f"{AppConfig.SYSTEM_PATHS['tcl_path']}/water.tcl")
 | 
				
			||||||
        ConfigManager.init(AppConfig.SETTINGS_FILE)
 | 
					        ConfigManager.init(AppConfig.SETTINGS_FILE)
 | 
				
			||||||
        theme = ConfigManager.get("theme")
 | 
					        theme = ConfigManager.get("theme")
 | 
				
			||||||
        ThemeManager.change_theme(self, theme)
 | 
					        ThemeManager.change_theme(self, theme)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # Load the image file from the disk
 | 
					        # Try to set icon
 | 
				
			||||||
        self.wg_icon = tk.PhotoImage(file=AppConfig.IMAGE_PATHS["icon_vpn"])
 | 
					        try:
 | 
				
			||||||
 | 
					            icon = self.image_manager.load_image("icon_vpn")
 | 
				
			||||||
        # Set it as the window icon
 | 
					            if icon:
 | 
				
			||||||
        self.iconphoto(True, self.wg_icon)
 | 
					                self.iconphoto(True, icon)
 | 
				
			||||||
 | 
					        except:
 | 
				
			||||||
 | 
					            pass
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # Add the widgets
 | 
					        # Add the widgets
 | 
				
			||||||
        FrameWidgets(self).grid()
 | 
					        FrameWidgets(self).grid()
 | 
				
			||||||
@@ -91,13 +94,7 @@ class FrameWidgets(ttk.Frame):
 | 
				
			|||||||
        self.dns = None
 | 
					        self.dns = None
 | 
				
			||||||
        self.address = None
 | 
					        self.address = None
 | 
				
			||||||
        self.auto_con = None
 | 
					        self.auto_con = None
 | 
				
			||||||
        self.wg_vpn_start = tk.PhotoImage(file=AppConfig.IMAGE_PATHS["icon_start"])
 | 
					        self.image_manager = Image()
 | 
				
			||||||
        self.wg_vpn_stop = tk.PhotoImage(file=AppConfig.IMAGE_PATHS["icon_stop"])
 | 
					 | 
				
			||||||
        self.imp_pic = tk.PhotoImage(file=AppConfig.IMAGE_PATHS["icon_import"])
 | 
					 | 
				
			||||||
        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.wg_icon_header = tk.PhotoImage(file=AppConfig.IMAGE_PATHS["icon_header"])
 | 
					 | 
				
			||||||
        self.columnconfigure(0, weight=1)
 | 
					        self.columnconfigure(0, weight=1)
 | 
				
			||||||
        self.rowconfigure(0, weight=1)
 | 
					        self.rowconfigure(0, weight=1)
 | 
				
			||||||
        self.columnconfigure(1, weight=1)
 | 
					        self.columnconfigure(1, weight=1)
 | 
				
			||||||
@@ -211,7 +208,9 @@ class FrameWidgets(ttk.Frame):
 | 
				
			|||||||
        self.wg_icon_header_frame.grid(column=0, row=0, rowspan=2, sticky="w")
 | 
					        self.wg_icon_header_frame.grid(column=0, row=0, rowspan=2, sticky="w")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        self.wg_icon_header_label = tk.Label(
 | 
					        self.wg_icon_header_label = tk.Label(
 | 
				
			||||||
            self.wg_icon_header_frame, image=self.wg_icon_header, bg="#2c3e50"
 | 
					            self.wg_icon_header_frame,
 | 
				
			||||||
 | 
					            image=self.image_manager.load_image("icon_header"),
 | 
				
			||||||
 | 
					            bg="#2c3e50",
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
        self.wg_icon_header_label.grid(column=0, row=0, sticky="e", ipadx=10)
 | 
					        self.wg_icon_header_label.grid(column=0, row=0, sticky="e", ipadx=10)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -345,7 +344,7 @@ class FrameWidgets(ttk.Frame):
 | 
				
			|||||||
        # Button Import
 | 
					        # Button Import
 | 
				
			||||||
        self.btn_i = ttk.Button(
 | 
					        self.btn_i = ttk.Button(
 | 
				
			||||||
            self.control_buttons_frame,
 | 
					            self.control_buttons_frame,
 | 
				
			||||||
            image=self.imp_pic,
 | 
					            image=self.image_manager.load_image("icon_import"),
 | 
				
			||||||
            command=self.import_sl,
 | 
					            command=self.import_sl,
 | 
				
			||||||
            padding=0,
 | 
					            padding=0,
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
@@ -356,7 +355,7 @@ class FrameWidgets(ttk.Frame):
 | 
				
			|||||||
        # Button Trash
 | 
					        # Button Trash
 | 
				
			||||||
        self.btn_tr = ttk.Button(
 | 
					        self.btn_tr = ttk.Button(
 | 
				
			||||||
            self.control_buttons_frame,
 | 
					            self.control_buttons_frame,
 | 
				
			||||||
            image=self.tr_pic,
 | 
					            image=self.image_manager.load_image("icon_trash"),
 | 
				
			||||||
            command=self.delete,
 | 
					            command=self.delete,
 | 
				
			||||||
            padding=0,
 | 
					            padding=0,
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
@@ -370,7 +369,7 @@ class FrameWidgets(ttk.Frame):
 | 
				
			|||||||
        # Button Export
 | 
					        # Button Export
 | 
				
			||||||
        self.btn_exp = ttk.Button(
 | 
					        self.btn_exp = ttk.Button(
 | 
				
			||||||
            self.control_buttons_frame,
 | 
					            self.control_buttons_frame,
 | 
				
			||||||
            image=self.exp_pic,
 | 
					            image=self.image_manager.load_image("icon_export"),
 | 
				
			||||||
            command=lambda: Tunnel.export(),
 | 
					            command=lambda: Tunnel.export(),
 | 
				
			||||||
            padding=0,
 | 
					            padding=0,
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
@@ -560,7 +559,7 @@ class FrameWidgets(ttk.Frame):
 | 
				
			|||||||
                None,
 | 
					                None,
 | 
				
			||||||
                partial(webbrowser.open, "https://git.ilunix.de/punix/Wire-Py"),
 | 
					                partial(webbrowser.open, "https://git.ilunix.de/punix/Wire-Py"),
 | 
				
			||||||
            ],
 | 
					            ],
 | 
				
			||||||
            icon=AppConfig.IMAGE_PATHS["icon_vpn"],
 | 
					            icon="/usr/share/icons/lx-icons/64/wg_vpn.png",
 | 
				
			||||||
            wraplength=420,
 | 
					            wraplength=420,
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -655,7 +654,7 @@ class FrameWidgets(ttk.Frame):
 | 
				
			|||||||
        """
 | 
					        """
 | 
				
			||||||
        self.btn_stst = ttk.Button(
 | 
					        self.btn_stst = ttk.Button(
 | 
				
			||||||
            self.control_buttons_frame,
 | 
					            self.control_buttons_frame,
 | 
				
			||||||
            image=self.wg_vpn_start,
 | 
					            image=self.image_manager.load_image("icon_start"),
 | 
				
			||||||
            command=lambda: self.wg_switch("start"),
 | 
					            command=lambda: self.wg_switch("start"),
 | 
				
			||||||
            padding=0,
 | 
					            padding=0,
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
@@ -694,7 +693,7 @@ class FrameWidgets(ttk.Frame):
 | 
				
			|||||||
        """
 | 
					        """
 | 
				
			||||||
        self.btn_stst = ttk.Button(
 | 
					        self.btn_stst = ttk.Button(
 | 
				
			||||||
            self.control_buttons_frame,
 | 
					            self.control_buttons_frame,
 | 
				
			||||||
            image=self.wg_vpn_stop,
 | 
					            image=self.image_manager.load_image("icon_stop"),
 | 
				
			||||||
            command=lambda: self.wg_switch("stop"),
 | 
					            command=lambda: self.wg_switch("stop"),
 | 
				
			||||||
            padding=0,
 | 
					            padding=0,
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -3,6 +3,8 @@
 | 
				
			|||||||
import logging
 | 
					import logging
 | 
				
			||||||
import gettext
 | 
					import gettext
 | 
				
			||||||
import locale
 | 
					import locale
 | 
				
			||||||
 | 
					import tkinter as tk
 | 
				
			||||||
 | 
					import os
 | 
				
			||||||
from pathlib import Path
 | 
					from pathlib import Path
 | 
				
			||||||
from subprocess import CompletedProcess, run
 | 
					from subprocess import CompletedProcess, run
 | 
				
			||||||
from typing import Dict, Any
 | 
					from typing import Dict, Any
 | 
				
			||||||
@@ -79,21 +81,6 @@ class AppConfig:
 | 
				
			|||||||
        "pkey_path": "/usr/local/etc/ssl/pwgk.pem",
 | 
					        "pkey_path": "/usr/local/etc/ssl/pwgk.pem",
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # Images and icons paths
 | 
					 | 
				
			||||||
    IMAGE_PATHS: Dict[str, Path] = {
 | 
					 | 
				
			||||||
        "icon_header": "/usr/share/icons/lx-icons/32/wg_vpn.png",
 | 
					 | 
				
			||||||
        "icon_vpn": "/usr/share/icons/lx-icons/48/wg_vpn.png",
 | 
					 | 
				
			||||||
        "icon_msg": "/usr/share/icons/lx-icons/48/wg_msg.png",
 | 
					 | 
				
			||||||
        "icon_import": "/usr/share/icons/lx-icons/48/wg_import.png",
 | 
					 | 
				
			||||||
        "icon_export": "/usr/share/icons/lx-icons/48/wg_export.png",
 | 
					 | 
				
			||||||
        "icon_trash": "/usr/share/icons/lx-icons/48/wg_trash.png",
 | 
					 | 
				
			||||||
        "icon_start": "/usr/share/icons/lx-icons/48/wg_vpn-start.png",
 | 
					 | 
				
			||||||
        "icon_stop": "/usr/share/icons/lx-icons/48/wg_vpn-stop.png",
 | 
					 | 
				
			||||||
        "icon_info": "/usr/share/icons/lx-icons/64/info.png",
 | 
					 | 
				
			||||||
        "icon_error": "/usr/share/icons/lx-icons/64/error.png",
 | 
					 | 
				
			||||||
        "icon_log": "/usr/share/icons/lx-icons/48/log.png",
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    @staticmethod
 | 
					    @staticmethod
 | 
				
			||||||
    def setup_translations() -> gettext.gettext:
 | 
					    def setup_translations() -> gettext.gettext:
 | 
				
			||||||
        """
 | 
					        """
 | 
				
			||||||
@@ -171,6 +158,65 @@ class AppConfig:
 | 
				
			|||||||
_ = AppConfig.setup_translations()
 | 
					_ = AppConfig.setup_translations()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class Image:
 | 
				
			||||||
 | 
					    def __init__(self):
 | 
				
			||||||
 | 
					        self.images = {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def load_image(self, image_key, fallback_paths=None) -> None | tk.PhotoImage:
 | 
				
			||||||
 | 
					        """Load PNG image using tk.PhotoImage with fallback options"""
 | 
				
			||||||
 | 
					        if image_key in self.images:
 | 
				
			||||||
 | 
					            return self.images[image_key]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        # Define image paths based on key
 | 
				
			||||||
 | 
					        image_paths = {
 | 
				
			||||||
 | 
					            "icon_header": [
 | 
				
			||||||
 | 
					                "/usr/share/icons/lx-icons/32/wg_vpn.png",
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					            "icon_vpn": [
 | 
				
			||||||
 | 
					                "/usr/share/icons/lx-icons/48/wg_vpn.png",
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					            "icon_start": [
 | 
				
			||||||
 | 
					                "/usr/share/icons/lx-icons/48/wg_vpn-start.png",
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					            "icon_stop": [
 | 
				
			||||||
 | 
					                "/usr/share/icons/lx-icons/48/wg_vpn-stop.png",
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					            "icon_import": [
 | 
				
			||||||
 | 
					                "/usr/share/icons/lx-icons/48/wg_import.png",
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					            "icon_export": [
 | 
				
			||||||
 | 
					                "/usr/share/icons/lx-icons/48/wg_export.png",
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					            "icon_log": [
 | 
				
			||||||
 | 
					                "/usr/share/icons/lx-icons/48/log.png",
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					            "icon_trash": [
 | 
				
			||||||
 | 
					                "/usr/share/icons/lx-icons/48/wg_trash.png",
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        # Get paths to try
 | 
				
			||||||
 | 
					        paths_to_try = image_paths.get(image_key, [])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        # Add fallback paths if provided
 | 
				
			||||||
 | 
					        if fallback_paths:
 | 
				
			||||||
 | 
					            paths_to_try.extend(fallback_paths)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        # Try to load image from paths
 | 
				
			||||||
 | 
					        for path in paths_to_try:
 | 
				
			||||||
 | 
					            try:
 | 
				
			||||||
 | 
					                if os.path.exists(path):
 | 
				
			||||||
 | 
					                    photo = tk.PhotoImage(file=path)
 | 
				
			||||||
 | 
					                    self.images[image_key] = photo
 | 
				
			||||||
 | 
					                    return photo
 | 
				
			||||||
 | 
					            except tk.TclError as e:
 | 
				
			||||||
 | 
					                # print(f"{LocaleStrings.MSGP["fail_load_image"]}{path}: {e}")
 | 
				
			||||||
 | 
					                continue
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        # Return None if no image found
 | 
				
			||||||
 | 
					        return None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class Msg:
 | 
					class Msg:
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
    A utility class that provides centralized access to translated message strings.
 | 
					    A utility class that provides centralized access to translated message strings.
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user