pass get image for unchanged window

Change-Id: Id71b3b01aa783397b7a0b7a8d797bbad602af9c0
This commit is contained in:
石博文 2017-05-04 10:39:03 +08:00
parent 0785cd9623
commit 825b5695b1
Notes: Deepin Code Review 2017-05-04 17:16:47 +08:00
Verified+1: Anonymous Coward #1000004
Code-Review+2: 石博文 <sbw@sbw.so>
Submitted-by: 石博文 <sbw@sbw.so>
Submitted-at: Thu, 04 May 2017 17:16:45 +0800
Reviewed-on: https://cr.deepin.io/22803
Project: dde/dde-dock
Branch: refs/heads/master
6 changed files with 88 additions and 41 deletions

View File

@ -43,7 +43,7 @@ AppItem::AppItem(const QDBusObjectPath &entry, QWidget *parent)
setAccessibleName(m_itemEntry->name()); setAccessibleName(m_itemEntry->name());
setAcceptDrops(true); setAcceptDrops(true);
setMouseTracking(true); // setMouseTracking(true);
setLayout(centralLayout); setLayout(centralLayout);
m_itemView->setScene(m_itemScene); m_itemView->setScene(m_itemScene);
@ -71,7 +71,7 @@ AppItem::AppItem(const QDBusObjectPath &entry, QWidget *parent)
m_appPreviewTips->setVisible(false); m_appPreviewTips->setVisible(false);
connect(m_itemEntry, &DBusDockEntry::ActiveChanged, this, &AppItem::activeChanged); 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::IconChanged, this, &AppItem::refershIcon);
connect(m_itemEntry, &DBusDockEntry::ActiveChanged, this, static_cast<void (AppItem::*)()>(&AppItem::update)); connect(m_itemEntry, &DBusDockEntry::ActiveChanged, this, static_cast<void (AppItem::*)()>(&AppItem::update));
@ -328,8 +328,8 @@ void AppItem::mouseMoveEvent(QMouseEvent *e)
e->accept(); e->accept();
// handle preview // handle preview
if (e->buttons() == Qt::NoButton) // if (e->buttons() == Qt::NoButton)
return showPreview(); // return showPreview();
// handle drag // handle drag
if (e->buttons() != Qt::LeftButton) if (e->buttons() != Qt::LeftButton)
@ -393,6 +393,14 @@ void AppItem::dropEvent(QDropEvent *e)
m_itemEntry->HandleDragDrop(uriList); m_itemEntry->HandleDragDrop(uriList);
} }
void AppItem::showHoverTips()
{
if (!m_titles.isEmpty())
return showPreview();
DockItem::showHoverTips();
}
void AppItem::invokedMenuItem(const QString &itemId, const bool checked) void AppItem::invokedMenuItem(const QString &itemId, const bool checked)
{ {
Q_UNUSED(checked); Q_UNUSED(checked);
@ -450,8 +458,6 @@ void AppItem::startDrag()
void AppItem::updateTitle() void AppItem::updateTitle()
{ {
m_titles = m_itemEntry->titles(); m_titles = m_itemEntry->titles();
// TODO: optimize
m_appPreviewTips->setWindowInfos(m_titles); m_appPreviewTips->setWindowInfos(m_titles);
update(); update();
@ -485,18 +491,19 @@ void AppItem::showPreview()
return; return;
// test cursor position // test cursor position
const QRect r = rect(); // const QRect r = rect();
const QPoint p = mapFromGlobal(QCursor::pos()); // const QPoint p = mapFromGlobal(QCursor::pos());
switch (DockPosition) // switch (DockPosition)
{ // {
case Top: if (p.y() != r.top()) return; break; // case Top: if (p.y() != r.top()) return; break;
case Left: if (p.x() != r.left()) return; break; // case Left: if (p.x() != r.left()) return; break;
case Right: if (p.x() != r.right()) return; break; // case Right: if (p.x() != r.right()) return; break;
case Bottom: if (p.y() != r.bottom()) return; break; // case Bottom: if (p.y() != r.bottom()) return; break;
default: return; // default: return;
} // }
m_appPreviewTips->setWindowInfos(m_titles);
m_appPreviewTips->updateLayoutDirection(DockPosition); m_appPreviewTips->updateLayoutDirection(DockPosition);
qApp->processEvents(); qApp->processEvents();

View File

@ -42,6 +42,7 @@ private:
void dragMoveEvent(QDragMoveEvent *e); void dragMoveEvent(QDragMoveEvent *e);
void dropEvent(QDropEvent *e); void dropEvent(QDropEvent *e);
void showHoverTips();
void invokedMenuItem(const QString &itemId, const bool checked); void invokedMenuItem(const QString &itemId, const bool checked);
const QString contextMenu() const; const QString contextMenu() const;
QWidget *popupTips(); QWidget *popupTips();

View File

@ -6,25 +6,24 @@
#include <QDebug> #include <QDebug>
PreviewContainer::PreviewContainer(QWidget *parent) PreviewContainer::PreviewContainer(QWidget *parent)
: QWidget(parent) : QWidget(parent),
m_mouseLeaveTimer(new QTimer(this))
{ {
m_windowListLayout = new QBoxLayout(QBoxLayout::LeftToRight); m_windowListLayout = new QBoxLayout(QBoxLayout::LeftToRight);
m_windowListLayout->setMargin(5); m_windowListLayout->setMargin(5);
m_windowListLayout->setSpacing(3); m_windowListLayout->setSpacing(3);
m_mouseLeaveTimer->setSingleShot(true);
m_mouseLeaveTimer->setInterval(100);
setLayout(m_windowListLayout); setLayout(m_windowListLayout);
setMouseTracking(true);
connect(m_mouseLeaveTimer, &QTimer::timeout, this, &PreviewContainer::checkMouseLeave, Qt::QueuedConnection);
} }
void PreviewContainer::setWindowInfos(const WindowDict &infos) void PreviewContainer::setWindowInfos(const WindowDict &infos)
{ {
// TODO: optimize
while (QLayoutItem *item = m_windowListLayout->takeAt(0))
{
item->widget()->deleteLater();
delete item;
}
if (infos.isEmpty()) if (infos.isEmpty())
{ {
emit requestCancelPreview(); emit requestCancelPreview();
@ -33,8 +32,26 @@ void PreviewContainer::setWindowInfos(const WindowDict &infos)
return; return;
} }
QList<WId> 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) for (auto it(infos.cbegin()); it != infos.cend(); ++it)
{ {
if (m_windows.contains(it.key()))
continue;
PreviewWidget *w = new PreviewWidget(it.key()); PreviewWidget *w = new PreviewWidget(it.key());
w->setTitle(it.value()); w->setTitle(it.value());
@ -44,11 +61,9 @@ void PreviewContainer::setWindowInfos(const WindowDict &infos)
connect(w, &PreviewWidget::requestHidePreview, this, &PreviewContainer::requestHidePreview); connect(w, &PreviewWidget::requestHidePreview, this, &PreviewContainer::requestHidePreview);
m_windowListLayout->addWidget(w); m_windowListLayout->addWidget(w);
m_windows.insert(it.key(), w);
} }
if (!isVisible())
return;
// update geometry // update geometry
QMetaObject::invokeMethod(this, "updateContainerSize", Qt::QueuedConnection); QMetaObject::invokeMethod(this, "updateContainerSize", Qt::QueuedConnection);
} }
@ -73,13 +88,25 @@ void PreviewContainer::leaveEvent(QEvent *e)
{ {
QWidget::leaveEvent(e); QWidget::leaveEvent(e);
const QPoint p = mapFromGlobal(QCursor::pos()) + pos(); m_mouseLeaveTimer->start();
}
if (!rect().contains(p)) void PreviewContainer::enterEvent(QEvent *e)
emit requestCancelPreview(); {
QWidget::enterEvent(e);
m_mouseLeaveTimer->stop();
} }
void PreviewContainer::updateContainerSize() void PreviewContainer::updateContainerSize()
{ {
resize(sizeHint()); resize(sizeHint());
} }
void PreviewContainer::checkMouseLeave()
{
const QPoint p = mapFromGlobal(QCursor::pos());
if (!rect().contains(p))
emit requestCancelPreview();
}

View File

@ -28,12 +28,18 @@ public slots:
protected: protected:
void leaveEvent(QEvent *e); void leaveEvent(QEvent *e);
void enterEvent(QEvent *e);
private slots: private slots:
void updateContainerSize(); void updateContainerSize();
void checkMouseLeave();
private: private:
QBoxLayout *m_windowListLayout; QBoxLayout *m_windowListLayout;
QTimer *m_mouseLeaveTimer;
QMap<WId, QWidget *> m_windows;
}; };
#endif // PREVIEWCONTAINER_H #endif // PREVIEWCONTAINER_H

View File

@ -17,6 +17,8 @@ PreviewWidget::PreviewWidget(const WId wid, QWidget *parent)
: QWidget(parent), : QWidget(parent),
m_wid(wid), m_wid(wid),
m_mouseEnterTimer(new QTimer(this)),
m_hovered(false) m_hovered(false)
{ {
m_closeButton = new QPushButton; m_closeButton = new QPushButton;
@ -28,6 +30,9 @@ PreviewWidget::PreviewWidget(const WId wid, QWidget *parent)
m_droppedDelay->setSingleShot(true); m_droppedDelay->setSingleShot(true);
m_droppedDelay->setInterval(100); m_droppedDelay->setInterval(100);
m_mouseEnterTimer->setInterval(200);
m_mouseEnterTimer->setSingleShot(true);
QVBoxLayout *centralLayout = new QVBoxLayout; QVBoxLayout *centralLayout = new QVBoxLayout;
centralLayout->setSpacing(0); centralLayout->setSpacing(0);
centralLayout->setMargin(0); centralLayout->setMargin(0);
@ -39,6 +44,9 @@ PreviewWidget::PreviewWidget(const WId wid, QWidget *parent)
setAcceptDrops(true); setAcceptDrops(true);
connect(m_closeButton, &QPushButton::clicked, this, &PreviewWidget::closeWindow); 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) void PreviewWidget::setTitle(const QString &title)
@ -48,7 +56,7 @@ void PreviewWidget::setTitle(const QString &title)
update(); update();
} }
void PreviewWidget::refershImage() void PreviewWidget::refreshImage()
{ {
const auto display = QX11Info::display(); const auto display = QX11Info::display();
@ -83,12 +91,9 @@ void PreviewWidget::closeWindow()
XFlush(display); XFlush(display);
} }
void PreviewWidget::setVisible(const bool visible) void PreviewWidget::showPreview()
{ {
QWidget::setVisible(visible); emit requestPreviewWindow(m_wid);
if (visible)
QTimer::singleShot(1, this, &PreviewWidget::refershImage);
} }
void PreviewWidget::paintEvent(QPaintEvent *e) void PreviewWidget::paintEvent(QPaintEvent *e)
@ -133,18 +138,18 @@ void PreviewWidget::enterEvent(QEvent *e)
m_hovered = true; m_hovered = true;
m_closeButton->setVisible(true); m_closeButton->setVisible(true);
m_mouseEnterTimer->start();
update(); update();
QWidget::enterEvent(e); QWidget::enterEvent(e);
emit requestPreviewWindow(m_wid);
} }
void PreviewWidget::leaveEvent(QEvent *e) void PreviewWidget::leaveEvent(QEvent *e)
{ {
m_hovered = false; m_hovered = false;
m_closeButton->setVisible(false); m_closeButton->setVisible(false);
m_mouseEnterTimer->stop();
update(); update();

View File

@ -22,9 +22,9 @@ signals:
void requestHidePreview() const; void requestHidePreview() const;
private slots: private slots:
void refershImage(); void refreshImage();
void closeWindow(); void closeWindow();
void setVisible(const bool visible); void showPreview();
private: private:
void paintEvent(QPaintEvent *e); void paintEvent(QPaintEvent *e);
@ -43,6 +43,7 @@ private:
QPushButton *m_closeButton; QPushButton *m_closeButton;
QTimer *m_droppedDelay; QTimer *m_droppedDelay;
QTimer *m_mouseEnterTimer;
bool m_hovered; bool m_hovered;
}; };