diff options
author | Arno <am@disconnect.de> | 2010-10-30 08:37:40 +0200 |
---|---|---|
committer | Arno <am@disconnect.de> | 2010-10-30 08:37:40 +0200 |
commit | b4c2989e289e482a85a71db1c43f425079bcd15f (patch) | |
tree | e357b077beb55d97bfdb67d93c7b779bdffa8ba6 /fileview.cpp | |
parent | 7e0abc7cde4a9c02fabc27cc2b6506bd41f0588d (diff) | |
download | SheMov-b4c2989e289e482a85a71db1c43f425079bcd15f.tar.gz SheMov-b4c2989e289e482a85a71db1c43f425079bcd15f.tar.bz2 SheMov-b4c2989e289e482a85a71db1c43f425079bcd15f.zip |
Performance improvement in FileView
This was a tricky one. Once again SheMov spinned at almost 100% CPU
usage. This time FileView::event() was the culprit. Because FileView
uses a QFileSystemModel it receives QTimer-Events every second.
Unfortunately a static_cast from QEvent::Timer to QEvent::Hover*
succeeds so we fetched the cursor position every second and tried to get
a QModelIndex. This obviously is quite expensive.
Fixed it by checking if e->type() is of QEvent::Hover* right at the
beginning of FileView::event().
Diffstat (limited to 'fileview.cpp')
-rw-r--r-- | fileview.cpp | 88 |
1 files changed, 43 insertions, 45 deletions
diff --git a/fileview.cpp b/fileview.cpp index cbdd8e0..f4f5294 100644 --- a/fileview.cpp +++ b/fileview.cpp @@ -149,61 +149,59 @@ void FileView::resizeEvent(QResizeEvent *e){ } bool FileView::event(QEvent *e){ - QHoverEvent *hEvent = static_cast<QHoverEvent*>(e); - if(!hEvent){ - return QTreeView::event(e); - } - if(!mHover){ - return true; - } - if(e->type() == QEvent::HoverLeave){ - return exitHover(); - } - 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)){ + int eType = e->type(); + if((eType == QEvent::HoverEnter) || (eType == QEvent::HoverLeave) || (eType == QEvent::HoverMove)){ + QHoverEvent *hEvent = static_cast<QHoverEvent*>(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)){ return exitHover(); } - } - QFileInfo fi(curIdx.data(QFileSystemModel::FilePathRole).toString()); - if(!fi.exists()){ - return true; - } - QList<QVariant> 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(mimeType.startsWith("image")){ - QPixmap pm(fi.absoluteFilePath()); - hoverData << pm; + QFileInfo fi(curIdx.data(QFileSystemModel::FilePathRole).toString()); + if(!fi.exists()){ + return true; + } + QList<QVariant> 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(mimeType.startsWith("image")){ + QPixmap pm(fi.absoluteFilePath()); + hoverData << pm; + }else{ + return exitHover(); + } }else{ return exitHover(); } - }else{ - return exitHover(); - } - if(e->type() == QEvent::HoverEnter){ - mCurHover = curIdx; - mHoverWin->setData(hoverData); - mHoverWin->setPos(); - mHoverWin->setVisible(true); - return true; - } - if(e->type() == QEvent::HoverMove){ - if(curIdx != mCurHover){ - mHoverWin->setData(hoverData); + if(e->type() == QEvent::HoverEnter){ mCurHover = curIdx; + mHoverWin->setData(hoverData); mHoverWin->setPos(); mHoverWin->setVisible(true); return true; - }else{ - mHoverWin->setPos(); - 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 QTreeView::event(e); |