Merge branch 'dark_mode' into 'master'

Support dark mode on Windows

Closes #7985

See merge request OpenMW/openmw!4101
esm4-texture
psi29a 7 months ago
commit cd116ebe5f

@ -238,6 +238,7 @@
Feature #7953: Allow to change SVG icons colors depending on color scheme
Feature #7964: Add Lua read access to MW Dialogue records
Feature #7971: Make save's Time Played value display hours instead of days
Feature #7985: Support dark mode on Windows
Task #5896: Do not use deprecated MyGUI properties
Task #6085: Replace boost::filesystem with std::filesystem
Task #6149: Dehardcode Lua API_REVISION

@ -47,13 +47,16 @@ source_group(launcher FILES ${LAUNCHER} ${LAUNCHER_HEADER})
set(QT_USE_QTGUI 1)
set (LAUNCHER_RES ${CMAKE_SOURCE_DIR}/files/launcher/launcher.qrc)
# Set some platform specific settings
if(WIN32)
set(LAUNCHER_RES ${LAUNCHER_RES} ${CMAKE_SOURCE_DIR}/files/windows/QWindowsVistaDark/dark.qrc)
set(GUI_TYPE WIN32)
set(QT_USE_QTMAIN TRUE)
endif(WIN32)
QT_ADD_RESOURCES(RCC_SRCS ${CMAKE_SOURCE_DIR}/files/launcher/launcher.qrc)
QT_ADD_RESOURCES(RCC_SRCS ${LAUNCHER_RES})
QT_WRAP_UI(UI_HDRS ${LAUNCHER_UI})
include_directories(${CMAKE_CURRENT_BINARY_DIR})

@ -9,6 +9,7 @@
#include <components/files/configurationmanager.hpp>
#include <components/files/qtconversion.hpp>
#include <components/l10n/qttranslations.hpp>
#include <components/platform/application.hpp>
#include <components/platform/platform.hpp>
#ifdef MAC_OS_X_VERSION_MIN_REQUIRED
@ -33,7 +34,7 @@ int runLauncher(int argc, char* argv[])
try
{
QApplication app(argc, argv);
Platform::Application app(argc, argv);
QString resourcesPath(".");
if (!variables["resources"].empty())

@ -144,6 +144,7 @@ set (OPENCS_UI
source_group (openmw-cs FILES main.cpp ${OPENCS_SRC} ${OPENCS_HDR})
if(WIN32)
set(OPENCS_RES ${OPENCS_RES} ${CMAKE_SOURCE_DIR}/files/windows/QWindowsVistaDark/dark.qrc)
set(QT_USE_QTMAIN TRUE)
set(OPENCS_RC_FILE ${CMAKE_SOURCE_DIR}/files/windows/opencs.rc)
else(WIN32)

@ -3,15 +3,13 @@
#include <exception>
#include <string>
#include <QApplication>
#include <QIcon>
#include <QSurfaceFormat>
#include <osg/DisplaySettings>
#include <components/debug/debugging.hpp>
#include <components/debug/debuglog.hpp>
#include <components/misc/scalableicon.hpp>
#include <components/platform/application.hpp>
#include <components/platform/platform.hpp>
#include "model/doc/messages.hpp"
@ -26,33 +24,6 @@ Q_DECLARE_METATYPE(std::string)
class QEvent;
class QObject;
class Application : public QApplication
{
private:
bool notify(QObject* receiver, QEvent* event) override
{
try
{
if (event->type() == QEvent::ThemeChange || event->type() == QEvent::PaletteChange)
Misc::ScalableIcon::updateAllIcons();
return QApplication::notify(receiver, event);
}
catch (const std::exception& exception)
{
Log(Debug::Error) << "An exception has been caught: " << exception.what();
}
return false;
}
public:
Application(int& argc, char* argv[])
: QApplication(argc, argv)
{
}
};
void setQSurfaceFormat()
{
osg::DisplaySettings* ds = osg::DisplaySettings::instance().get();
@ -76,6 +47,10 @@ int runApplication(int argc, char* argv[])
Q_INIT_RESOURCE(resources);
#ifdef WIN32
Q_INIT_RESOURCE(dark);
#endif
qRegisterMetaType<std::string>("std::string");
qRegisterMetaType<CSMWorld::UniversalId>("CSMWorld::UniversalId");
qRegisterMetaType<CSMDoc::Message>("CSMDoc::Message");
@ -83,7 +58,7 @@ int runApplication(int argc, char* argv[])
setQSurfaceFormat();
QCoreApplication::setAttribute(Qt::AA_ShareOpenGLContexts);
Application application(argc, argv);
Platform::Application application(argc, argv);
application.setWindowIcon(QIcon(":openmw-cs"));

@ -56,13 +56,16 @@ source_group(wizard FILES ${WIZARD} ${WIZARD_HEADER})
set(QT_USE_QTGUI 1)
set (WIZARD_RES ${CMAKE_SOURCE_DIR}/files/wizard/wizard.qrc)
# Set some platform specific settings
if(WIN32)
set(WIZARD_RES ${WIZARD_RES} ${CMAKE_SOURCE_DIR}/files/windows/QWindowsVistaDark/dark.qrc)
set(GUI_TYPE WIN32)
set(QT_USE_QTMAIN TRUE)
endif(WIN32)
QT_ADD_RESOURCES(RCC_SRCS ${CMAKE_SOURCE_DIR}/files/wizard/wizard.qrc)
QT_ADD_RESOURCES(RCC_SRCS ${WIZARD_RES})
QT_WRAP_UI(UI_HDRS ${WIZARD_UI})
include_directories(${CMAKE_CURRENT_BINARY_DIR})

@ -1,4 +1,3 @@
#include <QApplication>
#include <QDir>
#include <boost/program_options/options_description.hpp>
@ -6,6 +5,7 @@
#include <components/files/qtconversion.hpp>
#include <components/l10n/qttranslations.hpp>
#include <components/platform/application.hpp>
#include "mainwizard.hpp"
@ -23,7 +23,7 @@ int main(int argc, char* argv[])
configurationManager.addCommonOptions(description);
configurationManager.readConfiguration(variables, description, true);
QApplication app(argc, argv);
Platform::Application app(argc, argv);
// Now we make sure the current dir is set to application path
QDir dir(QCoreApplication::applicationDirPath());

@ -546,6 +546,10 @@ if (USE_QT)
qtconfigpath
)
add_component_qt_dir (platform
application
)
QT_WRAP_UI(ESM_UI_HDR ${ESM_UI})
endif()

@ -0,0 +1,98 @@
#include "application.hpp"
#include <QFile>
#include <QStyle>
#include <QStyleHints>
#include <components/debug/debuglog.hpp>
#include <components/misc/scalableicon.hpp>
namespace Platform
{
Application::Application(int& argc, char* argv[])
: QApplication(argc, argv)
{
#if defined(WIN32) && QT_VERSION >= QT_VERSION_CHECK(6, 5, 0)
init();
}
void Application::init()
{
connect(this, &Application::darkModeChanged, this, &Application::updateStyle);
const auto* hints = QGuiApplication::styleHints();
const auto currentStyle = QApplication::style()->objectName();
mInitialStyle = currentStyle.toStdString();
mCurrentStyle = currentStyle.toStdString();
if (hints->colorScheme() == Qt::ColorScheme::Dark)
{
mDarkMode = true;
if (currentStyle == "windowsvista")
{
mCurrentStyle = "windows";
setStyle("windows");
QFile file(":/dark/dark.qss");
file.open(QIODevice::ReadOnly);
setStyleSheet(file.readAll());
}
}
}
void Application::updateStyle(bool isDark)
{
if (mInitialStyle != "windowsvista")
return;
if (isDark)
{
mCurrentStyle = "windows";
setStyle("windows");
QFile file(":/dark/dark.qss");
file.open(QIODevice::ReadOnly);
setStyleSheet(file.readAll());
}
else
{
mCurrentStyle = mInitialStyle;
setStyleSheet("");
setStyle(mInitialStyle.c_str());
}
#endif
}
bool Application::notify(QObject* receiver, QEvent* event)
{
try
{
if (event->type() == QEvent::ThemeChange || event->type() == QEvent::PaletteChange)
{
#if defined(WIN32) && QT_VERSION >= QT_VERSION_CHECK(6, 5, 0)
const auto* hints = QGuiApplication::styleHints();
const auto currentStyle = QApplication::style()->objectName();
bool isDark = hints->colorScheme() == Qt::ColorScheme::Dark;
if (isDark != mDarkMode)
{
mDarkMode = isDark;
bool result = QApplication::notify(receiver, event);
emit darkModeChanged(isDark);
return result;
}
#endif
Misc::ScalableIcon::updateAllIcons();
}
return QApplication::notify(receiver, event);
}
catch (const std::exception& exception)
{
Log(Debug::Error) << "An exception has been caught: " << exception.what();
}
return false;
}
}

@ -0,0 +1,30 @@
#include <QApplication>
#include <QEvent>
namespace Platform
{
class Application : public QApplication
{
Q_OBJECT
public:
Application(int& argc, char* argv[]);
#if defined(WIN32) && QT_VERSION >= QT_VERSION_CHECK(6, 5, 0)
void init();
private slots:
void updateStyle(bool isDark);
#endif
signals:
void darkModeChanged(bool);
private:
bool notify(QObject* receiver, QEvent* event) override;
std::string mCurrentStyle{};
std::string mInitialStyle{};
bool mDarkMode{ false };
};
}

@ -21,7 +21,7 @@
<linearGradient
id="Red">
<stop
style="stop-color:#ff664d;stop-opacity:1;"
style="stop-color:#ff4d4d;stop-opacity:1;"
offset="0"
id="stop2533" />
</linearGradient>
@ -194,9 +194,8 @@
id="path2014"
d="m 11.1125,67.733337 a 1.5875,1.5875 0 0 1 -1.5875004,1.5875 1.5875,1.5875 0 0 1 -1.5875,-1.5875 1.5875,1.5875 0 0 1 1.5875,-1.5875 1.5875,1.5875 0 0 1 1.5875004,1.5875 z" />
<path
d="M 6,6 7.4315582,8.0000187 6.0034747,10 H 7.1386394 L 8.0000167,8.7968973 8.8613952,10 H 9.9965253 L 8.568443,8.0000187 10,6 H 8.8596406 L 8.0000167,7.2031413 7.1403606,6 Z"
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.944865px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate;stop-color:#000000"
id="path1-5"
transform="matrix(0.26458331,0,0,0.26458331,7.4083323,65.616655)" />
d="m 8.7312489,66.939571 0.5681496,0.793757 -0.5667706,0.793743 h 0.4505184 l 0.3418591,-0.477482 0.3418593,0.477482 H 10.31737 L 9.7505997,67.733328 10.318749,66.939571 H 9.8661687 l -0.3411633,0.477497 -0.341176,-0.477497 z"
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.374994px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate;stop-color:#000000"
id="path1-5" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 16 KiB

@ -21,7 +21,7 @@
<linearGradient
id="Red">
<stop
style="stop-color:#ff664d;stop-opacity:1;"
style="stop-color:#ff4d4d;stop-opacity:1;"
offset="0"
id="stop2533" />
</linearGradient>

Before

Width:  |  Height:  |  Size: 5.7 KiB

After

Width:  |  Height:  |  Size: 5.7 KiB

@ -110,7 +110,7 @@
id="Green"
gradientTransform="scale(3.7795276)">
<stop
style="stop-color:#66ff7a;stop-opacity:1;"
style="stop-color:#00c880;stop-opacity:1;"
offset="0"
id="stop2506" />
</linearGradient>

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<svg width="1300" height="1300" viewBox="0 0 1300 1300" xmlns="http://www.w3.org/2000/svg">
<rect x="50" y="50" width="1200" height="1200" style="stroke:#7e7e7e;stroke-width:100;fill:#505050;" />
<polyline points="250,700 500,950 1100,350" stroke="#7e7e7e" stroke-width="150" fill="none" />
</svg>

After

Width:  |  Height:  |  Size: 336 B

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<svg width="1300" height="1300" viewBox="0 0 1300 1300" xmlns="http://www.w3.org/2000/svg">
<rect x="50" y="50" width="1200" height="1200" style="stroke:#7e7e7e;stroke-width:100;fill:none;" />
<polyline points="250,700 500,950 1100,350" stroke="#7e7e7e" stroke-width="150" fill="none" />
</svg>

After

Width:  |  Height:  |  Size: 333 B

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<svg width="1300" height="1300" viewBox="0 0 1300 1300" xmlns="http://www.w3.org/2000/svg">
<rect x="50" y="50" width="1200" height="1200" style="stroke:#7e7e7e;stroke-width:100;fill:#505050;" />
</svg>

After

Width:  |  Height:  |  Size: 241 B

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<svg width="1300" height="1300" viewBox="0 0 1300 1300" xmlns="http://www.w3.org/2000/svg">
<rect x="50" y="50" width="1200" height="1200" style="stroke:#7e7e7e;stroke-width:100;fill:none;" />
</svg>

After

Width:  |  Height:  |  Size: 238 B

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<svg width="1300" height="1300" viewBox="0 0 1300 1300" xmlns="http://www.w3.org/2000/svg">
<rect x="50" y="50" width="1200" height="1200" style="stroke:#7e7e7e;stroke-width:100;fill:#505050;" />
<rect x="350" y="350" width="600" height="600" style="stroke:#7e7e7e;stroke-width:100;fill:#7e7e7e;" />
</svg>

After

Width:  |  Height:  |  Size: 345 B

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<svg width="1300" height="1300" viewBox="0 0 1300 1300" xmlns="http://www.w3.org/2000/svg">
<rect x="50" y="50" width="1200" height="1200" style="stroke:#7e7e7e;stroke-width:100;fill:none;" />
<rect x="350" y="350" width="600" height="600" style="stroke:#7e7e7e;stroke-width:100;fill:#7e7e7e;" />
</svg>

After

Width:  |  Height:  |  Size: 342 B

@ -0,0 +1,31 @@
<RCC>
<qresource prefix="/dark">
<file>dark.qss</file>
<file>checkbox-checked.svg</file>
<file>checkbox-checked-disabled.svg</file>
<file>checkbox-empty.svg</file>
<file>checkbox-empty-disabled.svg</file>
<file>checkbox-half.svg</file>
<file>checkbox-half-disabled.svg</file>
<file>dockwidget-close.svg</file>
<file>dockwidget-undock.svg</file>
<file>down-triangle.svg</file>
<file>down-triangle-spinbox.svg</file>
<file>dropdown-arrow.svg</file>
<file>left-triangle-tabbar.svg</file>
<file>radiobutton-checked.svg</file>
<file>radiobutton-checked-disabled.svg</file>
<file>radiobutton-empty.svg</file>
<file>radiobutton-empty-disabled.svg</file>
<file>right-triangle-tabbar.svg</file>
<file>scrollbar-arrow-down.svg</file>
<file>scrollbar-arrow-left.svg</file>
<file>scrollbar-arrow-right.svg</file>
<file>scrollbar-arrow-up.svg</file>
<file>size-grip.svg</file>
<file>table-header-sort-arrow-down.svg</file>
<file>table-header-sort-arrow-up.svg</file>
<file>up-triangle.svg</file>
<file>up-triangle-spinbox.svg</file>
</qresource>
</RCC>

@ -0,0 +1,618 @@
QMenu
{
border: 1px solid #4e4e4e;
}
QMenuBar
{
background-color: #232323;
color: #dcdcdc;
border: 0px;
}
QMenu, QMessageBox
{
background-color: #232323;
color: #dcdcdc;
border: 1px solid #4e4e4e;
}
QScrollArea
{
border: 1px solid #4e4e4e;
}
QMenuBar::item
{
background-color: #232323;
color: #dcdcdc;
}
QMenuBar
{
border-color: #404040;
}
QMenuBar::item:hover, QMenuBar::item:selected, QMenu::item:hover, QMenu::item:selected
{
background-color: #404040;
color: #dcdcdc;
}
QMenuBar::item:disabled, QMenu::item:disabled
{
color: #919191;
}
QMenu::separator
{
height: 1px;
background-color: #4e4e4e;
margin-left: 2px;
margin-right: 2px;
margin-top: 5px;
margin-bottom: 5px;
}
QToolTip, QColumnView, QListView, QTableView, QTableWidget, QTreeView
{
background-color: #232323;
alternate-background-color: #282828;
border: 1px solid #4e4e4e;
selection-background-color: #505050;
gridline-color: #606060;
}
QHeaderView::section
{
background-color: #232323;
border: 0px;
border-right: 1px solid #4e4e4e;
}
QHeaderView::section:hover, QHeaderView::section:checked
{
background-color: #202020;
}
QHeaderView::down-arrow
{
subcontrol-origin: content;
subcontrol-position: right;
image: url(:/dark/table-header-sort-arrow-down.svg);
width: 10px;
height: 7px;
background: transparent;
left: -5px;
}
QHeaderView::up-arrow
{
subcontrol-origin: content;
subcontrol-position: right;
image: url(:/dark/table-header-sort-arrow-up.svg);
width: 10px;
height: 7px;
background: transparent;
left: -5px;
}
QTabWidget::pane
{
border: 1px solid #4e4e4e;
top: -1px;
}
QTabBar
{
outline: 0px;
}
QTabBar::tab
{
background-color: #232323;
border-left: 1px solid #4e4e4e;
border-right: 1px solid #4e4e4e;
border-top: 1px solid #4e4e4e;
border-bottom: 1px solid #4e4e4e;
padding-top: 2px;
padding-bottom: 2px;
padding-left: 9px;
padding-right: 10px;
margin-right: -1px;
}
QTabBar::tab:only-one
{
margin-right: 0px;
}
QTabBar::tab:last
{
margin-right: 0px;
}
QTabBar::tab:hover
{
background-color: #404040;
}
QTabBar::tab:selected
{
border-bottom: 0px;
background-color: #1e1e1e;
padding-bottom: 4px;
}
QTabBar::tab:!selected
{
margin-top: 2px;
}
QProgressBar
{
background-color: #1e1e1e;
border: 1px solid #4e4e4e;
color: #dfe1e2;
text-align: center;
}
QProgressBar:disabled
{
background-color: #1e1e1e;
border: 1px solid #4e4e4e;
color: #788d9c;
text-align: center;
}
QProgressBar::chunk
{
background-color: #0e651e;
color: #19232D;
}
QProgressBar::chunk:disabled
{
background-color: #404040;
color: #788D9C;
}
QSizeGrip
{
image: url(:/dark/size-grip.svg);
}
QDockWidget
{
background-color: #232323;
titlebar-close-icon: url(:/dark/dockwidget-close.svg);
titlebar-normal-icon: url(:/dark/dockwidget-undock.svg);
}
QDockWidget::title
{
background-color: #212121;
}
QDockWidget::float-button
{
border: 0;
}
QDockWidget::close-button
{
border: 0;
}
QDockWidget::float-button:hover
{
background-color: #4e4e4e;
}
QDockWidget::float-button:pressed
{
background-color: #5e5e5e;
}
QDockWidget::close-button:hover
{
background-color: #4e4e4e;
}
QDockWidget::close-button:pressed
{
background-color: #5e5e5e;
}
QPushButton
{
background-color: #232323;
border: 1px solid #4e4e4e;
padding: 2px;
}
QToolButton[autoRaise="false"]
{
background-color: #232323;
border: 1px solid #4e4e4e;
padding: 2px;
}
QWizard QPushButton
{
min-width: 67px;
}
QDialogButtonBox QPushButton
{
min-width: 67px;
}
QPushButton:hover, QToolButton:hover
{
background-color: #404040;
}
QDialogButtonBox QPushButton:focus, QToolButton:focus
{
border: 2px solid #7e7e7e;
}
QPushButton:pressed, QToolButton:pressed
{
border: 1px solid #7e7e7e;
}
QPushButton:selected, QToolButton:selected
{
border: 1px solid #7e7e7e;
}
QPushButton:disabled, QToolButton:disabled
{
background-color: #313131;
}
/* the dropdownarrow on the right of the button in menu popup mode */
QToolButton[popupMode="1"]
{
padding-right: 19px;
}
QToolButton::menu-button
{
border: 0px;
border-left: 1px solid #4e4e4e;
width: 18px;
}
QToolButton::menu-arrow
{
image: url(:/dark/down-triangle.svg);
width: 14px;
}
QToolBar
{
border: 0px;
}
QToolBar QToolButton
{
border: 0px;
padding: 0px;
padding-left: 3px;
padding-right: 2px;
background-color: #1e1e1e;
}
QToolBar QToolButton:hover
{
background-color: #404040;
}
QToolBar QToolButton:checked
{
background-color: #505050;
}
QToolBar QToolButton:focus
{
background-color: #404040;
}
QToolBar QToolButton:disabled
{
background-color: #242424;
}
QToolBar::separator
{
min-width: 0px;
width: 1px;
margin-left: 3px;
margin-right: 2px;
background-color: #4e4e4e;
}
QGroupBox
{
border: 1px solid #4e4e4e;
margin-top: 9px;
padding-top: 7px;
padding-bottom: 0px;
padding-left: 1px;
padding-right: 1px;
}
QGroupBox::title
{
subcontrol-origin: margin;
subcontrol-position: top left;
left: 9px;
padding-top: 1px;
min-width: 0px;
}
QLineEdit, QTextEdit, QPlainTextEdit
{
border: 1px solid #4e4e4e;
}
QLineEdit:disabled, QTextEdit, QPlainTextEdit:disabled
{
background-color: #313131;
}
QComboBox
{
background-color: #232323;
border: 1px solid #4e4e4e;
margin: 0px;
padding-left: 3px;
padding-right: 3px;
padding-top: 1px;
padding-bottom: 1px;
}
QComboBox:disabled
{
background-color: #313131;
}
QComboBox:selected
{
background-color: #404040;
}
QComboBox:editable {
background-color: #232323;
}
QComboBox::drop-down
{
border: 0px;
}
QComboBox::down-arrow
{
image: url(:/dark/dropdown-arrow.svg);
height: 10px;
width: 15px;
}
QComboBox QAbstractItemView
{
background-color: #232323;
selection-background-color: #404040;
border: 1px solid #4e4e4e;
padding: 0px;
margin: 0px;
outline: 0px;
}
QComboBox QAbstractItemView::item:selected
{
color: #dcdcdc;
background-color: #404040;
}
QComboBox QAbstractItemView::item:last
{
border: 0px;
}
QScrollBar:vertical
{
border: 0px;
background: #2a2a2a;
width: 15px;
margin: 15px 0px;
}
QScrollBar::handle:vertical
{
border: 0px;
background: #606060;
min-height: 20px;
}
QScrollBar::add-line:vertical
{
border: 0px;
background: #232323;
height: 15px;
subcontrol-position: bottom;
subcontrol-origin: margin;
}
QScrollBar::sub-line:vertical
{
border: 0px;
background: #232323;
height: 15px;
subcontrol-position: top;
subcontrol-origin: margin;
}
QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical
{
border: 0px;
background: none;
}
QScrollBar::up-arrow:vertical
{
image: url(:/dark/scrollbar-arrow-up.svg);
height: 15px;
}
QScrollBar::down-arrow:vertical
{
image: url(:/dark/scrollbar-arrow-down.svg);
height: 15px;
}
QScrollBar:horizontal
{
border: 0px;
background: #2a2a2a;
height: 15px;
margin: 0px 15px;
}
QScrollBar::handle:horizontal
{
border: 0px;
background: #606060;
min-width: 20px;
}
QScrollBar::add-line:horizontal
{
border: 0px;
background: #232323;
width: 15px;
subcontrol-position: right;
subcontrol-origin: margin;
}
QScrollBar::sub-line:horizontal
{
border: 0px;
background: #232323;
width: 15px;
subcontrol-position: left;
subcontrol-origin: margin;
}
QScrollBar::add-page:horizontal, QScrollBar::sub-page:horizontal
{
border: 0px;
background: none;
}
QScrollBar::left-arrow:horizontal
{
image: url(:/dark/scrollbar-arrow-left.svg);
width: 15px;
}
QScrollBar::right-arrow:horizontal
{
image: url(:/dark/scrollbar-arrow-right.svg);
width: 15px;
}
QSpinBox, QDateEdit, QDateTimeEdit, QTimeEdit, QDoubleSpinBox
{
border: 1px solid #4e4e4e;
padding-right: 15px;
}
QSpinBox:disabled, QDateEdit:disabled, QDateTimeEdit:disabled, QTimeEdit:disabled, QDoubleSpinBox:disabled
{
background-color: #313131;
}
QSpinBox::up-button, QDateEdit::up-button, QDateTimeEdit::up-button, QTimeEdit::up-button, QDoubleSpinBox::up-button
{
border: 1px solid #4e4e4e;
subcontrol-origin: margin;
subcontrol-position: top right;
width: 12px;
height: 6px;
margin: 2px 2px;
}
QSpinBox::down-button, QDateEdit::down-button, QDateTimeEdit::down-button, QTimeEdit::down-button, QDoubleSpinBox::down-button
{
border: 1px solid #4e4e4e;
subcontrol-origin: margin;
subcontrol-position: bottom right;
width: 12px;
height: 6px;
margin: 2px 2px;
}
QSpinBox::up-button:hover, QDateEdit::up-button:hover, QDateTimeEdit::up-button:hover, QTimeEdit::up-button:hover, QDoubleSpinBox::up-button:hover
{
background-color: #404040;
}
QSpinBox::down-button:hover, QDateEdit::down-button:hover, QDateTimeEdit::down-button:hover, QTimeEdit::down-button:hover, QDoubleSpinBox::down-button:hover
{
background-color: #404040;
}
QSpinBox::up-arrow, QDateEdit::up-arrow, QDateTimeEdit::up-arrow, QTimeEdit::up-arrow, QDoubleSpinBox::up-arrow
{
image: url(:/dark/up-triangle-spinbox.svg);
width: 10px;
height: 5px;
}
QSpinBox::down-arrow, QDateEdit::down-arrow, QDateTimeEdit::down-arrow, QTimeEdit::down-arrow, QDoubleSpinBox::down-arrow
{
image: url(:/dark/down-triangle-spinbox.svg);
width: 10px;
height: 5px;
}
QSlider::handle
{
background-color: #dcdcdc;
}
QSlider::handle:disabled
{
background-color: #4e4e4e;
}
QCheckBox
{
padding: 2px 0px;
}
QCheckBox::indicator
{
padding: 0px;
margin: 0px;
border: 0px;
width: 13px;
height: 13px;
}
QCheckBox::indicator:unchecked, QObject::indicator:unchecked
{
image: url(:/dark/checkbox-empty.svg);
}
QCheckBox::indicator:unchecked:disabled, QObject::indicator:unchecked:disabled
{
image: url(:/dark/checkbox-empty-disabled.svg);
}
QCheckBox::indicator:checked, QObject::indicator:checked
{
image: url(:/dark/checkbox-checked.svg);
}
QCheckBox::indicator:checked:disabled, QObject::indicator:checked:disabled
{
image: url(:/dark/checkbox-checked-disabled.svg);
}
QCheckBox::indicator:indeterminate, QObject::indicator:indeterminate
{
image: url(:/dark/checkbox-half.svg);
}
QCheckBox::indicator:indeterminate:disabled, QObject::indicator:indeterminate:disabled
{
image: url(:/dark/checkbox-half-disabled.svg);
}
QRadioButton
{
padding: 2px 0px;
}
QRadioButton::indicator
{
padding: 0px;
margin: 0px;
border: 0px;
width: 13px;
height: 13px;
}
QRadioButton::indicator:unchecked
{
image: url(:/dark/radiobutton-empty.svg);
}
QRadioButton::indicator:unchecked:disabled
{
image: url(:/dark/radiobutton-empty-disabled.svg);
}
QRadioButton::indicator:checked
{
image: url(:/dark/radiobutton-checked.svg);
}
QRadioButton::indicator:checked:disabled
{
image: url(:/dark/radiobutton-checked-disabled.svg);
}
QListView::indicator:unchecked
{
image: url(:/dark/checkbox-empty.svg);
}
QListView::indicator:checked
{
image: url(:/dark/checkbox-checked.svg);
}
QListView::indicator:indeterminate
{
image: url(:/dark/checkbox-half.svg);
}
QTabBar QToolButton
{
background-color: #232323;
min-width: 0px;
}
QTabBar QToolButton::left-arrow
{
image: url(:/dark/left-triangle-tabbar.svg);
}
QTabBar QToolButton::right-arrow
{
image: url(:/dark/right-triangle-tabbar.svg);
}
QTableCornerButton::section
{
background-color: #232323;
border: 1px solid #4e4e4e;
border-top: 0px;
border-left: 0px;
border-bottom: 0px;
}

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<svg width="1300" height="1300" viewBox="0 0 1300 1300" xmlns="http://www.w3.org/2000/svg">
<line x1="100" y1="100" x2="1200" y2="1200" stroke="#7e7e7e" stroke-width="100" />
<line x1="100" y1="1200" x2="1200" y2="100" stroke="#7e7e7e" stroke-width="100" />
</svg>

After

Width:  |  Height:  |  Size: 303 B

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<svg width="1300" height="1300" viewBox="0 0 1300 1300" xmlns="http://www.w3.org/2000/svg">
<rect x="50" y="350" width="900" height="900" style="stroke:#7e7e7e;stroke-width:100;fill:none;" />
<polyline points="350,350 350,50 1250,50 1250,950 950,950" stroke="#7e7e7e" stroke-width="100" fill="none" />
</svg>

After

Width:  |  Height:  |  Size: 347 B

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<svg width="100" height="40" viewBox="0 0 100 40" xmlns="http://www.w3.org/2000/svg">
<polyline points="20,5 50,35 80,5" fill="#cfcfcf" />
</svg>

After

Width:  |  Height:  |  Size: 184 B

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<svg width="100" height="100" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg">
<polyline points="20,40 50,70 80,40" fill="#cfcfcf" />
</svg>

After

Width:  |  Height:  |  Size: 188 B

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<svg width="100" height="100" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg">
<polyline points="20,50 50,80 80,50" stroke="#cfcfcf" stroke-width="15" fill="none" />
</svg>

After

Width:  |  Height:  |  Size: 220 B

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<svg width="40" height="100" viewBox="0 0 40 100" xmlns="http://www.w3.org/2000/svg">
<polyline points="35,20 5,50 35,80" fill="#cfcfcf" />
</svg>

After

Width:  |  Height:  |  Size: 185 B

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<svg width="1000" height="1000" viewBox="0 0 1000 1000" xmlns="http://www.w3.org/2000/svg">
<circle cx="500" cy="500" r="450" style="stroke:#7e7e7e;stroke-width:100;fill:#505050;" />
<circle cx="500" cy="500" r="250" style="fill:#7e7e7e;" />
</svg>

After

Width:  |  Height:  |  Size: 287 B

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<svg width="1000" height="1000" viewBox="0 0 1000 1000" xmlns="http://www.w3.org/2000/svg">
<circle cx="500" cy="500" r="450" style="stroke:#7e7e7e;stroke-width:100;fill:none;" />
<circle cx="500" cy="500" r="250" style="fill:#7e7e7e;" />
</svg>

After

Width:  |  Height:  |  Size: 284 B

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<svg width="1000" height="1000" viewBox="0 0 1000 1000" xmlns="http://www.w3.org/2000/svg">
<circle cx="500" cy="500" r="450" style="stroke:#7e7e7e;stroke-width:100;fill:#505050;" />
</svg>

After

Width:  |  Height:  |  Size: 228 B

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<svg width="1000" height="1000" viewBox="0 0 1000 1000" xmlns="http://www.w3.org/2000/svg">
<circle cx="500" cy="500" r="450" style="stroke:#7e7e7e;stroke-width:100;fill:none;" />
</svg>

After

Width:  |  Height:  |  Size: 225 B

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<svg width="40" height="100" viewBox="0 0 40 100" xmlns="http://www.w3.org/2000/svg">
<polyline points="5,20 35,50 5,80" fill="#cfcfcf" />
</svg>

After

Width:  |  Height:  |  Size: 184 B

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<svg width="100" height="100" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg">
<polyline points="25,35 50,60 75,35" stroke="#cfcfcf" stroke-width="15" fill="none" />
</svg>

After

Width:  |  Height:  |  Size: 220 B

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<svg width="100" height="100" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg">
<polyline points="65,25 40,50 65,75" stroke="#cfcfcf" stroke-width="15" fill="none" />
</svg>

After

Width:  |  Height:  |  Size: 220 B

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<svg width="100" height="100" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg">
<polyline points="35,25 60,50 35,75" stroke="#cfcfcf" stroke-width="15" fill="none" />
</svg>

After

Width:  |  Height:  |  Size: 220 B

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<svg width="100" height="100" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg">
<polyline points="25,65 50,40 75,65" stroke="#cfcfcf" stroke-width="15" fill="none" />
</svg>

After

Width:  |  Height:  |  Size: 220 B

@ -0,0 +1,54 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
width="16"
height="16"
viewBox="0 0 16 16"
version="1.1"
id="svg1"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs1" />
<g
id="size-grip"
transform="translate(-16,2)">
<rect
style="fill:#787878;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.0466667"
id="rect1"
width="2"
height="2"
x="27"
y="10" />
<use
x="0"
y="0"
xlink:href="#rect1"
id="use1"
transform="translate(-3)" />
<use
x="0"
y="0"
xlink:href="#rect1"
id="use2"
transform="translate(-6)" />
<use
x="0"
y="0"
xlink:href="#rect1"
id="use3"
transform="translate(0,-3)" />
<use
x="0"
y="0"
xlink:href="#rect1"
id="use4"
transform="translate(-3,-3)" />
<use
x="0"
y="0"
xlink:href="#rect1"
id="use5"
transform="translate(0,-6)" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<svg width="60" height="50" viewBox="0 0 60 50" xmlns="http://www.w3.org/2000/svg">
<polyline points="5,10 30,35 55,10" stroke="#cfcfcf" stroke-width="10" fill="none" />
</svg>

After

Width:  |  Height:  |  Size: 215 B

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<svg width="60" height="50" viewBox="0 0 60 50" xmlns="http://www.w3.org/2000/svg">
<polyline points="5,35 30,10 55,35" stroke="#dcdcdc" stroke-width="10" fill="none" />
</svg>

After

Width:  |  Height:  |  Size: 215 B

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<svg width="100" height="40" viewBox="0 0 100 40" xmlns="http://www.w3.org/2000/svg">
<polyline points="20,35 50,5 80,35" fill="#dcdcdc" />
</svg>

After

Width:  |  Height:  |  Size: 185 B

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<svg width="100" height="100" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg">
<polyline points="20,60 50,30 80,60" fill="#dcdcdc" />
</svg>

After

Width:  |  Height:  |  Size: 188 B

Loading…
Cancel
Save