+ статистика

+ логирование
исправить: уведомления (сломался софт)
This commit is contained in:
Xatiko 2024-11-21 01:01:03 +03:00
parent 5c2cbbbad0
commit e01f43dc35
13 changed files with 637 additions and 51 deletions

View file

@ -3,6 +3,9 @@ from PIL import Image, ImageTk
from config import SETTINGS_IMG
from src.admin_functions import db_management, admin_logging, statistics, content, knowledge_base
from src.utils import clear_frame # Импортируем общую функцию для очистки фрейма
from database.db_session import get_session
from database.models import Notifications
from src.admin_functions.notification import Notification
# Конфигурация цветов из config.py
@ -14,12 +17,26 @@ MENU_COLOR = "#2f2b38"
MENU_OPACITY = 0.9 # Прозрачность меню
class AdminApp:
def __init__(self, root):
def __init__(self, root, master):
self.root = root
self.master = master
self.root.title("Админ-Панель")
self.root.geometry("1920x1080")
self.root.config(bg=BACKGROUND_COLOR)
self.notification = Notification(self.master)
def edit_database(self):
# Логика редактирования базы данных
# Например, успешное редактирование
self.notification.show_info("Успех", "База данных успешно обновлена!")
def show_error(self, message):
self.notification.show_error("Ошибка", message)
def show_warning(self, message):
self.notification.show_warning("Предупреждение", message)
# Верхняя панель
self.top_bar = tk.Frame(self.root, bg=TOP_BAR_COLOR, height=60)
self.top_bar.pack(side="top", fill="x")
@ -71,43 +88,94 @@ class AdminApp:
def toggle_menu(self):
"""Показ или скрытие меню."""
print(
f"Кнопка меню нажата. Меню сейчас {'видимо' if self.menu_visible else 'скрыто'}") # Отладка
if self.menu_visible: # Используем флаг для проверки состояния
print("Скрываем меню") # Отладка
self.menu_frame.lower() # Скрываем меню
if self.menu_visible:
self.menu_frame.lower()
self.menu_visible = False
else:
print("Показываем меню") # Отладка
self.menu_frame.lift() # Показываем меню
self.menu_frame.lift()
self.menu_visible = True
self.populate_menu() # Наполнение меню элементами
self.populate_menu()
def populate_menu(self):
# Очистка меню
for widget in self.menu_frame.winfo_children():
widget.destroy()
# Создание пунктов меню
self.create_menu_section("Работа с базой данных", [
("Редактирование пользователей", db_management.edit_users),
("Управление вопросами", db_management.manage_questions),
("Просмотр таблиц", db_management.view_tables),
])
self.create_menu_section("Управление игровым контентом", [
("Создание и настройка уровней", content.manage_levels),
("Настройка параметров собаки", content.manage_dog_params),
])
self.create_menu_section("Управление интерфейсом пользователя", [
("Изменение цветовой схемы, фона и логотипа", self.change_ui_settings),
("Добавление подсказок в интерфейс", self.manage_ui_tips),
])
self.create_menu_section("Работа с базой знаний", [
("Добавление информации", knowledge_base.add_info),
("Редактирование записей", knowledge_base.edit_records),
("Удаление записей", knowledge_base.delete_records),
("Просмотр базы знаний", knowledge_base.view_knowledge_base),
("Генерация вопросов", knowledge_base.generate_questions),
])
# Список разделов и их элементов
menu_sections = [
("Работа с базой данных", [
("Редактирование пользователей", db_management.edit_users),
("Управление вопросами", db_management.manage_questions),
("Просмотр таблиц", db_management.view_tables),
]),
("Управление игровым контентом", [
("Создание и настройка уровней", content.manage_levels),
("Настройка параметров собаки", content.manage_dog_params),
]),
("Управление интерфейсом пользователя", [
("Добавление подсказок в интерфейс", self.manage_ui_tips),
]),
("Работа с базой знаний", [
("Добавление информации", knowledge_base.add_info),
("Редактирование записей", knowledge_base.edit_records),
("Удаление записей", knowledge_base.delete_records),
("Просмотр базы знаний", knowledge_base.view_knowledge_base),
("Генерация вопросов", knowledge_base.generate_questions),
]),
]
# Определяем максимальную ширину текста для настройки ширины меню и кнопок
max_text_length = max(
len(title) for title, items in menu_sections
) + max(
max(len(text) for text, _ in items) for _, items in menu_sections
)
menu_width = max(300, max_text_length * 10) # Устанавливаем минимальную ширину
# Обновляем ширину меню
self.menu_frame.config(width=menu_width)
# Высота одной кнопки и отступов
button_height = 40
button_spacing = 10
section_spacing = 15
total_height = 0
for title, items in menu_sections:
# Заголовок раздела
section_label = tk.Label(
self.menu_frame,
text=title,
bg=MENU_COLOR,
fg=TEXT_COLOR,
font=("Comic Sans MS", 14, "bold"),
anchor="center" # Выравнивание по центру
)
section_label.pack(fill="x", padx=10, pady=5)
total_height += button_height + section_spacing
# Кнопки раздела
for text, command in items:
item_button = tk.Button(
self.menu_frame,
text=text,
bg=BUTTON_COLOR,
fg=TEXT_COLOR,
font=("Comic Sans MS", 12),
width=int(menu_width / 10) - 3, # Ширина кнопок зависит от ширины меню
height=1,
activebackground=BUTTON_COLOR,
activeforeground=TEXT_COLOR,
bd=0,
anchor="w", # Выравнивание текста по левому краю
command=lambda: command(self.main_frame) # Вызываем функцию и передаём фрейм
)
item_button.pack(fill="x", padx=20, pady=5)
total_height += button_height + button_spacing
# Подстройка высоты меню
self.menu_frame.config(height=total_height)
def create_menu_section(self, title, items):
section_label = tk.Label(self.menu_frame, text=title, bg=MENU_COLOR, fg=TEXT_COLOR, font=("Comic Sans MS", 14, "bold"))
@ -150,8 +218,14 @@ class AdminApp:
tk.Label(frame, text="Здесь будут подсказки для интерфейса", bg=BACKGROUND_COLOR, fg=TEXT_COLOR, font=("Comic Sans MS", 16)).pack()
def show_notifications(self, frame):
clear_frame(frame)
tk.Label(frame, text="Здесь будут уведомления", bg=BACKGROUND_COLOR, fg=TEXT_COLOR, font=("Comic Sans MS", 16)).pack()
clear_frame(frame) # Очищаем текущий экран
session = get_session()
notifications = session.query(Notifications).filter_by(
is_read=0).all() # Получаем все непрочитанные уведомления
for notification in notifications:
tk.Label(frame, text=notification.message, bg=BACKGROUND_COLOR, fg=TEXT_COLOR,
font=("Comic Sans MS", 16)).pack()
session.close()
def show_security(self, frame):
clear_frame(frame)