diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 00000000..63e907fd Binary files /dev/null and b/.DS_Store differ diff --git a/src/FluApp.cpp b/src/FluApp.cpp index 687575af..d72fbb50 100644 --- a/src/FluApp.cpp +++ b/src/FluApp.cpp @@ -59,7 +59,7 @@ void FluApp::navigate(const QString& route){ view->setSource((routes().value(route).toString())); if(isAppWindow){ QObject::connect(view->engine(), &QQmlEngine::quit, qApp, &QCoreApplication::quit); - QObject::connect(qApp, &QGuiApplication::aboutToQuit, qApp, [&view](){view->setSource({});}); +// QObject::connect(qApp, &QGuiApplication::aboutToQuit, qApp, [&view](){view->setSource({});}); }else{ view->closeDeleteLater(); } diff --git a/src/FluentUI.pro b/src/FluentUI.pro index 9476f93f..9b84e074 100644 --- a/src/FluentUI.pro +++ b/src/FluentUI.pro @@ -38,8 +38,13 @@ win32 { SOURCES += \ FramelessView_win.cpp } else { + macos { + SOURCES += \ + FramelessView_mac.cpp + }else{ SOURCES += \ FramelessView_unix.cpp + } } DEFINES += VERSION_IN=\\\"1.0.0\\\" diff --git a/src/FramelessView_mac.cpp b/src/FramelessView_mac.cpp new file mode 100644 index 00000000..c35d418f --- /dev/null +++ b/src/FramelessView_mac.cpp @@ -0,0 +1,109 @@ +#include "FramelessView.h" +#include +#include +#include +#include + +class FramelessViewPrivate +{ +public: + bool m_isMax = false; + bool m_isFull = false; + bool m_deleteLater = false; + QQuickItem *m_titleItem = nullptr; +}; +FramelessView::FramelessView(QWindow *parent) : Super(parent), d(new FramelessViewPrivate) +{ +// setFlags(Qt::CustomizeWindowHint | Qt::Window | Qt::FramelessWindowHint | Qt::WindowMinMaxButtonsHint | Qt::WindowTitleHint | Qt::WindowSystemMenuHint); + setResizeMode(SizeRootObjectToView); + setIsMax(windowState() == Qt::WindowMaximized); + setIsFull(windowState() == Qt::WindowFullScreen); + connect(this, &QWindow::windowStateChanged, this, [&](Qt::WindowState state) { + (void)state; + setIsMax(windowState() == Qt::WindowMaximized); + setIsFull(windowState() == Qt::WindowFullScreen); + }); +} +FramelessView::~FramelessView() +{ + delete d; +} +void FramelessView::showEvent(QShowEvent *e) +{ + Super::showEvent(e); +} +QRect FramelessView::calcCenterGeo(const QRect &screenGeo, const QSize &normalSize) +{ + int w = normalSize.width(); + int h = normalSize.height(); + int x = screenGeo.x() + (screenGeo.width() - w) / 2; + int y = screenGeo.y() + (screenGeo.height() - h) / 2; + if (screenGeo.width() < w) { + x = screenGeo.x(); + w = screenGeo.width(); + } + if (screenGeo.height() < h) { + y = screenGeo.y(); + h = screenGeo.height(); + } + + return { x, y, w, h }; +} +void FramelessView::moveToScreenCenter() +{ + auto geo = calcCenterGeo(screen()->availableGeometry(), size()); + if (minimumWidth() > geo.width() || minimumHeight() > geo.height()) { + setMinimumSize(geo.size()); + } + setGeometry(geo); + update(); +} +void FramelessView::closeDeleteLater(){ + d->m_deleteLater = true; +} + +bool FramelessView::isMax() const +{ + return d->m_isMax; +} +bool FramelessView::isFull() const +{ + return d->m_isFull; +} +QQuickItem *FramelessView::titleItem() const +{ + return d->m_titleItem; +} +void FramelessView::setIsMax(bool isMax) +{ + if (d->m_isMax == isMax) + return; + + d->m_isMax = isMax; + emit isMaxChanged(d->m_isMax); +} +void FramelessView::setIsFull(bool isFull) +{ + if(d->m_isFull == isFull) + return; + + d->m_isFull = isFull; + emit isFullChanged(d->m_isFull); +} +void FramelessView::setTitleItem(QQuickItem *item) +{ + d->m_titleItem = item; +} +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) +bool FramelessView::nativeEvent(const QByteArray &eventType, void *message, qintptr *result) +#else +bool FramelessView::nativeEvent(const QByteArray &eventType, void *message, long *result) +#endif +{ + return Super::nativeEvent(eventType, message, result); +} + +void FramelessView::resizeEvent(QResizeEvent *e) +{ + Super::resizeEvent(e); +} diff --git a/src/FramelessView_unix.cpp b/src/FramelessView_unix.cpp index a129a10f..e0a22f6d 100644 --- a/src/FramelessView_unix.cpp +++ b/src/FramelessView_unix.cpp @@ -14,7 +14,7 @@ public: }; FramelessView::FramelessView(QWindow *parent) : Super(parent), d(new FramelessViewPrivate) { - setFlags(Qt::CustomizeWindowHint | Qt::Window | Qt::FramelessWindowHint | Qt::WindowMinMaxButtonsHint | Qt::WindowTitleHint | Qt::WindowSystemMenuHint); +// setFlags(Qt::CustomizeWindowHint | Qt::Window | Qt::FramelessWindowHint | Qt::WindowMinMaxButtonsHint | Qt::WindowTitleHint | Qt::WindowSystemMenuHint); setResizeMode(SizeRootObjectToView); setIsMax(windowState() == Qt::WindowMaximized); setIsFull(windowState() == Qt::WindowFullScreen); diff --git a/src/controls/FluAppBar.qml b/src/controls/FluAppBar.qml index 48b52c2d..f7616629 100644 --- a/src/controls/FluAppBar.qml +++ b/src/controls/FluAppBar.qml @@ -13,13 +13,15 @@ Rectangle{ return borerlessColor return Window.window.active ? borerlessColor : Qt.lighter(borerlessColor,1.1) } - height: 50 + property bool isMacos: Qt.platform.os === "osx" + height: isMacos ? 0 : 50 width: { if(parent==null) return 200 return parent.width } z: 65535 + clip: true property string title: "标题" property color textColor: FluTheme.isDark ? "#000000" : "#FFFFFF" property bool showDark: false diff --git a/src/controls/FluWindow.qml b/src/controls/FluWindow.qml index 74230024..69840e90 100644 --- a/src/controls/FluWindow.qml +++ b/src/controls/FluWindow.qml @@ -21,7 +21,12 @@ Item { property int minimumHeight property int maximumHeight + property bool isMacos: Qt.platform.os === "osx" + property int borderless:{ + if(isMacos){ + return 0 + } if(window === null) return 4 if(Window.window.visibility === Window.Maximized){ diff --git a/src/macos_install.sh b/src/macos_install.sh old mode 100644 new mode 100755