From 7e0abc7cde4a9c02fabc27cc2b6506bd41f0588d Mon Sep 17 00:00:00 2001 From: Arno Date: Sat, 23 Oct 2010 15:09:49 +0200 Subject: Fix hover issues Hopefully this commit fixes all issues with hovering over items. First, only use QCursor::pos() to determine the position of the hover window and fix position calculation accordingly. For that SmGlobals now return a QSize of the actual cursor size. Introduced a hoverOffeset to HoverWindow defaulting to SmGlobals::cursorSize() + 30 to prevent a HoverLeave event on showing the HoverWindow. Also fixed Qt::WindowFlags of HoverWindow. We don't want the HoverWindow to show in the taskbar or get sent to background when clicking on an item. --- seriestreewidget.cpp | 70 +++++++++++++++++++++++++--------------------------- 1 file changed, 34 insertions(+), 36 deletions(-) (limited to 'seriestreewidget.cpp') diff --git a/seriestreewidget.cpp b/seriestreewidget.cpp index 5a57ec4..e4559fc 100644 --- a/seriestreewidget.cpp +++ b/seriestreewidget.cpp @@ -334,53 +334,51 @@ void SeriesTreeView::contextMenuEvent(QContextMenuEvent *e){ bool SeriesTreeView::event(QEvent *e){ QHoverEvent *hEvent = static_cast(e); - if((hEvent->type() == QEvent::HoverEnter) || (hEvent->type() == QEvent::HoverLeave) || (hEvent->type() == QEvent::HoverMove)){ - if(!mHover){ - return true; - } - QModelIndex curIdx; - QPoint hotSpot(hEvent->pos().x(), hEvent->pos().y() - SmGlobals::instance()->cursorOffset()); - QPoint globalPos = mapToGlobal(hotSpot); - QPoint where = globalPos + QPoint(30, 30); - curIdx = indexAt(hotSpot); - if((e->type() == QEvent::HoverEnter) || (e->type() == QEvent::HoverMove)){ - if(!curIdx.isValid()){ - return true; - } - if(curIdx.parent() != QModelIndex()){ - mHoverWin->setVisible(false); - mCurHover = QModelIndex(); - return true; - } + if(!hEvent){ + return QTreeView::event(e); + } + if(!mHover){ + return true; + } + QPoint hotSpot(hEvent->pos().x(), hEvent->pos().y() - SmGlobals::instance()->cursorSize().height()); + QModelIndex curIdx = indexAt(hotSpot); + if((e->type() == QEvent::HoverEnter) || (e->type() == QEvent::HoverMove)){ + if(!curIdx.isValid() || (curIdx.parent() != QModelIndex())){ + return exitHover(); } - if(e->type() == QEvent::HoverEnter){ + } + if(e->type() == QEvent::HoverEnter){ + mCurHover = curIdx; + mHoverWin->setContent(curIdx.data(Qt::DisplayRole).toString(), children(curIdx)); + mHoverWin->setPos(); + mHoverWin->setVisible(true); + return true; + } + if(e->type() == QEvent::HoverMove){ + if(curIdx != mCurHover){ mCurHover = curIdx; mHoverWin->setContent(curIdx.data(Qt::DisplayRole).toString(), children(curIdx)); - mHoverWin->setPos(where); + mHoverWin->setVisible(false); + mHoverWin->setPos(); mHoverWin->setVisible(true); return true; - } - if(e->type() == QEvent::HoverMove){ - if(curIdx != mCurHover){ - mCurHover = curIdx; - mHoverWin->setContent(curIdx.data(Qt::DisplayRole).toString(), children(curIdx)); - mHoverWin->setVisible(false); - mHoverWin->setPos(where); - mHoverWin->setVisible(true); - return true; - }else{ - mHoverWin->setPos(where); - return true; - } - } - if(e->type() == QEvent::HoverLeave){ - mHoverWin->setVisible(false); + }else{ + mHoverWin->setPos(); return true; } } + if(e->type() == QEvent::HoverLeave){ + return exitHover(); + } return QTreeView::event(e); } +bool SeriesTreeView::exitHover(bool exitVal){ + mHoverWin->setVisible(false); + mCurHover = QModelIndex(); + return exitVal; +} + QStringList SeriesTreeView::children(const QModelIndex &idx) const{ if(!idx.isValid()){ return QStringList(); -- cgit v1.2.3-70-g09d2