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 ++++++++++++++++++++++++++++++++++++++++++++++++++++- filestreewidget.h | 5 ++++ hoverwindow.cpp | 14 ++++++++++- hoverwindow.h | 1 + 4 files changed, 88 insertions(+), 2 deletions(-) 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{ diff --git a/filestreewidget.h b/filestreewidget.h index c340020..c385f43 100644 --- a/filestreewidget.h +++ b/filestreewidget.h @@ -66,6 +66,11 @@ class FilesTreeView : public QTreeView { protected: virtual void contextMenuEvent(QContextMenuEvent *event); + virtual bool event(QEvent *event); + + private: + QModelIndex mCurHover; + HoverWindow *mHoverWin; }; class FilesTreeSortModel : public QSortFilterProxyModel { diff --git a/hoverwindow.cpp b/hoverwindow.cpp index 59c851e..8c5f227 100644 --- a/hoverwindow.cpp +++ b/hoverwindow.cpp @@ -37,5 +37,17 @@ void HoverWindow::setContent(const QString &parent, const QStringList &children) } void HoverWindow::setPixmap(const QPixmap &pm){ - mLabel->setPixmap(pm); + QPixmap curPm = pm; + if(curPm.height() > 500){ + curPm = curPm.scaledToHeight(500); + } + if(curPm.width() > 300){ + curPm = curPm.scaledToWidth(300); + } + mLabel->setPixmap(curPm); +} + +int HoverWindow::pixmapHeight() const{ + const QPixmap *pm = mLabel->pixmap(); + return pm ? pm->height() : 0; } diff --git a/hoverwindow.h b/hoverwindow.h index b020124..6991d0b 100644 --- a/hoverwindow.h +++ b/hoverwindow.h @@ -18,6 +18,7 @@ class HoverWindow : public QWidget { explicit HoverWindow(QWidget *parent = 0, Qt::WindowFlags f = Qt::FramelessWindowHint); void setContent(const QString &parent, const QStringList &children); void setPixmap(const QPixmap &pm); + int pixmapHeight() const; private: QLabel *mLabel; -- cgit v1.2.3-70-g09d2