From 5761b56a0e1f2b237500387c16ea8dc8a165a263 Mon Sep 17 00:00:00 2001 From: Balkron Date: Tue, 27 Oct 2020 01:21:55 +0500 Subject: [PATCH] add themes support --- media/noggit.ico | Bin 0 -> 9662 bytes media/res.rc | 1 + resources/darkstyle.qrc | 28 ++ resources/framelesswindow.qrc | 8 + src/noggit/application.cpp | 27 +- src/noggit/ui/style/DarkStyle.cpp | 73 +++ src/noggit/ui/style/DarkStyle.h | 39 ++ src/noggit/ui/style/darkstyle/darkstyle.qss | 343 +++++++++++++ .../ui/style/darkstyle/icon_branch_closed.png | Bin 0 -> 310 bytes .../ui/style/darkstyle/icon_branch_end.png | Bin 0 -> 358 bytes .../ui/style/darkstyle/icon_branch_more.png | Bin 0 -> 207 bytes .../ui/style/darkstyle/icon_branch_open.png | Bin 0 -> 313 bytes .../style/darkstyle/icon_checkbox_checked.png | Bin 0 -> 176 bytes .../icon_checkbox_checked_disabled.png | Bin 0 -> 373 bytes .../icon_checkbox_checked_pressed.png | Bin 0 -> 373 bytes .../darkstyle/icon_checkbox_indeterminate.png | Bin 0 -> 121 bytes .../icon_checkbox_indeterminate_disabled.png | Bin 0 -> 286 bytes .../icon_checkbox_indeterminate_pressed.png | Bin 0 -> 286 bytes .../darkstyle/icon_checkbox_unchecked.png | Bin 0 -> 119 bytes .../icon_checkbox_unchecked_disabled.png | Bin 0 -> 238 bytes .../icon_checkbox_unchecked_pressed.png | Bin 0 -> 238 bytes src/noggit/ui/style/darkstyle/icon_close.png | Bin 0 -> 422 bytes .../darkstyle/icon_radiobutton_checked.png | Bin 0 -> 370 bytes .../icon_radiobutton_checked_disabled.png | Bin 0 -> 617 bytes .../icon_radiobutton_checked_pressed.png | Bin 0 -> 616 bytes .../darkstyle/icon_radiobutton_unchecked.png | Bin 0 -> 310 bytes .../icon_radiobutton_unchecked_disabled.png | Bin 0 -> 538 bytes .../icon_radiobutton_unchecked_pressed.png | Bin 0 -> 537 bytes .../ui/style/darkstyle/icon_restore.png | Bin 0 -> 404 bytes src/noggit/ui/style/darkstyle/icon_undock.png | Bin 0 -> 424 bytes src/noggit/ui/style/darkstyle/icon_vline.png | Bin 0 -> 303 bytes .../style/framelesswindow/framelesswindow.cpp | 458 ++++++++++++++++++ .../style/framelesswindow/framelesswindow.h | 69 +++ .../style/framelesswindow/framelesswindow.ui | 304 ++++++++++++ .../style/framelesswindow/windowdragger.cpp | 56 +++ .../ui/style/framelesswindow/windowdragger.h | 43 ++ .../ui/style/images/icon_window_close.png | Bin 0 -> 422 bytes .../ui/style/images/icon_window_maximize.png | Bin 0 -> 386 bytes .../ui/style/images/icon_window_minimize.png | Bin 0 -> 364 bytes .../ui/style/images/icon_window_restore.png | Bin 0 -> 404 bytes 40 files changed, 1448 insertions(+), 1 deletion(-) create mode 100644 media/noggit.ico create mode 100644 media/res.rc create mode 100644 resources/darkstyle.qrc create mode 100644 resources/framelesswindow.qrc create mode 100644 src/noggit/ui/style/DarkStyle.cpp create mode 100644 src/noggit/ui/style/DarkStyle.h create mode 100644 src/noggit/ui/style/darkstyle/darkstyle.qss create mode 100644 src/noggit/ui/style/darkstyle/icon_branch_closed.png create mode 100644 src/noggit/ui/style/darkstyle/icon_branch_end.png create mode 100644 src/noggit/ui/style/darkstyle/icon_branch_more.png create mode 100644 src/noggit/ui/style/darkstyle/icon_branch_open.png create mode 100644 src/noggit/ui/style/darkstyle/icon_checkbox_checked.png create mode 100644 src/noggit/ui/style/darkstyle/icon_checkbox_checked_disabled.png create mode 100644 src/noggit/ui/style/darkstyle/icon_checkbox_checked_pressed.png create mode 100644 src/noggit/ui/style/darkstyle/icon_checkbox_indeterminate.png create mode 100644 src/noggit/ui/style/darkstyle/icon_checkbox_indeterminate_disabled.png create mode 100644 src/noggit/ui/style/darkstyle/icon_checkbox_indeterminate_pressed.png create mode 100644 src/noggit/ui/style/darkstyle/icon_checkbox_unchecked.png create mode 100644 src/noggit/ui/style/darkstyle/icon_checkbox_unchecked_disabled.png create mode 100644 src/noggit/ui/style/darkstyle/icon_checkbox_unchecked_pressed.png create mode 100644 src/noggit/ui/style/darkstyle/icon_close.png create mode 100644 src/noggit/ui/style/darkstyle/icon_radiobutton_checked.png create mode 100644 src/noggit/ui/style/darkstyle/icon_radiobutton_checked_disabled.png create mode 100644 src/noggit/ui/style/darkstyle/icon_radiobutton_checked_pressed.png create mode 100644 src/noggit/ui/style/darkstyle/icon_radiobutton_unchecked.png create mode 100644 src/noggit/ui/style/darkstyle/icon_radiobutton_unchecked_disabled.png create mode 100644 src/noggit/ui/style/darkstyle/icon_radiobutton_unchecked_pressed.png create mode 100644 src/noggit/ui/style/darkstyle/icon_restore.png create mode 100644 src/noggit/ui/style/darkstyle/icon_undock.png create mode 100644 src/noggit/ui/style/darkstyle/icon_vline.png create mode 100644 src/noggit/ui/style/framelesswindow/framelesswindow.cpp create mode 100644 src/noggit/ui/style/framelesswindow/framelesswindow.h create mode 100644 src/noggit/ui/style/framelesswindow/framelesswindow.ui create mode 100644 src/noggit/ui/style/framelesswindow/windowdragger.cpp create mode 100644 src/noggit/ui/style/framelesswindow/windowdragger.h create mode 100644 src/noggit/ui/style/images/icon_window_close.png create mode 100644 src/noggit/ui/style/images/icon_window_maximize.png create mode 100644 src/noggit/ui/style/images/icon_window_minimize.png create mode 100644 src/noggit/ui/style/images/icon_window_restore.png diff --git a/media/noggit.ico b/media/noggit.ico new file mode 100644 index 0000000000000000000000000000000000000000..b4ac2771befde435ce74dfe3c5559e41c0a5ad5b GIT binary patch literal 9662 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 GN&f@*=ARJ& literal 0 HcmV?d00001 diff --git a/media/res.rc b/media/res.rc new file mode 100644 index 00000000..16b4064e --- /dev/null +++ b/media/res.rc @@ -0,0 +1 @@ +IDI_APP ICON "noggit.ico" diff --git a/resources/darkstyle.qrc b/resources/darkstyle.qrc new file mode 100644 index 00000000..084f8de8 --- /dev/null +++ b/resources/darkstyle.qrc @@ -0,0 +1,28 @@ + + + ../src/noggit/ui/style/darkstyle/darkstyle.qss + ../src/noggit/ui/style/darkstyle/icon_close.png + ../src/noggit/ui/style/darkstyle/icon_restore.png + ../src/noggit/ui/style/darkstyle/icon_undock.png + ../src/noggit/ui/style/darkstyle/icon_branch_closed.png + ../src/noggit/ui/style/darkstyle/icon_branch_end.png + ../src/noggit/ui/style/darkstyle/icon_branch_more.png + ../src/noggit/ui/style/darkstyle/icon_branch_open.png + ../src/noggit/ui/style/darkstyle/icon_vline.png + ../src/noggit/ui/style/darkstyle/icon_checkbox_checked.png + ../src/noggit/ui/style/darkstyle/icon_checkbox_indeterminate.png + ../src/noggit/ui/style/darkstyle/icon_checkbox_unchecked.png + ../src/noggit/ui/style/darkstyle/icon_checkbox_checked_pressed.png + ../src/noggit/ui/style/darkstyle/icon_checkbox_indeterminate_pressed.png + ../src/noggit/ui/style/darkstyle/icon_checkbox_unchecked_pressed.png + ../src/noggit/ui/style/darkstyle/icon_checkbox_checked_disabled.png + ../src/noggit/ui/style/darkstyle/icon_checkbox_indeterminate_disabled.png + ../src/noggit/ui/style/darkstyle/icon_checkbox_unchecked_disabled.png + ../src/noggit/ui/style/darkstyle/icon_radiobutton_checked.png + ../src/noggit/ui/style/darkstyle/icon_radiobutton_unchecked.png + ../src/noggit/ui/style/darkstyle/icon_radiobutton_checked_pressed.png + ../src/noggit/ui/style/darkstyle/icon_radiobutton_unchecked_pressed.png + ../src/noggit/ui/style/darkstyle/icon_radiobutton_checked_disabled.png + ../src/noggit/ui/style/darkstyle/icon_radiobutton_unchecked_disabled.png + + diff --git a/resources/framelesswindow.qrc b/resources/framelesswindow.qrc new file mode 100644 index 00000000..6bc403fe --- /dev/null +++ b/resources/framelesswindow.qrc @@ -0,0 +1,8 @@ + + + ../src/noggit/ui/style/images/icon_window_minimize.png + ../src/noggit/ui/style/images/icon_window_restore.png + ../src/noggit/ui/style/images/icon_window_maximize.png + ../src/noggit/ui/style/images/icon_window_close.png + + diff --git a/src/noggit/application.cpp b/src/noggit/application.cpp index d4305799..08ba9b1d 100644 --- a/src/noggit/application.cpp +++ b/src/noggit/application.cpp @@ -39,6 +39,9 @@ #include "revision.h" +#include +#include + class Noggit { public: @@ -284,8 +287,22 @@ Noggit::Noggit(int argc, char *argv[]) LogDebug << "GL: Vendor: " << gl.getString (GL_VENDOR) << std::endl; LogDebug << "GL: Renderer: " << gl.getString (GL_RENDERER) << std::endl; + + qApp->setStyle(new DarkStyle); + + // create frameless window (and set windowState or title) + FramelessWindow framelessWindow; + framelessWindow.setWindowState(Qt::WindowMaximized); + framelessWindow.setWindowTitle("Noggit Red"); + //framelessWindow.setWindowIcon(a.style()->standardIcon(QStyle::SP_DesktopIcon)); + + main_window = std::make_unique(); - if (fullscreen) + // add the mainwindow to our custom frameless window + framelessWindow.setContent(main_window.get()); + framelessWindow.showMaximized(); + + /*if (fullscreen) { main_window->showFullScreen(); } @@ -293,6 +310,7 @@ Noggit::Noggit(int argc, char *argv[]) { main_window->showMaximized(); } + */ } namespace @@ -348,5 +366,12 @@ int main(int argc, char *argv[]) Noggit app (argc, argv); + + QFile File("./themes/dark/theme.qss"); + File.open(QFile::ReadOnly); + QString StyleSheet = QLatin1String(File.readAll()); + + qapp.setStyleSheet(StyleSheet); + return qapp.exec(); } diff --git a/src/noggit/ui/style/DarkStyle.cpp b/src/noggit/ui/style/DarkStyle.cpp new file mode 100644 index 00000000..8b31bf74 --- /dev/null +++ b/src/noggit/ui/style/DarkStyle.cpp @@ -0,0 +1,73 @@ +/* +############################################################################### +# # +# The MIT License # +# # +# Copyright (C) 2017 by Juergen Skrotzky (JorgenVikingGod@gmail.com) # +# >> https://github.com/Jorgen-VikingGod # +# # +# Sources: https://github.com/Jorgen-VikingGod/Qt-Frameless-Window-DarkStyle # +# # +############################################################################### +*/ + +#include "DarkStyle.h" + +DarkStyle::DarkStyle() : DarkStyle(styleBase()) {} + +DarkStyle::DarkStyle(QStyle *style) : QProxyStyle(style) {} + +QStyle *DarkStyle::styleBase(QStyle *style) const { + static QStyle *base = + !style ? QStyleFactory::create(QStringLiteral("Fusion")) : style; + return base; +} + +QStyle *DarkStyle::baseStyle() const { return styleBase(); } + +void DarkStyle::polish(QPalette &palette) { + // modify palette to dark + palette.setColor(QPalette::Window, QColor(53, 53, 53)); + palette.setColor(QPalette::WindowText, Qt::white); + palette.setColor(QPalette::Disabled, QPalette::WindowText, + QColor(127, 127, 127)); + palette.setColor(QPalette::Base, QColor(42, 42, 42)); + palette.setColor(QPalette::AlternateBase, QColor(66, 66, 66)); + palette.setColor(QPalette::ToolTipBase, Qt::white); + palette.setColor(QPalette::ToolTipText, QColor(53, 53, 53)); + palette.setColor(QPalette::Text, Qt::white); + palette.setColor(QPalette::Disabled, QPalette::Text, QColor(127, 127, 127)); + palette.setColor(QPalette::Dark, QColor(35, 35, 35)); + palette.setColor(QPalette::Shadow, QColor(20, 20, 20)); + palette.setColor(QPalette::Button, QColor(53, 53, 53)); + palette.setColor(QPalette::ButtonText, Qt::white); + palette.setColor(QPalette::Disabled, QPalette::ButtonText, + QColor(127, 127, 127)); + palette.setColor(QPalette::BrightText, Qt::red); + palette.setColor(QPalette::Link, QColor(42, 130, 218)); + palette.setColor(QPalette::Highlight, QColor(42, 130, 218)); + palette.setColor(QPalette::Disabled, QPalette::Highlight, QColor(80, 80, 80)); + palette.setColor(QPalette::HighlightedText, Qt::white); + palette.setColor(QPalette::Disabled, QPalette::HighlightedText, + QColor(127, 127, 127)); +} + +void DarkStyle::polish(QApplication *app) { + if (!app) return; + + // increase font size for better reading, + // setPointSize was reduced from +2 because when applied this way in Qt5, the + // font is larger than intended for some reason + QFont defaultFont = QApplication::font(); + defaultFont.setPointSize(defaultFont.pointSize() + 1); + app->setFont(defaultFont); + + // loadstylesheet + QFile qfDarkstyle(QStringLiteral(":/darkstyle/darkstyle.qss")); + if (qfDarkstyle.open(QIODevice::ReadOnly | QIODevice::Text)) { + // set stylesheet + QString qsStylesheet = QString::fromLatin1(qfDarkstyle.readAll()); + app->setStyleSheet(qsStylesheet); + qfDarkstyle.close(); + } +} diff --git a/src/noggit/ui/style/DarkStyle.h b/src/noggit/ui/style/DarkStyle.h new file mode 100644 index 00000000..16187d01 --- /dev/null +++ b/src/noggit/ui/style/DarkStyle.h @@ -0,0 +1,39 @@ +/* +############################################################################### +# # +# The MIT License # +# # +# Copyright (C) 2017 by Juergen Skrotzky (JorgenVikingGod@gmail.com) # +# >> https://github.com/Jorgen-VikingGod # +# # +# Sources: https://github.com/Jorgen-VikingGod/Qt-Frameless-Window-DarkStyle # +# # +############################################################################### +*/ + +#ifndef DARKSTYLE_HPP +#define DARKSTYLE_HPP + +#include +#include +#include +#include +#include + +class DarkStyle : public QProxyStyle { + Q_OBJECT + + public: + DarkStyle(); + explicit DarkStyle(QStyle *style); + + QStyle *baseStyle() const; + + void polish(QPalette &palette) override; + void polish(QApplication *app) override; + + private: + QStyle *styleBase(QStyle *style = Q_NULLPTR) const; +}; + +#endif // DARKSTYLE_HPP diff --git a/src/noggit/ui/style/darkstyle/darkstyle.qss b/src/noggit/ui/style/darkstyle/darkstyle.qss new file mode 100644 index 00000000..44e5c682 --- /dev/null +++ b/src/noggit/ui/style/darkstyle/darkstyle.qss @@ -0,0 +1,343 @@ +QToolTip{ + color:#ffffff; + background-color:palette(base); + border:1px solid palette(highlight); + border-radius:4px; +} +QStatusBar{ + background-color:qlineargradient(x1:0,y1:0,x2:0,y2:1,stop:0 rgba(25,25,25,127),stop:1 rgba(53,53,53,75)); + color:palette(mid); +} +QMenuBar{ + background-color:qlineargradient(x1:0,y1:0,x2:0,y2:1,stop:0 rgba(25,25,25,127),stop:1 rgba(53,53,53,75)); + border-bottom:2px solid rgba(25,25,25,75); +} +QMenuBar::item{ + spacing:2px; + padding:3px 4px; + background:transparent; +} +QMenuBar::item:selected{ + background-color:qlineargradient(x1:0,y1:0,x2:0,y2:1,stop:0 rgba(106,106,106,255),stop:1 rgba(106,106,106,75)); + border-left:1px solid rgba(106,106,106,127); + border-right:1px solid rgba(106,106,106,127); +} +QMenuBar::item:pressed{ + background-color:palette(highlight); + border-left:1px solid rgba(25,25,25,127); + border-right:1px solid rgba(25,25,25,127); +} +QMenu{ + background-color:palette(window); + border:1px solid palette(shadow); +} +QMenu::item{ + padding:3px 25px 3px 25px; + border:1px solid transparent; +} +QMenu::item:disabled{ + background-color:rgba(35,35,35,127); + color:palette(disabled); +} +QMenu::item:selected{ + border-color:rgba(147,191,236,127); + background:palette(highlight); +} +QMenu::icon:checked{ + background-color:qlineargradient(x1:0,y1:1,x2:0,y2:0,stop:0 rgba(25,25,25,127),stop:1 rgba(53,53,53,75)); + border:1px solid palette(highlight); + border-radius:2px; +} +QMenu::separator{ + height:1px; + background:palette(alternate-base); + margin-left:5px; + margin-right:5px; +} +QMenu::indicator{ + width:18px; + height:18px; +} +QMenu::indicator:non-exclusive:checked{ + image:url(:/darkstyle/icon_checkbox_checked.png); + padding-left:2px; +} +QMenu::indicator:non-exclusive:unchecked{ + image:url(:/darkstyle/icon_checkbox_unchecked.png); + padding-left:2px; +} +QMenu::indicator:exclusive:checked{ + image:url(:/darkstyle/icon_radiobutton_checked.png); + padding-left:2px; +} +QMenu::indicator:exclusive:unchecked{ + image:url(:/darkstyle/icon_radiobutton_unchecked.png); + padding-left:2px; +} +QToolBar::top{ + background-color:qlineargradient(x1:0,y1:0,x2:0,y2:1,stop:0 rgba(25,25,25,127),stop:1 rgba(53,53,53,75)); + border-bottom:3px solid qlineargradient(x1:0,y1:0,x2:0,y2:1,stop:0 rgba(25,25,25,127),stop:1 rgba(53,53,53,75)); +} +QToolBar::bottom{ + background-color:qlineargradient(x1:0,y1:1,x2:0,y2:0,stop:0 rgba(25,25,25,127),stop:1 rgba(53,53,53,75)); + border-top:3px solid qlineargradient(x1:0,y1:1,x2:0,y2:0,stop:0 rgba(25,25,25,127),stop:1 rgba(53,53,53,75)); +} +QToolBar::left{ + background-color:qlineargradient(x1:0,y1:0,x2:1,y2:0,stop:0 rgba(25,25,25,127),stop:1 rgba(53,53,53,75)); + border-right:3px solid qlineargradient(x1:0,y1:0,x2:1,y2:0,stop:0 rgba(25,25,25,127),stop:1 rgba(53,53,53,75)); +} +QToolBar::right{ + background-color:qlineargradient(x1:1,y1:0,x2:0,y2:0,stop:0 rgba(25,25,25,127),stop:1 rgba(53,53,53,75)); + border-left:3px solid qlineargradient(x1:1,y1:0,x2:0,y2:0,stop:0 rgba(25,25,25,127),stop:1 rgba(53,53,53,75)); +} +QMainWindow::separator{ + width:6px; + height:5px; + padding:2px; +} +QSplitter::handle:horizontal{ + width:10px; +} +QSplitter::handle:vertical{ + height:10px; +} +QMainWindow::separator:hover,QSplitter::handle:hover{ + background:palette(highlight); +} +QDockWidget::title{ + padding:4px; + background-color:qlineargradient(x1:0,y1:1,x2:0,y2:0,stop:0 rgba(25,25,25,127),stop:1 rgba(53,53,53,75)); + border:1px solid rgba(25,25,25,75); + border-bottom:2px solid rgba(25,25,25,75); +} +QDockWidget{ + titlebar-close-icon:url(:/darkstyle/icon_close.png); + titlebar-normal-icon:url(:/darkstyle/icon_restore.png); +} +QDockWidget::close-button,QDockWidget::float-button{ + subcontrol-position:top right; + subcontrol-origin:margin; + position:absolute; + top:3px; + bottom:0px; + width:20px; + height:20px; +} +QDockWidget::close-button{ + right:3px; +} +QDockWidget::float-button{ + right:25px; +} +QGroupBox{ + background-color:rgba(66,66,66,50%); + margin-top:27px; + border:1px solid rgba(25,25,25,127); + border-radius:4px; +} +QGroupBox::title{ + subcontrol-origin:margin; + subcontrol-position:left top; + padding:4px 6px; + margin-left:3px; + background-color:qlineargradient(x1:0,y1:1,x2:0,y2:0,stop:0 rgba(25,25,25,127),stop:1 rgba(53,53,53,75)); + border:1px solid rgba(25,25,25,75); + border-bottom:2px solid rgb(127,127,127); + border-top-left-radius:4px; + border-top-right-radius:4px; +} +QTabWidget::pane{ + background-color:rgba(66,66,66,50%); + border-top:1px solid rgba(25,25,25,50%); +} +QTabWidget::tab-bar{ + left:3px; + top:1px; +} +QTabBar{ + background-color:transparent; + qproperty-drawBase:0; + border-bottom:1px solid rgba(25,25,25,50%); +} +QTabBar::tab{ + padding:4px 6px; + background-color:qlineargradient(x1:0,y1:1,x2:0,y2:0,stop:0 rgba(25,25,25,127),stop:1 rgba(53,53,53,75)); + border:1px solid rgba(25,25,25,75); + border-top-left-radius:4px; + border-top-right-radius:4px; +} +QTabBar::tab:selected,QTabBar::tab:hover{ + background-color:qlineargradient(x1:0,y1:0,x2:0,y2:1,stop:0 rgba(53,53,53,127),stop:1 rgba(66,66,66,50%)); + border-bottom-color:rgba(66,66,66,75%); +} +QTabBar::tab:selected{ + border-bottom:2px solid palette(highlight); +} +QTabBar::tab::selected:disabled{ + border-bottom:2px solid rgb(127,127,127); +} +QTabBar::tab:!selected{ + margin-top:2px; +} +QCheckBox::indicator{ + width:18px; + height:18px; +} +QCheckBox::indicator:checked,QTreeView::indicator:checked,QTableView::indicator:checked,QGroupBox::indicator:checked{ + image:url(:/darkstyle/icon_checkbox_checked.png); +} +QCheckBox::indicator:checked:pressed,QTreeView::indicator:checked:pressed,QTableView::indicator:checked:pressed,QGroupBox::indicator:checked:pressed{ + image:url(:/darkstyle/icon_checkbox_checked_pressed.png); +} +QCheckBox::indicator:checked:disabled,QTreeView::indicator:checked:disabled,QTableView::indicator:checked:disabled,QGroupBox::indicator:checked:disabled{ + image:url(:/darkstyle/icon_checkbox_checked_disabled.png); +} +QCheckBox::indicator:unchecked,QTreeView::indicator:unchecked,QTableView::indicator:unchecked,QGroupBox::indicator:unchecked{ + image:url(:/darkstyle/icon_checkbox_unchecked.png); +} +QCheckBox::indicator:unchecked:pressed,QTreeView::indicator:unchecked:pressed,QTableView::indicator:unchecked:pressed,QGroupBox::indicator:unchecked:pressed{ + image:url(:/darkstyle/icon_checkbox_unchecked_pressed.png); +} +QCheckBox::indicator:unchecked:disabled,QTreeView::indicator:unchecked:disabled,QTableView::indicator:unchecked:disabled,QGroupBox::indicator:unchecked:disabled{ + image:url(:/darkstyle/icon_checkbox_unchecked_disabled.png); +} +QCheckBox::indicator:indeterminate,QTreeView::indicator:indeterminate,QTableView::indicator:indeterminate,QGroupBox::indicator:indeterminate{ + image:url(:/darkstyle/icon_checkbox_indeterminate.png); +} +QCheckBox::indicator:indeterminate:pressed,QTreeView::indicator:indeterminate:pressed,QTableView::indicator:indeterminate:pressed,QGroupBox::indicator:indeterminate:pressed{ + image:url(:/darkstyle/icon_checkbox_indeterminate_pressed.png); +} +QCheckBox::indicator:indeterminate:disabled,QTreeView::indicator:indeterminate:disabled,QTableView::indicator:indeterminate:disabled,QGroupBox::indicator:indeterminate:disabled{ + image:url(:/darkstyle/icon_checkbox_indeterminate_disabled.png); +} +QRadioButton::indicator{ + width:18px; + height:18px; +} +QRadioButton::indicator:checked{ + image:url(:/darkstyle/icon_radiobutton_checked.png); +} +QRadioButton::indicator:checked:pressed{ + image:url(:/darkstyle/icon_radiobutton_checked_pressed.png); +} +QRadioButton::indicator:checked:disabled{ + image:url(:/darkstyle/icon_radiobutton_checked_disabled.png); +} +QRadioButton::indicator:unchecked{ + image:url(:/darkstyle/icon_radiobutton_unchecked.png); +} +QRadioButton::indicator:unchecked:pressed{ + image:url(:/darkstyle/icon_radiobutton_unchecked_pressed.png); +} +QRadioButton::indicator:unchecked:disabled{ + image:url(:/darkstyle/icon_radiobutton_unchecked_disabled.png); +} +QTreeView, QTableView{ + alternate-background-color:palette(window); + background:palette(base); +} +QTreeView QHeaderView::section, QTableView QHeaderView::section{ + background-color:qlineargradient(x1:0,y1:1,x2:0,y2:0,stop:0 rgba(25,25,25,127),stop:1 rgba(53,53,53,75)); + border-style:none; + border-bottom:1px solid palette(dark); + padding-left:5px; + padding-right:5px; +} +QTreeView::item:selected:disabled, QTableView::item:selected:disabled{ + background:rgb(80,80,80); +} +QTreeView::branch{ + background-color:palette(base); +} +QTreeView::branch:has-siblings:!adjoins-item{ + border-image:url(:/darkstyle/icon_vline.png) 0; +} +QTreeView::branch:has-siblings:adjoins-item{ + border-image:url(:/darkstyle/icon_branch_more.png) 0; +} +QTreeView::branch:!has-children:!has-siblings:adjoins-item{ + border-image:url(:/darkstyle/icon_branch_end.png) 0; +} +QTreeView::branch:has-children:!has-siblings:closed, +QTreeView::branch:closed:has-children:has-siblings{ + border-image:none; + image:url(:/darkstyle/icon_branch_closed.png); +} +QTreeView::branch:open:has-children:!has-siblings, +QTreeView::branch:open:has-children:has-siblings{ + border-image:none; + image:url(:/darkstyle/icon_branch_open.png); +} +QScrollBar:vertical{ + background:palette(base); + border-top-right-radius:2px; + border-bottom-right-radius:2px; + width:16px; + margin:0px; +} +QScrollBar::handle:vertical{ + background-color:palette(alternate-base); + border-radius:2px; + min-height:20px; + margin:2px 4px 2px 4px; +} +QScrollBar::handle:vertical:hover{ + background-color:palette(highlight); +} +QScrollBar::add-line:vertical{ + background:none; + height:0px; + subcontrol-position:right; + subcontrol-origin:margin; +} +QScrollBar::sub-line:vertical{ + background:none; + height:0px; + subcontrol-position:left; + subcontrol-origin:margin; +} +QScrollBar:horizontal{ + background:palette(base); + height:16px; + margin:0px; +} +QScrollBar::handle:horizontal{ + background-color:palette(alternate-base); + border-radius:2px; + min-width:20px; + margin:4px 2px 4px 2px; +} +QScrollBar::handle:horizontal:hover{ + background-color:palette(highlight); +} +QScrollBar::add-line:horizontal{ + background:none; + width:0px; + subcontrol-position:bottom; + subcontrol-origin:margin; +} +QScrollBar::sub-line:horizontal{ + background:none; + width:0px; + subcontrol-position:top; + subcontrol-origin:margin; +} +QSlider::handle:horizontal{ + border-radius:4px; + border:1px solid rgba(25,25,25,255); + background-color:palette(alternate-base); + min-height:20px; + margin:0 -4px; +} +QSlider::handle:horizontal:hover{ + background:palette(highlight); +} +QSlider::add-page:horizontal{ + background:palette(base); +} +QSlider::sub-page:horizontal{ + background:palette(highlight); +} +QSlider::sub-page:horizontal:disabled{ + background:rgb(80,80,80); +} diff --git a/src/noggit/ui/style/darkstyle/icon_branch_closed.png b/src/noggit/ui/style/darkstyle/icon_branch_closed.png new file mode 100644 index 0000000000000000000000000000000000000000..fa785cc91e6ab6b57b9ff2ab8b17a0a5cc6319a1 GIT binary patch literal 310 zcmeAS@N?(olHy`uVBq!ia0vp^96-#&!3HGb=lz)rq*&4&eH|GXHuiJ>Nn{1`ISV`@ ziy0Ug6+xJhcmI}fprAyFYeY$Kep*R+Vo@qXL1JcJiC$i6iGqoqfu3cKah)Gf%@$7= z#}JL+(hHtkhYUoHeSGtUuc@N{9ZSA)X=LW)W6T`$7OcCY(GgmBKu~=SpXh(VD6dR$ zd!c*385yVyt-!VXGE|c|w9$Xh1f5+6=PY#m#nNhi z$u+a=lXqQ$_}0s7mrUfXF-+PtF<-4Q?q|64N9H*vo@%>1TlgC2eg;ohKbLh*2~7Y8 CYj9%# literal 0 HcmV?d00001 diff --git a/src/noggit/ui/style/darkstyle/icon_branch_end.png b/src/noggit/ui/style/darkstyle/icon_branch_end.png new file mode 100644 index 0000000000000000000000000000000000000000..d90a04c33075a3e26db2686fd9a62b21e3d14a5d GIT binary patch literal 358 zcmeAS@N?(olHy`uVBq!ia0vp^fk14a~60+ z7BevL9RguSQ4OyKprAyFYeY$Kep*R+Vo@qXL1JcJiC$i6iGqoqfu3cKah)Gf%@a=- z$B>G+w-*-jGC4}PJbc|`Bw)c)Iw9dDqa*9}FPlCURi+*45cRKl6zBKH`nE)}=kI;@ zm%l&Q`!AaDn5ackqp}#8#DR|fmz$Jo4sbmyd@g9e{C(;J<}ic);v@BEAFsRo`+=!# zcng03+hQY$sRvi^xTP9sH3v%eoJt5GQAqXJH|9Hg)*H{(6P*q8FN3G6pUXO@geCxm C^?Y^! literal 0 HcmV?d00001 diff --git a/src/noggit/ui/style/darkstyle/icon_branch_more.png b/src/noggit/ui/style/darkstyle/icon_branch_more.png new file mode 100644 index 0000000000000000000000000000000000000000..bdbe4ed92af5f6fcdd185c752072d727bc6d350d GIT binary patch literal 207 zcmeAS@N?(olHy`uVBq!ia0vp^5mw7EWWf>Pm0S#vGboFyt=akR{0R8(u^#A|> literal 0 HcmV?d00001 diff --git a/src/noggit/ui/style/darkstyle/icon_branch_open.png b/src/noggit/ui/style/darkstyle/icon_branch_open.png new file mode 100644 index 0000000000000000000000000000000000000000..9dd05d6460df3535a0c8833eef4b617d8cb2e93c GIT binary patch literal 313 zcmeAS@N?(olHy`uVBq!ia0vp^JV4CB!3HGHK9Tzfq*&4&eH|GXHuiJ>Nn{1`ISV`@ ziy0Ug6+xJhcmI}fprAyFYeY$Kep*R+Vo@qXL1JcJiC$i6iGqoqfu3cKah)Gf&2~>0 z#}JL+)N`I(ha3c2AKrT@%koiS9ZSA);mt`OnVPc23!l0<`iQX06drmR@HT#uhmg2@ zNci4Yc~2|j?w8&*kE?j(`2L;6x!zx0+~+J7F5Yr2wM((byZokP61Lr_XX8RS-DxvGt3% zkMqH#PZ#?`_iXL#d?+iHSnyRL<=Lon*Ag*cla~T(pPQ6*e2~U<-GP*_hH3&`b%ZkbC+1l*n ZZ6=uTeQ?shqy}^XgQu&X%Q~loCIC{JK~n$# literal 0 HcmV?d00001 diff --git a/src/noggit/ui/style/darkstyle/icon_checkbox_checked_disabled.png b/src/noggit/ui/style/darkstyle/icon_checkbox_checked_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..441d0d9148a8badd5620904b2d18defce32fd7ca GIT binary patch literal 373 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL5ULAh?3y^w370~qEv>0#LT=By}Z;C1rt33 zJ6J37bZ;R4rebAc+WAn zhTjOpTkc$S@?y&418U;yWUqK{0tt!pUiVfIW;feeaM3_vPA@ai#*7{8Fp~Yxe0TO| zJEVXv_z|J=Q%zx?Sx(j;^+RVT9y(ii>I+LjgTe~DWM4f^5Bfb literal 0 HcmV?d00001 diff --git a/src/noggit/ui/style/darkstyle/icon_checkbox_checked_pressed.png b/src/noggit/ui/style/darkstyle/icon_checkbox_checked_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..7b508c8d156a3878a701209c7674dc5584fc90d7 GIT binary patch literal 373 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL5ULAh?3y^w370~qEv>0#LT=By}Z;C1rt33 zJ@&NsXv6nQvE@b(uy_5N& zAZ%5Cpw;;A{78Sz)a<-x7hmR?v8@%?yECbxm2I|E`wIttGgH2c1;>_FrUyS>;2g=m z*{J$vGLXq`oF$Xq9{)j)FQ@2X$%?0#LT=By}Z;C1rt33 zJ0#LT=By}Z;C1rt33 zJpVX7N4|TXV6yiU3DYu{zQAO6G=?WX`=#=i4;_Bx$?Q@(zG9RUcI0#LT=By}Z;C1rt33 zJBmQ; a&*+s(r7SrAZQf#_RScf4elF{r5}E*y3QTeU literal 0 HcmV?d00001 diff --git a/src/noggit/ui/style/darkstyle/icon_checkbox_unchecked_pressed.png b/src/noggit/ui/style/darkstyle/icon_checkbox_unchecked_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..c24130c552f7f9a31e3891082af80749a11ef16c GIT binary patch literal 238 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL5ULAh?3y^w370~qEv>0#LT=By}Z;C1rt33 zJ`@(t+}9+VxKD(vOcw bpV8Yib^U@4%V)Yks~9|8{an^LB{Ts5&cjUT literal 0 HcmV?d00001 diff --git a/src/noggit/ui/style/darkstyle/icon_close.png b/src/noggit/ui/style/darkstyle/icon_close.png new file mode 100644 index 0000000000000000000000000000000000000000..ece7c28b9cf14f2a10fb7b58fe87e19f19f3a25d GIT binary patch literal 422 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaL-l0AZa85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP=YPV z+ua371Hn({-St3 z1W2#{3nc6{#qKB_n*?NeE3Z~P%Cuv3L8McU)F$19HwtRl0?!u2JoL%=6YxlQ5>NV~ zE^fA5fr}=SGH3Z@&b#;`Fyz9v4brTKxfvMN7xoq(RcyNlv{JRiHKHUXu_Vv=^7b_7#drd7+V>eX&V?=85q3$W9f;aAvZrIGp!Q0h8YVRzXCOAfNUr( zOSei&EKb!eEy`p_%gjl&(%087$t}>&O-#>B&eruwD+sId%}=t++^!GQ!{F)a=d#Wz Gp$PyJ(T2tV literal 0 HcmV?d00001 diff --git a/src/noggit/ui/style/darkstyle/icon_radiobutton_checked.png b/src/noggit/ui/style/darkstyle/icon_radiobutton_checked.png new file mode 100644 index 0000000000000000000000000000000000000000..f747f4989cfc6113a43f98a53e4aa337bbb00282 GIT binary patch literal 370 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM0wlfaz7{huFj{)LIEGjV?mc+cQ@K!v;llkV z2Em<+TstBfI=U8V#M!8VP!7zLc3X5n1DWZi)qVqVs1`9uK$}qg7^3dx$HoHU|2GE My85}Sb4q9e03n;5kpKVy literal 0 HcmV?d00001 diff --git a/src/noggit/ui/style/darkstyle/icon_radiobutton_checked_disabled.png b/src/noggit/ui/style/darkstyle/icon_radiobutton_checked_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..fa554cbb3ba874b49b41b95927db8f3b92fbf1fe GIT binary patch literal 617 zcmV-v0+#)WP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;(#7eog=Y0oqAKK~zXf-IYN~TtO5?TL-!l#VkT33lLFJ z(iogLP)zm_5QGE*8T1a6xQ15e5?p{1)Fo(QCdoO?t^Td4?oS4pc;P_*`)*ZzUe&Me zylnM)y;<0X6Zj6lg1^7QTbND!-^9Q-a0kCzxP{FOYZu{Z_>#eL0lP20NFcZ5Grl-ZgMXZ5%K8#=EATe{ctL({E>_(U#MT@(!^nCNt32Uq* zZhk-BajZs|o^6YBvGi=q=wvlc6F0vQ?>bf^Og|ut!~XHRY}_R76F2WZ>OID4g!$hW zC@q?grRQlGovcPbar3X@UBzmI>D^*+FP7eFyh$u4ZvK6|qgahFy|^rT)TUzVAH=Wm zAu)3v)64kX*o`plpBI;b;ZapQufQqXhdvD7T=D!49BZrp{?HVK&4k?CrP!?^`x<^` z>{{%)2zV=&MZCy{?RqY2;G37pKczHYguJfHBI2I-h58ZMM)9<`p{3{Y5!$coBElQs z#Z@L4hdrO%mT_XBe=b{a4A<}&uHXo|P~XrOqE6=z20Wq*i~*uf00000NkvXXu0mjf DBpw!u literal 0 HcmV?d00001 diff --git a/src/noggit/ui/style/darkstyle/icon_radiobutton_checked_pressed.png b/src/noggit/ui/style/darkstyle/icon_radiobutton_checked_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..7b4bb1106ab17be557f94cd40956484fe7909e09 GIT binary patch literal 616 zcmV-u0+;=XP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;(#7eog=Y0oh4JK~zXf-IYyBTtOH`TL-!l#VkT33lK4) zM3hW2P)zm_Xb30>?mGohl5PKaG>A)ZdEW&HKnjWF$>7ngy-QB^!I!3o@jV;H=-;`tLe)>c3N&=iHWgxuVP*sUV_7Jg;y zyV!LR@K!8~c##d-^{=dfZ(b(fOKG$Sd0m%9#69r~^&_&4;%RY1OV4E&+OO*(!mHrL zRVEmPJs;neQDUHfE*o$J*YFsw;1JfKzM-!~oz7p{3_bQImI8wS0000KF1Pf3GwFP5xd6L7An~<5K?75c)&OV+~Pik3(QpMq4JEg6dLbn)58rqb$&R(++nux#}|&W&IEI%b&k?c?cCI>g@qUQ&eZv3-%cDM_^JxOy#N3J07*qo IM6N<$f~R4H-v9sr literal 0 HcmV?d00001 diff --git a/src/noggit/ui/style/darkstyle/icon_radiobutton_unchecked_disabled.png b/src/noggit/ui/style/darkstyle/icon_radiobutton_unchecked_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..87d18463ca3de25b42f8f279a70b28f5cd3d0d25 GIT binary patch literal 538 zcmV+#0_FXQP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;(#7eog=Y0gFjQK~zXf-IZNRLQxcj)dwAkQiBL-3W1Us zz4V||gDD7la0W^ZMWO*HQB9$;m-<$$%^|wi>j`|Q1s}-TKj*T~kG21;$z;-kW4MI} zcsKfe14qzudY&jeglG7u;0gLJs}{)(xOTCa!wA~YG#wbj9Yo$0G~A|KBt`QVII&$Q z;&ssCukf{qL&YLNV~OT_wkt($7h;i~?e8L>4UL(v{qiDFqmilh5t_D>Fm+m#Ft?Q@ z>NKv{lcDV-OdUl9N4By>?WudrY$ajpY%AEdl`U#_++%4g2~!tH!JqTnP}FK4)njEV z33KZU#E3e!vPJE#dn{}vVd`yBaBM4E)SkP?)K(Iv9xerS)atf3mTKVMJqEUuFf~6t zTuR73s??mhR--Q7M*@8(>DqT~SBl(ycysN6?P8IjS1}gRLsmL2#Xw&k%`Y7)7fE`q zV-cY}(GArl(inwKi#9Z7E-s+@xek%s13g^PpbX7?{aDIGq5fQkFoPwm%mSt`fL~wC czo1&}6PiV{{Bs1%hyVZp07*qoM6N<$g2%GpegFUf literal 0 HcmV?d00001 diff --git a/src/noggit/ui/style/darkstyle/icon_radiobutton_unchecked_pressed.png b/src/noggit/ui/style/darkstyle/icon_radiobutton_unchecked_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..8f4d548b081590f7bd126d98aa00743c0170149e GIT binary patch literal 537 zcmV+!0_OdRP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;(#7eog=Y0g6dPK~zXf-IZNRLQxcj)dwAkQiBL-3W1Us zz4V||gDD7_gJLsLq5&vTO`)=v`c|yXA-dP=33{jnAIRE2=d#a_wg0X8eBOd%xPg0k zGx|M)BWO82PZS=)6TDaO2z{4Ti{u7eyI3q>1Z`-V4vgUzBJT_WQte7PUL>v9gtfsSBjw_xWupYPFB*v9^_j z`RfbBh&r~iMeVM8ENvxW>TOYQY%5#Tp1a4yRuZNjE(LYe>bAF*YT(X22DXzhH9tLE zO2|H{)SS6iqb}Y@0(~dx+IMYNirjs8b?t%eVv(R%F&5E7Ryr=lKwlosFC8iuNqVkh z5urWN4b>&m7==!YHZ*1~E};6k4w2jgJzUYC49$G=Sjt49{#=GIg%zyL5+*Q!A79MB bpjzz%)7KnVvMmjB00000NkvXXu0mjfZmZ&p literal 0 HcmV?d00001 diff --git a/src/noggit/ui/style/darkstyle/icon_restore.png b/src/noggit/ui/style/darkstyle/icon_restore.png new file mode 100644 index 0000000000000000000000000000000000000000..be29650401564c0bb4d3f1527dbcd1931ca46708 GIT binary patch literal 404 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaL-l0AZa85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP=YPV z+ua371Hn({-St3PI1gGYY|NsBjPvS{Q zaWS0SdCe|C@p|f!UsL|s9e64f^Qfi9tyrF?mb+k?Qc>{P2Ok+XHcaqm+t1HtBmdwF zv=^7b_7#drd z7+V>cXd4(<85nFjsqqg*LvDUbW?Cg~4Tq;pZ~|)30NGGnmTr}lSe&X`T9nC?hDGs&BmALjAB#;Q<@k=#Mf-#lAw(+U3%24DaN;GYAZ0t^6TvPy9R S9_vZ~0000a~60+ z7BevL9RguSQ4OyKprAyFYeY$Kep*R+Vo@qXL1JcJiC$i6iGqoqfu3cKah)Gf&00?v z$B>G+w-*))HW)ClI944Blonm`vcbh=9fz^{wLg1yC7;{5)bQBXUH0d$=ChwJWOrrh u;t&zkPzrEa(BUB1sKi7cf&ZNr{p{Q~c4mFyk(~r|ID@CFpUXO@geCxAGgaIG literal 0 HcmV?d00001 diff --git a/src/noggit/ui/style/framelesswindow/framelesswindow.cpp b/src/noggit/ui/style/framelesswindow/framelesswindow.cpp new file mode 100644 index 00000000..5f267e69 --- /dev/null +++ b/src/noggit/ui/style/framelesswindow/framelesswindow.cpp @@ -0,0 +1,458 @@ +/* +############################################################################### +# # +# The MIT License # +# # +# Copyright (C) 2017 by Juergen Skrotzky (JorgenVikingGod@gmail.com) # +# >> https://github.com/Jorgen-VikingGod # +# # +# Sources: https://github.com/Jorgen-VikingGod/Qt-Frameless-Window-DarkStyle # +# # +############################################################################### +*/ + +#include "framelesswindow.h" +#include +#include +#include +#include + +#include "ui_framelesswindow.h" + +FramelessWindow::FramelessWindow(QWidget *parent) + : QWidget(parent), + ui(new Ui::FramelessWindow), + m_bMousePressed(false), + m_bDragTop(false), + m_bDragLeft(false), + m_bDragRight(false), + m_bDragBottom(false) { + setWindowFlags(Qt::FramelessWindowHint | Qt::WindowSystemMenuHint); + // append minimize button flag in case of windows, + // for correct windows native handling of minimize function +#if defined(Q_OS_WIN) + setWindowFlags(windowFlags() | Qt::WindowMinimizeButtonHint); +#endif + setAttribute(Qt::WA_NoSystemBackground, true); + setAttribute(Qt::WA_TranslucentBackground); + + ui->setupUi(this); + ui->restoreButton->setVisible(false); + + // shadow under window title text + QGraphicsDropShadowEffect *textShadow = new QGraphicsDropShadowEffect; + textShadow->setBlurRadius(4.0); + textShadow->setColor(QColor(0, 0, 0)); + textShadow->setOffset(0.0); + ui->titleText->setGraphicsEffect(textShadow); + + // window shadow + QGraphicsDropShadowEffect *windowShadow = new QGraphicsDropShadowEffect; + windowShadow->setBlurRadius(9.0); + windowShadow->setColor(palette().color(QPalette::Highlight)); + windowShadow->setOffset(0.0); + ui->windowFrame->setGraphicsEffect(windowShadow); + + QObject::connect(qApp, &QGuiApplication::applicationStateChanged, this, + &FramelessWindow::on_applicationStateChanged); + setMouseTracking(true); + + // important to watch mouse move from all child widgets + QApplication::instance()->installEventFilter(this); +} + +FramelessWindow::~FramelessWindow() { delete ui; } + +void FramelessWindow::on_restoreButton_clicked() { + ui->restoreButton->setVisible(false); + + ui->maximizeButton->setVisible(true); + setWindowState(Qt::WindowNoState); + // on MacOS this hack makes sure the + // background window is repaint correctly + hide(); + show(); +} + +void FramelessWindow::on_maximizeButton_clicked() { + ui->restoreButton->setVisible(true); + ui->maximizeButton->setVisible(false); + this->setWindowState(Qt::WindowMaximized); + this->showMaximized(); + styleWindow(true, false); +} + +void FramelessWindow::changeEvent(QEvent *event) { + if (event->type() == QEvent::WindowStateChange) { + if (windowState().testFlag(Qt::WindowNoState)) { + ui->restoreButton->setVisible(false); + ui->maximizeButton->setVisible(true); + styleWindow(true, true); + event->ignore(); + } else if (windowState().testFlag(Qt::WindowMaximized)) { + ui->restoreButton->setVisible(true); + ui->maximizeButton->setVisible(false); + styleWindow(true, false); + event->ignore(); + } + } + event->accept(); +} + +void FramelessWindow::setContent(QWidget *w) { + ui->windowContent->layout()->addWidget(w); +} + +void FramelessWindow::setWindowTitle(const QString &text) { + ui->titleText->setText(text); +} + +void FramelessWindow::setWindowIcon(const QIcon &ico) { + ui->icon->setPixmap(ico.pixmap(16, 16)); +} + +void FramelessWindow::styleWindow(bool bActive, bool bNoState) { + if (bActive) { + if (bNoState) { + layout()->setMargin(15); + ui->windowTitlebar->setStyleSheet(QStringLiteral( + "#windowTitlebar{border: 0px none palette(shadow); " + "border-top-left-radius:5px; border-top-right-radius:5px; " + "background-color:palette(shadow); height:20px;}")); + ui->windowFrame->setStyleSheet(QStringLiteral( + "#windowFrame{border:1px solid palette(highlight); border-radius:5px " + "5px 5px 5px; background-color:palette(Window);}")); + QGraphicsEffect *oldShadow = ui->windowFrame->graphicsEffect(); + if (oldShadow) delete oldShadow; + QGraphicsDropShadowEffect *windowShadow = new QGraphicsDropShadowEffect; + windowShadow->setBlurRadius(9.0); + windowShadow->setColor(palette().color(QPalette::Highlight)); + windowShadow->setOffset(0.0); + ui->windowFrame->setGraphicsEffect(windowShadow); + } else { + layout()->setMargin(0); + ui->windowTitlebar->setStyleSheet(QStringLiteral( + "#windowTitlebar{border: 0px none palette(shadow); " + "border-top-left-radius:0px; border-top-right-radius:0px; " + "background-color:palette(shadow); height:20px;}")); + ui->windowFrame->setStyleSheet(QStringLiteral( + "#windowFrame{border:1px solid palette(dark); border-radius:0px 0px " + "0px 0px; background-color:palette(Window);}")); + QGraphicsEffect *oldShadow = ui->windowFrame->graphicsEffect(); + if (oldShadow) delete oldShadow; + ui->windowFrame->setGraphicsEffect(nullptr); + } // if (bNoState) else maximize + } else { + if (bNoState) { + layout()->setMargin(15); + ui->windowTitlebar->setStyleSheet(QStringLiteral( + "#windowTitlebar{border: 0px none palette(shadow); " + "border-top-left-radius:5px; border-top-right-radius:5px; " + "background-color:palette(dark); height:20px;}")); + ui->windowFrame->setStyleSheet(QStringLiteral( + "#windowFrame{border:1px solid #000000; border-radius:5px 5px 5px " + "5px; background-color:palette(Window);}")); + QGraphicsEffect *oldShadow = ui->windowFrame->graphicsEffect(); + if (oldShadow) delete oldShadow; + QGraphicsDropShadowEffect *windowShadow = new QGraphicsDropShadowEffect; + windowShadow->setBlurRadius(9.0); + windowShadow->setColor(palette().color(QPalette::Shadow)); + windowShadow->setOffset(0.0); + ui->windowFrame->setGraphicsEffect(windowShadow); + } else { + layout()->setMargin(0); + ui->windowTitlebar->setStyleSheet(QStringLiteral( + "#titlebarWidget{border: 0px none palette(shadow); " + "border-top-left-radius:0px; border-top-right-radius:0px; " + "background-color:palette(dark); height:20px;}")); + ui->windowFrame->setStyleSheet(QStringLiteral( + "#windowFrame{border:1px solid palette(shadow); border-radius:0px " + "0px 0px 0px; background-color:palette(Window);}")); + QGraphicsEffect *oldShadow = ui->windowFrame->graphicsEffect(); + if (oldShadow) delete oldShadow; + ui->windowFrame->setGraphicsEffect(nullptr); + } // if (bNoState) { else maximize + } // if (bActive) { else no focus +} + +void FramelessWindow::on_applicationStateChanged(Qt::ApplicationState state) { + if (windowState().testFlag(Qt::WindowNoState)) { + if (state == Qt::ApplicationActive) { + styleWindow(true, true); + } else { + styleWindow(false, true); + } + } else if (windowState().testFlag(Qt::WindowFullScreen)) { + if (state == Qt::ApplicationActive) { + styleWindow(true, false); + } else { + styleWindow(false, false); + } + } +} + +void FramelessWindow::on_minimizeButton_clicked() { + setWindowState(Qt::WindowMinimized); +} + +void FramelessWindow::on_closeButton_clicked() { close(); } + +void FramelessWindow::on_windowTitlebar_doubleClicked() { + if (windowState().testFlag(Qt::WindowNoState)) { + on_maximizeButton_clicked(); + } else if (windowState().testFlag(Qt::WindowFullScreen)) { + on_restoreButton_clicked(); + } +} + +void FramelessWindow::mouseDoubleClickEvent(QMouseEvent *event) { + Q_UNUSED(event); +} + +void FramelessWindow::checkBorderDragging(QMouseEvent *event) { + if (isMaximized()) { + return; + } + + QPoint globalMousePos = event->globalPos(); + if (m_bMousePressed) { + QScreen *screen = QGuiApplication::primaryScreen(); + // available geometry excludes taskbar + QRect availGeometry = screen->availableGeometry(); + int h = availGeometry.height(); + int w = availGeometry.width(); + QList screenlist = screen->virtualSiblings(); + if (screenlist.contains(screen)) { + QSize sz = QApplication::desktop()->size(); + h = sz.height(); + w = sz.width(); + } + + // top right corner + if (m_bDragTop && m_bDragRight) { + int diff = + globalMousePos.x() - (m_StartGeometry.x() + m_StartGeometry.width()); + int neww = m_StartGeometry.width() + diff; + diff = globalMousePos.y() - m_StartGeometry.y(); + int newy = m_StartGeometry.y() + diff; + if (neww > 0 && newy > 0 && newy < h - 50) { + QRect newg = m_StartGeometry; + newg.setWidth(neww); + newg.setX(m_StartGeometry.x()); + newg.setY(newy); + setGeometry(newg); + } + } + // top left corner + else if (m_bDragTop && m_bDragLeft) { + int diff = globalMousePos.y() - m_StartGeometry.y(); + int newy = m_StartGeometry.y() + diff; + diff = globalMousePos.x() - m_StartGeometry.x(); + int newx = m_StartGeometry.x() + diff; + if (newy > 0 && newx > 0) { + QRect newg = m_StartGeometry; + newg.setY(newy); + newg.setX(newx); + setGeometry(newg); + } + } + // bottom right corner + else if (m_bDragBottom && m_bDragLeft) { + int diff = + globalMousePos.y() - (m_StartGeometry.y() + m_StartGeometry.height()); + int newh = m_StartGeometry.height() + diff; + diff = globalMousePos.x() - m_StartGeometry.x(); + int newx = m_StartGeometry.x() + diff; + if (newh > 0 && newx > 0) { + QRect newg = m_StartGeometry; + newg.setX(newx); + newg.setHeight(newh); + setGeometry(newg); + } + } else if (m_bDragTop) { + int diff = globalMousePos.y() - m_StartGeometry.y(); + int newy = m_StartGeometry.y() + diff; + if (newy > 0 && newy < h - 50) { + QRect newg = m_StartGeometry; + newg.setY(newy); + setGeometry(newg); + } + } else if (m_bDragLeft) { + int diff = globalMousePos.x() - m_StartGeometry.x(); + int newx = m_StartGeometry.x() + diff; + if (newx > 0 && newx < w - 50) { + QRect newg = m_StartGeometry; + newg.setX(newx); + setGeometry(newg); + } + } else if (m_bDragRight) { + int diff = + globalMousePos.x() - (m_StartGeometry.x() + m_StartGeometry.width()); + int neww = m_StartGeometry.width() + diff; + if (neww > 0) { + QRect newg = m_StartGeometry; + newg.setWidth(neww); + newg.setX(m_StartGeometry.x()); + setGeometry(newg); + } + } else if (m_bDragBottom) { + int diff = + globalMousePos.y() - (m_StartGeometry.y() + m_StartGeometry.height()); + int newh = m_StartGeometry.height() + diff; + if (newh > 0) { + QRect newg = m_StartGeometry; + newg.setHeight(newh); + newg.setY(m_StartGeometry.y()); + setGeometry(newg); + } + } + } else { + // no mouse pressed + if (leftBorderHit(globalMousePos) && topBorderHit(globalMousePos)) { + setCursor(Qt::SizeFDiagCursor); + } else if (rightBorderHit(globalMousePos) && topBorderHit(globalMousePos)) { + setCursor(Qt::SizeBDiagCursor); + } else if (leftBorderHit(globalMousePos) && + bottomBorderHit(globalMousePos)) { + setCursor(Qt::SizeBDiagCursor); + } else { + if (topBorderHit(globalMousePos)) { + setCursor(Qt::SizeVerCursor); + } else if (leftBorderHit(globalMousePos)) { + setCursor(Qt::SizeHorCursor); + } else if (rightBorderHit(globalMousePos)) { + setCursor(Qt::SizeHorCursor); + } else if (bottomBorderHit(globalMousePos)) { + setCursor(Qt::SizeVerCursor); + } else { + m_bDragTop = false; + m_bDragLeft = false; + m_bDragRight = false; + m_bDragBottom = false; + setCursor(Qt::ArrowCursor); + } + } + } +} + +// pos in global virtual desktop coordinates +bool FramelessWindow::leftBorderHit(const QPoint &pos) { + const QRect &rect = this->geometry(); + if (pos.x() >= rect.x() && pos.x() <= rect.x() + CONST_DRAG_BORDER_SIZE) { + return true; + } + return false; +} + +bool FramelessWindow::rightBorderHit(const QPoint &pos) { + const QRect &rect = this->geometry(); + int tmp = rect.x() + rect.width(); + if (pos.x() <= tmp && pos.x() >= (tmp - CONST_DRAG_BORDER_SIZE)) { + return true; + } + return false; +} + +bool FramelessWindow::topBorderHit(const QPoint &pos) { + const QRect &rect = this->geometry(); + if (pos.y() >= rect.y() && pos.y() <= rect.y() + CONST_DRAG_BORDER_SIZE) { + return true; + } + return false; +} + +bool FramelessWindow::bottomBorderHit(const QPoint &pos) { + const QRect &rect = this->geometry(); + int tmp = rect.y() + rect.height(); + if (pos.y() <= tmp && pos.y() >= (tmp - CONST_DRAG_BORDER_SIZE)) { + return true; + } + return false; +} + +void FramelessWindow::mousePressEvent(QMouseEvent *event) { + if (isMaximized()) { + return; + } + + m_bMousePressed = true; + m_StartGeometry = this->geometry(); + + QPoint globalMousePos = mapToGlobal(QPoint(event->x(), event->y())); + + if (leftBorderHit(globalMousePos) && topBorderHit(globalMousePos)) { + m_bDragTop = true; + m_bDragLeft = true; + setCursor(Qt::SizeFDiagCursor); + } else if (rightBorderHit(globalMousePos) && topBorderHit(globalMousePos)) { + m_bDragRight = true; + m_bDragTop = true; + setCursor(Qt::SizeBDiagCursor); + } else if (leftBorderHit(globalMousePos) && bottomBorderHit(globalMousePos)) { + m_bDragLeft = true; + m_bDragBottom = true; + setCursor(Qt::SizeBDiagCursor); + } else { + if (topBorderHit(globalMousePos)) { + m_bDragTop = true; + setCursor(Qt::SizeVerCursor); + } else if (leftBorderHit(globalMousePos)) { + m_bDragLeft = true; + setCursor(Qt::SizeHorCursor); + } else if (rightBorderHit(globalMousePos)) { + m_bDragRight = true; + setCursor(Qt::SizeHorCursor); + } else if (bottomBorderHit(globalMousePos)) { + m_bDragBottom = true; + setCursor(Qt::SizeVerCursor); + } + } +} + +void FramelessWindow::mouseReleaseEvent(QMouseEvent *event) { + Q_UNUSED(event); + if (isMaximized()) { + return; + } + + m_bMousePressed = false; + bool bSwitchBackCursorNeeded = + m_bDragTop || m_bDragLeft || m_bDragRight || m_bDragBottom; + m_bDragTop = false; + m_bDragLeft = false; + m_bDragRight = false; + m_bDragBottom = false; + if (bSwitchBackCursorNeeded) { + setCursor(Qt::ArrowCursor); + } +} + +bool FramelessWindow::eventFilter(QObject *obj, QEvent *event) { + if (isMaximized()) { + return QWidget::eventFilter(obj, event); + } + + // check mouse move event when mouse is moved on any object + if (event->type() == QEvent::MouseMove) { + QMouseEvent *pMouse = dynamic_cast(event); + if (pMouse) { + checkBorderDragging(pMouse); + } + } + // press is triggered only on frame window + else if (event->type() == QEvent::MouseButtonPress && obj == this) { + QMouseEvent *pMouse = dynamic_cast(event); + if (pMouse) { + mousePressEvent(pMouse); + } + } else if (event->type() == QEvent::MouseButtonRelease) { + if (m_bMousePressed) { + QMouseEvent *pMouse = dynamic_cast(event); + if (pMouse) { + mouseReleaseEvent(pMouse); + } + } + } + + return QWidget::eventFilter(obj, event); +} diff --git a/src/noggit/ui/style/framelesswindow/framelesswindow.h b/src/noggit/ui/style/framelesswindow/framelesswindow.h new file mode 100644 index 00000000..62bd08ef --- /dev/null +++ b/src/noggit/ui/style/framelesswindow/framelesswindow.h @@ -0,0 +1,69 @@ +/* +############################################################################### +# # +# The MIT License # +# # +# Copyright (C) 2017 by Juergen Skrotzky (JorgenVikingGod@gmail.com) # +# >> https://github.com/Jorgen-VikingGod # +# # +# Sources: https://github.com/Jorgen-VikingGod/Qt-Frameless-Window-DarkStyle # +# # +############################################################################### +*/ + +#ifndef FRAMELESSWINDOW_H +#define FRAMELESSWINDOW_H + +#include + +namespace Ui { +class FramelessWindow; +} + +class FramelessWindow : public QWidget { + Q_OBJECT + + public: + explicit FramelessWindow(QWidget *parent = Q_NULLPTR); + virtual ~FramelessWindow(); + void setContent(QWidget *w); + + private: + bool leftBorderHit(const QPoint &pos); + bool rightBorderHit(const QPoint &pos); + bool topBorderHit(const QPoint &pos); + bool bottomBorderHit(const QPoint &pos); + void styleWindow(bool bActive, bool bNoState); + + public slots: + void setWindowTitle(const QString &text); + void setWindowIcon(const QIcon &ico); + + private slots: + void on_applicationStateChanged(Qt::ApplicationState state); + void on_minimizeButton_clicked(); + void on_restoreButton_clicked(); + void on_maximizeButton_clicked(); + void on_closeButton_clicked(); + void on_windowTitlebar_doubleClicked(); + + protected: + virtual void changeEvent(QEvent *event); + virtual void mouseDoubleClickEvent(QMouseEvent *event); + virtual void checkBorderDragging(QMouseEvent *event); + virtual void mousePressEvent(QMouseEvent *event); + virtual void mouseReleaseEvent(QMouseEvent *event); + virtual bool eventFilter(QObject *obj, QEvent *event); + + private: + Ui::FramelessWindow *ui; + QRect m_StartGeometry; + const quint8 CONST_DRAG_BORDER_SIZE = 15; + bool m_bMousePressed; + bool m_bDragTop; + bool m_bDragLeft; + bool m_bDragRight; + bool m_bDragBottom; +}; + +#endif // FRAMELESSWINDOW_H diff --git a/src/noggit/ui/style/framelesswindow/framelesswindow.ui b/src/noggit/ui/style/framelesswindow/framelesswindow.ui new file mode 100644 index 00000000..70b043ec --- /dev/null +++ b/src/noggit/ui/style/framelesswindow/framelesswindow.ui @@ -0,0 +1,304 @@ + + + FramelessWindow + + + + 0 + 0 + 560 + 398 + + + + + + + false + + + + 0 + + + 5 + + + 5 + + + 5 + + + 5 + + + + + false + + + #windowFrame{border:1px solid palette(highlight); border-radius:5px 5px 5px 5px; background-color:palette(Window);} + + + + 0 + + + 1 + + + 1 + + + 1 + + + 1 + + + + + + 0 + 0 + + + + + 0 + 0 + + + + false + + + #windowTitlebar{border: 0px none palette(base); border-top-left-radius:5px; border-top-right-radius:5px; background-color:palette(shadow); height:20px;} + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 4 + 0 + + + + + 4 + 16777215 + + + + + + + + + 16 + 16 + + + + + 16 + 16 + + + + Qt::NoContextMenu + + + #icon {background-color:palette(shadow);} + + + + + + + + 75 + true + + + + padding-left:5px; + color:rgb(153,153,153); + + + Frameless Window (Dark Style) + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + + + + 75 + true + + + + #minimizeButton{ + background-color:none; + border:none; + width:16px; + height:16px; + padding:4px; + image:url(:/images/icon_window_minimize.png); +} +#minimizeButton:hover{ + background-color:palette(alternate-base); +} +#minimizeButton:pressed{ + background-color:palette(highlight); +} + + + + + + + + + + #restoreButton{ + background-color:none; + border:none; + width:16px; + height:16px; + padding:4px; + image:url(:/images/icon_window_restore.png); +} +#restoreButton:hover{ + background-color:palette(alternate-base); +} +#restoreButton:pressed{ + background-color:palette(highlight); +} + + + + + + + + + + #maximizeButton{ + background-color:none; + border:none; + width:16px; + height:16px; + padding:4px; + image:url(:/images/icon_window_maximize.png); +} +#maximizeButton:hover{ + background-color:palette(alternate-base); +} +##maximizeButton:pressed{ + background-color:palette(highlight); +} + + + + + + + + + + + 75 + true + + + + #closeButton{ + background-color:none; + border:none; + width:16px; + height:16px; + padding:4px; + image:url(:/images/icon_window_close.png); + border-top-right-radius: 5px; +} +#closeButton:hover{ + background-color:palette(alternate-base); +} +##closeButton:pressed{ + background-color:palette(highlight); +} + + + + + + + + + + false + + + #windowContent{ + border: 0px none palette(base); + border-radius:0px 0px 5px 5px; +} + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + + + + + + + + WindowDragger + QWidget +
windowdragger.h
+ 1 +
+
+ + +
diff --git a/src/noggit/ui/style/framelesswindow/windowdragger.cpp b/src/noggit/ui/style/framelesswindow/windowdragger.cpp new file mode 100644 index 00000000..1d8627fc --- /dev/null +++ b/src/noggit/ui/style/framelesswindow/windowdragger.cpp @@ -0,0 +1,56 @@ +/* +############################################################################### +# # +# The MIT License # +# # +# Copyright (C) 2017 by Juergen Skrotzky (JorgenVikingGod@gmail.com) # +# >> https://github.com/Jorgen-VikingGod # +# # +# Sources: https://github.com/Jorgen-VikingGod/Qt-Frameless-Window-DarkStyle # +# # +############################################################################### +*/ + +#include "windowdragger.h" +#include +#include + +WindowDragger::WindowDragger(QWidget *parent) : QWidget(parent) { + mousePressed = false; +} + +void WindowDragger::mousePressEvent(QMouseEvent *event) { + mousePressed = true; + mousePos = event->globalPos(); + + QWidget *parent = parentWidget(); + if (parent) parent = parent->parentWidget(); + + if (parent) wndPos = parent->pos(); +} + +void WindowDragger::mouseMoveEvent(QMouseEvent *event) { + QWidget *parent = parentWidget(); + if (parent) parent = parent->parentWidget(); + + if (parent && mousePressed) + parent->move(wndPos + (event->globalPos() - mousePos)); +} + +void WindowDragger::mouseReleaseEvent(QMouseEvent *event) { + Q_UNUSED(event); + mousePressed = false; +} + +void WindowDragger::paintEvent(QPaintEvent *event) { + Q_UNUSED(event); + QStyleOption styleOption; + styleOption.init(this); + QPainter painter(this); + style()->drawPrimitive(QStyle::PE_Widget, &styleOption, &painter, this); +} + +void WindowDragger::mouseDoubleClickEvent(QMouseEvent *event) { + Q_UNUSED(event); + emit doubleClicked(); +} diff --git a/src/noggit/ui/style/framelesswindow/windowdragger.h b/src/noggit/ui/style/framelesswindow/windowdragger.h new file mode 100644 index 00000000..be5b5392 --- /dev/null +++ b/src/noggit/ui/style/framelesswindow/windowdragger.h @@ -0,0 +1,43 @@ +/* +############################################################################### +# # +# The MIT License # +# # +# Copyright (C) 2017 by Juergen Skrotzky (JorgenVikingGod@gmail.com) # +# >> https://github.com/Jorgen-VikingGod # +# # +# Sources: https://github.com/Jorgen-VikingGod/Qt-Frameless-Window-DarkStyle # +# # +############################################################################### +*/ + +#ifndef WINDOWDRAGGER_H +#define WINDOWDRAGGER_H + +#include +#include + +class WindowDragger : public QWidget { + Q_OBJECT + + public: + explicit WindowDragger(QWidget *parent = Q_NULLPTR); + virtual ~WindowDragger() {} + + signals: + void doubleClicked(); + + protected: + void mousePressEvent(QMouseEvent *event); + void mouseMoveEvent(QMouseEvent *event); + void mouseReleaseEvent(QMouseEvent *event); + void mouseDoubleClickEvent(QMouseEvent *event); + void paintEvent(QPaintEvent *event); + + protected: + QPoint mousePos; + QPoint wndPos; + bool mousePressed; +}; + +#endif // WINDOWDRAGGER_H diff --git a/src/noggit/ui/style/images/icon_window_close.png b/src/noggit/ui/style/images/icon_window_close.png new file mode 100644 index 0000000000000000000000000000000000000000..ece7c28b9cf14f2a10fb7b58fe87e19f19f3a25d GIT binary patch literal 422 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaL-l0AZa85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP=YPV z+ua371Hn({-St3 z1W2#{3nc6{#qKB_n*?NeE3Z~P%Cuv3L8McU)F$19HwtRl0?!u2JoL%=6YxlQ5>NV~ zE^fA5fr}=SGH3Z@&b#;`Fyz9v4brTKxfvMN7xoq(RcyNlv{JRiHKHUXu_Vv=^7b_7#drd7+V>eX&V?=85q3$W9f;aAvZrIGp!Q0h8YVRzXCOAfNUr( zOSei&EKb!eEy`p_%gjl&(%087$t}>&O-#>B&eruwD+sId%}=t++^!GQ!{F)a=d#Wz Gp$PyJ(T2tV literal 0 HcmV?d00001 diff --git a/src/noggit/ui/style/images/icon_window_maximize.png b/src/noggit/ui/style/images/icon_window_maximize.png new file mode 100644 index 0000000000000000000000000000000000000000..53ae289d010134bbd2218c1d94bb7cf62380a7c5 GIT binary patch literal 386 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaL-l0AZa85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP=YPV z+ua371Hn({-St3PI#6{MB|NsA=uf!}V z8F(gT(N_MpeXKe=R4yEzByd2q+}XavO;=)T0!KuHv3hXSs!M0t7biSmWXLPwQLw2j ziv=2|TH+c}l9E`GYL#4+3Zxi}3=GY64a{_nj6)2KtxSxpOpUY+46FA`FK1~g9gZk;<9wBq{QM>-O{2=hP2F_R4aXb{gT`Q{oKU#%;ap{{K#-q Y=hDOi$%hHwfqED`UHx3vIVCg!04C3CMF0Q* literal 0 HcmV?d00001 diff --git a/src/noggit/ui/style/images/icon_window_minimize.png b/src/noggit/ui/style/images/icon_window_minimize.png new file mode 100644 index 0000000000000000000000000000000000000000..29bceed06b98e0268aeaf23477b585859f561a98 GIT binary patch literal 364 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaL-l0AZa85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP=YPV z+ua371Hn({-St3+E?Ks8O}VHKHUXu_Vv=^7b_ z7#drd7+V>dXd4(<85r2O>C2*M$jwj5OsmAL!B=|vLZAi>kPXFU=~hXJ#i_cbMVSm~ unK`Le`uh4Mxdr;UiRqci*}5*y1}5d9=3)9;b7g>f7(8A5T-G@yGywpqYG70V literal 0 HcmV?d00001 diff --git a/src/noggit/ui/style/images/icon_window_restore.png b/src/noggit/ui/style/images/icon_window_restore.png new file mode 100644 index 0000000000000000000000000000000000000000..be29650401564c0bb4d3f1527dbcd1931ca46708 GIT binary patch literal 404 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaL-l0AZa85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP=YPV z+ua371Hn({-St3PI1gGYY|NsBjPvS{Q zaWS0SdCe|C@p|f!UsL|s9e64f^Qfi9tyrF?mb+k?Qc>{P2Ok+XHcaqm+t1HtBmdwF zv=^7b_7#drd z7+V>cXd4(<85nFjsqqg*LvDUbW?Cg~4Tq;pZ~|)30NGGnmTr}lSe&X`T9nC