Use TopLevelMenu instead of DockMenu
This commit is contained in:
parent
9b36d585f4
commit
f79dbd8f06
7 changed files with 2 additions and 225 deletions
|
@ -28,7 +28,6 @@ set(SRCS
|
|||
src/trashmanager.cpp
|
||||
src/utils.cpp
|
||||
src/xwindowinterface.cpp
|
||||
src/popupwindow.cpp
|
||||
|
||||
src/fakewindow.cpp
|
||||
)
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
import QtQuick 2.12
|
||||
import QtQuick.Controls 2.12
|
||||
import Cutefish.Dock 1.0
|
||||
import MeuiKit 1.0 as Meui
|
||||
|
||||
DockItem {
|
||||
id: appItem
|
||||
|
@ -36,7 +37,7 @@ DockItem {
|
|||
updateGeometry()
|
||||
}
|
||||
|
||||
DockMenu {
|
||||
Meui.TopLevelMenu {
|
||||
id: contextMenu
|
||||
|
||||
MenuItem {
|
||||
|
|
|
@ -1,43 +0,0 @@
|
|||
import QtQuick 2.12
|
||||
import QtQuick.Layouts 1.12
|
||||
import QtQuick.Controls 2.12
|
||||
import Cutefish.Dock 1.0
|
||||
import MeuiKit 1.0 as Meui
|
||||
|
||||
PopupWindow {
|
||||
id: control
|
||||
|
||||
default property alias content : _mainLayout.data
|
||||
|
||||
Rectangle {
|
||||
id: _background
|
||||
anchors.fill: parent
|
||||
opacity: 0.6
|
||||
color: Meui.Theme.backgroundColor
|
||||
radius: Meui.Theme.mediumRadius
|
||||
|
||||
Meui.WindowShadow {
|
||||
view: control
|
||||
geometry: Qt.rect(control.x, control.y, control.width, control.height)
|
||||
radius: _background.radius
|
||||
}
|
||||
|
||||
Meui.WindowBlur {
|
||||
view: control
|
||||
geometry: Qt.rect(control.x, control.y, control.width, control.height)
|
||||
windowRadius: _background.radius
|
||||
enabled: true
|
||||
}
|
||||
}
|
||||
|
||||
ColumnLayout {
|
||||
id: _mainLayout
|
||||
anchors.fill: parent
|
||||
anchors.topMargin: 8
|
||||
anchors.bottomMargin: 8
|
||||
}
|
||||
|
||||
function open() {
|
||||
control.show()
|
||||
}
|
||||
}
|
|
@ -96,6 +96,5 @@
|
|||
<file>svg/light/dark-mode.svg</file>
|
||||
<file>svg/dark/dark-mode.svg</file>
|
||||
<file>svg/dark/bluetooth-symbolic.svg</file>
|
||||
<file>qml/DockMenu.qml</file>
|
||||
</qresource>
|
||||
</RCC>
|
||||
|
|
|
@ -26,15 +26,12 @@
|
|||
#include "applicationmodel.h"
|
||||
#include "mainwindow.h"
|
||||
|
||||
#include "popupwindow.h"
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
QApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
|
||||
QApplication app(argc, argv);
|
||||
|
||||
qmlRegisterType<DockSettings>("Cutefish.Dock", 1, 0, "DockSettings");
|
||||
qmlRegisterType<PopupWindow>("Cutefish.Dock", 1, 0, "PopupWindow");
|
||||
|
||||
QString qmFilePath = QString("%1/%2.qm").arg("/usr/share/cutefish-dock/translations/").arg(QLocale::system().name());
|
||||
if (QFile::exists(qmFilePath)) {
|
||||
|
|
|
@ -1,129 +0,0 @@
|
|||
#include "popupwindow.h"
|
||||
#include <QGuiApplication>
|
||||
#include <QQuickRenderControl>
|
||||
#include <QQuickItem>
|
||||
#include <QScreen>
|
||||
|
||||
PopupWindow::PopupWindow(QQuickWindow *parent)
|
||||
: QQuickWindow(parent)
|
||||
, m_parentItem(0)
|
||||
, m_contentItem(0)
|
||||
, m_mouseMoved(false)
|
||||
, m_dismissed(false)
|
||||
{
|
||||
setFlags(Qt::Popup);
|
||||
setColor(Qt::transparent);
|
||||
connect(qApp, SIGNAL(applicationStateChanged(Qt::ApplicationState)),
|
||||
this, SLOT(applicationStateChanged(Qt::ApplicationState)));
|
||||
}
|
||||
|
||||
void PopupWindow::applicationStateChanged(Qt::ApplicationState state)
|
||||
{
|
||||
if (state != Qt::ApplicationActive)
|
||||
dismissPopup();
|
||||
}
|
||||
|
||||
void PopupWindow::show()
|
||||
{
|
||||
QPoint pos = QCursor::pos();
|
||||
int w = m_contentItem->implicitWidth();
|
||||
int h = m_contentItem->implicitHeight() + 16;
|
||||
int posx = pos.x();
|
||||
int posy = pos.y();
|
||||
|
||||
QWindow *pw = transientParent();
|
||||
if (!pw && parentItem())
|
||||
pw = parentItem()->window();
|
||||
if (!pw)
|
||||
pw = this;
|
||||
|
||||
QRect g = pw->screen()->availableGeometry();
|
||||
|
||||
if (posx + w > g.right()) {
|
||||
if (qobject_cast<PopupWindow *>(transientParent())) {
|
||||
// reposition submenu window on the parent menu's left side
|
||||
int submenuOverlap = pw->x() + pw->width() - posx;
|
||||
posx -= pw->width() + w - 2 * submenuOverlap;
|
||||
} else {
|
||||
posx = g.right() - w;
|
||||
}
|
||||
} else {
|
||||
posx = qMax(posx, g.left());
|
||||
}
|
||||
|
||||
posy = qBound(g.top(), posy, g.bottom() - h);
|
||||
|
||||
setGeometry(posx, posy, w, h);
|
||||
|
||||
QQuickWindow::show();
|
||||
setMouseGrabEnabled(true);
|
||||
setKeyboardGrabEnabled(true);
|
||||
}
|
||||
|
||||
void PopupWindow::setParentItem(QQuickItem *item)
|
||||
{
|
||||
m_parentItem = item;
|
||||
if (m_parentItem)
|
||||
setTransientParent(m_parentItem->window());
|
||||
}
|
||||
|
||||
void PopupWindow::setPopupContentItem(QQuickItem *contentItem)
|
||||
{
|
||||
if (!contentItem)
|
||||
return;
|
||||
|
||||
contentItem->setParentItem(this->contentItem());
|
||||
m_contentItem = contentItem;
|
||||
}
|
||||
|
||||
void PopupWindow::dismissPopup()
|
||||
{
|
||||
m_dismissed = true;
|
||||
emit popupDismissed();
|
||||
hide();
|
||||
}
|
||||
|
||||
void PopupWindow::mouseMoveEvent(QMouseEvent *e)
|
||||
{
|
||||
QQuickWindow::mouseMoveEvent(e);
|
||||
}
|
||||
|
||||
void PopupWindow::mousePressEvent(QMouseEvent *e)
|
||||
{
|
||||
QRect rect = QRect(QPoint(), size());
|
||||
if (rect.contains(e->pos())) {
|
||||
QQuickWindow::mousePressEvent(e);
|
||||
} else {
|
||||
dismissPopup();
|
||||
}
|
||||
}
|
||||
|
||||
void PopupWindow::mouseReleaseEvent(QMouseEvent *e)
|
||||
{
|
||||
QQuickWindow::mouseReleaseEvent(e);
|
||||
dismissPopup();
|
||||
}
|
||||
|
||||
bool PopupWindow::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<PopupWindow*>(transientParent())) {
|
||||
QRect rect = QRect(QPoint(), size());
|
||||
QTouchEvent *touch = static_cast<QTouchEvent*>(event);
|
||||
QTouchEvent::TouchPoint point = touch->touchPoints().first();
|
||||
if ((point.state() == Qt::TouchPointPressed) && !rect.contains(point.pos().toPoint())) {
|
||||
//first default handling
|
||||
bool result = QQuickWindow::event(event);
|
||||
//now specific broken case
|
||||
if (!m_dismissed)
|
||||
dismissPopup();
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
return QQuickWindow::event(event);
|
||||
}
|
|
@ -1,47 +0,0 @@
|
|||
#ifndef TOPLEVELMENU_H
|
||||
#define TOPLEVELMENU_H
|
||||
|
||||
#include <QQuickWindow>
|
||||
#include <QQuickItem>
|
||||
|
||||
class PopupWindow : public QQuickWindow
|
||||
{
|
||||
Q_OBJECT
|
||||
Q_PROPERTY(QQuickItem *popupContentItem READ popupContentItem WRITE setPopupContentItem)
|
||||
Q_CLASSINFO("DefaultProperty", "popupContentItem")
|
||||
Q_PROPERTY(QQuickItem *parentItem READ parentItem WRITE setParentItem)
|
||||
|
||||
public:
|
||||
PopupWindow(QQuickWindow *parent = nullptr);
|
||||
|
||||
QQuickItem *popupContentItem() const { return m_contentItem; }
|
||||
void setPopupContentItem(QQuickItem *popupContentItem);
|
||||
|
||||
QQuickItem *parentItem() const { return m_parentItem; }
|
||||
virtual void setParentItem(QQuickItem *);
|
||||
|
||||
public slots:
|
||||
void show();
|
||||
void dismissPopup();
|
||||
|
||||
signals:
|
||||
void popupDismissed();
|
||||
void geometryChanged();
|
||||
|
||||
protected:
|
||||
void mousePressEvent(QMouseEvent *) override;
|
||||
void mouseReleaseEvent(QMouseEvent *) override;
|
||||
void mouseMoveEvent(QMouseEvent *) override;
|
||||
bool event(QEvent *) override;
|
||||
|
||||
protected slots:
|
||||
void applicationStateChanged(Qt::ApplicationState state);
|
||||
|
||||
private:
|
||||
QQuickItem *m_parentItem;
|
||||
QPointer<QQuickItem> m_contentItem;
|
||||
bool m_mouseMoved;
|
||||
bool m_dismissed;
|
||||
};
|
||||
|
||||
#endif // POPUPWINDOW_H
|
Loading…
Reference in a new issue