/
Ruden161
/
player
Обзор
Документация
Войти
/
Ruden161
/
player
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
src/ui/panel_toggle_button.py
73 строки
3 KB
Ruden161
Start
23 ноя 2025, 16:19
23 ноя 2025, 16:19
0ff3eca
Код
Авторство
О чём код?
""" Кнопка переключения панели с анимацией и цветовой индикацией """ from PyQt6.QtWidgets import QToolButton from PyQt6.QtCore import Qt, QSize, QPointF from PyQt6.QtGui import QIcon, QPixmap, QPainter, QColor, QPen, QPolygonF from src.utils.config import Config class PanelToggleButton(QToolButton): """Кнопка переключения панели с цветовой индикацией""" def __init__(self, panel_type, tooltip_text): super().__init__() self.panel_type = panel_type # "left" или "right" self.is_panel_visible = True self.setToolTip(tooltip_text) self.setCursor(Qt.CursorShape.PointingHandCursor) self.setIconSize(QSize(28, 28)) # Стиль кнопки без линии (линия будет у контейнера) self.setStyleSheet(f""" QToolButton {{ background-color: transparent; border: none; padding: 6px 8px; }} QToolButton:hover {{ background-color: {Config.COLOR_TAB_HOVER}; }} """) self.update_icon() def set_panel_visible(self, visible): """Установить состояние видимости панели""" self.is_panel_visible = visible self.update_icon() def update_icon(self): """Обновить иконку в зависимости от состояния (стиль VS Code)""" size = 48 pixmap = QPixmap(size, size) pixmap.fill(Qt.GlobalColor.transparent) painter = QPainter(pixmap) painter.setRenderHint(QPainter.RenderHint.Antialiasing) painter.setRenderHint(QPainter.RenderHint.SmoothPixmapTransform) # Цвет в зависимости от состояния if self.is_panel_visible: color = QColor(Config.COLOR_ACCENT) # Бирюзовый если включено else: color = QColor("#808080") # Серый если выключено pen = QPen(color, 3, Qt.PenStyle.SolidLine, Qt.PenCapStyle.RoundCap, Qt.PenJoinStyle.RoundJoin) painter.setPen(pen) painter.setBrush(color) if self.panel_type == "left": # Левая панель - два вертикальных прямоугольника (как в VS Code) painter.fillRect(10, 14, 8, 20, color) # Левый прямоугольник (узкий) painter.fillRect(22, 14, 16, 20, color) # Правый прямоугольник (широкий) else: # Правая панель - два вертикальных прямоугольника (зеркально) painter.fillRect(10, 14, 16, 20, color) # Левый прямоугольник (широкий) painter.fillRect(30, 14, 8, 20, color) # Правый прямоугольник (узкий) painter.end() icon = QIcon(pixmap) self.setIcon(icon)