mirror of
https://github.com/linuxdeepin/dde-dock.git
synced 2025-06-04 17:33:05 +00:00
add popup auto hide signal
Change-Id: I701b98144d2ae07b7dcbff1874577ac4dcc123af
This commit is contained in:
parent
6372853152
commit
f5ee6b649e
37
frame/dbus/dbusxmousearea.cpp
Normal file
37
frame/dbus/dbusxmousearea.cpp
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (C) 2015 Deepin Technology Co., Ltd.
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
**/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file was generated by qdbusxml2cpp version 0.8
|
||||||
|
* Command line was: qdbusxml2cpp -c DBusXMouseArea -p dbusxmousearea com.deepin.api.XMouseArea.xml
|
||||||
|
*
|
||||||
|
* qdbusxml2cpp is Copyright (C) 2015 Digia Plc and/or its subsidiary(-ies).
|
||||||
|
*
|
||||||
|
* This is an auto-generated file.
|
||||||
|
* This file may have been hand-edited. Look for HAND-EDIT comments
|
||||||
|
* before re-generating it.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "dbusxmousearea.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Implementation of interface class DBusXMouseArea
|
||||||
|
*/
|
||||||
|
|
||||||
|
DBusXMouseArea::DBusXMouseArea(QObject *parent)
|
||||||
|
: QDBusAbstractInterface("com.deepin.api.XMouseArea", "/com/deepin/api/XMouseArea", staticInterfaceName(), QDBusConnection::sessionBus(), parent)
|
||||||
|
{
|
||||||
|
QDBusConnection::sessionBus().connect(this->service(), this->path(), "org.freedesktop.DBus.Properties", "PropertiesChanged", "sa{sv}as", this, SLOT(__propertyChanged__(QDBusMessage)));
|
||||||
|
}
|
||||||
|
|
||||||
|
DBusXMouseArea::~DBusXMouseArea()
|
||||||
|
{
|
||||||
|
QDBusConnection::sessionBus().disconnect(service(), path(), "org.freedesktop.DBus.Properties", "PropertiesChanged", "sa{sv}as", this, SLOT(propertyChanged(QDBusMessage)));
|
||||||
|
}
|
||||||
|
|
101
frame/dbus/dbusxmousearea.h
Normal file
101
frame/dbus/dbusxmousearea.h
Normal file
@ -0,0 +1,101 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (C) 2015 Deepin Technology Co., Ltd.
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
**/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file was generated by qdbusxml2cpp version 0.8
|
||||||
|
* Command line was: qdbusxml2cpp -c DBusXMouseArea -p dbusxmousearea com.deepin.api.XMouseArea.xml
|
||||||
|
*
|
||||||
|
* qdbusxml2cpp is Copyright (C) 2015 Digia Plc and/or its subsidiary(-ies).
|
||||||
|
*
|
||||||
|
* This is an auto-generated file.
|
||||||
|
* Do not edit! All changes made to it will be lost.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef DBUSXMOUSEAREA_H_1441764668
|
||||||
|
#define DBUSXMOUSEAREA_H_1441764668
|
||||||
|
|
||||||
|
#include <QtCore/QObject>
|
||||||
|
#include <QtCore/QByteArray>
|
||||||
|
#include <QtCore/QList>
|
||||||
|
#include <QtCore/QMap>
|
||||||
|
#include <QtCore/QString>
|
||||||
|
#include <QtCore/QStringList>
|
||||||
|
#include <QtCore/QVariant>
|
||||||
|
#include <QtDBus/QtDBus>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Proxy class for interface com.deepin.api.XMouseArea
|
||||||
|
*/
|
||||||
|
class DBusXMouseArea: public QDBusAbstractInterface
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
Q_SLOT void __propertyChanged__(const QDBusMessage &msg)
|
||||||
|
{
|
||||||
|
QList<QVariant> arguments = msg.arguments();
|
||||||
|
if (3 != arguments.count()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
QString interfaceName = msg.arguments().at(0).toString();
|
||||||
|
if (interfaceName != "com.deepin.api.XMouseArea") {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
QVariantMap changedProps = qdbus_cast<QVariantMap>(arguments.at(1).value<QDBusArgument>());
|
||||||
|
QStringList keys = changedProps.keys();
|
||||||
|
foreach(const QString & prop, keys) {
|
||||||
|
const QMetaObject *self = metaObject();
|
||||||
|
for (int i = self->propertyOffset(); i < self->propertyCount(); ++i) {
|
||||||
|
QMetaProperty p = self->property(i);
|
||||||
|
if (p.name() == prop) {
|
||||||
|
Q_EMIT p.notifySignal().invoke(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public:
|
||||||
|
static inline const char *staticInterfaceName()
|
||||||
|
{
|
||||||
|
return "com.deepin.api.XMouseArea";
|
||||||
|
}
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit DBusXMouseArea(QObject *parent = 0);
|
||||||
|
|
||||||
|
~DBusXMouseArea();
|
||||||
|
|
||||||
|
public Q_SLOTS: // METHODS
|
||||||
|
inline QDBusPendingReply<QString> RegisterFullScreen()
|
||||||
|
{
|
||||||
|
QList<QVariant> argumentList;
|
||||||
|
return asyncCallWithArgumentList(QStringLiteral("RegisterFullScreen"), argumentList);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline QDBusPendingReply<> UnregisterArea(const QString &in0)
|
||||||
|
{
|
||||||
|
QList<QVariant> argumentList;
|
||||||
|
argumentList << QVariant::fromValue(in0);
|
||||||
|
return asyncCallWithArgumentList(QStringLiteral("UnregisterArea"), argumentList);
|
||||||
|
}
|
||||||
|
|
||||||
|
Q_SIGNALS: // SIGNALS
|
||||||
|
void ButtonRelease(int in0, int in1, int in2, const QString &in3);
|
||||||
|
// begin property changed signals
|
||||||
|
};
|
||||||
|
|
||||||
|
namespace com
|
||||||
|
{
|
||||||
|
namespace deepin
|
||||||
|
{
|
||||||
|
namespace api
|
||||||
|
{
|
||||||
|
typedef ::DBusXMouseArea XMouseArea;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
@ -30,7 +30,8 @@ SOURCES += main.cpp \
|
|||||||
item/pluginsitem.cpp \
|
item/pluginsitem.cpp \
|
||||||
controller/dockpluginscontroller.cpp \
|
controller/dockpluginscontroller.cpp \
|
||||||
util/imagefactory.cpp \
|
util/imagefactory.cpp \
|
||||||
util/dockpopupwindow.cpp
|
util/dockpopupwindow.cpp \
|
||||||
|
dbus/dbusxmousearea.cpp
|
||||||
|
|
||||||
HEADERS += \
|
HEADERS += \
|
||||||
window/mainwindow.h \
|
window/mainwindow.h \
|
||||||
@ -52,7 +53,8 @@ HEADERS += \
|
|||||||
item/pluginsitem.h \
|
item/pluginsitem.h \
|
||||||
controller/dockpluginscontroller.h \
|
controller/dockpluginscontroller.h \
|
||||||
util/imagefactory.h \
|
util/imagefactory.h \
|
||||||
util/dockpopupwindow.h
|
util/dockpopupwindow.h \
|
||||||
|
dbus/dbusxmousearea.h
|
||||||
|
|
||||||
dbus_service.files += com.deepin.dde.dock.service
|
dbus_service.files += com.deepin.dde.dock.service
|
||||||
dbus_service.path = /usr/share/dbus-1/services
|
dbus_service.path = /usr/share/dbus-1/services
|
||||||
|
@ -179,7 +179,9 @@ void DockItem::showPopupWindow(QWidget * const content, const bool model)
|
|||||||
popup->setHeight(content->sizeHint().height());
|
popup->setHeight(content->sizeHint().height());
|
||||||
|
|
||||||
const QPoint p = popupMarkPoint();
|
const QPoint p = popupMarkPoint();
|
||||||
popup->show(p, model);
|
QMetaObject::invokeMethod(popup, "show", Qt::QueuedConnection, Q_ARG(QPoint, p), Q_ARG(bool, model));
|
||||||
|
|
||||||
|
connect(popup, &DockPopupWindow::accept, this, &DockItem::popupWindowAccept);
|
||||||
}
|
}
|
||||||
|
|
||||||
void DockItem::popupWindowAccept()
|
void DockItem::popupWindowAccept()
|
||||||
@ -187,6 +189,8 @@ void DockItem::popupWindowAccept()
|
|||||||
if (!PopupWindow->isVisible())
|
if (!PopupWindow->isVisible())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
disconnect(PopupWindow.get(), &DockPopupWindow::accept, this, &DockItem::popupWindowAccept);
|
||||||
|
|
||||||
PopupWindow->hide();
|
PopupWindow->hide();
|
||||||
|
|
||||||
emit requestWindowAutoHide(true);
|
emit requestWindowAutoHide(true);
|
||||||
|
@ -51,16 +51,10 @@ void PluginsItem::detachPluginWidget()
|
|||||||
|
|
||||||
void PluginsItem::mousePressEvent(QMouseEvent *e)
|
void PluginsItem::mousePressEvent(QMouseEvent *e)
|
||||||
{
|
{
|
||||||
if (e->button() == Qt::LeftButton)
|
DockItem::mousePressEvent(e);
|
||||||
{
|
|
||||||
MousePressPoint = e->pos();
|
|
||||||
}
|
|
||||||
else if (e->button() == Qt::RightButton)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
if (e->button() == Qt::LeftButton)
|
||||||
else
|
MousePressPoint = e->pos();
|
||||||
DockItem::mousePressEvent(e);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void PluginsItem::mouseMoveEvent(QMouseEvent *e)
|
void PluginsItem::mouseMoveEvent(QMouseEvent *e)
|
||||||
@ -77,8 +71,10 @@ void PluginsItem::mouseMoveEvent(QMouseEvent *e)
|
|||||||
|
|
||||||
void PluginsItem::mouseReleaseEvent(QMouseEvent *e)
|
void PluginsItem::mouseReleaseEvent(QMouseEvent *e)
|
||||||
{
|
{
|
||||||
|
DockItem::mouseReleaseEvent(e);
|
||||||
|
|
||||||
if (e->button() != Qt::LeftButton)
|
if (e->button() != Qt::LeftButton)
|
||||||
return DockItem::mouseReleaseEvent(e);
|
return;
|
||||||
|
|
||||||
e->accept();
|
e->accept();
|
||||||
|
|
||||||
|
@ -4,9 +4,17 @@ DWIDGET_USE_NAMESPACE
|
|||||||
|
|
||||||
DockPopupWindow::DockPopupWindow(QWidget *parent)
|
DockPopupWindow::DockPopupWindow(QWidget *parent)
|
||||||
: DArrowRectangle(ArrowBottom, parent),
|
: DArrowRectangle(ArrowBottom, parent),
|
||||||
m_model(false)
|
m_model(false),
|
||||||
{
|
|
||||||
|
|
||||||
|
m_acceptDelayTimer(new QTimer(this)),
|
||||||
|
|
||||||
|
m_mouseInter(new DBusXMouseArea(this))
|
||||||
|
{
|
||||||
|
m_acceptDelayTimer->setSingleShot(true);
|
||||||
|
m_acceptDelayTimer->setInterval(100);
|
||||||
|
|
||||||
|
connect(m_acceptDelayTimer, &QTimer::timeout, this, &DockPopupWindow::accept);
|
||||||
|
connect(m_mouseInter, &DBusXMouseArea::ButtonRelease, this, &DockPopupWindow::globalMouseRelease);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool DockPopupWindow::model() const
|
bool DockPopupWindow::model() const
|
||||||
@ -19,4 +27,30 @@ void DockPopupWindow::show(const QPoint &pos, const bool model)
|
|||||||
m_model = model;
|
m_model = model;
|
||||||
|
|
||||||
DArrowRectangle::show(pos.x(), pos.y());
|
DArrowRectangle::show(pos.x(), pos.y());
|
||||||
|
|
||||||
|
if (model)
|
||||||
|
m_mouseAreaKey = m_mouseInter->RegisterFullScreen();
|
||||||
|
}
|
||||||
|
|
||||||
|
void DockPopupWindow::mousePressEvent(QMouseEvent *e)
|
||||||
|
{
|
||||||
|
DArrowRectangle::mousePressEvent(e);
|
||||||
|
|
||||||
|
if (e->button() == Qt::LeftButton)
|
||||||
|
m_acceptDelayTimer->start();
|
||||||
|
}
|
||||||
|
|
||||||
|
void DockPopupWindow::globalMouseRelease()
|
||||||
|
{
|
||||||
|
Q_ASSERT(m_model);
|
||||||
|
|
||||||
|
const QRect rect = QRect(pos(), size());
|
||||||
|
const QPoint pos = QCursor::pos();
|
||||||
|
|
||||||
|
if (rect.contains(pos))
|
||||||
|
return;
|
||||||
|
|
||||||
|
emit accept();
|
||||||
|
|
||||||
|
m_mouseInter->UnregisterArea(m_mouseAreaKey);
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
#ifndef DOCKPOPUPWINDOW_H
|
#ifndef DOCKPOPUPWINDOW_H
|
||||||
#define DOCKPOPUPWINDOW_H
|
#define DOCKPOPUPWINDOW_H
|
||||||
|
|
||||||
|
#include "dbus/dbusxmousearea.h"
|
||||||
|
|
||||||
#include <darrowrectangle.h>
|
#include <darrowrectangle.h>
|
||||||
|
|
||||||
class DockPopupWindow : public Dtk::Widget::DArrowRectangle
|
class DockPopupWindow : public Dtk::Widget::DArrowRectangle
|
||||||
@ -12,10 +14,25 @@ public:
|
|||||||
|
|
||||||
bool model() const;
|
bool model() const;
|
||||||
|
|
||||||
|
public slots:
|
||||||
void show(const QPoint &pos, const bool model = false);
|
void show(const QPoint &pos, const bool model = false);
|
||||||
|
|
||||||
|
signals:
|
||||||
|
void accept() const;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void mousePressEvent(QMouseEvent *e);
|
||||||
|
|
||||||
|
private slots:
|
||||||
|
void globalMouseRelease();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool m_model;
|
bool m_model;
|
||||||
|
QString m_mouseAreaKey;
|
||||||
|
|
||||||
|
QTimer *m_acceptDelayTimer;
|
||||||
|
|
||||||
|
DBusXMouseArea *m_mouseInter;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // DOCKPOPUPWINDOW_H
|
#endif // DOCKPOPUPWINDOW_H
|
||||||
|
@ -4,6 +4,8 @@
|
|||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
#include <QMouseEvent>
|
#include <QMouseEvent>
|
||||||
|
|
||||||
|
#include <cmath>
|
||||||
|
|
||||||
#include <xcb/xproto.h>
|
#include <xcb/xproto.h>
|
||||||
|
|
||||||
#define DRAG_THRESHOLD 10
|
#define DRAG_THRESHOLD 10
|
||||||
|
@ -81,6 +81,8 @@ void TrayWidget::mousePressEvent(QMouseEvent *e)
|
|||||||
|
|
||||||
void TrayWidget::mouseReleaseEvent(QMouseEvent *e)
|
void TrayWidget::mouseReleaseEvent(QMouseEvent *e)
|
||||||
{
|
{
|
||||||
|
QWidget::mouseReleaseEvent(e);
|
||||||
|
|
||||||
const QPoint distance = e->pos() - m_pressPoint;
|
const QPoint distance = e->pos() - m_pressPoint;
|
||||||
if (distance.manhattanLength() > DRAG_THRESHOLD)
|
if (distance.manhattanLength() > DRAG_THRESHOLD)
|
||||||
return;
|
return;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user