diff --git a/media/noggit.ico b/media/noggit.ico new file mode 100644 index 00000000..b4ac2771 Binary files /dev/null and b/media/noggit.ico differ 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 00000000..fa785cc9 Binary files /dev/null and b/src/noggit/ui/style/darkstyle/icon_branch_closed.png differ 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 00000000..d90a04c3 Binary files /dev/null and b/src/noggit/ui/style/darkstyle/icon_branch_end.png differ 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 00000000..bdbe4ed9 Binary files /dev/null and b/src/noggit/ui/style/darkstyle/icon_branch_more.png differ 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 00000000..9dd05d64 Binary files /dev/null and b/src/noggit/ui/style/darkstyle/icon_branch_open.png differ diff --git a/src/noggit/ui/style/darkstyle/icon_checkbox_checked.png b/src/noggit/ui/style/darkstyle/icon_checkbox_checked.png new file mode 100644 index 00000000..fa229078 Binary files /dev/null and b/src/noggit/ui/style/darkstyle/icon_checkbox_checked.png differ 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 00000000..441d0d91 Binary files /dev/null and b/src/noggit/ui/style/darkstyle/icon_checkbox_checked_disabled.png differ 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 00000000..7b508c8d Binary files /dev/null and b/src/noggit/ui/style/darkstyle/icon_checkbox_checked_pressed.png differ diff --git a/src/noggit/ui/style/darkstyle/icon_checkbox_indeterminate.png b/src/noggit/ui/style/darkstyle/icon_checkbox_indeterminate.png new file mode 100644 index 00000000..87ebf238 Binary files /dev/null and b/src/noggit/ui/style/darkstyle/icon_checkbox_indeterminate.png differ diff --git a/src/noggit/ui/style/darkstyle/icon_checkbox_indeterminate_disabled.png b/src/noggit/ui/style/darkstyle/icon_checkbox_indeterminate_disabled.png new file mode 100644 index 00000000..ee7d112d Binary files /dev/null and b/src/noggit/ui/style/darkstyle/icon_checkbox_indeterminate_disabled.png differ diff --git a/src/noggit/ui/style/darkstyle/icon_checkbox_indeterminate_pressed.png b/src/noggit/ui/style/darkstyle/icon_checkbox_indeterminate_pressed.png new file mode 100644 index 00000000..562c4821 Binary files /dev/null and b/src/noggit/ui/style/darkstyle/icon_checkbox_indeterminate_pressed.png differ diff --git a/src/noggit/ui/style/darkstyle/icon_checkbox_unchecked.png b/src/noggit/ui/style/darkstyle/icon_checkbox_unchecked.png new file mode 100644 index 00000000..c3c14ddd Binary files /dev/null and b/src/noggit/ui/style/darkstyle/icon_checkbox_unchecked.png differ diff --git a/src/noggit/ui/style/darkstyle/icon_checkbox_unchecked_disabled.png b/src/noggit/ui/style/darkstyle/icon_checkbox_unchecked_disabled.png new file mode 100644 index 00000000..3ac26d8c Binary files /dev/null and b/src/noggit/ui/style/darkstyle/icon_checkbox_unchecked_disabled.png differ 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 00000000..c24130c5 Binary files /dev/null and b/src/noggit/ui/style/darkstyle/icon_checkbox_unchecked_pressed.png differ 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 00000000..ece7c28b Binary files /dev/null and b/src/noggit/ui/style/darkstyle/icon_close.png differ 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 00000000..f747f498 Binary files /dev/null and b/src/noggit/ui/style/darkstyle/icon_radiobutton_checked.png differ 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 00000000..fa554cbb Binary files /dev/null and b/src/noggit/ui/style/darkstyle/icon_radiobutton_checked_disabled.png differ 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 00000000..7b4bb110 Binary files /dev/null and b/src/noggit/ui/style/darkstyle/icon_radiobutton_checked_pressed.png differ diff --git a/src/noggit/ui/style/darkstyle/icon_radiobutton_unchecked.png b/src/noggit/ui/style/darkstyle/icon_radiobutton_unchecked.png new file mode 100644 index 00000000..e74f040b Binary files /dev/null and b/src/noggit/ui/style/darkstyle/icon_radiobutton_unchecked.png differ 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 00000000..87d18463 Binary files /dev/null and b/src/noggit/ui/style/darkstyle/icon_radiobutton_unchecked_disabled.png differ 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 00000000..8f4d548b Binary files /dev/null and b/src/noggit/ui/style/darkstyle/icon_radiobutton_unchecked_pressed.png differ 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 00000000..be296504 Binary files /dev/null and b/src/noggit/ui/style/darkstyle/icon_restore.png differ diff --git a/src/noggit/ui/style/darkstyle/icon_undock.png b/src/noggit/ui/style/darkstyle/icon_undock.png new file mode 100644 index 00000000..25e317e6 Binary files /dev/null and b/src/noggit/ui/style/darkstyle/icon_undock.png differ diff --git a/src/noggit/ui/style/darkstyle/icon_vline.png b/src/noggit/ui/style/darkstyle/icon_vline.png new file mode 100644 index 00000000..14228c8f Binary files /dev/null and b/src/noggit/ui/style/darkstyle/icon_vline.png differ 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 00000000..ece7c28b Binary files /dev/null and b/src/noggit/ui/style/images/icon_window_close.png differ 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 00000000..53ae289d Binary files /dev/null and b/src/noggit/ui/style/images/icon_window_maximize.png differ 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 00000000..29bceed0 Binary files /dev/null and b/src/noggit/ui/style/images/icon_window_minimize.png differ 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 00000000..be296504 Binary files /dev/null and b/src/noggit/ui/style/images/icon_window_restore.png differ