134 lines
4.5 KiB
Python
134 lines
4.5 KiB
Python
from PySide6.QtWidgets import QMainWindow, QWidget, QVBoxLayout, QStackedWidget, QHBoxLayout, QLabel, QPushButton
|
|
from PySide6.QtCore import QTimer, Qt
|
|
from themes import THEME_DAY, THEME_NIGHT
|
|
from ui.components.divider import divider
|
|
from ui.components.nav_button import NavButton
|
|
from screens.home import HomeScreen
|
|
from screens.stub import StubScreen
|
|
from screens.settings import SettingsScreen
|
|
from screens.media import MediaScreen
|
|
from datetime import datetime
|
|
from PySide6.QtWidgets import (
|
|
QApplication, QMainWindow, QWidget, QLabel, QPushButton,
|
|
QHBoxLayout, QVBoxLayout, QGridLayout, QStackedWidget, QSizePolicy
|
|
)
|
|
from PySide6.QtCore import QSize
|
|
from PySide6.QtGui import QFont
|
|
|
|
class MainWindow(QMainWindow):
|
|
def __init__(self, app: QApplication):
|
|
super().__init__()
|
|
self.app = app
|
|
self.is_night = True
|
|
|
|
self.setWindowTitle("Car UI (Premium)")
|
|
self.setMinimumSize(QSize(1024, 600))
|
|
self.showFullScreen()
|
|
|
|
# Root layout container
|
|
central = QWidget()
|
|
outer = QVBoxLayout(central)
|
|
outer.setContentsMargins(0, 0, 0, 0)
|
|
outer.setSpacing(0)
|
|
|
|
# Top bar
|
|
self.topbar = QWidget()
|
|
self.topbar.setObjectName("TopBar")
|
|
self.topbar.setAttribute(Qt.WA_StyledBackground, True)
|
|
self.topbar.setAutoFillBackground(True)
|
|
self.topbar.setMinimumHeight(72)
|
|
top = QHBoxLayout(self.topbar)
|
|
top.setContentsMargins(18, 12, 18, 12)
|
|
top.setSpacing(12)
|
|
|
|
self.lbl_time = QLabel("--:--")
|
|
self.lbl_time.setFont(QFont("", 20, 700))
|
|
|
|
chip_bt = QPushButton("BT")
|
|
chip_bt.setObjectName("IconChip")
|
|
chip_bt.setMinimumSize(QSize(60, 40))
|
|
chip_wifi = QPushButton("Wi-Fi")
|
|
chip_wifi.setObjectName("IconChip")
|
|
chip_wifi.setMinimumSize(QSize(70, 40))
|
|
chip_lte = QPushButton("LTE")
|
|
chip_lte.setObjectName("IconChip")
|
|
chip_lte.setMinimumSize(QSize(60, 40))
|
|
|
|
self.lbl_vol = QLabel("VOL 45%")
|
|
self.lbl_vol.setStyleSheet("color: rgba(138,147,166,0.95); font-size: 16px;")
|
|
|
|
self.btn_theme = QPushButton("🌙")
|
|
self.btn_theme.setObjectName("IconChip")
|
|
self.btn_theme.setMinimumSize(QSize(48, 40))
|
|
self.btn_theme.clicked.connect(self.toggle_theme)
|
|
|
|
top.addWidget(self.lbl_time)
|
|
top.addSpacing(10)
|
|
top.addWidget(chip_bt)
|
|
top.addWidget(chip_wifi)
|
|
top.addWidget(chip_lte)
|
|
top.addStretch(1)
|
|
top.addWidget(self.lbl_vol)
|
|
top.addWidget(self.btn_theme)
|
|
|
|
# Content stack
|
|
self.stack = QStackedWidget()
|
|
self.stack.addWidget(HomeScreen()) # 0
|
|
self.stack.addWidget(MediaScreen()) # 1
|
|
self.stack.addWidget(StubScreen("Car")) # 2
|
|
self.stack.addWidget(StubScreen("Maps")) # 3
|
|
self.stack.addWidget(SettingsScreen()) # 4
|
|
|
|
# Bottom bar (nav)
|
|
self.bottombar = QWidget()
|
|
self.bottombar.setObjectName("BottomBar")
|
|
self.bottombar.setMinimumHeight(100)
|
|
bottom = QHBoxLayout(self.bottombar)
|
|
bottom.setContentsMargins(16, 12, 16, 12)
|
|
bottom.setSpacing(12)
|
|
|
|
self.nav_buttons = [
|
|
NavButton("HOME"),
|
|
NavButton("MEDIA"),
|
|
NavButton("CAR"),
|
|
NavButton("MAPS"),
|
|
NavButton("SETTINGS"),
|
|
]
|
|
|
|
for i, btn in enumerate(self.nav_buttons):
|
|
btn.clicked.connect(lambda checked=False, idx=i: self.go(idx))
|
|
bottom.addWidget(btn, 1)
|
|
|
|
outer.addWidget(self.topbar)
|
|
outer.addWidget(divider(1))
|
|
outer.addWidget(self.stack, 1)
|
|
outer.addWidget(divider(1))
|
|
outer.addWidget(self.bottombar)
|
|
|
|
self.setCentralWidget(central)
|
|
|
|
# timers
|
|
self._clock_timer = QTimer(self)
|
|
self._clock_timer.timeout.connect(self.update_time)
|
|
self._clock_timer.start(500)
|
|
|
|
self.apply_theme()
|
|
self.go(0)
|
|
|
|
def update_time(self):
|
|
from datetime import datetime
|
|
self.lbl_time.setText(datetime.now().strftime("%H:%M"))
|
|
|
|
def apply_theme(self):
|
|
self.app.setStyleSheet(THEME_NIGHT if self.is_night else THEME_DAY)
|
|
self.btn_theme.setText("🌙" if self.is_night else "☀")
|
|
|
|
def toggle_theme(self):
|
|
self.is_night = not self.is_night
|
|
self.apply_theme()
|
|
|
|
def go(self, idx: int):
|
|
self.stack.setCurrentIndex(idx)
|
|
for i, b in enumerate(self.nav_buttons):
|
|
b.set_active(i == idx)
|