-
Notifications
You must be signed in to change notification settings - Fork 14
/
Copy pathnavigation_panel.py
105 lines (89 loc) · 4.33 KB
/
navigation_panel.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
import customtkinter as ctk
from typing import Any, List, Callable
from services import ThemeManager, LanguageManager
from settings import (
AppearanceSettings
)
class NavigationPanel(ctk.CTkFrame):
def __init__(
self,
master: Any = None,
navigation_panels: List[ctk.CTkFrame] = None,
navigation_button_on_click_callback: Callable = None,
navigation_buttons_texts: List[str] = None,
width: int = None):
super().__init__(
master=master,
fg_color=AppearanceSettings.settings["root"]["fg_color"]["normal"],
width=width
)
self.navigation_buttons_texts = navigation_buttons_texts
self.navigation_buttons = []
self.navigation_buttons_clicked_state = []
for i in range(len(navigation_buttons_texts)):
self.navigation_buttons.append(
ctk.CTkButton(
master=self,
corner_radius=0,
text="",
hover=False,
text_color=AppearanceSettings.settings["settings_panel"]["nav_text_color"]
)
)
self.navigation_buttons[-1].configure(
command=lambda panel=navigation_panels[i], button=self.navigation_buttons[-1]:
self.on_click_navigation_button(button, panel)
)
self.navigation_buttons_clicked_state.append(False)
self.navigation_button_on_click_callback = navigation_button_on_click_callback
self.width = width
self.set_widgets_accent_color()
self.set_widgets_sizes()
self.set_widgets_texts()
self.set_widgets_fonts()
self.place_widgets()
# place first panel @ startup
self.on_click_navigation_button(self.navigation_buttons[0], navigation_panels[0])
ThemeManager.register_widget(self)
LanguageManager.register_widget(self)
def on_click_navigation_button(self, clicked_button: ctk.CTkButton, navigation_panel: ctk.CTkFrame):
for i, navigation_button in enumerate(self.navigation_buttons):
if clicked_button is navigation_button:
self.navigation_buttons_clicked_state[i] = True
navigation_button.configure(fg_color=AppearanceSettings.settings["root"]["accent_color"]["normal"])
else:
self.navigation_buttons_clicked_state[i] = False
navigation_button.configure(fg_color=AppearanceSettings.settings["root"]["accent_color"]["hover"])
self.navigation_button_on_click_callback(navigation_panel)
def place_widgets(self):
self.navigation_buttons[0].pack(pady=(50 * AppearanceSettings.settings["scale_r"], 0))
for navigation_button in self.navigation_buttons[1::]:
navigation_button.pack()
def set_widgets_texts(self):
for i, button in enumerate(self.navigation_buttons):
button.configure(text=LanguageManager.data[self.navigation_buttons_texts[i]])
def update_widgets_text(self):
self.set_widgets_texts()
def set_widgets_fonts(self):
scale = AppearanceSettings.settings["scale_r"]
button_font = ("Comic Sans MS", int(14 * scale), "bold")
for navigation_button in self.navigation_buttons:
navigation_button.configure(font=button_font)
def set_widgets_sizes(self):
scale = AppearanceSettings.settings["scale_r"]
for navigation_button in self.navigation_buttons:
navigation_button.configure(height=int(36 * scale), width=self.width)
def update_widgets_accent_color(self) -> None:
self.set_widgets_accent_color()
def set_widgets_accent_color(self):
for i, navigation_button in enumerate(self.navigation_buttons):
if not self.navigation_buttons_clicked_state[i]:
navigation_button.configure(
fg_color=AppearanceSettings.settings["root"]["accent_color"]["hover"]
)
else:
navigation_button.configure(
fg_color=AppearanceSettings.settings["root"]["accent_color"]["normal"]
)
def update_widgets_colors(self):
"""Update colors for the widgets."""