From bf5ccbe56631ac516751a9f194b643f77fdedf82 Mon Sep 17 00:00:00 2001 From: Arno Date: Sat, 16 Oct 2010 14:08:16 +0200 Subject: Hover for FilesTreeWidget Hovering over a cover item in FilesTreeWidget shows a HoverWindow with the scaled image under the cursor. --- filestreewidget.cpp | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 69 insertions(+), 1 deletion(-) (limited to 'filestreewidget.cpp') diff --git a/filestreewidget.cpp b/filestreewidget.cpp index a941612..0dab9a2 100644 --- a/filestreewidget.cpp +++ b/filestreewidget.cpp @@ -269,7 +269,10 @@ void FilesTreeWidget::fileSelectionChanged(const QItemSelection &selected, const emit sizeChanged(mSelectedSize); } -FilesTreeView::FilesTreeView(QWidget *parent) : QTreeView(parent){} +FilesTreeView::FilesTreeView(QWidget *parent) : QTreeView(parent){ + setAttribute(Qt::WA_Hover); + mHoverWin = new HoverWindow; +} void FilesTreeView::contextMenuEvent(QContextMenuEvent *event){ QMenu ctxMenu; @@ -279,6 +282,71 @@ void FilesTreeView::contextMenuEvent(QContextMenuEvent *event){ ctxMenu.exec(event->globalPos()); } +bool FilesTreeView::event(QEvent *e){ + QModelIndex curIdx; + QHoverEvent *hEvent = static_cast(e); + QPoint hotSpot(hEvent->pos().x(), hEvent->pos().y() - SmGlobals::instance()->cursorOffset()); + QPoint globalPos = mapToGlobal(hotSpot); + QPoint where = globalPos + QPoint(30, 0); + + curIdx = indexAt(hotSpot); + if((e->type() == QEvent::HoverEnter) || (e->type() == QEvent::HoverMove)){ + if(!curIdx.isValid()){ + return true; + } + if(!curIdx.column() == 0){ + mCurHover = QModelIndex(); + mHoverWin->setVisible(false); + return true; + } + if(!curIdx.isValid()){ + return true; + } + QVariant fileType = curIdx.data(FilesTreeModel::FileTypeRole); + if(!fileType.isValid()){ + mHoverWin->setVisible(false); + return true; + } + if(fileType.toInt() == FilesTreeModel::Movie){ + mHoverWin->setVisible(false); + return true; + } + } + + if(e->type() == QEvent::HoverEnter){ + mCurHover = curIdx; + QPixmap pm = QPixmap(curIdx.data(FilesTreeModel::FullPathRole).toString()); + mHoverWin->setPixmap(pm); + if(mHoverWin->pixmapHeight()){ + where = QPoint(where.x(), where.y() - mHoverWin->pixmapHeight() / 2); + } + mHoverWin->move(where); + mHoverWin->setVisible(true); + return true; + } + if(e->type() == QEvent::HoverMove){ + if(mHoverWin->pixmapHeight()){ + where = QPoint(where.x(), where.y() - mHoverWin->pixmapHeight() / 2); + } + if(curIdx != mCurHover){ + mCurHover = curIdx; + mHoverWin->setPixmap(QPixmap(curIdx.data(FilesTreeModel::FullPathRole).toString())); + mHoverWin->setVisible(false); + mHoverWin->move(where); + mHoverWin->setVisible(true); + return true; + }else{ + mHoverWin->move(where); + return true; + } + } + if(e->type() == QEvent::HoverLeave){ + mHoverWin->setVisible(false); + return true; + } + return QTreeView::event(e); +} + FilesTreeSortModel::FilesTreeSortModel(QObject *parent) : QSortFilterProxyModel(parent) {} bool FilesTreeSortModel::lessThan(const QModelIndex &left, const QModelIndex &right) const{ -- cgit v1.2.3-70-g09d2