add themes support
BIN
media/noggit.ico
Normal file
|
After Width: | Height: | Size: 9.4 KiB |
1
media/res.rc
Normal file
@@ -0,0 +1 @@
|
|||||||
|
IDI_APP ICON "noggit.ico"
|
||||||
28
resources/darkstyle.qrc
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
<RCC>
|
||||||
|
<qresource prefix="/">
|
||||||
|
<file>../src/noggit/ui/style/darkstyle/darkstyle.qss</file>
|
||||||
|
<file>../src/noggit/ui/style/darkstyle/icon_close.png</file>
|
||||||
|
<file>../src/noggit/ui/style/darkstyle/icon_restore.png</file>
|
||||||
|
<file>../src/noggit/ui/style/darkstyle/icon_undock.png</file>
|
||||||
|
<file>../src/noggit/ui/style/darkstyle/icon_branch_closed.png</file>
|
||||||
|
<file>../src/noggit/ui/style/darkstyle/icon_branch_end.png</file>
|
||||||
|
<file>../src/noggit/ui/style/darkstyle/icon_branch_more.png</file>
|
||||||
|
<file>../src/noggit/ui/style/darkstyle/icon_branch_open.png</file>
|
||||||
|
<file>../src/noggit/ui/style/darkstyle/icon_vline.png</file>
|
||||||
|
<file>../src/noggit/ui/style/darkstyle/icon_checkbox_checked.png</file>
|
||||||
|
<file>../src/noggit/ui/style/darkstyle/icon_checkbox_indeterminate.png</file>
|
||||||
|
<file>../src/noggit/ui/style/darkstyle/icon_checkbox_unchecked.png</file>
|
||||||
|
<file>../src/noggit/ui/style/darkstyle/icon_checkbox_checked_pressed.png</file>
|
||||||
|
<file>../src/noggit/ui/style/darkstyle/icon_checkbox_indeterminate_pressed.png</file>
|
||||||
|
<file>../src/noggit/ui/style/darkstyle/icon_checkbox_unchecked_pressed.png</file>
|
||||||
|
<file>../src/noggit/ui/style/darkstyle/icon_checkbox_checked_disabled.png</file>
|
||||||
|
<file>../src/noggit/ui/style/darkstyle/icon_checkbox_indeterminate_disabled.png</file>
|
||||||
|
<file>../src/noggit/ui/style/darkstyle/icon_checkbox_unchecked_disabled.png</file>
|
||||||
|
<file>../src/noggit/ui/style/darkstyle/icon_radiobutton_checked.png</file>
|
||||||
|
<file>../src/noggit/ui/style/darkstyle/icon_radiobutton_unchecked.png</file>
|
||||||
|
<file>../src/noggit/ui/style/darkstyle/icon_radiobutton_checked_pressed.png</file>
|
||||||
|
<file>../src/noggit/ui/style/darkstyle/icon_radiobutton_unchecked_pressed.png</file>
|
||||||
|
<file>../src/noggit/ui/style/darkstyle/icon_radiobutton_checked_disabled.png</file>
|
||||||
|
<file>../src/noggit/ui/style/darkstyle/icon_radiobutton_unchecked_disabled.png</file>
|
||||||
|
</qresource>
|
||||||
|
</RCC>
|
||||||
8
resources/framelesswindow.qrc
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
<RCC>
|
||||||
|
<qresource prefix="/">
|
||||||
|
<file>../src/noggit/ui/style/images/icon_window_minimize.png</file>
|
||||||
|
<file>../src/noggit/ui/style/images/icon_window_restore.png</file>
|
||||||
|
<file>../src/noggit/ui/style/images/icon_window_maximize.png</file>
|
||||||
|
<file>../src/noggit/ui/style/images/icon_window_close.png</file>
|
||||||
|
</qresource>
|
||||||
|
</RCC>
|
||||||
@@ -39,6 +39,9 @@
|
|||||||
|
|
||||||
#include "revision.h"
|
#include "revision.h"
|
||||||
|
|
||||||
|
#include <noggit/ui/style/framelesswindow/framelesswindow.h>
|
||||||
|
#include <noggit/ui/style/DarkStyle.h>
|
||||||
|
|
||||||
class Noggit
|
class Noggit
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@@ -284,8 +287,22 @@ Noggit::Noggit(int argc, char *argv[])
|
|||||||
LogDebug << "GL: Vendor: " << gl.getString (GL_VENDOR) << std::endl;
|
LogDebug << "GL: Vendor: " << gl.getString (GL_VENDOR) << std::endl;
|
||||||
LogDebug << "GL: Renderer: " << gl.getString (GL_RENDERER) << 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<noggit::ui::main_window>();
|
main_window = std::make_unique<noggit::ui::main_window>();
|
||||||
if (fullscreen)
|
// add the mainwindow to our custom frameless window
|
||||||
|
framelessWindow.setContent(main_window.get());
|
||||||
|
framelessWindow.showMaximized();
|
||||||
|
|
||||||
|
/*if (fullscreen)
|
||||||
{
|
{
|
||||||
main_window->showFullScreen();
|
main_window->showFullScreen();
|
||||||
}
|
}
|
||||||
@@ -293,6 +310,7 @@ Noggit::Noggit(int argc, char *argv[])
|
|||||||
{
|
{
|
||||||
main_window->showMaximized();
|
main_window->showMaximized();
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace
|
namespace
|
||||||
@@ -348,5 +366,12 @@ int main(int argc, char *argv[])
|
|||||||
|
|
||||||
Noggit app (argc, 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();
|
return qapp.exec();
|
||||||
}
|
}
|
||||||
|
|||||||
73
src/noggit/ui/style/DarkStyle.cpp
Normal file
@@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
39
src/noggit/ui/style/DarkStyle.h
Normal file
@@ -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 <QApplication>
|
||||||
|
#include <QFile>
|
||||||
|
#include <QFont>
|
||||||
|
#include <QProxyStyle>
|
||||||
|
#include <QStyleFactory>
|
||||||
|
|
||||||
|
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
|
||||||
343
src/noggit/ui/style/darkstyle/darkstyle.qss
Normal file
@@ -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);
|
||||||
|
}
|
||||||
BIN
src/noggit/ui/style/darkstyle/icon_branch_closed.png
Normal file
|
After Width: | Height: | Size: 310 B |
BIN
src/noggit/ui/style/darkstyle/icon_branch_end.png
Normal file
|
After Width: | Height: | Size: 358 B |
BIN
src/noggit/ui/style/darkstyle/icon_branch_more.png
Normal file
|
After Width: | Height: | Size: 207 B |
BIN
src/noggit/ui/style/darkstyle/icon_branch_open.png
Normal file
|
After Width: | Height: | Size: 313 B |
BIN
src/noggit/ui/style/darkstyle/icon_checkbox_checked.png
Normal file
|
After Width: | Height: | Size: 176 B |
BIN
src/noggit/ui/style/darkstyle/icon_checkbox_checked_disabled.png
Normal file
|
After Width: | Height: | Size: 373 B |
BIN
src/noggit/ui/style/darkstyle/icon_checkbox_checked_pressed.png
Normal file
|
After Width: | Height: | Size: 373 B |
BIN
src/noggit/ui/style/darkstyle/icon_checkbox_indeterminate.png
Normal file
|
After Width: | Height: | Size: 121 B |
|
After Width: | Height: | Size: 286 B |
|
After Width: | Height: | Size: 286 B |
BIN
src/noggit/ui/style/darkstyle/icon_checkbox_unchecked.png
Normal file
|
After Width: | Height: | Size: 119 B |
|
After Width: | Height: | Size: 238 B |
|
After Width: | Height: | Size: 238 B |
BIN
src/noggit/ui/style/darkstyle/icon_close.png
Normal file
|
After Width: | Height: | Size: 422 B |
BIN
src/noggit/ui/style/darkstyle/icon_radiobutton_checked.png
Normal file
|
After Width: | Height: | Size: 370 B |
|
After Width: | Height: | Size: 617 B |
|
After Width: | Height: | Size: 616 B |
BIN
src/noggit/ui/style/darkstyle/icon_radiobutton_unchecked.png
Normal file
|
After Width: | Height: | Size: 310 B |
|
After Width: | Height: | Size: 538 B |
|
After Width: | Height: | Size: 537 B |
BIN
src/noggit/ui/style/darkstyle/icon_restore.png
Normal file
|
After Width: | Height: | Size: 404 B |
BIN
src/noggit/ui/style/darkstyle/icon_undock.png
Normal file
|
After Width: | Height: | Size: 424 B |
BIN
src/noggit/ui/style/darkstyle/icon_vline.png
Normal file
|
After Width: | Height: | Size: 303 B |
458
src/noggit/ui/style/framelesswindow/framelesswindow.cpp
Normal file
@@ -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 <QApplication>
|
||||||
|
#include <QDesktopWidget>
|
||||||
|
#include <QGraphicsDropShadowEffect>
|
||||||
|
#include <QScreen>
|
||||||
|
|
||||||
|
#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<QScreen *> 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<QMouseEvent *>(event);
|
||||||
|
if (pMouse) {
|
||||||
|
checkBorderDragging(pMouse);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// press is triggered only on frame window
|
||||||
|
else if (event->type() == QEvent::MouseButtonPress && obj == this) {
|
||||||
|
QMouseEvent *pMouse = dynamic_cast<QMouseEvent *>(event);
|
||||||
|
if (pMouse) {
|
||||||
|
mousePressEvent(pMouse);
|
||||||
|
}
|
||||||
|
} else if (event->type() == QEvent::MouseButtonRelease) {
|
||||||
|
if (m_bMousePressed) {
|
||||||
|
QMouseEvent *pMouse = dynamic_cast<QMouseEvent *>(event);
|
||||||
|
if (pMouse) {
|
||||||
|
mouseReleaseEvent(pMouse);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return QWidget::eventFilter(obj, event);
|
||||||
|
}
|
||||||
69
src/noggit/ui/style/framelesswindow/framelesswindow.h
Normal file
@@ -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 <QWidget>
|
||||||
|
|
||||||
|
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
|
||||||
304
src/noggit/ui/style/framelesswindow/framelesswindow.ui
Normal file
@@ -0,0 +1,304 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<ui version="4.0">
|
||||||
|
<class>FramelessWindow</class>
|
||||||
|
<widget class="QWidget" name="FramelessWindow">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>0</x>
|
||||||
|
<y>0</y>
|
||||||
|
<width>560</width>
|
||||||
|
<height>398</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="windowTitle">
|
||||||
|
<string/>
|
||||||
|
</property>
|
||||||
|
<property name="autoFillBackground">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_2">
|
||||||
|
<property name="spacing">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="leftMargin">
|
||||||
|
<number>5</number>
|
||||||
|
</property>
|
||||||
|
<property name="topMargin">
|
||||||
|
<number>5</number>
|
||||||
|
</property>
|
||||||
|
<property name="rightMargin">
|
||||||
|
<number>5</number>
|
||||||
|
</property>
|
||||||
|
<property name="bottomMargin">
|
||||||
|
<number>5</number>
|
||||||
|
</property>
|
||||||
|
<item>
|
||||||
|
<widget class="QWidget" name="windowFrame" native="true">
|
||||||
|
<property name="autoFillBackground">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<property name="styleSheet">
|
||||||
|
<string notr="true">#windowFrame{border:1px solid palette(highlight); border-radius:5px 5px 5px 5px; background-color:palette(Window);}</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout">
|
||||||
|
<property name="spacing">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="leftMargin">
|
||||||
|
<number>1</number>
|
||||||
|
</property>
|
||||||
|
<property name="topMargin">
|
||||||
|
<number>1</number>
|
||||||
|
</property>
|
||||||
|
<property name="rightMargin">
|
||||||
|
<number>1</number>
|
||||||
|
</property>
|
||||||
|
<property name="bottomMargin">
|
||||||
|
<number>1</number>
|
||||||
|
</property>
|
||||||
|
<item>
|
||||||
|
<widget class="WindowDragger" name="windowTitlebar" native="true">
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>0</width>
|
||||||
|
<height>0</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="autoFillBackground">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<property name="styleSheet">
|
||||||
|
<string notr="true">#windowTitlebar{border: 0px none palette(base); border-top-left-radius:5px; border-top-right-radius:5px; background-color:palette(shadow); height:20px;}</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QHBoxLayout" name="horizontalLayout" stretch="0,0,1,0,0,0,0">
|
||||||
|
<property name="spacing">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="leftMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="topMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="rightMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="bottomMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="spacer">
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>4</width>
|
||||||
|
<height>0</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="maximumSize">
|
||||||
|
<size>
|
||||||
|
<width>4</width>
|
||||||
|
<height>16777215</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="icon">
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>16</width>
|
||||||
|
<height>16</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="maximumSize">
|
||||||
|
<size>
|
||||||
|
<width>16</width>
|
||||||
|
<height>16</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="contextMenuPolicy">
|
||||||
|
<enum>Qt::NoContextMenu</enum>
|
||||||
|
</property>
|
||||||
|
<property name="styleSheet">
|
||||||
|
<string notr="true">#icon {background-color:palette(shadow);}</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="titleText">
|
||||||
|
<property name="font">
|
||||||
|
<font>
|
||||||
|
<weight>75</weight>
|
||||||
|
<bold>true</bold>
|
||||||
|
</font>
|
||||||
|
</property>
|
||||||
|
<property name="styleSheet">
|
||||||
|
<string notr="true"> padding-left:5px;
|
||||||
|
color:rgb(153,153,153);</string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Frameless Window (Dark Style)</string>
|
||||||
|
</property>
|
||||||
|
<property name="alignment">
|
||||||
|
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QToolButton" name="minimizeButton">
|
||||||
|
<property name="font">
|
||||||
|
<font>
|
||||||
|
<weight>75</weight>
|
||||||
|
<bold>true</bold>
|
||||||
|
</font>
|
||||||
|
</property>
|
||||||
|
<property name="styleSheet">
|
||||||
|
<string notr="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);
|
||||||
|
}</string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string/>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QToolButton" name="restoreButton">
|
||||||
|
<property name="styleSheet">
|
||||||
|
<string notr="true">#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);
|
||||||
|
}</string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string/>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QToolButton" name="maximizeButton">
|
||||||
|
<property name="styleSheet">
|
||||||
|
<string notr="true">#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);
|
||||||
|
}</string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string/>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QToolButton" name="closeButton">
|
||||||
|
<property name="font">
|
||||||
|
<font>
|
||||||
|
<weight>75</weight>
|
||||||
|
<bold>true</bold>
|
||||||
|
</font>
|
||||||
|
</property>
|
||||||
|
<property name="styleSheet">
|
||||||
|
<string notr="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);
|
||||||
|
}</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QWidget" name="windowContent" native="true">
|
||||||
|
<property name="autoFillBackground">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<property name="styleSheet">
|
||||||
|
<string notr="true">#windowContent{
|
||||||
|
border: 0px none palette(base);
|
||||||
|
border-radius:0px 0px 5px 5px;
|
||||||
|
}</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_3">
|
||||||
|
<property name="spacing">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="leftMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="topMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="rightMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="bottomMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
<layoutdefault spacing="6" margin="11"/>
|
||||||
|
<customwidgets>
|
||||||
|
<customwidget>
|
||||||
|
<class>WindowDragger</class>
|
||||||
|
<extends>QWidget</extends>
|
||||||
|
<header>windowdragger.h</header>
|
||||||
|
<container>1</container>
|
||||||
|
</customwidget>
|
||||||
|
</customwidgets>
|
||||||
|
<resources/>
|
||||||
|
<connections/>
|
||||||
|
</ui>
|
||||||
56
src/noggit/ui/style/framelesswindow/windowdragger.cpp
Normal file
@@ -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 <QPainter>
|
||||||
|
#include <QStyleOption>
|
||||||
|
|
||||||
|
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();
|
||||||
|
}
|
||||||
43
src/noggit/ui/style/framelesswindow/windowdragger.h
Normal file
@@ -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 <QMouseEvent>
|
||||||
|
#include <QWidget>
|
||||||
|
|
||||||
|
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
|
||||||
BIN
src/noggit/ui/style/images/icon_window_close.png
Normal file
|
After Width: | Height: | Size: 422 B |
BIN
src/noggit/ui/style/images/icon_window_maximize.png
Normal file
|
After Width: | Height: | Size: 386 B |
BIN
src/noggit/ui/style/images/icon_window_minimize.png
Normal file
|
After Width: | Height: | Size: 364 B |
BIN
src/noggit/ui/style/images/icon_window_restore.png
Normal file
|
After Width: | Height: | Size: 404 B |