From 1acc248c79ccfac72edca9b677f50ca54970fcd0 Mon Sep 17 00:00:00 2001 From: "B.Melnik" Date: Tue, 1 Jun 2021 13:01:47 +0300 Subject: [PATCH] fix: update position of window to center, add traffic lights --- ui/StatusQ/sandbox/main.qml | 21 ++++ ui/StatusQ/sandbox/sandbox.pro | 2 + ui/StatusQ/sandbox/sandboxapp.cpp | 2 +- ui/StatusQ/sandbox/statuswindow.h | 49 +++++++- ui/StatusQ/sandbox/statuswindow_mac.mm | 39 +++++- ui/StatusQ/src/StatusQ/Components/qmldir | 1 + .../Platform/StatusMacTrafficLights.qml | 115 ++++++++++++++++++ ui/StatusQ/src/StatusQ/Platform/qmldir | 5 + .../assets/img/icons/traffic_lights/close.png | Bin 0 -> 493 bytes .../icons/traffic_lights/close_pressed.png | Bin 0 -> 481 bytes .../img/icons/traffic_lights/maximize.png | Bin 0 -> 340 bytes .../icons/traffic_lights/maximize_pressed.png | Bin 0 -> 299 bytes .../img/icons/traffic_lights/minimise.png | Bin 0 -> 222 bytes .../icons/traffic_lights/minimise_pressed.png | Bin 0 -> 214 bytes 14 files changed, 228 insertions(+), 6 deletions(-) create mode 100644 ui/StatusQ/src/StatusQ/Platform/StatusMacTrafficLights.qml create mode 100644 ui/StatusQ/src/StatusQ/Platform/qmldir create mode 100644 ui/StatusQ/src/assets/img/icons/traffic_lights/close.png create mode 100644 ui/StatusQ/src/assets/img/icons/traffic_lights/close_pressed.png create mode 100644 ui/StatusQ/src/assets/img/icons/traffic_lights/maximize.png create mode 100644 ui/StatusQ/src/assets/img/icons/traffic_lights/maximize_pressed.png create mode 100644 ui/StatusQ/src/assets/img/icons/traffic_lights/minimise.png create mode 100644 ui/StatusQ/src/assets/img/icons/traffic_lights/minimise_pressed.png diff --git a/ui/StatusQ/sandbox/main.qml b/ui/StatusQ/sandbox/main.qml index c473530fb9..114cdd7ffa 100644 --- a/ui/StatusQ/sandbox/main.qml +++ b/ui/StatusQ/sandbox/main.qml @@ -10,6 +10,7 @@ import StatusQ.Core.Theme 0.1 import StatusQ.Controls 0.1 import StatusQ.Components 0.1 import StatusQ.Layout 0.1 +import StatusQ.Platform 0.1 StatusWindow { id: rootWindow @@ -29,6 +30,8 @@ StatusWindow { Component.onCompleted: { Theme.palette = lightTheme apiDocsButton.checked = true + + rootWindow.updatePosition(); } StatusAppLayout { @@ -251,4 +254,22 @@ StatusWindow { } } } + + StatusMacTrafficLights { + anchors.left: parent.left + anchors.top: parent.top + anchors.margins: 13 + + onClose: { + rootWindow.close() + } + + onMinimised: { + rootWindow.showMinimized() + } + + onMaximized: { + rootWindow.toggleFullScreen() + } + } } diff --git a/ui/StatusQ/sandbox/sandbox.pro b/ui/StatusQ/sandbox/sandbox.pro index 0f39bd9d4f..39fdb84873 100644 --- a/ui/StatusQ/sandbox/sandbox.pro +++ b/ui/StatusQ/sandbox/sandbox.pro @@ -32,9 +32,11 @@ HEADERS += \ statuswindow.h DISTFILES += \ + ../src/StatusQ/Components/StatusMacWindowButtons.qml \ ../src/StatusQ/Controls/StatusBaseButton.qml \ ../src/StatusQ/Controls/StatusButton.qml \ ../src/StatusQ/Controls/StatusCheckBox.qml \ ../src/StatusQ/Controls/StatusFlatRoundButton.qml \ ../src/StatusQ/Controls/StatusRadioButton.qml \ + ../src/StatusQ/Controls/StatusSlider.qml \ ../src/StatusQ/Controls/StatusSwitch.qml diff --git a/ui/StatusQ/sandbox/sandboxapp.cpp b/ui/StatusQ/sandbox/sandboxapp.cpp index 2c7d2834d7..5efccb459b 100644 --- a/ui/StatusQ/sandbox/sandboxapp.cpp +++ b/ui/StatusQ/sandbox/sandboxapp.cpp @@ -36,8 +36,8 @@ void SandboxApp::restartEngine() const QUrl url(applicationDirPath() + "/../main.qml"); QWindow *rootWindow = qobject_cast(m_engine.rootObjects().at(0)); if (rootWindow) { - rootWindow->close(); + rootWindow->deleteLater(); } m_engine.clearComponentCache(); m_engine.load(url); diff --git a/ui/StatusQ/sandbox/statuswindow.h b/ui/StatusQ/sandbox/statuswindow.h index 4bbcf9c699..5ecf597fad 100644 --- a/ui/StatusQ/sandbox/statuswindow.h +++ b/ui/StatusQ/sandbox/statuswindow.h @@ -2,20 +2,63 @@ #define STATUSWINDOW_H #include +#include class StatusWindow: public QQuickWindow { Q_OBJECT + Q_PROPERTY(bool isFullScreen READ isFullScreen NOTIFY isFullScreenChanged) + public: + struct EventCallbacks { + std::function onResize; + std::function willExitFullScreen; + std::function didExitFullScreen; + }; + explicit StatusWindow(QWindow *parent = nullptr) - : QQuickWindow(parent) + : QQuickWindow(parent), + m_isFullScreen(false) { - removeTitleBar(winId()); + removeTitleBar(); + + connect(this, &QQuickWindow::windowStateChanged, [&](Qt::WindowState windowState) { + if (windowState == Qt::WindowNoState) { + removeTitleBar(); + m_isFullScreen = false; + emit isFullScreenChanged(); + } else if (windowState == Qt::WindowFullScreen) { + m_isFullScreen = true; + emit isFullScreenChanged(); + showTitleBar(); + } + }); + } + Q_INVOKABLE void toggleFullScreen(); + + Q_INVOKABLE void updatePosition() { + auto point = QPoint(screen()->geometry().center().x() - geometry().width() / 2, screen()->geometry().center().y() - geometry().height() / 2); + if (point != this->position()) { + this->setPosition(point); + } + } + + bool isFullScreen() const; + +signals: + void isFullScreenChanged(); + private: - void removeTitleBar(WId wid); + void removeTitleBar(); + void showTitleBar(); + void initCallbacks(); + +private: + EventCallbacks m_callbacks; + bool m_isFullScreen; }; #endif // STATUSWINDOW_H diff --git a/ui/StatusQ/sandbox/statuswindow_mac.mm b/ui/StatusQ/sandbox/statuswindow_mac.mm index 25c6a665bf..f9113d405d 100644 --- a/ui/StatusQ/sandbox/statuswindow_mac.mm +++ b/ui/StatusQ/sandbox/statuswindow_mac.mm @@ -2,17 +2,52 @@ #include +#include + #include #include #include #include +#include +#include +#include -void StatusWindow::removeTitleBar(WId wid) +void StatusWindow::toggleFullScreen() { - NSView *nsView = reinterpret_cast(wid); + if (m_isFullScreen) { + showNormal(); + } else { + showFullScreen(); + } +} + +bool StatusWindow::isFullScreen() const +{ + return m_isFullScreen; +} + +void StatusWindow::removeTitleBar() +{ + NSView *nsView = reinterpret_cast(this->winId()); NSWindow *window = [nsView window]; window.titlebarAppearsTransparent = true; window.titleVisibility = NSWindowTitleHidden; window.styleMask |= NSWindowStyleMaskFullSizeContentView; + NSButton* close = [window standardWindowButton:NSWindowCloseButton]; + NSView* titleBarContainerView = close.superview.superview; + [titleBarContainerView setHidden:YES]; +} + +void StatusWindow::showTitleBar() +{ + NSView *nsView = reinterpret_cast(this->winId()); + NSWindow *window = [nsView window]; + + window.titlebarAppearsTransparent = true; + window.titleVisibility = NSWindowTitleHidden; + window.styleMask |= NSWindowStyleMaskFullSizeContentView; + NSButton* close = [window standardWindowButton:NSWindowCloseButton]; + NSView* titleBarContainerView = close.superview.superview; + [titleBarContainerView setHidden:NO]; } diff --git a/ui/StatusQ/src/StatusQ/Components/qmldir b/ui/StatusQ/src/StatusQ/Components/qmldir index cc1372d6a6..a8a97def54 100644 --- a/ui/StatusQ/src/StatusQ/Components/qmldir +++ b/ui/StatusQ/src/StatusQ/Components/qmldir @@ -10,3 +10,4 @@ StatusLoadingIndicator 0.1 StatusLoadingIndicator.qml StatusNavigationListItem 0.1 StatusNavigationListItem.qml StatusRoundIcon 0.1 StatusRoundIcon.qml StatusRoundedImage 0.1 StatusRoundedImage.qml +StatusMacWindowButtons 0.1 StatusMacWindowButtons.qml diff --git a/ui/StatusQ/src/StatusQ/Platform/StatusMacTrafficLights.qml b/ui/StatusQ/src/StatusQ/Platform/StatusMacTrafficLights.qml new file mode 100644 index 0000000000..7db6c9032d --- /dev/null +++ b/ui/StatusQ/src/StatusQ/Platform/StatusMacTrafficLights.qml @@ -0,0 +1,115 @@ +import QtQuick 2.13 + +import StatusQ.Core 0.1 +import StatusQ.Core.Theme 0.1 + +MouseArea { + id: statusMacTrafficLights + + signal close() + signal minimised() + signal maximized() + + hoverEnabled: true + + width: layout.implicitWidth + height: layout.implicitHeight + + visible: Qt.platform.os === "osx" && !rootWindow.isFullScreen + + readonly property color inactive: Theme.palette.name === "light" ? "#10000000" + : "#10FFFFFF" + readonly property color inactiveBorder: Theme.palette.name === "light" ? "#10000000" + : "#10FFFFFF" + + Row { + id: layout + spacing: 8 + + Rectangle { + width: 12 + height: 12 + radius: width / 2 + antialiasing: true + + color: closeSensor.pressed ? "#B24F47" : (rootWindow.active || statusMacTrafficLights.containsMouse ? Qt.lighter("#E9685C", 1.07) + : inactive ) + border.color:closeSensor.pressed ? "#943229" : (rootWindow.active ? "#D14C40" + : inactiveBorder) + border.width: Theme.palette.name === "light" ? 0.5 : 0 + + Image { + anchors.centerIn: parent + visible: statusMacTrafficLights.containsMouse + source: closeSensor.pressed ? "../../assets/img/icons/traffic_lights/close_pressed.png" + : "../../assets/img/icons/traffic_lights/close.png" + scale: 0.25 + } + + + MouseArea { + id: closeSensor + anchors.fill: parent + + onClicked: statusMacTrafficLights.close() + } + } + + Rectangle { + width: 12 + height: 12 + radius: width / 2 + antialiasing: true + + color: miniSensor.pressed ? "#878E3B" : (rootWindow.active || statusMacTrafficLights.containsMouse ? Qt.lighter("#EDB84C", 1.07) + : inactive) + border.color:miniSensor.pressed ? "#986E29" : (rootWindow.active ? "#D79F3D" + : inactiveBorder) + border.width: Theme.palette.name === "light" ? 0.5 : 0 + + Image { + anchors.centerIn: parent + anchors.verticalCenterOffset: -0.25 + visible: statusMacTrafficLights.containsMouse + source: miniSensor.pressed ? "../../assets/img/icons/traffic_lights/minimise_pressed.png" + : "../../assets/img/icons/traffic_lights/minimise.png" + scale: 0.27 + } + + MouseArea { + id: miniSensor + anchors.fill: parent + + onClicked: statusMacTrafficLights.minimised() + } + } + + Rectangle { + width: 12 + height: 12 + radius: width / 2 + antialiasing: true + + color: maxiSensor.pressed ? "#48943f" : (rootWindow.active || statusMacTrafficLights.containsMouse ? Qt.lighter("#62C454", 1.06) + : inactive) + border.color: maxiSensor.pressed ? "#357225" : (rootWindow.active ? "#53A73E" + : inactiveBorder) + border.width: Theme.palette.name === "light" ? 0.5 : 0 + + Image { + anchors.centerIn: parent + visible: statusMacTrafficLights.containsMouse + source: maxiSensor.pressed ?"../../assets/img/icons/traffic_lights/maximize_pressed.png" + :"../../assets/img/icons/traffic_lights/maximize.png" + scale: 0.25 + } + + MouseArea { + id: maxiSensor + anchors.fill: parent + + onClicked: statusMacTrafficLights.maximized() + } + } + } +} diff --git a/ui/StatusQ/src/StatusQ/Platform/qmldir b/ui/StatusQ/src/StatusQ/Platform/qmldir new file mode 100644 index 0000000000..8ef441bf62 --- /dev/null +++ b/ui/StatusQ/src/StatusQ/Platform/qmldir @@ -0,0 +1,5 @@ +module StatusQ.Platform + +StatusMacTrafficLights 0.1 StatusMacTrafficLights.qml + + diff --git a/ui/StatusQ/src/assets/img/icons/traffic_lights/close.png b/ui/StatusQ/src/assets/img/icons/traffic_lights/close.png new file mode 100644 index 0000000000000000000000000000000000000000..b310f2194021ea7a90d3e0752137b3dec6fb1b38 GIT binary patch literal 493 zcmV@~0drDELIAGL9O(c600d`2O+f$vv5yPy5)$eNWrH#RQab_@&hr z$A9{r9RK-!@w5FNL2I5JT`9uIwB?4bA0P@u>Nd-UOeOu*R;{nQJ+j>mhl$` zT(+!rhRX(rQYB02jG6XIib(~$B5)_2aH_@&Aqr~thwQ`&m-54W(*C%Qi7&j>z-2;E zxdKgn;8p{N34Gy3iEYh$waw3y^i==B5Rvds11}Q?+=#&;rtoPUBr1hWN_2?22CcW{ zzd9cy9SC=tupqdOxlWFG%M$C0XCZKNpv&#gMMzqq5P0*p_@)(#frpq-EZoP$RJ5cn znS{p}xKYPr?DrD+rAsCTvGASj^@K{M2iAwcnR39 jg*P=z`6#8|a>w`s<;5Q&zh{o800000NkvXXu0mjf8FSQE literal 0 HcmV?d00001 diff --git a/ui/StatusQ/src/assets/img/icons/traffic_lights/close_pressed.png b/ui/StatusQ/src/assets/img/icons/traffic_lights/close_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..fd0745e309e88181c2454190f37e69dc81ef2803 GIT binary patch literal 481 zcmV<70UrK|P)X1^@s6D=Y3@00009a7bBm001mY z001mY0i`{bsQ>@~0drDELIAGL9O(c600d`2O+f$vv5yPxS=I-S%-~Xv85}I#?u(l7y+fsL;csxABO&<-xJcSc zEO4DC@i?8vIlyrni49&N4)`^Xa4}e^h?kUZwrM7no;1N<()3E#xbi1Qi7UJ!aFOI$ zcH;^+3LGTHnBcVnUr8O@DsYw9;5r1Bd=$m!F3}g4Ct#l48#n&k#;^+XY7s)*aYH*b zL$-JVA#acm-hzfNbUBetLf-JQObky{D-k|$-BA8*kINXUF>Wj91D~&!Zl@FGdA>M9 z*0Qp#pf7wLR|&R(`$&F|OetS|;ZBmGI2GSg_S(XA^m#%=`aFpZj7ab$X$xGZx^prwfgF}}M_)$E)e-c@N{Fk0Cjv*C{Td(?ZH91He`&jOi?6JbK$^8S@ zy(PUDw$0v>d419BE4-iBZt|un?|E?ih=<_PXEk=*g01)E9VM97yH?K8V@XWdwM_G4 z&(rsh1L7Xl)G`Zb3K&Q$x*o}BYd9QUa(t5O?Ry7HgyLBx?F;O_SuxB$`=E@GHAauc z-{SVBf9)6lGr8{R+r@os$3^ap2Y=%^t>P0JR%Z%x z@mL(&&n)-B|A6p4b`7TQt*6hQg?;^nso j3z|6M=B{$OXV19&)xJAlgTe~DWM4f<0FOw literal 0 HcmV?d00001 diff --git a/ui/StatusQ/src/assets/img/icons/traffic_lights/maximize_pressed.png b/ui/StatusQ/src/assets/img/icons/traffic_lights/maximize_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..51ec389c80bace73ee4fef7bcd893b87b3447b6e GIT binary patch literal 299 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjoCO|{#S9EO-XP4l)OOlRpde#$ zkh>GZx^prwfgF}}M_)$E)e-c@N`~#jYjv*C{Tc5jgR3=A9lx&I`x0{O+BE{-7;j7KkR6m)P9V7;*abkCO(2iB+s z%#D&OCv=@y64J;u<$;xgG1IlcBX_yW{^fj{%x~d#|7G#ga}C;TLJ?1P>J;}4EfHEA*}}S3j3^P65jgR3=A9lx&I`x0{PjVE{-7;j7Kjx@;Mj?v_9Ogx~sIs>&P|H z9gVF=u6?v%^-IWK{C&cdX~r4*kDf^h)8|(bt}B@pqv@t&${2BDQg^A*j4Spb$IkWs zd-TWuP(`{#x!5B8OreubEQc