From 4f64bd4ee5b465fe64237500b32b03f286dd7faf Mon Sep 17 00:00:00 2001 From: Arno Date: Fri, 17 Dec 2010 11:59:27 +0100 Subject: Fix hover in FileSystemWidget Hover over movies in FileSystemWidget. Make it stick to the selected hover options. --- fileview.cpp | 110 ++++++++++++++++++++++++++++++++++++----------------------- fileview.h | 10 ++++-- 2 files changed, 75 insertions(+), 45 deletions(-) diff --git a/fileview.cpp b/fileview.cpp index 4c4e993..082ec92 100644 --- a/fileview.cpp +++ b/fileview.cpp @@ -59,7 +59,10 @@ void FileView::createFolder(){ void FileView::readConfig(){ QSettings s; - mHover = s.value("ui/hoverdirs", true).toBool(); + mHoverDirs = s.value("ui/hoverdirs", true).toBool(); + mHoverPics = s.value("ui/hoverpics", true).toBool(); + mHoverMovies = s.value("ui/hovermovies", true).toBool(); + mWhen = s.value("ui/grabframe", "00:00:00").toString(); mHoverWin->setWindowOpacity(s.value("ui/hoveropacity", 10).toFloat() / 10.0); } @@ -149,63 +152,59 @@ void FileView::resizeEvent(QResizeEvent *e){ } bool FileView::event(QEvent *e){ - int eType = e->type(); - if((eType == QEvent::HoverEnter) || (eType == QEvent::HoverLeave) || (eType == QEvent::HoverMove)){ - QHoverEvent *hEvent = static_cast(e); - if(!mHover){ - return true; - } - if(hEvent->type() == QEvent::HoverLeave){ - return exitHover(); - } - QPoint hotSpot(hEvent->pos().x(), hEvent->pos().y() - SmGlobals::instance()->cursorSize().height()); - QModelIndex curIdx = indexAt(hotSpot); - if(!curIdx.isValid() || (curIdx.column() != 0)){ + QHoverEvent *hEvent = static_cast(e); + if(!hEvent){ + return exitHover(); + } + QPoint hotSpot(hEvent->pos().x(), hEvent->pos().y() - SmGlobals::instance()->cursorSize().height()); + QModelIndex curIdx = indexAt(hotSpot); + HoverFileType ft = None; + QFileInfo curIdxInfo(curIdx.data(QFileSystemModel::FilePathRole).toString()); + if((e->type() == QEvent::HoverEnter) || (e->type() == QEvent::HoverMove)){ + if(!curIdx.isValid() || (!curIdx.column() == 0)){ return exitHover(); } if(curIdx.data().toString() == ".."){ return exitHover(); } - QFileInfo fi(curIdx.data(QFileSystemModel::FilePathRole).toString()); - if(!fi.exists()){ - return true; - } - QList hoverData; - if(fi.isDir()){ - hoverData << fi.fileName(); - QDir curDir(fi.absoluteFilePath()); - QStringList files = curDir.entryList(QDir::AllEntries | QDir::NoDotAndDotDot, QDir::Name); - hoverData << files; - }else if(fi.isFile()){ - QString mimeType = Helper::mimeType(fi.absoluteFilePath()); + if(curIdxInfo.isFile()){ + QString mimeType = Helper::mimeType(curIdxInfo.absoluteFilePath()); if(mimeType.startsWith("image")){ - QPixmap pm(fi.absoluteFilePath()); - hoverData << pm; + if(!mHoverPics){ + return exitHover(); + } + ft = Image; + }else if(mimeType.startsWith("video")){ + if(!mHoverMovies){ + return exitHover(); + } + ft = Movie; }else{ return exitHover(); } + }else if(curIdxInfo.isDir()){ + if(!mHoverDirs){ + return exitHover(); + } + ft = Dir; }else{ return exitHover(); } - if(e->type() == QEvent::HoverEnter){ + } + if(e->type() == QEvent::HoverEnter){ + mCurHover = curIdx; + doHover(curIdxInfo, ft); + return true; + }else if(e->type() == QEvent::HoverMove){ + if(mCurHover != curIdx){ mCurHover = curIdx; - mHoverWin->setData(hoverData); + doHover(curIdxInfo, ft); + }else{ mHoverWin->setPos(); - mHoverWin->setVisible(true); - return true; - } - if(e->type() == QEvent::HoverMove){ - if(curIdx != mCurHover){ - mHoverWin->setData(hoverData); - mCurHover = curIdx; - mHoverWin->setPos(); - mHoverWin->setVisible(true); - return true; - }else{ - mHoverWin->setPos(); - return true; - } } + return true; + }else if(e->type() == QEvent::HoverLeave){ + return exitHover(); } return QTreeView::event(e); } @@ -215,3 +214,28 @@ bool FileView::exitHover(bool exitVal){ mCurHover = QModelIndex(); return exitVal; } + +void FileView::doHover(const QFileInfo &fi, int type){ + QPixmap pm; + if(type == Movie){ + pm = SmGlobals::instance()->frameCache()->entry(fi.absoluteFilePath(), mWhen); + if(pm.isNull()){ + exitHover(); + return; + } + mHoverWin->setPixmap(pm, false); + mHoverWin->setCaption(fi.fileName()); + }else if(type == Image){ + pm.load(fi.absoluteFilePath()); + mHoverWin->setPixmap(pm); + mHoverWin->setCaption(fi.fileName()); + }else if(type == Dir){ + QList hoverList; + hoverList << fi.fileName(); + QDir curDir(fi.absoluteFilePath()); + hoverList << curDir.entryList(QDir::AllEntries | QDir::NoDotAndDotDot, QDir::Name); + mHoverWin->setData(hoverList); + } + mHoverWin->setPos(); + mHoverWin->setVisible(true); +} diff --git a/fileview.h b/fileview.h index 604fa8f..7f35fdc 100644 --- a/fileview.h +++ b/fileview.h @@ -18,12 +18,13 @@ class QModelIndex; class QAction; class HoverWindow; class QEvent; +class QFileInfo; class FileView : public QTreeView { Q_OBJECT public: FileView(QWidget *parent = 0); - ~FileView() {}; + ~FileView() {} signals: void upDir(); @@ -48,13 +49,18 @@ class FileView : public QTreeView { virtual bool event(QEvent *event); private: + enum HoverFileType { Dir, Movie, Image, None }; bool exitHover(bool exitVal = true); + void doHover(const QFileInfo &fi, int type); MessageDialog *mMarkDialog; MessageDialog *mCreateFolderDialog; QAction *mDeleteA; HoverWindow *mHoverWin; QModelIndex mCurHover; - bool mHover; + bool mHoverDirs; + bool mHoverMovies; + bool mHoverPics; + QString mWhen; }; #endif -- cgit v1.2.3-70-g09d2