264 lines
9.5 KiB
Python
264 lines
9.5 KiB
Python
# modules/light_module.py
|
||
import tkinter as tk
|
||
from tkinter import ttk, messagebox
|
||
from pathlib import Path
|
||
import sys
|
||
import os
|
||
|
||
# Добавляем родительскую директорию в путь для импорта
|
||
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
||
|
||
try:
|
||
import config
|
||
DOCUMENTS_PATH = config.DOCUMENTS_PATH
|
||
except ImportError:
|
||
# Локальные значения по умолчанию
|
||
DOCUMENTS_PATH = Path.home() / "Documents" / "C4"
|
||
|
||
|
||
class LightModuleTab:
|
||
"""
|
||
Класс для создания вкладки настройки подсветки.
|
||
Поддерживает версии 1 и 2 подсветки для аппаратов "Фишка".
|
||
"""
|
||
|
||
def __init__(self, parent_frame):
|
||
"""
|
||
Инициализация компонента вкладки.
|
||
|
||
Args:
|
||
parent_frame: Родительский фрейм, куда будет помещен интерфейс
|
||
"""
|
||
self.parent = parent_frame
|
||
|
||
# Пути к файлам
|
||
self.overrides_dir = DOCUMENTS_PATH / "overrides"
|
||
self.light_conf_file = self.overrides_dir / "Light.conf"
|
||
|
||
# Текущая версия подсветки
|
||
self.current_version = None
|
||
|
||
# Переменная для радиокнопок
|
||
self.light_version = tk.IntVar(value=2) # По умолчанию вторая версия
|
||
|
||
# Создаем основной контейнер для вкладки
|
||
self.container = ttk.Frame(parent_frame, padding=20)
|
||
self.container.pack(fill=tk.BOTH, expand=True)
|
||
|
||
self._build_ui()
|
||
|
||
# Проверяем текущую версию при запуске
|
||
self.check_light_version()
|
||
|
||
def _build_ui(self):
|
||
"""Построение интерфейса вкладки"""
|
||
|
||
# Заголовок вкладки
|
||
title_frame = ttk.Frame(self.container)
|
||
title_frame.pack(fill=tk.X, pady=(0, 20))
|
||
|
||
title_label = ttk.Label(
|
||
title_frame,
|
||
text='Настройка подсветки',
|
||
font=("Segoe UI", 12, "bold")
|
||
)
|
||
title_label.pack()
|
||
|
||
# Разделитель
|
||
ttk.Separator(self.container, orient="horizontal").pack(
|
||
fill=tk.X, pady=(0, 20)
|
||
)
|
||
|
||
# Фрейм для выбора версии
|
||
selector_frame = ttk.LabelFrame(
|
||
self.container,
|
||
text="Выбор версии подсветки",
|
||
padding=15
|
||
)
|
||
selector_frame.pack(fill=tk.X, pady=(0, 20))
|
||
|
||
# Версия 1
|
||
version1_frame = ttk.Frame(selector_frame)
|
||
version1_frame.pack(fill=tk.X, pady=(0, 10))
|
||
|
||
version1_radio = ttk.Radiobutton(
|
||
version1_frame,
|
||
text="Версия 1 (старая)",
|
||
variable=self.light_version,
|
||
value=1,
|
||
command=self._on_version_change
|
||
)
|
||
version1_radio.pack(side=tk.LEFT, anchor=tk.W)
|
||
|
||
|
||
# Версия 2
|
||
version2_frame = ttk.Frame(selector_frame)
|
||
version2_frame.pack(fill=tk.X, pady=(0, 10))
|
||
|
||
version2_radio = ttk.Radiobutton(
|
||
version2_frame,
|
||
text="Версия 2 (новая, по умолчанию)",
|
||
variable=self.light_version,
|
||
value=2,
|
||
command=self._on_version_change
|
||
)
|
||
version2_radio.pack(side=tk.LEFT, anchor=tk.W)
|
||
|
||
|
||
# Кнопки управления
|
||
button_frame = ttk.Frame(selector_frame)
|
||
button_frame.pack(fill=tk.X, pady=(10, 0))
|
||
|
||
# Кнопка сохранения
|
||
save_btn = ttk.Button(
|
||
button_frame,
|
||
text="Сохранить настройки",
|
||
command=self._save_config,
|
||
width=30
|
||
)
|
||
save_btn.pack(side=tk.LEFT, padx=(0, 10))
|
||
|
||
# Кнопка проверки
|
||
check_btn = ttk.Button(
|
||
button_frame,
|
||
text="Проверить текущую версию",
|
||
command=self.check_light_version,
|
||
width=30
|
||
)
|
||
check_btn.pack(side=tk.LEFT)
|
||
|
||
# Информационная панель
|
||
info_frame = ttk.LabelFrame(
|
||
self.container,
|
||
text="Информация",
|
||
padding=15
|
||
)
|
||
info_frame.pack(fill=tk.X)
|
||
|
||
# Статус
|
||
self.status_label = ttk.Label(
|
||
info_frame,
|
||
text="Статус: не проверено",
|
||
font=("Segoe UI", 10)
|
||
)
|
||
self.status_label.pack(anchor=tk.W, pady=(0, 5))
|
||
|
||
# Файл
|
||
self.file_label = ttk.Label(
|
||
info_frame,
|
||
text=f"Файл: {self.light_conf_file.name}",
|
||
font=("Segoe UI", 9),
|
||
foreground="gray"
|
||
)
|
||
self.file_label.pack(anchor=tk.W)
|
||
|
||
def _on_version_change(self):
|
||
"""Обработчик изменения выбранной версии"""
|
||
selected_version = self.light_version.get()
|
||
|
||
# Визуальная обратная связь
|
||
if selected_version == 1:
|
||
self.status_label.config(
|
||
text="Статус: выбрана версия 1",
|
||
foreground="orange"
|
||
)
|
||
else:
|
||
self.status_label.config(
|
||
text="Статус: выбрана версия 2",
|
||
foreground="green"
|
||
)
|
||
|
||
def check_light_version(self):
|
||
"""Проверить текущую версию подсветки"""
|
||
try:
|
||
# Проверяем существование файла
|
||
if not self.light_conf_file.exists():
|
||
self.current_version = None
|
||
self.status_label.config(
|
||
text="Статус: файл не найден",
|
||
foreground="red"
|
||
)
|
||
return None
|
||
|
||
# Читаем файл
|
||
with open(self.light_conf_file, 'r', encoding='utf-8') as f:
|
||
content = f.read().strip()
|
||
|
||
# Парсим версию
|
||
if content == "1":
|
||
self.current_version = 1
|
||
self.light_version.set(1)
|
||
self.status_label.config(
|
||
text="Статус: установлена версия 1",
|
||
foreground="orange"
|
||
)
|
||
elif content == "2":
|
||
self.current_version = 2
|
||
self.light_version.set(2)
|
||
self.status_label.config(
|
||
text="Статус: установлена версия 2",
|
||
foreground="green"
|
||
)
|
||
else:
|
||
self.current_version = None
|
||
self.status_label.config(
|
||
text="Статус: некорректное содержимое файла",
|
||
foreground="red"
|
||
)
|
||
|
||
return self.current_version
|
||
|
||
except Exception as e:
|
||
self.current_version = None
|
||
self.status_label.config(
|
||
text=f"Статус: ошибка чтения файла",
|
||
foreground="red"
|
||
)
|
||
return None
|
||
|
||
def _save_config(self):
|
||
"""Сохранить выбранную версию подсветки (внутренний метод)"""
|
||
try:
|
||
selected_version = self.light_version.get()
|
||
|
||
# Создаем директорию, если её нет
|
||
self.overrides_dir.mkdir(parents=True, exist_ok=True)
|
||
|
||
# Сохраняем в файл
|
||
with open(self.light_conf_file, 'w', encoding='utf-8') as f:
|
||
f.write(str(selected_version))
|
||
|
||
# Обновляем текущую версию
|
||
self.current_version = selected_version
|
||
|
||
# Обновляем интерфейс
|
||
if selected_version == 1:
|
||
self.status_label.config(
|
||
text="Статус: ✓ сохранена версия 1",
|
||
foreground="green"
|
||
)
|
||
else:
|
||
self.status_label.config(
|
||
text="Статус: ✓ сохранена версия 2",
|
||
foreground="green"
|
||
)
|
||
|
||
messagebox.showinfo(
|
||
"Готово",
|
||
f"Версия подсветки успешно сохранена!\n\n"
|
||
f"Версия: {selected_version}"
|
||
)
|
||
|
||
except Exception as e:
|
||
messagebox.showerror(
|
||
"Ошибка сохранения",
|
||
f"Не удалось сохранить настройки подсветки:\n{e}"
|
||
)
|
||
|
||
def get_current_version(self):
|
||
"""Получить текущую версию подсветки (для использования другими модулями)"""
|
||
return self.current_version
|
||
|
||
def save_light_config(self):
|
||
"""Сохранить конфигурацию подсветки (интерфейсный метод для main)"""
|
||
self._save_config() |