car_ui/ui/main_window_new.py
2026-01-08 23:15:53 +03:00

138 lines
4.4 KiB
Python

from PySide6.QtWidgets import (
QApplication,
QMainWindow,
QWidget,
QVBoxLayout,
QHBoxLayout,
QStackedWidget,
QToolButton,
QMenu,
QPushButton,
QLabel,
)
from PySide6.QtCore import QSize, Qt, QTimer
from PySide6.QtGui import QFont
from themes import THEME_DAY, THEME_NIGHT
from screens.media import MediaScreen
from screens.stub import StubScreen
from screens.settings import SettingsScreen
class MainWindowNew(QMainWindow):
def __init__(self, app: QApplication):
super().__init__()
self.app = app
self.is_night = True
self.setWindowTitle("Car UI (New)")
self.setMinimumSize(QSize(1024, 600))
self.showFullScreen()
central = QWidget()
outer = QVBoxLayout(central)
outer.setContentsMargins(0, 0, 0, 0)
outer.setSpacing(0)
self.topbar = QWidget()
self.topbar.setObjectName("TopBar")
self.topbar.setMinimumHeight(86)
top = QHBoxLayout(self.topbar)
top.setContentsMargins(18, 14, 18, 14)
top.setSpacing(14)
self.menu_button = QToolButton()
self.menu_button.setObjectName("MenuButton")
self.menu_button.setText("")
self.menu_button.setPopupMode(QToolButton.InstantPopup)
self.menu_button.setCursor(Qt.PointingHandCursor)
menu = QMenu(self.menu_button)
self.menu_button.setMenu(menu)
self.act_media = menu.addAction("Media")
self.act_car = menu.addAction("Car")
self.act_maps = menu.addAction("Maps")
self.lbl_source = QLabel("Media")
self.lbl_source.setFont(QFont("", 20, 600))
self.lbl_bt = QLabel("Источник")
self.lbl_bt.setObjectName("BluetoothStatus")
self.lbl_bt.setFont(QFont("", 18, 600))
self.lbl_time = QLabel("--:--")
self.lbl_time.setFont(QFont("", 20, 600))
self.btn_settings = QPushButton("")
self.btn_settings.setObjectName("SettingsButton")
self.btn_settings.setMinimumSize(56, 48)
self.btn_settings.clicked.connect(self.toggle_settings)
top.addWidget(self.menu_button)
top.addWidget(self.lbl_source)
top.addStretch(1)
top.addWidget(self.lbl_bt)
top.addWidget(self.lbl_time)
top.addWidget(self.btn_settings)
self.stack = QStackedWidget()
self.media_screen = MediaScreen()
self.stack.addWidget(self.media_screen) # 0
self.stack.addWidget(StubScreen("Car")) # 1
self.stack.addWidget(StubScreen("Maps")) # 2
self.stack.addWidget(SettingsScreen()) # 3
self.settings_idx = 3
self.last_non_settings_idx = 0
self.act_media.triggered.connect(lambda: self.go(0))
self.act_car.triggered.connect(lambda: self.go(1))
self.act_maps.triggered.connect(lambda: self.go(2))
self.media_screen.source_changed.connect(self.lbl_bt.setText)
outer.addWidget(self.topbar)
outer.addWidget(self.stack, 1)
self.setCentralWidget(central)
self._clock_timer = QTimer(self)
self._clock_timer.timeout.connect(self.update_time)
self._clock_timer.start(500)
self.apply_theme()
self.go(0)
self.lbl_bt.setText(self.media_screen.source.text())
def apply_theme(self):
self.app.setStyleSheet(THEME_NIGHT if self.is_night else THEME_DAY)
def _sync_topbar(self, idx: int):
is_settings = idx == self.settings_idx
self.menu_button.setVisible(not is_settings)
self.lbl_bt.setVisible(not is_settings)
self.lbl_time.setVisible(not is_settings)
self.btn_settings.setText("" if is_settings else "")
if is_settings:
self.lbl_source.setText("Настройки")
def toggle_settings(self):
if self.stack.currentIndex() == self.settings_idx:
self.go(self.last_non_settings_idx)
else:
self.go(self.settings_idx)
def update_time(self):
from datetime import datetime
self.lbl_time.setText(datetime.now().strftime("%H:%M"))
def go(self, idx: int):
if idx != self.settings_idx:
self.last_non_settings_idx = idx
self.stack.setCurrentIndex(idx)
if idx == 0:
self.lbl_source.setText("Media")
elif idx == 1:
self.lbl_source.setText("Car")
elif idx == 2:
self.lbl_source.setText("Maps")
self._sync_topbar(idx)