264 lines
9.5 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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()