From f86e27f2f1b2a5068ceb5cbd6e8d17067f354ce4 Mon Sep 17 00:00:00 2001 From: "Herman S." <429230+has207@users.noreply.github.com> Date: Sun, 12 Oct 2025 13:17:03 +0900 Subject: [PATCH] [UI] Switch to green-ish theme --- src/xenia/app/achievements_dialog_qt.cc | 4 +- src/xenia/app/game_list_dialog_qt.cc | 17 ++- src/xenia/ui/windowed_app_main_qt.cc | 182 +++++++++++++++++++++--- 3 files changed, 173 insertions(+), 30 deletions(-) diff --git a/src/xenia/app/achievements_dialog_qt.cc b/src/xenia/app/achievements_dialog_qt.cc index 3432b899b..ab564e209 100644 --- a/src/xenia/app/achievements_dialog_qt.cc +++ b/src/xenia/app/achievements_dialog_qt.cc @@ -147,14 +147,14 @@ void AchievementsDialogQt::SetupUI() { " background-color: #2D2D2D;" " alternate-background-color: #2D2D2D;" " gridline-color: #444444;" - " selection-background-color: #3D5A80;" + " selection-background-color: rgba(16, 124, 16, 120);" "}" "QTableWidget::item {" " border-bottom: 1px solid #444444;" " padding: 0px;" "}" "QTableWidget::item:selected {" - " background-color: #3D5A80;" + " background-color: rgba(16, 124, 16, 120);" "}"); // Row height - consistent minimum height with auto-resize for content diff --git a/src/xenia/app/game_list_dialog_qt.cc b/src/xenia/app/game_list_dialog_qt.cc index 0d1946fb1..ac9d4e3f1 100644 --- a/src/xenia/app/game_list_dialog_qt.cc +++ b/src/xenia/app/game_list_dialog_qt.cc @@ -17,6 +17,7 @@ #include #include #include +#include #include #include #include @@ -274,9 +275,11 @@ void GameListDialogQt::SetupUI() { table_widget_->setContextMenuPolicy(Qt::CustomContextMenu); table_widget_->setMouseTracking(true); - // Disable default table item hover highlighting (we handle it in row widget) + // Set Xbox green theme for table table_widget_->setStyleSheet( - "QTableWidget::item:hover { background-color: transparent; }"); + "QTableWidget::item:hover { background-color: transparent; }" + "QTableWidget::item:selected { background-color: rgba(16, 124, 16, 120); " + "}"); // Auto-hide scrollbar - only show when hovering or scrolling table_widget_->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded); @@ -610,7 +613,7 @@ void GameListDialogQt::PopulateTable() { row_widget->setObjectName("GameListRow"); row_widget->setStyleSheet( "#GameListRow { border-bottom: 1px solid rgba(128, 128, 128, 50); }" - "#GameListRow:hover { background-color: rgba(128, 128, 128, 50); }"); + "#GameListRow:hover { background-color: rgba(16, 124, 16, 80); }"); auto* row_layout = new QHBoxLayout(row_widget); row_layout->setContentsMargins(10, 10, 10, 10); row_layout->setSpacing(15); @@ -1234,12 +1237,12 @@ void GameListDialogQt::ShowScrollbar() { " margin: 0px;" "}" "QScrollBar::handle:vertical {" - " background: rgba(128, 128, 128, 180);" + " background: rgba(16, 124, 16, 180);" " min-height: 20px;" " border-radius: 5px;" "}" "QScrollBar::handle:vertical:hover {" - " background: rgba(128, 128, 128, 220);" + " background: rgba(16, 124, 16, 220);" "}" "QScrollBar::add-line:vertical, QScrollBar::sub-line:vertical {" " height: 0px;" @@ -1268,12 +1271,12 @@ void GameListDialogQt::HideScrollbar() { " margin: 0px;" "}" "QScrollBar::handle:vertical {" - " background: rgba(128, 128, 128, 0);" + " background: rgba(16, 124, 16, 0);" " min-height: 20px;" " border-radius: 5px;" "}" "QScrollBar::handle:vertical:hover {" - " background: rgba(128, 128, 128, 180);" + " background: rgba(16, 124, 16, 180);" "}" "QScrollBar::add-line:vertical, QScrollBar::sub-line:vertical {" " height: 0px;" diff --git a/src/xenia/ui/windowed_app_main_qt.cc b/src/xenia/ui/windowed_app_main_qt.cc index 46cc7d43c..9dd288505 100644 --- a/src/xenia/ui/windowed_app_main_qt.cc +++ b/src/xenia/ui/windowed_app_main_qt.cc @@ -32,25 +32,43 @@ int main(int argc, char** argv) { QApplication qt_app(argc, argv); - // Force dark theme + // Force Fusion style to ensure consistent styling across platforms + qt_app.setStyle("Fusion"); + + // Force dark theme with Xbox green highlights QPalette dark_palette; - dark_palette.setColor(QPalette::Window, QColor(53, 53, 53)); - dark_palette.setColor(QPalette::WindowText, Qt::white); - dark_palette.setColor(QPalette::Base, QColor(35, 35, 35)); - dark_palette.setColor(QPalette::AlternateBase, QColor(53, 53, 53)); - dark_palette.setColor(QPalette::ToolTipBase, QColor(25, 25, 25)); - dark_palette.setColor(QPalette::ToolTipText, Qt::white); - dark_palette.setColor(QPalette::Text, Qt::white); - dark_palette.setColor(QPalette::Button, QColor(53, 53, 53)); - dark_palette.setColor(QPalette::ButtonText, Qt::white); - dark_palette.setColor(QPalette::BrightText, Qt::red); - dark_palette.setColor(QPalette::Link, QColor(42, 130, 218)); - dark_palette.setColor(QPalette::Highlight, QColor(42, 130, 218)); - dark_palette.setColor(QPalette::HighlightedText, Qt::black); - dark_palette.setColor(QPalette::Disabled, QPalette::Text, - QColor(127, 127, 127)); - dark_palette.setColor(QPalette::Disabled, QPalette::ButtonText, - QColor(127, 127, 127)); + + // Set colors for all color groups (Active, Inactive, Disabled) to avoid any + // blue + for (auto group : + {QPalette::Active, QPalette::Inactive, QPalette::Disabled}) { + dark_palette.setColor(group, QPalette::Window, QColor(53, 53, 53)); + dark_palette.setColor(group, QPalette::WindowText, Qt::white); + dark_palette.setColor(group, QPalette::Base, QColor(35, 35, 35)); + dark_palette.setColor(group, QPalette::AlternateBase, QColor(53, 53, 53)); + dark_palette.setColor(group, QPalette::ToolTipBase, QColor(25, 25, 25)); + dark_palette.setColor(group, QPalette::ToolTipText, Qt::white); + dark_palette.setColor( + group, QPalette::Text, + group == QPalette::Disabled ? QColor(127, 127, 127) : Qt::white); + dark_palette.setColor(group, QPalette::Button, QColor(53, 53, 53)); + dark_palette.setColor( + group, QPalette::ButtonText, + group == QPalette::Disabled ? QColor(127, 127, 127) : Qt::white); + dark_palette.setColor(group, QPalette::BrightText, Qt::red); + dark_palette.setColor(group, QPalette::Link, QColor(16, 124, 16)); + dark_palette.setColor(group, QPalette::LinkVisited, QColor(14, 106, 14)); + dark_palette.setColor(group, QPalette::Highlight, + group == QPalette::Disabled ? QColor(14, 106, 14) + : QColor(16, 124, 16)); + dark_palette.setColor(group, QPalette::HighlightedText, Qt::white); + dark_palette.setColor(group, QPalette::Light, QColor(80, 80, 80)); + dark_palette.setColor(group, QPalette::Midlight, QColor(66, 66, 66)); + dark_palette.setColor(group, QPalette::Dark, QColor(26, 26, 26)); + dark_palette.setColor(group, QPalette::Mid, QColor(40, 40, 40)); + dark_palette.setColor(group, QPalette::Shadow, Qt::black); + } + qt_app.setPalette(dark_palette); // Fix menu spacing and styling @@ -58,6 +76,14 @@ int main(int argc, char** argv) { "QMenuBar::item { " " padding: 5px 10px; " "} " + "QMenuBar::item:selected { " + " background-color: rgb(16, 124, 16); " + " color: white; " + "} " + "QMenuBar::item:pressed { " + " background-color: rgb(16, 124, 16); " + " color: white; " + "} " "QMenu { " " background-color: rgb(53, 53, 53); " " border: 1px solid rgb(80, 80, 80); " @@ -68,10 +94,124 @@ int main(int argc, char** argv) { " background-color: transparent; " "} " "QMenu::item:selected { " - " background-color: rgb(42, 130, 218); " - " color: black; " + " background-color: rgb(16, 124, 16); " + " color: white; " "} " - "QMenu::indicator { width: 0px; margin-left: 0px; }"); + "QMenu::indicator { width: 0px; margin-left: 0px; } " + // Scrollbars - Xbox green theme + "QScrollBar:vertical { " + " border: none; " + " background: transparent; " + " width: 12px; " + " margin: 0px; " + "} " + "QScrollBar::handle:vertical { " + " background: rgba(16, 124, 16, 180); " + " min-height: 20px; " + " border-radius: 6px; " + "} " + "QScrollBar::handle:vertical:hover { " + " background: rgba(16, 124, 16, 220); " + "} " + "QScrollBar::add-line:vertical, QScrollBar::sub-line:vertical { " + " height: 0px; " + "} " + "QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical { " + " background: none; " + "} " + "QScrollBar:horizontal { " + " border: none; " + " background: transparent; " + " height: 12px; " + " margin: 0px; " + "} " + "QScrollBar::handle:horizontal { " + " background: rgba(16, 124, 16, 180); " + " min-width: 20px; " + " border-radius: 6px; " + "} " + "QScrollBar::handle:horizontal:hover { " + " background: rgba(16, 124, 16, 220); " + "} " + "QScrollBar::add-line:horizontal, QScrollBar::sub-line:horizontal { " + " width: 0px; " + "} " + "QScrollBar::add-page:horizontal, QScrollBar::sub-page:horizontal { " + " background: none; " + "} " + // Table headers - Xbox green theme + "QHeaderView::section { " + " background-color: rgb(45, 45, 45); " + " color: white; " + " padding: 5px; " + " border: 1px solid rgb(80, 80, 80); " + "} " + "QHeaderView::section:hover { " + " background-color: rgb(16, 124, 16); " + "} " + // Table widgets - Xbox green focus outline + "QTableWidget:focus, QTableView:focus { " + " border: 2px solid rgb(16, 124, 16); " + " outline: none; " + "} " + "QTableWidget, QTableView { " + " border: 1px solid rgb(80, 80, 80); " + "} " + // Checkboxes - Xbox green theme + "QCheckBox::indicator:checked { " + " background-color: rgb(16, 124, 16); " + " border: 1px solid rgb(16, 124, 16); " + "} " + "QCheckBox::indicator:hover { " + " border: 1px solid rgb(16, 124, 16); " + "} " + // Input fields - Xbox green focus + "QLineEdit:focus, QTextEdit:focus, QPlainTextEdit:focus, QSpinBox:focus, " + "QDoubleSpinBox:focus, QComboBox:focus { " + " border: 2px solid rgb(16, 124, 16); " + " outline: none; " + "} " + "QLineEdit, QTextEdit, QPlainTextEdit, QSpinBox, QDoubleSpinBox, " + "QComboBox { " + " border: 1px solid rgb(80, 80, 80); " + "} " + // ComboBox dropdown - Xbox green theme + "QComboBox:hover { " + " border: 2px solid rgb(16, 124, 16); " + "} " + "QComboBox:on { " + " border: 2px solid rgb(16, 124, 16); " + "} " + "QComboBox::drop-down:hover { " + " background-color: rgba(16, 124, 16, 100); " + "} " + "QComboBox QAbstractItemView::item:hover { " + " background-color: rgba(16, 124, 16, 80); " + "} " + // List widgets - Xbox green theme + "QListView::item:selected, QTreeView::item:selected { " + " background-color: rgb(16, 124, 16); " + " color: white; " + "} " + "QListView::item:hover, QTreeView::item:hover { " + " background-color: rgba(16, 124, 16, 80); " + "} " + // Buttons hover - Xbox green theme + "QPushButton:hover { " + " background-color: rgba(16, 124, 16, 100); " + " border: 1px solid rgb(16, 124, 16); " + "} " + "QPushButton:pressed { " + " background-color: rgb(16, 124, 16); " + "} " + // Tab widget - Xbox green theme + "QTabBar::tab:selected { " + " background-color: rgb(16, 124, 16); " + " color: white; " + "} " + "QTabBar::tab:hover { " + " background-color: rgba(16, 124, 16, 100); " + "}"); // Set different application name for game processes so they show as separate // dock entries. Check if we have a target file argument (game process) or not