125 lines
4.0 KiB
Python
125 lines
4.0 KiB
Python
from kivy.utils import hex_colormap
|
||
from kivy.uix.widget import Widget
|
||
from materialyoucolor.utils.platform_utils import SCHEMES
|
||
from kivymd.uix.menu import MDDropdownMenu
|
||
|
||
|
||
class MenuApp:
|
||
"""Класс для меню приложения"""
|
||
|
||
menu: MDDropdownMenu = None
|
||
|
||
def switch_screen(self, item) -> None:
|
||
"""Переключает экран"""
|
||
|
||
screen_manager = self.root
|
||
|
||
match item.text:
|
||
case 'Таймеры':
|
||
screen_manager.current = 'timers_screen'
|
||
|
||
def open_menu(self, menu_button) -> None:
|
||
"""Открывает выпадающее меню"""
|
||
|
||
menu_items = []
|
||
|
||
for item, method in {
|
||
'Цвет темы': lambda: self.set_palette(),
|
||
'Стиль темы': lambda: self.switch_theme(),
|
||
'Тип схемы': lambda: self.set_scheme_type(),
|
||
# 'Новый таймер': None
|
||
}.items():
|
||
menu_items.append(
|
||
{
|
||
'text': item,
|
||
'on_release': method,
|
||
}
|
||
)
|
||
|
||
self.menu = MDDropdownMenu(
|
||
caller=menu_button,
|
||
items=menu_items,
|
||
)
|
||
self.menu.open()
|
||
|
||
def switch_palette(self, selected_palette: str) -> None:
|
||
"""Переключает основной цвет темы"""
|
||
|
||
self.theme_cls.primary_palette = selected_palette
|
||
|
||
def switch_theme(self) -> None:
|
||
"""Переключает светлую/тёмную тему"""
|
||
|
||
self.theme_cls.switch_theme()
|
||
|
||
def set_palette(self) -> None:
|
||
"""Формирует и открывает меню выбора палитры"""
|
||
|
||
instance_from_menu = self.get_instance_from_menu('Set palette')
|
||
available_palettes = [
|
||
name_color.capitalize() for name_color in hex_colormap.keys()
|
||
]
|
||
|
||
menu_items = []
|
||
for name_palette in available_palettes:
|
||
menu_items.append(
|
||
{
|
||
'text': name_palette,
|
||
'on_release': lambda x=name_palette: self.switch_palette(x),
|
||
}
|
||
)
|
||
MDDropdownMenu(
|
||
caller=instance_from_menu,
|
||
items=menu_items,
|
||
).open()
|
||
|
||
def set_scheme_type(self) -> None:
|
||
"""Формирует и открывает меню выбора типа цветовой схемы"""
|
||
|
||
instance_from_menu = self.get_instance_from_menu("Switch scheme type")
|
||
|
||
menu_items = []
|
||
for scheme_name in SCHEMES.keys():
|
||
menu_items.append(
|
||
{
|
||
'text': scheme_name,
|
||
'on_release': lambda x=scheme_name: self.update_scheme_name(x),
|
||
}
|
||
)
|
||
MDDropdownMenu(
|
||
caller=instance_from_menu,
|
||
items=menu_items,
|
||
).open()
|
||
|
||
def update_scheme_name(self, scheme_name: str) -> None:
|
||
"""Обновляет тип цветовой схемы"""
|
||
|
||
self.theme_cls.dynamic_scheme_name = scheme_name
|
||
|
||
def get_instance_from_menu(self, name_item: str) -> Widget:
|
||
"""Возвращает экземпляр элемента меню по его названию"""
|
||
|
||
index = 0
|
||
rv = self.menu.ids.md_menu
|
||
opts = rv.layout_manager.view_opts
|
||
datas = rv.data[0]
|
||
|
||
for data in rv.data:
|
||
if data.get('text') == name_item:
|
||
index = rv.data.index(data)
|
||
break
|
||
|
||
instance = rv.view_adapter.get_view(
|
||
index, datas, opts[index].get('viewclass')
|
||
)
|
||
return instance
|
||
|
||
def disabled_widgets(self) -> None:
|
||
"""Переключает активность виджетов (блокирует/разблокирует)"""
|
||
|
||
for widget in self.root.ids.widget_box.children:
|
||
widget.disabled = not widget.disabled
|
||
|
||
for widget in self.root.ids.custom_widget_box.children:
|
||
widget.disabled = not widget.disabled
|