From 4be2340d3edec9f4b52c4e363d139669a1f39a74 Mon Sep 17 00:00:00 2001 From: "B.Melnik" Date: Wed, 19 May 2021 17:09:03 +0300 Subject: [PATCH] feat: Add cutsom window without titlebar for osx --- vendor/DOtherSide/lib/CMakeLists.txt | 8 +++++ .../DOtherSide/DOtherSideStatusWindow.h | 32 +++++++++++++++++ vendor/DOtherSide/lib/src/DOtherSide.cpp | 2 ++ .../lib/src/DOtherSideStatusWindow.cpp | 34 ++++++++++++++++++ .../lib/src/DOtherSideStatusWindow_osx.mm | 35 +++++++++++++++++++ .../lib/src/DOtherSideStatusWindow_other.cpp | 11 ++++++ 6 files changed, 122 insertions(+) create mode 100644 vendor/DOtherSide/lib/include/DOtherSide/DOtherSideStatusWindow.h create mode 100644 vendor/DOtherSide/lib/src/DOtherSideStatusWindow.cpp create mode 100644 vendor/DOtherSide/lib/src/DOtherSideStatusWindow_osx.mm create mode 100644 vendor/DOtherSide/lib/src/DOtherSideStatusWindow_other.cpp diff --git a/vendor/DOtherSide/lib/CMakeLists.txt b/vendor/DOtherSide/lib/CMakeLists.txt index db200b71f7..e69cabefd6 100644 --- a/vendor/DOtherSide/lib/CMakeLists.txt +++ b/vendor/DOtherSide/lib/CMakeLists.txt @@ -21,6 +21,7 @@ macro(add_target name type) include/DOtherSide/DosQAbstractItemModel.h include/DOtherSide/Utils.h include/DOtherSide/DosDockClicker.h + include/DOtherSide/DOtherSideStatusWindow.h src/DOtherSide.cpp src/DosQMetaObject.cpp src/DosQDeclarative.cpp @@ -30,8 +31,15 @@ macro(add_target name type) src/DosQAbstractItemModel.cpp src/DosQQuickImageProvider.cpp src/DosDockClicker.cpp + src/DOtherSideStatusWindow.cpp ) + if (APPLE) + target_sources(${name} PUBLIC src/DOtherSideStatusWindow_osx.mm) + else() + target_sources(${name} PUBLIC ${CMAKE_SOURCE_DIR}/lib/src/DOtherSideStatusWindow_other.cpp) + endif() + if (WIN32) target_compile_definitions(${name} PRIVATE -DWIN32) endif() diff --git a/vendor/DOtherSide/lib/include/DOtherSide/DOtherSideStatusWindow.h b/vendor/DOtherSide/lib/include/DOtherSide/DOtherSideStatusWindow.h new file mode 100644 index 0000000000..fc97ed0660 --- /dev/null +++ b/vendor/DOtherSide/lib/include/DOtherSide/DOtherSideStatusWindow.h @@ -0,0 +1,32 @@ +#ifndef STATUSWINDOW_H +#define STATUSWINDOW_H + +#include + +class StatusWindow: public QQuickWindow +{ + Q_OBJECT + + Q_PROPERTY(bool isFullScreen READ isFullScreen NOTIFY isFullScreenChanged) + +public: + + explicit StatusWindow(QWindow *parent = nullptr); + + Q_INVOKABLE void toggleFullScreen(); + + bool isFullScreen() const; + +signals: + void isFullScreenChanged(); + +private: + void removeTitleBar(); + void showTitleBar(); + void initCallbacks(); + +private: + bool m_isFullScreen; +}; + +#endif // STATUSWINDOW_H diff --git a/vendor/DOtherSide/lib/src/DOtherSide.cpp b/vendor/DOtherSide/lib/src/DOtherSide.cpp index 0ace30599b..19c112d017 100644 --- a/vendor/DOtherSide/lib/src/DOtherSide.cpp +++ b/vendor/DOtherSide/lib/src/DOtherSide.cpp @@ -58,12 +58,14 @@ #include "DOtherSide/DosQDeclarative.h" #include "DOtherSide/DosQQuickImageProvider.h" #include "DOtherSide/DosDockClicker.h" +#include "DOtherSide/DOtherSideStatusWindow.h" namespace { void register_meta_types() { qRegisterMetaType>(); + qmlRegisterType("DotherSide", 0 , 1, "StatusWindow"); } } diff --git a/vendor/DOtherSide/lib/src/DOtherSideStatusWindow.cpp b/vendor/DOtherSide/lib/src/DOtherSideStatusWindow.cpp new file mode 100644 index 0000000000..1864d963be --- /dev/null +++ b/vendor/DOtherSide/lib/src/DOtherSideStatusWindow.cpp @@ -0,0 +1,34 @@ +#include "DOtherSide/DOtherSideStatusWindow.h" + +StatusWindow::StatusWindow(QWindow *parent) +: QQuickWindow(parent), + m_isFullScreen(false) +{ + 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(); + } + }); +} + +void StatusWindow::toggleFullScreen() +{ + if (m_isFullScreen) { + showNormal(); + } else { + showFullScreen(); + } +} + +bool StatusWindow::isFullScreen() const +{ + return m_isFullScreen; +} diff --git a/vendor/DOtherSide/lib/src/DOtherSideStatusWindow_osx.mm b/vendor/DOtherSide/lib/src/DOtherSideStatusWindow_osx.mm new file mode 100644 index 0000000000..7fb5d4352b --- /dev/null +++ b/vendor/DOtherSide/lib/src/DOtherSideStatusWindow_osx.mm @@ -0,0 +1,35 @@ +#include "DOtherSide/DOtherSideStatusWindow.h" + +#include +#include +#include +#include +#include +#include +#include + +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/vendor/DOtherSide/lib/src/DOtherSideStatusWindow_other.cpp b/vendor/DOtherSide/lib/src/DOtherSideStatusWindow_other.cpp new file mode 100644 index 0000000000..dc1f4fe386 --- /dev/null +++ b/vendor/DOtherSide/lib/src/DOtherSideStatusWindow_other.cpp @@ -0,0 +1,11 @@ +#include "DOtherSide/DOtherSideStatusWindow.h" + +void StatusWindow::removeTitleBar() +{ + +} + +void StatusWindow::showTitleBar() +{ + +}