From 432e2852572f3aaf2598d9d77efbf935c9cf6722 Mon Sep 17 00:00:00 2001 From: Joel Bethke Date: Tue, 13 Jun 2017 14:34:05 -0500 Subject: [PATCH] UI: Add new theme, update theme capabilities I have always felt that the out of the box themes for OBS were quite lacking, and have spent a lot of time going through and sorting out the difficulties with the current setup. I've added a new themeID parameter to several elements that were otherwise impossible to target with QSS in a theme. Since Qt has pushed for the use of QML over QSS at this point, these should be considered workarounds. Included is the theme I was working on that can serve as a base. I'm hoping to encourage others to make their own themes, so we can grow the available themes for OBS. I am happy for any feedback on the theme itself, or other updates that can me made to make creating new themes easier overall. --- UI/data/themes/Rachni.qss | 1021 +++++++++++++++++ UI/data/themes/Rachni/checkbox_checked.png | Bin 0 -> 281 bytes .../Rachni/checkbox_checked_disabled.png | Bin 0 -> 491 bytes .../themes/Rachni/checkbox_checked_focus.png | Bin 0 -> 281 bytes UI/data/themes/Rachni/checkbox_unchecked.png | Bin 0 -> 464 bytes .../Rachni/checkbox_unchecked_disabled.png | Bin 0 -> 464 bytes .../Rachni/checkbox_unchecked_focus.png | Bin 0 -> 275 bytes UI/data/themes/Rachni/down_arrow.png | Bin 0 -> 165 bytes UI/data/themes/Rachni/down_arrow_disabled.png | Bin 0 -> 166 bytes UI/data/themes/Rachni/left_arrow.png | Bin 0 -> 166 bytes UI/data/themes/Rachni/left_arrow_disabled.png | Bin 0 -> 166 bytes UI/data/themes/Rachni/radio_checked.png | Bin 0 -> 940 bytes .../themes/Rachni/radio_checked_disabled.png | Bin 0 -> 972 bytes UI/data/themes/Rachni/radio_checked_focus.png | Bin 0 -> 18843 bytes UI/data/themes/Rachni/radio_unchecked.png | Bin 0 -> 728 bytes .../Rachni/radio_unchecked_disabled.png | Bin 0 -> 760 bytes .../themes/Rachni/radio_unchecked_focus.png | Bin 0 -> 18568 bytes UI/data/themes/Rachni/right_arrow.png | Bin 0 -> 160 bytes .../themes/Rachni/right_arrow_disabled.png | Bin 0 -> 160 bytes UI/data/themes/Rachni/sizegrip.png | Bin 0 -> 129 bytes UI/data/themes/Rachni/up_arrow.png | Bin 0 -> 158 bytes UI/data/themes/Rachni/up_arrow_disabled.png | Bin 0 -> 159 bytes UI/hotkey-edit.cpp | 4 + UI/properties-view.cpp | 5 + UI/window-basic-main.cpp | 1 + 25 files changed, 1031 insertions(+) create mode 100644 UI/data/themes/Rachni.qss create mode 100644 UI/data/themes/Rachni/checkbox_checked.png create mode 100644 UI/data/themes/Rachni/checkbox_checked_disabled.png create mode 100644 UI/data/themes/Rachni/checkbox_checked_focus.png create mode 100644 UI/data/themes/Rachni/checkbox_unchecked.png create mode 100644 UI/data/themes/Rachni/checkbox_unchecked_disabled.png create mode 100644 UI/data/themes/Rachni/checkbox_unchecked_focus.png create mode 100644 UI/data/themes/Rachni/down_arrow.png create mode 100644 UI/data/themes/Rachni/down_arrow_disabled.png create mode 100644 UI/data/themes/Rachni/left_arrow.png create mode 100644 UI/data/themes/Rachni/left_arrow_disabled.png create mode 100644 UI/data/themes/Rachni/radio_checked.png create mode 100644 UI/data/themes/Rachni/radio_checked_disabled.png create mode 100644 UI/data/themes/Rachni/radio_checked_focus.png create mode 100644 UI/data/themes/Rachni/radio_unchecked.png create mode 100644 UI/data/themes/Rachni/radio_unchecked_disabled.png create mode 100644 UI/data/themes/Rachni/radio_unchecked_focus.png create mode 100644 UI/data/themes/Rachni/right_arrow.png create mode 100644 UI/data/themes/Rachni/right_arrow_disabled.png create mode 100644 UI/data/themes/Rachni/sizegrip.png create mode 100644 UI/data/themes/Rachni/up_arrow.png create mode 100644 UI/data/themes/Rachni/up_arrow_disabled.png diff --git a/UI/data/themes/Rachni.qss b/UI/data/themes/Rachni.qss new file mode 100644 index 000000000..524fda29c --- /dev/null +++ b/UI/data/themes/Rachni.qss @@ -0,0 +1,1021 @@ +/***************************************************************************/ +/* Copyright (C) 2017 by Joel Bethke */ +/* */ +/* */ +/* This program is free software: you can redistribute it and/or modify */ +/* it under the terms of the GNU General Public License as published by */ +/* the Free Software Foundation, either version 2 of the License, or */ +/* (at your option) any later version. */ +/* */ +/* This program is distributed in the hope that it will be useful, */ +/* but WITHOUT ANY WARRANTY; without even the implied warranty of */ +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */ +/* GNU General Public License for more details. */ +/* */ +/* You should have received a copy of the GNU General Public License */ +/* along with this program. If not, see . */ +/* */ +/* ======================================================================= */ + +/* =========================== Color Palette ============================= */ +/* */ +/* rgb(49, 54, 59) - Blue-gray (Main Background) */ +/* rgb(58, 64, 69); - Light Blue-gray */ +/* */ +/* rgb(239, 240, 241) - "White" */ +/* */ +/* rgb(162, 161, 162) - Lighter Gray */ +/* rgb(118, 121, 124) - Light Grey */ +/* rgb(84, 87, 91) - Gray */ +/* rgb(35, 38, 41) - Dark Gray */ +/* */ +/* rgb(0, 188, 212) - Cyan (Primary) */ +/* rgb(98, 238, 255) - Light Cyan (Primary Light - unused) */ +/* rgb(0, 139, 163) - Dark Cyan (Primary Dark) */ +/* */ +/* rgb(240, 98, 146) - Pink (Secondary) */ +/* rgb(255, 148, 194) - Light Pink (Secondary Light) */ +/* rgb(186, 45, 101) - Dark Pink (Secondary Dark) */ +/* */ +/***************************************************************************/ + + +/*************************/ +/* --- General style --- */ +/*************************/ + +QMainWindow, +QDialog, +QWidget { + background-color: rgb(49, 54, 59); /* Blue-gray */ + color: rgb(239, 240, 241); /* White */ + selection-background-color: rgb(0, 188, 212); /* Cyan (Primary) */ + selection-color: rgb(239, 240, 241); /* White */ + outline: none; + font-family: Noto Sans, Tahoma; + font-size: 11px; +} + +QWidget::disabled { + color: 2px solid rgba(255, 148, 194, 0.25); /* Light Pink (Secondary Light) */ +} + +QWidget:item:hover { + background-color: rgb(0, 188, 212); /* Cyan (Primary) */ + color: rgb(118, 121, 124); /* Light Gray */ +} + +QComboBox:hover, +QAbstractSpinBox:hover, +QLineEdit:hover, +QTextEdit:hover, +QPlainTextEdit:hover, +QAbstractView:hover, +QTreeView:hover { + border: 1px solid rgb(0, 188, 212); /* Cyan (Primary) */ + color: rgb(239, 240, 241); /* White */ +} + +QSizeGrip { + image: url(./Rachni/sizegrip.png); + width: 12px; + height: 12px; +} + +/***********************/ +/* --- List widget --- */ +/***********************/ + +QListWidget::item:selected:!active { + color: rgb(239, 240, 241); /* White */ + background-color: rgba(255, 148, 194, 0.25); /* Light Pink (Secondary Light) */ + border: none; +} + +QListWidget::item:selected { + background-color: rgba(240, 98, 146, 0.5); /* Pink (Secondary) */ + border: none; +} + +QListWidget::item:hover, +QListWidget::item:disabled:hover, +QListWidget::item:hover:!active { + background-color: rgb(0, 188, 212); /* Cyan (Primary) */ + color: rgb(239, 240, 241); /* White */ + border: none; +} + + +/***********************/ +/* --- Group Boxes --- */ +/***********************/ + +QGroupBox { + font-size: 13px; + border: 1px solid rgb(118, 121, 124); /* Light Gray */ + border-radius: 2px; + padding-top: 16px; + margin-top: 20px; +} + +QGroupBox::title { + color: rgb(240, 98, 146); /* Pink (Secondary) */ + left: 20px; + padding-left: 5px; + padding-right: 4px; + padding-top: -14px; +} + +/*****************/ +/* --- Menus --- */ +/*****************/ + +QMenuBar { + background-color: rgb(49, 54, 59); /* Blue-gray */ + color: rgb(239, 240, 241); /* White */ +} + +QMenuBar::item { + background: transparent; +} + +QMenuBar::item:selected { + background-color: rgba(240, 98, 146, 0.5); /* Pink (Secondary) */ + border-radius: 1px; +} + +QMenuBar::item:pressed { + border: none; + background-color: rgb(0, 188, 212); + margin-bottom: -1px; + padding-bottom: 1px; +} + +/**********************/ +/* --- ScrollBars --- */ +/**********************/ + +QScrollBar:horizontal { + height: 15px; + margin: 3px 15px 3px 15px; + border: 1px transparent; + border-radius: 4px; + background-color: rgb(35, 38, 41); /* Dark Gray */ +} + +QScrollBar::handle:horizontal { + background-color: rgb(118, 121, 124); /* Light Gray */ + min-width: 5px; + border-radius: 4px; +} + +QScrollBar::add-line:horizontal { + margin: 0 3px 0 3px; + border-image: url(./Rachni/right_arrow_disabled.png); + width: 10px; + height: 10px; + subcontrol-position: right; + subcontrol-origin: margin; +} + +QScrollBar::sub-line:horizontal { + margin: 0 3px 0 3px; + border-image: url(./Rachni/left_arrow_disabled.png); + height: 10px; + width: 10px; + subcontrol-position: left; + subcontrol-origin: margin; +} + +QScrollBar::add-line:horizontal:hover, +QScrollBar::add-line:horizontal:on { + border-image: url(./Rachni/right_arrow.png); + height: 10px; + width: 10px; + subcontrol-position: right; + subcontrol-origin: margin; +} + +QScrollBar::sub-line:horizontal:hover, +QScrollBar::sub-line:horizontal:on { + border-image: url(./Rachni/left_arrow.png); + height: 10px; + width: 10px; + subcontrol-position: left; + subcontrol-origin: margin; +} + +QScrollBar::up-arrow:horizontal, +QScrollBar::down-arrow:horizontal { + background: none; +} + +QScrollBar::add-page:horizontal, +QScrollBar::sub-page:horizontal { + background: none; +} + +QScrollBar:vertical { + background-color: rgb(35, 38, 41); /* Dark Gray */ + width: 15px; + margin: 15px 3px 15px 3px; + border: 1px transparent; + border-radius: 4px; +} + +QScrollBar::handle:vertical { + background-color: rgb(118, 121, 124); /* Light Gray */ + min-height: 5px; + border-radius: 4px; +} + +QScrollBar::sub-line:vertical { + margin: 3px 0 3px 0; + border-image: url(./Rachni/up_arrow_disabled.png); + height: 10px; + width: 10px; + subcontrol-position: top; + subcontrol-origin: margin; +} + +QScrollBar::add-line:vertical { + margin: 3px 0 3px 0; + border-image: url(./Rachni/down_arrow_disabled.png); + height: 10px; + width: 10px; + subcontrol-position: bottom; + subcontrol-origin: margin; +} + +QScrollBar::sub-line:vertical:hover, +QScrollBar::sub-line:vertical:on { + border-image: url(./Rachni/up_arrow.png); + height: 10px; + width: 10px; + subcontrol-position: top; + subcontrol-origin: margin; +} + +QScrollBar::add-line:vertical:hover, +QScrollBar::add-line:vertical:on { + border-image: url(./Rachni/down_arrow.png); + height: 10px; + width: 10px; + subcontrol-position: bottom; + subcontrol-origin: margin; +} + +QScrollBar::up-arrow:vertical, +QScrollBar::down-arrow:vertical { + background: none; +} + +QScrollBar::add-page:vertical, +QScrollBar::sub-page:vertical { + background: none; +} + +/***********************/ +/* --- Tab Widgets --- */ +/***********************/ + +QTabWidget { + border: none; +} + +QTabWidget::pane { + border: 1px solid rgb(118, 121, 124); /* Light Gray */ + padding: 5px; + margin: 0; +} + +QTabWidget::tab-bar { + left: 5px; +} + +/********************/ +/* --- Tab Bars --- */ +/********************/ + +QTabBar { + qproperty-drawBase: 0; + border-radius: 3px; +} + +QTabBar:focus { + border: none; +} + +QTabBar::close-button { + image: url(./Rachni/close.png); + background: transparent; +} + +QTabBar::close-button:hover { + image: url(./Rachni/close-hover.png); + background: transparent; +} + +QTabBar::close-button:pressed { + image: url(:./Rachni/close-pressed.png); + background: transparent; +} + +QTabBar::tab { + color: rgb(239, 240, 241); /* White */ + border: 1px solid rgb(118, 121, 124); /* Light Gray */ + border-bottom: 1px transparent; + background-color: rgba(240, 98, 146, 0.5); /* Pink (Secondary) */ + padding: 5px; + min-width: 50px; + border-top-left-radius: 2px; + border-top-right-radius: 2px; +} + +QTabBar::tab:!selected { + color: rgb(239, 240, 241); /* White */ + background-color: rgb(84, 87, 91); /* Gray */ + border: 1px solid rgb(118, 121, 124); /* Light Gray */ + border-bottom: 1px transparent; + border-top-left-radius: 2px; + border-top-right-radius: 2px; +} + +QTabBar::tab:!selected:hover { + background-color: rgb(0, 188, 212); /* Cyan (Primary) */ +} + +/********************/ +/* --- Toolbars --- */ +/********************/ + +QToolBar { + background-color: rgb(49, 54, 59); /* Blue-gray */ + border: none; +} + +QToolButton:hover { + background-color: rgba(240, 98, 146, 0.5); /* Pink (Secondary) */ + border-radius: 2px; +} + +QToolButton:pressed { + background-color: rgb(240, 98, 146); /* Pink (Secondary) */ + border-radius: 2px; +} + +* [themeID="addIconSmall"] { + qproperty-icon: url(./Dark/plus.png); +} + +* [themeID="removeIconSmall"] { + qproperty-icon: url(./Dark/minus.png); +} + +* [themeID="propertiesIconSmall"] { + qproperty-icon: url(./Dark/cogwheel.png); +} + +* [themeID="configIconSmall"] { + qproperty-icon: url(./Dark/cogwheel.png); +} + +* [themeID="upArrowIconSmall"] { + qproperty-icon: url(./Dark/up_arrow.png); +} + +* [themeID="downArrowIconSmall"] { + qproperty-icon: url(./Dark/down_arrow.png); +} + +/***********************/ +/* --- Combo boxes --- */ +/***********************/ + +QComboBox { + background-color: rgb(35, 38, 41); /* Dark Gray */ + border: 1px solid rgb(118, 121, 124); /* Light Gray */ + border-radius: 2px; + padding: 5px; + min-width: 75px; +} + +QComboBox:on { + padding-top: 3px; + padding-left: 4px; +} + +QComboBox QAbstractItemView { + background-color: rgb(35, 38, 41); /* Dark Gray */ + border-radius: 2px; + border: 1px solid rgb(118, 121, 124); /* Light Gray */ +} + +QComboBox::drop-down { + subcontrol-origin: padding; + subcontrol-position: top right; + width: 15px; + + border-left-width: 0; + border-left-color: rgb(169, 169, 169); + border-left-style: solid; + border-top-right-radius: 3px; + border-bottom-right-radius: 3px; +} + +QComboBox::down-arrow, +QComboBox::down-arrow:pressed, +QComboBox::down-arrow:focus { + image: url(./Rachni/down_arrow_disabled.png); +} + +QComboBox::down-arrow:on, +QComboBox::down-arrow:hover { + image: url(./Rachni/down_arrow.png); +} + +/*********************/ +/* --- Spinboxes --- */ +/*********************/ + +QAbstractSpinBox { + padding: 5px; + border: 1px solid rgb(118, 121, 124); /* Light Gray */ + background-color: rgb(35, 38, 41); /* Dark Gray */ + color: rgb(239, 240, 241); /* White */ + border-radius: 2px; + min-width: 75px; +} + +QAbstractSpinBox:up-button { + background-color: transparent; + subcontrol-origin: border; + subcontrol-position: top right; +} + +QAbstractSpinBox:down-button { + background-color: transparent; + subcontrol-origin: border; + subcontrol-position: bottom right; +} + +QAbstractSpinBox::up-arrow, +QAbstractSpinBox::up-arrow:disabled, +QAbstractSpinBox::up-arrow:off { + image: url(./Rachni/up_arrow_disabled.png); + width: 10px; + height: 10px; +} + +QAbstractSpinBox::up-arrow:hover { + image: url(./Rachni/up_arrow.png); +} + +QAbstractSpinBox::down-arrow, +QAbstractSpinBox::down-arrow:disabled, +QAbstractSpinBox::down-arrow:off { + image: url(./Rachni/down_arrow_disabled.png); + width: 10px; + height: 10px; +} + +QAbstractSpinBox::down-arrow:hover { + image: url(./Rachni/down_arrow.png); +} + +/**********************/ +/* --- Line edits --- */ +/**********************/ + +QLineEdit { + background-color: rgb(35, 38, 41); /* Dark Gray */ + padding: 5px; + border: 1px solid rgb(118, 121, 124); /* Light Gray */ + border-radius: 2px; + color: rgb(239, 240, 241); /* White */ +} + +/**********************/ +/* --- Checkboxes --- */ +/**********************/ + +QCheckBox { + spacing: 5px; + outline: none; + color: rgb(239, 240, 241); /* White */ + margin-bottom: 2px; +} + +QCheckBox:hover, QCheckBox:focus { + color: rgb(240, 98, 146); /* Pink (Secondary) */ +} + +QCheckBox:disabled { + color: rgb(118, 121, 124); /* Light Gray */ +} + +QCheckBox::indicator, +QGroupBox::indicator { + width: 18px; + height: 18px; +} + +QGroupBox::indicator { + margin-left: 2px; +} + +QCheckBox::indicator:unchecked { + image: url(./Rachni/checkbox_unchecked.png); +} + +QCheckBox::indicator:unchecked:hover, +QGroupBox::indicator:unchecked:hover { + border: none; + image: url(./Rachni/checkbox_unchecked_focus.png); +} + +QCheckBox::indicator:checked { + image: url(./Rachni/checkbox_checked.png); +} + +QCheckBox::indicator:checked:hover, +QGroupBox::indicator:checked:hover { + border: none; + image: url(./Rachni/checkbox_checked_focus.png); +} + +QCheckBox::indicator:checked:disabled, +QGroupBox::indicator:checked:disabled { + image: url(./Rachni/checkbox_checked_disabled.png); +} + +QCheckBox::indicator:unchecked:disabled, +QGroupBox::indicator:unchecked:disabled { + image: url(./Rachni/checkbox_unchecked_disabled.png); +} + +/***********************/ +/* --- Radio boxes --- */ +/***********************/ + +QRadioButton { + spacing: 5px; + outline: none; + color: rgb(239, 240, 241); /* White */ + margin-bottom: 2px; +} + +QRadioButton:disabled { + color: rgb(118, 121, 124); /* Light Gray */ +} + +QRadioButton::indicator { + width: 21px; + height: 21px; +} + +QRadioButton::indicator:unchecked { + image: url(./Rachni/radio_unchecked.png); +} + + +QRadioButton::indicator:unchecked:hover, +QRadioButton::indicator:unchecked:focus, +QRadioButton::indicator:unchecked:pressed { + border: none; + outline: none; + image: url(./Rachni/radio_unchecked_focus.png); +} + +QRadioButton::indicator:checked { + border: none; + outline: none; + image: url(./Rachni/radio_checked.png); +} + +QRadioButton::indicator:checked:hover, +QRadioButton::indicator:checked:focus, +QRadioButton::indicator:checked:pressed { + border: none; + outline: none; + image: url(./Rachni/radio_checked_focus.png); +} + +QRadioButton::indicator:checked:disabled { + outline: none; + image: url(./Rachni/radio_checked_disabled.png); +} + +QRadioButton::indicator:unchecked:disabled { + image: url(./Rachni/radio_unchecked_disabled.png); +} + +/***************************/ +/* --- Mute Checkboxes --- */ +/***************************/ + +MuteCheckBox { + outline: none; +} + +MuteCheckBox::indicator:checked { + image: url(./Dark/mute.png); +} + +MuteCheckBox::indicator:unchecked { + image: url(./Dark/unmute.png); +} + +MuteCheckBox::indicator:unchecked:hover { + background-color: rgba(240, 98, 146, 0.5); /* Pink (Secondary) */ + image: url(./Dark/unmute.png); +} + +MuteCheckBox::indicator:unchecked:focus { + image: url(./Dark/unmute.png); +} +MuteCheckBox::indicator:checked:hover { + background-color: rgba(240, 98, 146, 0.5); /* Pink (Secondary) */ + image: url(./Dark/mute.png); +} + +MuteCheckBox::indicator:checked:focus { + image: url(./Dark/mute.png); +} + +MuteCheckBox::indicator:checked:disabled { + image: url(./Dark/mute.png); +} + +MuteCheckBox::indicator:unchecked:disabled { + image: url(./Dark/unmute.png); +} + +/*************************/ +/* --- Progress bars --- */ +/*************************/ + +QProgressBar { + border: 2px solid rgb(118, 121, 124); /* Light Gray */ + border-radius: 5px; + text-align: center; +} + +QProgressBar::chunk { + background-color: rgb(0, 188, 212); /* Cyan (Primary) */ +} + +/**************************/ +/* --- Volume Control --- */ +/**************************/ + +VolumeMeter { + qproperty-bkColor: rgb(35, 38, 41); /* Dark Gray */ + qproperty-magColor: rgb(186, 45, 101); /* Dark Pink (Secondary Dark) */ + qproperty-peakColor: rgb(240, 98, 146); /* Pink (Secondary) */ + qproperty-peakHoldColor: rgb(255, 148, 194); /* Light Pink (Secondary Light) */ +} + +/*******************/ +/* --- Buttons --- */ +/*******************/ + +QPushButton { + background-color: rgb(0, 188, 212);; /* Cyan (Primary) */ + color: rgb(239, 240, 241); /* White */ + border-radius: 2px; + border: 1px solid rgb(0, 188, 212); /* Cyan (Primary) */ + padding: 4px; + padding-left: 15px; + padding-right: 15px; +} + +QPushButton:hover { + background-color: rgba(240, 98, 146, 0.5); /* Pink (Secondary) */ + border: 1px solid rgba(240, 98, 146, 0.5); /* Pink (Secondary) */ +} + +QPushButton:pressed { + background-color: rgb(240, 98, 146); /* Pink (Secondary) */ + border: 1px solid rgb(240, 98, 146); /* Pink (Secondary) */ +} + +QPushButton:checked:pressed { + background-color: rgb(240, 98, 146); /* Pink (Secondary) */ + border: 1px solid rgb(240, 98, 146); /* Pink (Secondary) */ +} + +QPushButton:checked { + border: 1px solid rgba(240, 98, 146, 0.5); /* Pink (Secondary) */ +} + +QPushButton:checked:hover { + background-color: rgba(240, 98, 146, 0.5); /* Pink (Secondary) */ +} + +QPushButton:disabled { + background-color: rgb(0, 139, 163); /* Dark Cyan (Primary Dark) */ + border: 1px solid rgb(0, 139, 163); /* Dark Cyan (Primary Dark) */ + color: rgb(162, 161, 162); /* Lighter Gray */ +} + + + +/******************************/ +/* --- Dialog Box Buttons --- */ +/******************************/ +/* These currently match the */ +/* default button style, but */ +/* I left this section in as */ +/* a reference to themers. */ +/******************************/ + +QDialogButtonBox QPushButton { + background-color: rgb(0, 188, 212); /* Cyan (Primary) */ +} + +QDialogButtonBox QPushButton:hover { + background-color: rgba(240, 98, 146, 0.5); /* Pink (Secondary) */ + border: 1px solid rgba(240, 98, 146, 0.5); /* Pink (Secondary) */ +} + +QDialogButtonBox QPushButton:pressed { + background-color: rgb(240, 98, 146); /* Pink (Secondary) */ +} + +QDialogButtonBox QPushButton:disabled { + background-color: rgb(0, 139, 163); /* Dark Cyan (Primary Dark) */ + border: 1px solid rgb(0, 139, 163); /* Dark Cyan (Primary Dark) */ + color: rgb(162, 161, 162); /* Lighter Gray */ +} + +/*******************************/ +/* --- OBS Main UI Buttons --- */ +/********************************/ +/* This will style the buttons */ +/* from the main OBS UI apart */ +/* from the rest of the general */ +/* button styles. Currently */ +/* these match, but left in for */ +/* reference to new themers. */ +/********************************/ + +QPushButton#streamButton, +QPushButton#recordButton, +QPushButton[themeID="replayBufferButton"], +QPushButton#modeSwitch, +QPushButton#settingsButton, +QPushButton#exitButton { + background-color: rgb(0, 188, 212); /* Cyan (Primary) */ +} + +QPushButton#recordButton { + padding-left: 5px; + padding-right: 5px; +} + +QPushButton:hover#streamButton, +QPushButton:hover#recordButton, +QPushButton:hover[themeID="replayBufferButton"], +QPushButton:hover#modeSwitch, +QPushButton:hover#settingsButton, +QPushButton:hover#exitButton { + background-color: rgba(240, 98, 146, 0.5); /* Pink (Secondary) */ + border: 1px solid rgba(240, 98, 146, 0.5); /* Pink (Secondary) */ +} + +QPushButton:pressed#streamButton, +QPushButton:pressed#recordButton, +QPushButton:pressed[themeID="replayBufferButton"], +QPushButton:pressed#modeSwitch, +QPushButton:pressed#settingsButton, +QPushButton:pressed#exitButton { + background-color: rgb(240, 98, 146); /* Pink (Secondary) */ + border: 1px solid rgb(240, 98, 146); /* Pink (Secondary) */ +} + +QPushButton:checked[themeID="replayBufferButton"], +QPushButton:checked#modeSwitch { + background-color: rgba(240, 98, 146, 0.5); /* Pink (Secondary) */ + border: 1px solid rgba(240, 98, 146, 0.5); /* Pink (Secondary) */ +} + +/**************************/ +/* --- Icon Buttons --- */ +/**************************/ +/* This fixes the issues */ +/* with the icon buttons */ +/* sharing the same style */ +/* as other buttons. */ +/**************************/ + +QPushButton[themeID="addIconSmall"], +QPushButton[themeID="removeIconSmall"], +QPushButton[themeID="configIconSmall"], +QPushButton#transitionRemove, +QPushButton#moveAsyncFilterUp, +QPushButton#moveAsyncFilterDown, +QPushButton#moveEffectFilterDown, +QPushButton#moveEffectFilterUp { + background-color: rgb(49, 54, 59); /* Blue-gray */ + border: none; +} + + +QPushButton:hover[themeID="addIconSmall"], +QPushButton:hover[themeID="removeIconSmall"], +QPushButton:hover[themeID="configIconSmall"], +QPushButton:hover#transitionRemove, +QPushButton:hover#moveAsyncFilterUp, +QPushButton:hover#moveAsyncFilterDown, +QPushButton:hover#moveEffectFilterDown, +QPushButton:hover#moveEffectFilterUp { + background-color: rgba(240, 98, 146, 0.5); /* Pink (Secondary) */ + margin: 0; + padding: 0; + border-radius: 2px; + border: none; + outline: none; +} + +/******************************/ +/* --- Hotkey Buttons --- */ +/******************************/ +/* Fix for the hotkey buttons */ +/* looking terrible with my */ +/* color choices. */ +/******************************/ + +QPushButton[themeID="hotkeyButtons"] { + background-color: rgb(58, 64, 69); /* Light Blue-gray */ + color: rgb(239, 240, 241); /* White */ + border-radius: 2px; + border: none; + margin: 4px; + padding-top: 6px; + padding-bottom: 6px; +} + +QPushButton:hover[themeID="hotkeyButtons"] { + background-color: rgba(240, 98, 146, 0.5); /* Pink (Secondary) */ + border: 1px solid rgba(240, 98, 146, 0.5); /* Pink (Secondary) */ +} + +QPushButton:pressed[themeID="hotkeyButtons"] { + background-color: rgb(240, 98, 146); /* Pink (Secondary) */ + border: 1px solid rgb(240, 98, 146); /* Pink (Secondary) */ +} + +QPushButton:disabled[themeID="hotkeyButtons"] { + background-color: rgb(58, 64, 69); /* Light Blue-gray */ + color: rgb(162, 161, 162); /* Lighter Gray */ +} + +/******************/ +/* --- Labels --- */ +/******************/ + +/* Titles for main UI */ +QLabel#scenesLabel, +QLabel#sourcesLabel, +QLabel#mixerLabel, +QLabel#sceneTransitionsLabel { + color: rgb(240, 98, 146); /* Pink (Secondary) */ + margin-top: 5px; +} + +/* warning and error */ +QLabel#warningLabel { + color: rgb(255, 148, 194); /* Light Pink (Secondary Light) */ + font-weight: bold; +} + +QLabel#errorLabel { + color: rgb(186, 45, 101); /* Dark Pink (Secondary Dark) */ + font-weight: bold; +} + +/****************************/ +/* --- Splitter --- */ +/****************************/ +/* This styles the splitter */ +/* object to show a dashed */ +/* line, indicating that it */ +/* is present and can be */ +/* adjusted. */ +/****************************/ + +QSplitter::handle { + border: 1px dashed rgb(118, 121, 124); /* Light Gray */ +} + +QSplitter::handle:hover { + background-color: rgba(240, 98, 146, 0.5); /* Pink (Secondary) */ +} + +QSplitter::handle:horizontal { + width: 1px; +} + +QSplitter::handle:vertical { + height: 1px; +} + +/*******************************/ +/* --- Sliders --- */ +/*******************************/ +/* Not really happy with */ +/* these, but not sure what */ +/* else to do. All colors not */ +/* in the palette for now */ +/*******************************/ + +QSlider::groove:horizontal { + background-color: QLinearGradient(x1: 0, y1: 0, x2: 0, y2: 1, + stop: 0 rgb(35, 38, 41), /* Dark Gray */ + stop: 0.75 rgb(50, 49, 50)); + height: 4px; + border: none; + border-radius: 2px; +} + +QSlider::handle:horizontal { + background-color: QLinearGradient(x1: 0, y1: 0, x2: 0, y2: 1, + stop: 0 rgb(240, 239, 240), + stop: 0.25 rgb(200, 199, 200), + stop: 1 rgb(162, 161, 162)); + border: 1px solid rgb(58, 57, 58); + border-radius: 3px; + height: 10px; + width: 18px; + margin: -3px 0; +} + +QSlider::handle:horizontal:pressed { + background-color: QLinearGradient(x1: 0, y1: 1, x2: 0, y2: 0, + stop: 0 rgb(240, 239, 240), + stop: 0.25 rgb(200, 199, 200), + stop: 1 rgb(162, 161, 162)); +} + +QSlider::sub-page:horizontal:disabled { + background-color: QLinearGradient(x1: 0, y1: 0, x2: 0, y2: 1, + stop: 0 rgb(35, 38, 41), /* Dark Gray */ + stop: 0.75 rgb(50, 49, 50)); + border-radius: 2px; +} + +QSlider::handle:hover { + background-color: rgb(200, 199, 200); +} + +QSlider::sub-page { + background-color: rgb(0, 188, 212); /* Cyan (Primary) */ + border-radius: 2px; +} + +QSlider::handle:disabled { + background-color: rgb(122, 121, 122); +} + +/****************/ +/* --- Misc --- */ +/****************/ + + +/* Highlight linked hotkeys */ +OBSHotkeyLabel[hotkeyPairHover=true] { + color: rgb(240, 98, 146); /* Pink (Secondary) */ +} + +/* Workaround so frame borders in dark themes don't look like poop */ +* [frameShape="1"], +* [frameShape="2"], +* [frameShape="3"], +* [frameShape="4"], +* [frameShape="5"], +* [frameShape="6"] { + border: 1px solid rgb(118, 121, 124); /* Light Gray */ + background-color: rgb(35, 38, 41); /* Dark Gray */ +} + +QFrame[frameShape="0"] { + border-radius: 2px; + border: 1px transparent; +} + + +/* Misc style tweaks for dark themes */ +QStatusBar::item { + border: none; +} + +QAbstractItemView { + background-color: rgb(35, 38, 41); /* Dark Gray */ +} + +QToolTip { + border: 1px solid rgb(118, 121, 124); /* Light Gray */ + background-color: rgb(49, 54, 59); /* Blue-gray */ + color: rgb(240, 98, 146); /* Pink (Secondary) */ +} diff --git a/UI/data/themes/Rachni/checkbox_checked.png b/UI/data/themes/Rachni/checkbox_checked.png new file mode 100644 index 0000000000000000000000000000000000000000..c7ce2c3c25858ad69ad0e82b80933972da406c8c GIT binary patch literal 281 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@&H$ef*Z=?j|NH-+Vb7JGwC4su zL8g)*zhDN2vdL#HfIP+|Z+91l4pvzYkop3T$YLN3VtX*Soy@iaGAun^977~7Cnp?W z=vjT>Kw~5Cp&17bY-Ld4Q`sryz@w(Xyhx;#G01v`goIv;wcIn=9qbF^j`47_F+BU^ zr#}1QZ*ia@swJ)wB`Jv|saDBFsX&Us$iUEC*T7WQ&?Lmr*vin*%ES=JwK6c+-{*1- eMMG|WN@iLmZVl%y|H%SsVDNPHb6Mw<&;$TQ{!iur literal 0 HcmV?d00001 diff --git a/UI/data/themes/Rachni/checkbox_checked_disabled.png b/UI/data/themes/Rachni/checkbox_checked_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..cb63cc2fac47ad304451f864be5fb9b9085910ee GIT binary patch literal 491 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzmSQK*5Dp-y;YjHK@;M7UB8!3Q zuY)k7lg8`{prB-lYeY$Kep*R+Vo@qXd3m{BW?pu2a$-TMUVc&f>~}U&3=E7Jo-U3d z5v^~h`}!SnkZ7B~UO?mu^MY^z;cfGr%T7e}s1?W?8ZIpHm|nqi{YV9S;d_3jiRW9V zC@j#CiOINs*XRD1%4NQnC4ao1_;X|a8O{J^t^>=I&uJH^EA=Yy=q@QJXMe6{= z3nu?QmTiqn8yL4lU7L4ID46lSggggJ-lhEfrK>ewSvD~j#OXbEpLgByNx%V?Yugz2 z%=F`x=yC0fIn20j(F*mKC7cqgJZ$I97rnv0D^bF3N854ErU!Bp^;Wf}GDU{OUt^u0 zW>d#j^wD7Ns`t{1S6kg*n)>$7^lzH?%EjxII~|lJaHueWsWo@_*Zi9Q-(<7@f_{&8 zrO0b9HEPU+9v)SBw)%l|Fntmmjz{W9#jS ei>v=l+`}wZn5FJg^3NX_F$|urelF{r5}E*p0K`TB literal 0 HcmV?d00001 diff --git a/UI/data/themes/Rachni/checkbox_checked_focus.png b/UI/data/themes/Rachni/checkbox_checked_focus.png new file mode 100644 index 0000000000000000000000000000000000000000..c7ce2c3c25858ad69ad0e82b80933972da406c8c GIT binary patch literal 281 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@&H$ef*Z=?j|NH-+Vb7JGwC4su zL8g)*zhDN2vdL#HfIP+|Z+91l4pvzYkop3T$YLN3VtX*Soy@iaGAun^977~7Cnp?W z=vjT>Kw~5Cp&17bY-Ld4Q`sryz@w(Xyhx;#G01v`goIv;wcIn=9qbF^j`47_F+BU^ zr#}1QZ*ia@swJ)wB`Jv|saDBFsX&Us$iUEC*T7WQ&?Lmr*vin*%ES=JwK6c+-{*1- eMMG|WN@iLmZVl%y|H%SsVDNPHb6Mw<&;$TQ{!iur literal 0 HcmV?d00001 diff --git a/UI/data/themes/Rachni/checkbox_unchecked.png b/UI/data/themes/Rachni/checkbox_unchecked.png new file mode 100644 index 0000000000000000000000000000000000000000..2159aca9a10f75729912579b33a1226e575799aa GIT binary patch literal 464 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzmSQK*5Dp-y;YjHK@;M7UB8!3Q zuY)k7lg8`{prB-lYeY$Kep*R+Vo@qXd3m{BW?pu2a$-TMUVc&f>~}U&3=E9Eo-U3d z5v^~hTl*b$5Mg-k8hGeCL!&lB&^xD7y>BB#3gn$qXZC6ymd#kPSfgCwOO2D=r^N+5 zJw7|dgetV6qbk!>#or&Sckj|)rDfLlx9!BzLz){NpZKh3z}$B1``V5SO@~m`&d1TB zFPXg)nog`1-usI20_&}gBemzbKX;_n9XqyBf99W!7jwS#7#6F4()FBFa_MYZPgcU( zS_U_U-aih`PlO_t6}*e$OX!)Ie`yQ*8keuHPS3X2n8Pqxfn#3m>Ec5MHB4$L|F3^% zND!}B?-loe_r`C{2jMH2Uo}`Q;Db^cY&se~TB4iwmri9$b1?Uu;sB%_cFATAov~jhym_YEdgAln?ixeQ z^=a2;y}eWCW~RA2fzc;$?>Dw)YxnzqlxvtK94R$eY;o}lF!UKbUHx3vIVCg!09=m0 AT>t<8 literal 0 HcmV?d00001 diff --git a/UI/data/themes/Rachni/checkbox_unchecked_disabled.png b/UI/data/themes/Rachni/checkbox_unchecked_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..ade721e81ba47fa792d4586516b8744f8c49c8bb GIT binary patch literal 464 zcmV;>0WbcEP)z3Xli7-6*p9aNvlr>Itd;TFIVxd-y|OyrCsEBb@QA; zCyb(7HXkO*sBg@biZoF@2MSgIU*CL)>Rq?ji!Gh`NAd|iaAZN1hu>)c0000Kw~5Cp&17bY-Ld4Q`sryz@w(Xyr?9@@IhaDCHp(a71Iq5H!(8&?NVNTxm~;; zs9m+hHKHUXu_Vv>KdAa7#dp{n^+lG0J&BM1_F|`RVW&A^HVa@ XDsgK_bUAtqsDZ)L)z4*}Q$iB}A97A1 literal 0 HcmV?d00001 diff --git a/UI/data/themes/Rachni/down_arrow.png b/UI/data/themes/Rachni/down_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..e271f7f90b4132c9d740058d8b6c915dbdd626d2 GIT binary patch literal 165 zcmeAS@N?(olHy`uVBq!ia0vp^oIuRR!2%?ApR4f$QjEnx?oJHr&dIz4a+s35-CY>w z1e^Sc1@brxJR*x37`TN&n2}-D90{Nxdx@v7EBhS|ac(A-+!@lDKp{;}7sn8e>&XcR z7pulY;Wn^IBG(*7A%~?b^VC!N=hHC=sm-IdEdjT~uc)I$ztaD0e F0ssj2CNKa1 literal 0 HcmV?d00001 diff --git a/UI/data/themes/Rachni/down_arrow_disabled.png b/UI/data/themes/Rachni/down_arrow_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..5805d9842bb3c8bdf9ae741ebabc690a4929585a GIT binary patch literal 166 zcmeAS@N?(olHy`uVBq!ia0vp^oIuRR!2%?ApR4f$QjEnx?oJHr&dIz4a+s35-CY>| zxA&jf59DzcctjR6FmMZlFeAgPITAoY_7YEDSN1y`;vAyZcdU741BJ9aT^vI=t|uoP zVCdoDDYjGKUczBuWT3#kjKjddz-flSK@mm~;ef4+85xf4WSF7(8A5T-G@y GGywodVJqnX literal 0 HcmV?d00001 diff --git a/UI/data/themes/Rachni/left_arrow_disabled.png b/UI/data/themes/Rachni/left_arrow_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..f5b9af8a34edb5f8dd767bf6afa303b89a31d38f GIT binary patch literal 166 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 DLAR|V literal 0 HcmV?d00001 diff --git a/UI/data/themes/Rachni/radio_unchecked.png b/UI/data/themes/Rachni/radio_unchecked.png new file mode 100644 index 0000000000000000000000000000000000000000..9a4def65c64a9d55441f82fe66fc7f46e5b73a75 GIT binary patch literal 728 zcmV;}0w?{6P)@!=&7gwT^7eV48y+tYIRCxlLiT(zip~u_E}K!eZQ1UCJ)XWpcn*qFv|mj2Hymm zGOGZ1&1OGlqk`+ej=|zgCiDDE0Kzalw_mH}fqMq8tl7*>&(3Zg z<=pb}a>SKCQhxe=1 zDZv#_S~^K`0Q0>2NJI5nZ6eAi5Q&W)Tj`Fao}46Y)*j1A!XehJuV&-U1oWX;y{+O9Vm8?gbB$>af^ zw*ZW{XL~Faoy!4ZGMk^9n`^`d07#`$FMw5G<+u=%tPliCX7&)sr_<@k@^=LQ*e#cH zlGcEH(Ye>fV(~_l?|Kj7Dkc) literal 0 HcmV?d00001 diff --git a/UI/data/themes/Rachni/radio_unchecked_disabled.png b/UI/data/themes/Rachni/radio_unchecked_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..6ece890e750b0685bbd818f22e5fbf999ccd35e1 GIT binary patch literal 760 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 literal 0 HcmV?d00001 diff --git a/UI/data/themes/Rachni/sizegrip.png b/UI/data/themes/Rachni/sizegrip.png new file mode 100644 index 0000000000000000000000000000000000000000..350583aaac4aa474ac449eaea2cc7ddd060276b9 GIT binary patch literal 129 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!D3?x-;bCrM;TYyi9E0A8dZe4lyHC-T!u_VYZ zn8D%MjWi%f)6>Nz(!sM1rC-2ha+zM<2rMwpeI*@Z@PO%TWH}e*?iSqXK(y9 X| zxA&jf59DzcctjR6FmMZlFeAgPITAoY_7YEDSN1y`;vAy| zxA&jf59DzcctjR6FmMZlFeAgPITAoY_7YEDSN1y`;v6FKKb3EC1BH}5T^vI=t|uoP z;C)upuu)setToolTip(toolTip); auto revert = new QPushButton; + revert->setProperty("themeID", "hotkeyButtons"); revert->setText(QTStr("Revert")); revert->setEnabled(false); auto clear = new QPushButton; + clear->setProperty("themeID", "hotkeyButtons"); clear->setText(QTStr("Clear")); clear->setEnabled(!obs_key_combination_is_empty(combo)); @@ -287,10 +289,12 @@ void OBSHotkeyWidget::AddEdit(obs_key_combination combo, int idx) }); auto add = new QPushButton; + add->setProperty("themeID", "hotkeyButtons"); add->setText("+"); add->setMinimumWidth(50); auto remove = new QPushButton; + remove->setProperty("themeID", "hotkeyButtons"); remove->setText("-"); remove->setEnabled(removeButtons.size() > 0); remove->setMinimumWidth(50); diff --git a/UI/properties-view.cpp b/UI/properties-view.cpp index 17bcbfd9f..419787c53 100644 --- a/UI/properties-view.cpp +++ b/UI/properties-view.cpp @@ -296,6 +296,7 @@ void OBSPropertiesView::AddPath(obs_property_t *prop, QFormLayout *layout, button->setEnabled(false); } + button->setProperty("themeID", "settingsButtons"); edit->setText(QT_UTF8(val)); edit->setReadOnly(true); edit->setToolTip(QT_UTF8(obs_property_long_description(prop))); @@ -610,6 +611,7 @@ QWidget *OBSPropertiesView::AddButton(obs_property_t *prop) const char *desc = obs_property_description(prop); QPushButton *button = new QPushButton(QT_UTF8(desc)); + button->setProperty("themeID", "settingsButtons"); button->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Maximum); return NewWidget(prop, button, SIGNAL(clicked())); } @@ -628,6 +630,7 @@ void OBSPropertiesView::AddColor(obs_property_t *prop, QFormLayout *layout, colorLabel->setEnabled(false); } + button->setProperty("themeID", "settingsButtons"); button->setText(QTStr("Basic.PropertiesWindow.SelectColor")); button->setToolTip(QT_UTF8(obs_property_long_description(prop))); @@ -698,6 +701,7 @@ void OBSPropertiesView::AddFont(obs_property_t *prop, QFormLayout *layout, font = fontLabel->font(); MakeQFont(font_obj, font, true); + button->setProperty("themeID", "settingsButtons"); button->setText(QTStr("Basic.PropertiesWindow.SelectFont")); button->setToolTip(QT_UTF8(obs_property_long_description(prop))); @@ -1795,6 +1799,7 @@ public: if (browse) { QPushButton *browseButton = new QPushButton(QTStr("Browse")); + browseButton->setProperty("themeID", "settingsButtons"); topLayout->addWidget(browseButton); topLayout->setAlignment(browseButton, Qt::AlignVCenter); diff --git a/UI/window-basic-main.cpp b/UI/window-basic-main.cpp index ae7dca78d..ec6a508c5 100644 --- a/UI/window-basic-main.cpp +++ b/UI/window-basic-main.cpp @@ -1213,6 +1213,7 @@ void OBSBasic::ResetOutputs() this, &OBSBasic::ReplayBufferClicked); + replayBufferButton->setProperty("themeID", "replayBufferButton"); ui->buttonsVLayout->insertWidget(2, replayBufferButton); }