From 825b5695b1f56470dd498baba14b1070042e55a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=9F=B3=E5=8D=9A=E6=96=87?= Date: Thu, 4 May 2017 10:39:03 +0800 Subject: [PATCH] pass get image for unchanged window Change-Id: Id71b3b01aa783397b7a0b7a8d797bbad602af9c0 --- frame/item/appitem.cpp | 39 +++++++++------ frame/item/appitem.h | 1 + frame/item/components/previewcontainer.cpp | 57 ++++++++++++++++------ frame/item/components/previewcontainer.h | 6 +++ frame/item/components/previewwidget.cpp | 21 +++++--- frame/item/components/previewwidget.h | 5 +- 6 files changed, 88 insertions(+), 41 deletions(-) diff --git a/frame/item/appitem.cpp b/frame/item/appitem.cpp index e4b1c35ff..0ff40845c 100644 --- a/frame/item/appitem.cpp +++ b/frame/item/appitem.cpp @@ -43,7 +43,7 @@ AppItem::AppItem(const QDBusObjectPath &entry, QWidget *parent) setAccessibleName(m_itemEntry->name()); setAcceptDrops(true); - setMouseTracking(true); +// setMouseTracking(true); setLayout(centralLayout); m_itemView->setScene(m_itemScene); @@ -71,7 +71,7 @@ AppItem::AppItem(const QDBusObjectPath &entry, QWidget *parent) m_appPreviewTips->setVisible(false); connect(m_itemEntry, &DBusDockEntry::ActiveChanged, this, &AppItem::activeChanged); - connect(m_itemEntry, &DBusDockEntry::TitlesChanged, this, &AppItem::updateTitle); + connect(m_itemEntry, &DBusDockEntry::TitlesChanged, this, &AppItem::updateTitle, Qt::QueuedConnection); connect(m_itemEntry, &DBusDockEntry::IconChanged, this, &AppItem::refershIcon); connect(m_itemEntry, &DBusDockEntry::ActiveChanged, this, static_cast(&AppItem::update)); @@ -328,8 +328,8 @@ void AppItem::mouseMoveEvent(QMouseEvent *e) e->accept(); // handle preview - if (e->buttons() == Qt::NoButton) - return showPreview(); +// if (e->buttons() == Qt::NoButton) +// return showPreview(); // handle drag if (e->buttons() != Qt::LeftButton) @@ -393,6 +393,14 @@ void AppItem::dropEvent(QDropEvent *e) m_itemEntry->HandleDragDrop(uriList); } +void AppItem::showHoverTips() +{ + if (!m_titles.isEmpty()) + return showPreview(); + + DockItem::showHoverTips(); +} + void AppItem::invokedMenuItem(const QString &itemId, const bool checked) { Q_UNUSED(checked); @@ -450,8 +458,6 @@ void AppItem::startDrag() void AppItem::updateTitle() { m_titles = m_itemEntry->titles(); - - // TODO: optimize m_appPreviewTips->setWindowInfos(m_titles); update(); @@ -485,18 +491,19 @@ void AppItem::showPreview() return; // test cursor position - const QRect r = rect(); - const QPoint p = mapFromGlobal(QCursor::pos()); +// const QRect r = rect(); +// const QPoint p = mapFromGlobal(QCursor::pos()); - switch (DockPosition) - { - case Top: if (p.y() != r.top()) return; break; - case Left: if (p.x() != r.left()) return; break; - case Right: if (p.x() != r.right()) return; break; - case Bottom: if (p.y() != r.bottom()) return; break; - default: return; - } +// switch (DockPosition) +// { +// case Top: if (p.y() != r.top()) return; break; +// case Left: if (p.x() != r.left()) return; break; +// case Right: if (p.x() != r.right()) return; break; +// case Bottom: if (p.y() != r.bottom()) return; break; +// default: return; +// } + m_appPreviewTips->setWindowInfos(m_titles); m_appPreviewTips->updateLayoutDirection(DockPosition); qApp->processEvents(); diff --git a/frame/item/appitem.h b/frame/item/appitem.h index cf4cafa6f..92c54e5a7 100644 --- a/frame/item/appitem.h +++ b/frame/item/appitem.h @@ -42,6 +42,7 @@ private: void dragMoveEvent(QDragMoveEvent *e); void dropEvent(QDropEvent *e); + void showHoverTips(); void invokedMenuItem(const QString &itemId, const bool checked); const QString contextMenu() const; QWidget *popupTips(); diff --git a/frame/item/components/previewcontainer.cpp b/frame/item/components/previewcontainer.cpp index 81954952a..ca1cbe4c0 100644 --- a/frame/item/components/previewcontainer.cpp +++ b/frame/item/components/previewcontainer.cpp @@ -6,25 +6,24 @@ #include PreviewContainer::PreviewContainer(QWidget *parent) - : QWidget(parent) + : QWidget(parent), + + m_mouseLeaveTimer(new QTimer(this)) { m_windowListLayout = new QBoxLayout(QBoxLayout::LeftToRight); m_windowListLayout->setMargin(5); m_windowListLayout->setSpacing(3); + m_mouseLeaveTimer->setSingleShot(true); + m_mouseLeaveTimer->setInterval(100); + setLayout(m_windowListLayout); - setMouseTracking(true); + + connect(m_mouseLeaveTimer, &QTimer::timeout, this, &PreviewContainer::checkMouseLeave, Qt::QueuedConnection); } void PreviewContainer::setWindowInfos(const WindowDict &infos) { - // TODO: optimize - while (QLayoutItem *item = m_windowListLayout->takeAt(0)) - { - item->widget()->deleteLater(); - delete item; - } - if (infos.isEmpty()) { emit requestCancelPreview(); @@ -33,8 +32,26 @@ void PreviewContainer::setWindowInfos(const WindowDict &infos) return; } + QList removedWindows; + + // remove desroyed window + for (auto it(m_windows.cbegin()); it != m_windows.cend(); ++it) + { + if (infos.contains(it.key())) + continue; + + removedWindows << it.key(); + m_windowListLayout->removeWidget(it.value()); + it.value()->deleteLater(); + } + for (auto id : removedWindows) + m_windows.remove(id); + for (auto it(infos.cbegin()); it != infos.cend(); ++it) { + if (m_windows.contains(it.key())) + continue; + PreviewWidget *w = new PreviewWidget(it.key()); w->setTitle(it.value()); @@ -44,11 +61,9 @@ void PreviewContainer::setWindowInfos(const WindowDict &infos) connect(w, &PreviewWidget::requestHidePreview, this, &PreviewContainer::requestHidePreview); m_windowListLayout->addWidget(w); + m_windows.insert(it.key(), w); } - if (!isVisible()) - return; - // update geometry QMetaObject::invokeMethod(this, "updateContainerSize", Qt::QueuedConnection); } @@ -73,13 +88,25 @@ void PreviewContainer::leaveEvent(QEvent *e) { QWidget::leaveEvent(e); - const QPoint p = mapFromGlobal(QCursor::pos()) + pos(); + m_mouseLeaveTimer->start(); +} - if (!rect().contains(p)) - emit requestCancelPreview(); +void PreviewContainer::enterEvent(QEvent *e) +{ + QWidget::enterEvent(e); + + m_mouseLeaveTimer->stop(); } void PreviewContainer::updateContainerSize() { resize(sizeHint()); } + +void PreviewContainer::checkMouseLeave() +{ + const QPoint p = mapFromGlobal(QCursor::pos()); + + if (!rect().contains(p)) + emit requestCancelPreview(); +} diff --git a/frame/item/components/previewcontainer.h b/frame/item/components/previewcontainer.h index 3faef8f78..e642e72be 100644 --- a/frame/item/components/previewcontainer.h +++ b/frame/item/components/previewcontainer.h @@ -28,12 +28,18 @@ public slots: protected: void leaveEvent(QEvent *e); + void enterEvent(QEvent *e); private slots: void updateContainerSize(); + void checkMouseLeave(); private: QBoxLayout *m_windowListLayout; + + QTimer *m_mouseLeaveTimer; + + QMap m_windows; }; #endif // PREVIEWCONTAINER_H diff --git a/frame/item/components/previewwidget.cpp b/frame/item/components/previewwidget.cpp index a03a25938..b4af9a5bd 100644 --- a/frame/item/components/previewwidget.cpp +++ b/frame/item/components/previewwidget.cpp @@ -17,6 +17,8 @@ PreviewWidget::PreviewWidget(const WId wid, QWidget *parent) : QWidget(parent), m_wid(wid), + m_mouseEnterTimer(new QTimer(this)), + m_hovered(false) { m_closeButton = new QPushButton; @@ -28,6 +30,9 @@ PreviewWidget::PreviewWidget(const WId wid, QWidget *parent) m_droppedDelay->setSingleShot(true); m_droppedDelay->setInterval(100); + m_mouseEnterTimer->setInterval(200); + m_mouseEnterTimer->setSingleShot(true); + QVBoxLayout *centralLayout = new QVBoxLayout; centralLayout->setSpacing(0); centralLayout->setMargin(0); @@ -39,6 +44,9 @@ PreviewWidget::PreviewWidget(const WId wid, QWidget *parent) setAcceptDrops(true); connect(m_closeButton, &QPushButton::clicked, this, &PreviewWidget::closeWindow); + connect(m_mouseEnterTimer, &QTimer::timeout, this, &PreviewWidget::showPreview, Qt::QueuedConnection); + + QTimer::singleShot(1, this, &PreviewWidget::refreshImage); } void PreviewWidget::setTitle(const QString &title) @@ -48,7 +56,7 @@ void PreviewWidget::setTitle(const QString &title) update(); } -void PreviewWidget::refershImage() +void PreviewWidget::refreshImage() { const auto display = QX11Info::display(); @@ -83,12 +91,9 @@ void PreviewWidget::closeWindow() XFlush(display); } -void PreviewWidget::setVisible(const bool visible) +void PreviewWidget::showPreview() { - QWidget::setVisible(visible); - - if (visible) - QTimer::singleShot(1, this, &PreviewWidget::refershImage); + emit requestPreviewWindow(m_wid); } void PreviewWidget::paintEvent(QPaintEvent *e) @@ -133,18 +138,18 @@ void PreviewWidget::enterEvent(QEvent *e) m_hovered = true; m_closeButton->setVisible(true); + m_mouseEnterTimer->start(); update(); QWidget::enterEvent(e); - - emit requestPreviewWindow(m_wid); } void PreviewWidget::leaveEvent(QEvent *e) { m_hovered = false; m_closeButton->setVisible(false); + m_mouseEnterTimer->stop(); update(); diff --git a/frame/item/components/previewwidget.h b/frame/item/components/previewwidget.h index b92e70f1d..8fdeb8122 100644 --- a/frame/item/components/previewwidget.h +++ b/frame/item/components/previewwidget.h @@ -22,9 +22,9 @@ signals: void requestHidePreview() const; private slots: - void refershImage(); + void refreshImage(); void closeWindow(); - void setVisible(const bool visible); + void showPreview(); private: void paintEvent(QPaintEvent *e); @@ -43,6 +43,7 @@ private: QPushButton *m_closeButton; QTimer *m_droppedDelay; + QTimer *m_mouseEnterTimer; bool m_hovered; };