From 6354bd01e2aa264a4a7945a29e256f898d3a7687 Mon Sep 17 00:00:00 2001 From: rattatwinko Date: Fri, 31 Oct 2025 22:58:08 +0100 Subject: [PATCH] windows dark mode styling, this reads the registry, some scrollbar styles. and a new and improved logo --- mucapy/main.py | 94 ++++++++++++++++++++++++++++------ mucapy/styling/logo.png | Bin 16969 -> 17230 bytes mucapy/styling/mainwindow.qss | 65 ++++++++++++++++++++++- 3 files changed, 141 insertions(+), 18 deletions(-) diff --git a/mucapy/main.py b/mucapy/main.py index 65d8c6e..f042662 100644 --- a/mucapy/main.py +++ b/mucapy/main.py @@ -1,11 +1,12 @@ import json +import winreg import os import platform import subprocess import sys import time import urllib.parse - +import ctypes import cv2 import numpy as np import psutil # Add psutil import @@ -1189,7 +1190,7 @@ class AboutWindow(QDialog): layout.addWidget(icon_label) # Title - title_label = QLabel("MuCaPy - 1") + title_label = QLabel("PySec") title_label.setStyleSheet("font-size: 18px; font-weight: bold;") title_label.setAlignment(Qt.AlignCenter) layout.addWidget(title_label) @@ -1886,7 +1887,7 @@ class CameraSelectorDialog(QDialog): class MainWindow(QMainWindow): def __init__(self): super().__init__() - self.setWindowTitle("MuCaPy - V1") + self.setWindowTitle("PySec") self.setGeometry(100, 100, 1200, 800) # Initialize configuration @@ -2404,7 +2405,7 @@ class MainWindow(QMainWindow): # Python Memory Usage mem_layout = QHBoxLayout() - mem_layout.addWidget(QLabel("Python Memory:")) + mem_layout.addWidget(QLabel("RAM-Usage:")) self.mem_progress = QProgressBar() self.mem_progress.setRange(0, 100) self.mem_progress.setTextVisible(True) @@ -2686,14 +2687,14 @@ class MainWindow(QMainWindow): available = vm.available # bytes available to processes without swapping total_ram = vm.total # Calculate percent of available memory currently occupied by this process - mem_percent = int(min((rss / available) * 100, 100)) if available else 0 + mem_percent = int(min((rss / available) * 500, 100)) if available else 0 if hasattr(self, 'mem_progress'): # Update bar value and dynamic text self.mem_progress.setValue(mem_percent) rss_h = bytes_to_human(rss) avail_h = bytes_to_human(available) - self.mem_progress.setFormat(f"{mem_percent}%") - self.mem_progress.setToolTip(f"Python RSS: {rss_h}\nAvailable: {avail_h}\nTotal RAM: {bytes_to_human(total_ram)}") + self.mem_progress.setFormat(f"{rss_h}") + self.mem_progress.setToolTip(f"Python Resident Set Size: {rss_h}\nAvailable: {avail_h}\nTotal RAM: {bytes_to_human(total_ram)}") except Exception: pass @@ -2818,29 +2819,88 @@ class initQT: else: pass -if __name__ == "__main__": +""" + This is where windows fuckery starts, if you try to modify any of this then good luck, + this code is fragile but usually works, idk if it works in production but im pushing anyways, + fuck you. + Here we just try to set the windows titlebar to dark mode, this is done with HWND Handle +""" +def is_windows_darkmode() -> bool: + if platform.system() != "Windows": + return False - # Initialize Qt if on Linux ; If shit fails then modify these Functions + try: + key_path = r"Software\Microsoft\Windows\CurrentVersion\Themes\Personalize" + with winreg.OpenKey(winreg.HKEY_CURRENT_USER, key_path) as key: + # 0 = dark mode, 1 = light mode + value, _ = winreg.QueryValueEx(key, "AppsUseLightTheme") + # print(f"AppsUseLightTheme: {value}") # optional debug + return value == 0 + except Exception as e: + print(f"Could not read Windows registry for dark mode: {e}") + return False + +class darkmodechildren(QApplication): + def notify(self, receiver, event): + # Only handle top-level windows + if isinstance(receiver, QWidget) and receiver.isWindow(): + if event.type() == QEvent.WinIdChange: + set_dark_titlebar(receiver) + return super().notify(receiver, event) + +def set_dark_titlebar(widget: QWidget): + """Apply dark titlebar on Windows to any top-level window.""" + if platform.system() != "Windows": + return + if not widget.isWindow(): # only top-level windows + return + if is_windows_darkmode(): + try: + hwnd = int(widget.winId()) + DWMWA_USE_IMMERSIVE_DARK_MODE = 20 + value = ctypes.c_int(1) + res = ctypes.windll.dwmapi.DwmSetWindowAttribute( + hwnd, + DWMWA_USE_IMMERSIVE_DARK_MODE, + ctypes.byref(value), + ctypes.sizeof(value) + ) + if res != 0: + # fallback for some Windows builds + DWMWA_USE_IMMERSIVE_DARK_MODE = 19 + ctypes.windll.dwmapi.DwmSetWindowAttribute( + hwnd, + DWMWA_USE_IMMERSIVE_DARK_MODE, + ctypes.byref(value), + ctypes.sizeof(value) + ) + except Exception as e: + print("Failed to set dark titlebar:", e) + + +if __name__ == "__main__": + # Initialize Qt if on Linux if platform.system() == "Linux": qt = initQT() qt.getenv() qt.setenv() qt.shutupCV() - else: - # We do nothing, Windows doesnt need this ; better shit anyways - pass - app = QApplication(sys.argv) + app = darkmodechildren(sys.argv) - # Here we try to set the AppIcon ; If it isnt find then just pass + # Try to set the AppIcon try: app.setWindowIcon(QIcon(getpath.resource_path("styling/icon.png"))) except FileNotFoundError: pass - # Set application style to Fusion for better dark mode support + # Use Fusion style for consistent dark-mode palettes app.setStyle("Fusion") - window = MainWindow() window.show() - sys.exit(app.exec_()) \ No newline at end of file + + try: + sys.exit(app.exec_()) + except Exception as e: + print(f"Exit Exception with: {e}") + pass \ No newline at end of file diff --git a/mucapy/styling/logo.png b/mucapy/styling/logo.png index 8c9089be91fc074a9c2a3edc461bc82ad3f6ab1a..eaeeb9e0b08f3528d9af423d754456df12cdc8ec 100644 GIT binary patch literal 17230 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 T&#d6PFCbH6OVsN#n7jW6yJCRq literal 16969 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 WD^xM+?6;w>0pgC@?Yx`D&;JL)sbaSP diff --git a/mucapy/styling/mainwindow.qss b/mucapy/styling/mainwindow.qss index b8b9464..967f34f 100644 --- a/mucapy/styling/mainwindow.qss +++ b/mucapy/styling/mainwindow.qss @@ -92,4 +92,67 @@ QDockWidget::title { QToolButton { background-color: transparent; border: none; -} \ No newline at end of file +} + +QScrollBar:vertical { + background: #1E1E1E; /* Scrollbar background */ + width: 10px; + margin: 0px; + border-radius: 5px; +} + +QScrollBar::handle:vertical { + background: #3A3A3A; /* Scroll handle */ + min-height: 20px; + border-radius: 5px; +} + +QScrollBar::handle:vertical:hover { + background: #555555; /* Hover color */ +} + +QScrollBar::handle:vertical:pressed { + background: #6A6A6A; /* Active color */ +} + +QScrollBar::add-line:vertical, +QScrollBar::sub-line:vertical { + height: 0px; /* Hide arrows */ +} + +QScrollBar::add-page:vertical, +QScrollBar::sub-page:vertical { + background: none; /* No gap color */ +} + +/* ===== Horizontal Scrollbar ===== */ +QScrollBar:horizontal { + background: #1E1E1E; + height: 10px; + margin: 0px; + border-radius: 5px; +} + +QScrollBar::handle:horizontal { + background: #3A3A3A; + min-width: 20px; + border-radius: 5px; +} + +QScrollBar::handle:horizontal:hover { + background: #555555; +} + +QScrollBar::handle:horizontal:pressed { + background: #6A6A6A; +} + +QScrollBar::add-line:horizontal, +QScrollBar::sub-line:horizontal { + width: 0px; +} + +QScrollBar::add-page:horizontal, +QScrollBar::sub-page:horizontal { + background: none; +}