diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 5b2aabc..69e9ed8 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -13,7 +13,8 @@ set(SOURCES windowhelper.cpp iconitem.cpp managedtexturenode.cpp - popupwindow.cpp + + desktop/menupopupwindow.cpp meuikit.qrc meui-style/style.qrc diff --git a/src/controls/TopLevelMenu.qml b/src/controls/DesktopMenu.qml similarity index 97% rename from src/controls/TopLevelMenu.qml rename to src/controls/DesktopMenu.qml index 72ebc37..6ebb3e2 100644 --- a/src/controls/TopLevelMenu.qml +++ b/src/controls/DesktopMenu.qml @@ -3,7 +3,7 @@ import QtQuick.Layouts 1.12 import QtQuick.Controls 2.12 import MeuiKit 1.0 as Meui -Meui.PopupWindow { +Meui.MenuPopupWindow { id: control default property alias content : _mainLayout.data diff --git a/src/controls/qmldir b/src/controls/qmldir index 26e49cc..5f8918e 100644 --- a/src/controls/qmldir +++ b/src/controls/qmldir @@ -19,4 +19,4 @@ RoundedRect 1.0 RoundedRect.qml Window 1.0 Window.qml WindowButton 1.0 WindowButton.qml Toast 1.0 Toast.qml -TopLevelMenu 1.0 TopLevelMenu.qml +DesktopMenu 1.0 DesktopMenu.qml diff --git a/src/popupwindow.cpp b/src/desktop/menupopupwindow.cpp similarity index 81% rename from src/popupwindow.cpp rename to src/desktop/menupopupwindow.cpp index 6290b13..8acd8f8 100644 --- a/src/popupwindow.cpp +++ b/src/desktop/menupopupwindow.cpp @@ -17,13 +17,13 @@ * along with this program. If not, see . */ -#include "popupwindow.h" +#include "menupopupwindow.h" #include #include #include #include -PopupWindow::PopupWindow(QQuickWindow *parent) +MenuPopupWindow::MenuPopupWindow(QQuickWindow *parent) : QQuickWindow(parent) , m_parentItem(0) , m_contentItem(0) @@ -36,13 +36,13 @@ PopupWindow::PopupWindow(QQuickWindow *parent) this, SLOT(applicationStateChanged(Qt::ApplicationState))); } -void PopupWindow::applicationStateChanged(Qt::ApplicationState state) +void MenuPopupWindow::applicationStateChanged(Qt::ApplicationState state) { if (state != Qt::ApplicationActive) dismissPopup(); } -void PopupWindow::show() +void MenuPopupWindow::show() { QPoint pos = QCursor::pos(); int w = m_contentItem->implicitWidth(); @@ -59,7 +59,7 @@ void PopupWindow::show() QRect g = pw->screen()->availableGeometry(); if (posx + w > g.right()) { - if (qobject_cast(transientParent())) { + if (qobject_cast(transientParent())) { // reposition submenu window on the parent menu's left side int submenuOverlap = pw->x() + pw->width() - posx; posx -= pw->width() + w - 2 * submenuOverlap; @@ -70,6 +70,9 @@ void PopupWindow::show() posx = qMax(posx, g.left()); } + m_mouseMoved = false; + m_dismissed = false; + posy = qBound(g.top(), posy, g.bottom() - h); setGeometry(posx, posy, w, h); @@ -79,14 +82,14 @@ void PopupWindow::show() setKeyboardGrabEnabled(true); } -void PopupWindow::setParentItem(QQuickItem *item) +void MenuPopupWindow::setParentItem(QQuickItem *item) { m_parentItem = item; if (m_parentItem) setTransientParent(m_parentItem->window()); } -void PopupWindow::setPopupContentItem(QQuickItem *contentItem) +void MenuPopupWindow::setPopupContentItem(QQuickItem *contentItem) { if (!contentItem) return; @@ -95,21 +98,21 @@ void PopupWindow::setPopupContentItem(QQuickItem *contentItem) m_contentItem = contentItem; } -void PopupWindow::dismissPopup() +void MenuPopupWindow::dismissPopup() { m_dismissed = true; emit popupDismissed(); hide(); } -void PopupWindow::mouseMoveEvent(QMouseEvent *e) +void MenuPopupWindow::mouseMoveEvent(QMouseEvent *e) { m_mouseMoved = true; QQuickWindow::mouseMoveEvent(e); } -void PopupWindow::mousePressEvent(QMouseEvent *e) +void MenuPopupWindow::mousePressEvent(QMouseEvent *e) { QRect rect = QRect(QPoint(), size()); if (rect.contains(e->pos())) { @@ -119,15 +122,17 @@ void PopupWindow::mousePressEvent(QMouseEvent *e) } } -void PopupWindow::mouseReleaseEvent(QMouseEvent *e) +void MenuPopupWindow::mouseReleaseEvent(QMouseEvent *e) { QRect rect = QRect(QPoint(), size()); if (rect.contains(e->pos())) { if (m_mouseMoved) { QMouseEvent pe = QMouseEvent(QEvent::MouseButtonPress, e->pos(), e->button(), e->buttons(), e->modifiers()); QQuickWindow::mousePressEvent(&pe); - if (!m_dismissed) + if (!m_dismissed) { + dismissPopup(); QQuickWindow::mouseReleaseEvent(e); + } } m_mouseMoved = true; } @@ -136,14 +141,14 @@ void PopupWindow::mouseReleaseEvent(QMouseEvent *e) // dismissPopup(); } -bool PopupWindow::event(QEvent *event) +bool MenuPopupWindow::event(QEvent *event) { //QTBUG-45079 //This is a workaround for popup menu not being closed when using touch input. //Currently mouse synthesized events are not created for touch events which are //outside the qquickwindow. - if (event->type() == QEvent::TouchBegin && !qobject_cast(transientParent())) { + if (event->type() == QEvent::TouchBegin && !qobject_cast(transientParent())) { QRect rect = QRect(QPoint(), size()); QTouchEvent *touch = static_cast(event); QTouchEvent::TouchPoint point = touch->touchPoints().first(); diff --git a/src/popupwindow.h b/src/desktop/menupopupwindow.h similarity index 91% rename from src/popupwindow.h rename to src/desktop/menupopupwindow.h index e545f59..d842acc 100644 --- a/src/popupwindow.h +++ b/src/desktop/menupopupwindow.h @@ -17,13 +17,13 @@ * along with this program. If not, see . */ -#ifndef TOPLEVELMENU_H -#define TOPLEVELMENU_H +#ifndef MENUPOPUPWINDOW_H +#define MENUPOPUPWINDOW_H #include #include -class PopupWindow : public QQuickWindow +class MenuPopupWindow : public QQuickWindow { Q_OBJECT Q_PROPERTY(QQuickItem *popupContentItem READ popupContentItem WRITE setPopupContentItem) @@ -31,7 +31,7 @@ class PopupWindow : public QQuickWindow Q_PROPERTY(QQuickItem *parentItem READ parentItem WRITE setParentItem) public: - PopupWindow(QQuickWindow *parent = nullptr); + MenuPopupWindow(QQuickWindow *parent = nullptr); QQuickItem *popupContentItem() const { return m_contentItem; } void setPopupContentItem(QQuickItem *popupContentItem); @@ -63,4 +63,4 @@ private: bool m_dismissed; }; -#endif // POPUPWINDOW_H +#endif diff --git a/src/meuikit.cpp b/src/meuikit.cpp index 09000f8..a57ce88 100644 --- a/src/meuikit.cpp +++ b/src/meuikit.cpp @@ -24,7 +24,8 @@ #include "blurhelper/windowblur.h" #include "windowhelper.h" #include "iconitem.h" -#include "popupwindow.h" + +#include "desktop/menupopupwindow.h" #include #include @@ -55,7 +56,7 @@ void MeuiKit::registerTypes(const char *uri) qmlRegisterType(uri, 1, 0, "WindowBlur"); qmlRegisterType(uri, 1, 0, "WindowHelper"); qmlRegisterType(uri, 1, 0, "IconItem"); - qmlRegisterType(uri, 1, 0, "PopupWindow"); + qmlRegisterType(uri, 1, 0, "MenuPopupWindow"); qmlRegisterSingletonType(componentUrl(QStringLiteral("Theme.qml")), uri, 1, 0, "Theme"); qmlRegisterSingletonType(componentUrl(QStringLiteral("Units.qml")), uri, 1, 0, "Units"); @@ -68,7 +69,7 @@ void MeuiKit::registerTypes(const char *uri) qmlRegisterType(componentUrl(QStringLiteral("Toast.qml")), uri, 1, 0, "Toast"); qmlRegisterType(componentUrl(QStringLiteral("Window.qml")), uri, 1, 0, "Window"); qmlRegisterType(componentUrl(QStringLiteral("WindowButton.qml")), uri, 1, 0, "WindowButton"); - qmlRegisterType(componentUrl(QStringLiteral("TopLevelMenu.qml")), uri, 1, 0, "TopLevelMenu"); + qmlRegisterType(componentUrl(QStringLiteral("DesktopMenu.qml")), uri, 1, 0, "DesktopMenu"); qmlProtectModule(uri, 1); } diff --git a/src/meuikit.qrc b/src/meuikit.qrc index c30b979..fcdba31 100644 --- a/src/meuikit.qrc +++ b/src/meuikit.qrc @@ -10,7 +10,7 @@ controls/Units.qml controls/Window.qml controls/WindowButton.qml - controls/TopLevelMenu.qml + controls/DesktopMenu.qml images/refresh.svg images/dark/close.svg images/dark/maximize.svg