commit 37
This commit is contained in:
Binary file not shown.
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
""" Classes Method and Functions for lx Apps """
|
""" Classes Method and Functions for lx Apps """
|
||||||
|
|
||||||
import logging
|
import logging
|
||||||
@@ -327,7 +326,8 @@ class ConfigManager:
|
|||||||
"""Load the config file and return the config as dict"""
|
"""Load the config file and return the config as dict"""
|
||||||
if not cls._config:
|
if not cls._config:
|
||||||
try:
|
try:
|
||||||
lines = Path(cls._config_file).read_text(encoding="utf-8").splitlines()
|
lines = Path(cls._config_file).read_text(
|
||||||
|
encoding="utf-8").splitlines()
|
||||||
cls._config = {
|
cls._config = {
|
||||||
"updates": lines[1].strip(),
|
"updates": lines[1].strip(),
|
||||||
"theme": lines[3].strip(),
|
"theme": lines[3].strip(),
|
||||||
@@ -406,21 +406,38 @@ class ThemeManager:
|
|||||||
|
|
||||||
|
|
||||||
class Tooltip:
|
class Tooltip:
|
||||||
def __init__(self, widget, text, wraplength=250):
|
def __init__(self, widget, text, wraplength=250, state_var=None):
|
||||||
self.widget = widget
|
self.widget = widget
|
||||||
self.text = text
|
self.text = text
|
||||||
self.wraplength = wraplength
|
self.wraplength = wraplength
|
||||||
|
self.state_var = state_var
|
||||||
self.tooltip_window = None
|
self.tooltip_window = None
|
||||||
self.id = None
|
self.id = None
|
||||||
|
self.update_bindings()
|
||||||
|
if self.state_var:
|
||||||
|
self.state_var.trace_add("write", self.update_bindings)
|
||||||
|
|
||||||
|
def update_bindings(self, *args):
|
||||||
|
self.widget.unbind("<Enter>")
|
||||||
|
self.widget.unbind("<Leave>")
|
||||||
|
self.widget.unbind("<ButtonPress>")
|
||||||
|
|
||||||
|
if self.state_var is None or self.state_var.get():
|
||||||
self.widget.bind("<Enter>", self.enter)
|
self.widget.bind("<Enter>", self.enter)
|
||||||
self.widget.bind("<Leave>", self.leave)
|
self.widget.bind("<Leave>", self.leave)
|
||||||
self.widget.bind("<ButtonPress>", self.leave)
|
self.widget.bind("<ButtonPress>", self.leave)
|
||||||
|
|
||||||
def enter(self, event=None): self.schedule()
|
def enter(self, event=None):
|
||||||
def leave(self, event=None): self.unschedule(); self.hide_tooltip()
|
if self.state_var is None or self.state_var.get():
|
||||||
|
self.schedule()
|
||||||
|
|
||||||
def schedule(self): self.unschedule(
|
def leave(self, event=None):
|
||||||
); self.id = self.widget.after(250, self.show_tooltip)
|
self.unschedule()
|
||||||
|
self.hide_tooltip()
|
||||||
|
|
||||||
|
def schedule(self):
|
||||||
|
self.unschedule()
|
||||||
|
self.id = self.widget.after(250, self.show_tooltip)
|
||||||
|
|
||||||
def unschedule(self):
|
def unschedule(self):
|
||||||
id = self.id
|
id = self.id
|
||||||
@@ -429,12 +446,14 @@ class Tooltip:
|
|||||||
self.widget.after_cancel(id)
|
self.widget.after_cancel(id)
|
||||||
|
|
||||||
def show_tooltip(self, event=None):
|
def show_tooltip(self, event=None):
|
||||||
|
if self.tooltip_window or not self.text:
|
||||||
|
return
|
||||||
x, y, _, _ = self.widget.bbox("insert")
|
x, y, _, _ = self.widget.bbox("insert")
|
||||||
x += self.widget.winfo_rootx() + 25
|
x += self.widget.winfo_rootx() + 25
|
||||||
y += self.widget.winfo_rooty() + 20
|
y += self.widget.winfo_rooty() + 20
|
||||||
self.tooltip_window = tw = tk.Toplevel(self.widget)
|
self.tooltip_window = tw = tk.Toplevel(self.widget)
|
||||||
tw.wm_overrideredirect(True)
|
tw.wm_overrideredirect(True)
|
||||||
tw.wm_geometry(f"+{x}+{y}")
|
tw.wm_geometry(f"+" + str(x) + "+" + str(y))
|
||||||
label = ttk.Label(tw, text=self.text, justify=tk.LEFT, background="#FFFFE0", foreground="black",
|
label = ttk.Label(tw, text=self.text, justify=tk.LEFT, background="#FFFFE0", foreground="black",
|
||||||
relief=tk.SOLID, borderwidth=1, wraplength=self.wraplength, padding=(4, 2, 4, 2))
|
relief=tk.SOLID, borderwidth=1, wraplength=self.wraplength, padding=(4, 2, 4, 2))
|
||||||
label.pack(ipadx=1)
|
label.pack(ipadx=1)
|
||||||
@@ -455,17 +474,17 @@ class LogConfig:
|
|||||||
mode="a",
|
mode="a",
|
||||||
encoding="utf-8",
|
encoding="utf-8",
|
||||||
)
|
)
|
||||||
formatter = logging.Formatter("%(asctime)s - %(levelname)s - %(message)s")
|
formatter = logging.Formatter(
|
||||||
|
"%(asctime)s - %(levelname)s - %(message)s")
|
||||||
file_handler.setFormatter(formatter)
|
file_handler.setFormatter(formatter)
|
||||||
file_handler.setLevel(logging.DEBUG)
|
file_handler.setLevel(logging.DEBUG)
|
||||||
|
|
||||||
logger = logging.getLogger()
|
logger = logging.getLogger()
|
||||||
logger.addHandler(file_handler)
|
logger.addHandler(file_handler)
|
||||||
|
|
||||||
import os
|
|
||||||
|
|
||||||
class IconManager:
|
class IconManager:
|
||||||
def __init__(self, base_path='/usr/share/icons/lx-icons'):
|
def __init__(self, base_path='/usr/share/icons/lx-icons/'):
|
||||||
self.base_path = base_path
|
self.base_path = base_path
|
||||||
self.icons = {}
|
self.icons = {}
|
||||||
self._define_icon_paths()
|
self._define_icon_paths()
|
||||||
@@ -615,7 +634,13 @@ class IconManager:
|
|||||||
except tk.TclError as e:
|
except tk.TclError as e:
|
||||||
print(f"Error loading icon '{key}' from '{full_path}': {e}")
|
print(f"Error loading icon '{key}' from '{full_path}': {e}")
|
||||||
size = 32 # Default size
|
size = 32 # Default size
|
||||||
if '16' in rel_path: size = 16
|
if '16' in rel_path:
|
||||||
elif '48' in rel_path: size = 48
|
size = 16
|
||||||
elif '64' in rel_path: size = 64
|
elif '48' in rel_path:
|
||||||
|
size = 48
|
||||||
|
elif '64' in rel_path:
|
||||||
|
size = 64
|
||||||
self.icons[key] = tk.PhotoImage(width=size, height=size)
|
self.icons[key] = tk.PhotoImage(width=size, height=size)
|
||||||
|
|
||||||
|
def get_icon(self, name):
|
||||||
|
return self.icons.get(name)
|
Reference in New Issue
Block a user