summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArno <am@disconnect.de>2010-10-16 14:08:16 +0200
committerArno <am@disconnect.de>2010-10-16 14:08:16 +0200
commitbf5ccbe56631ac516751a9f194b643f77fdedf82 (patch)
treef5a4227e7ad222c87197c529c29629ee17c3631f
parentf10a0a63e699288f1288c193c49795cae9cb3b40 (diff)
downloadSheMov-bf5ccbe56631ac516751a9f194b643f77fdedf82.tar.gz
SheMov-bf5ccbe56631ac516751a9f194b643f77fdedf82.tar.bz2
SheMov-bf5ccbe56631ac516751a9f194b643f77fdedf82.zip
Hover for FilesTreeWidget
Hovering over a cover item in FilesTreeWidget shows a HoverWindow with the scaled image under the cursor.
-rw-r--r--filestreewidget.cpp70
-rw-r--r--filestreewidget.h5
-rw-r--r--hoverwindow.cpp14
-rw-r--r--hoverwindow.h1
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<QHoverEvent*>(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;