summaryrefslogtreecommitdiffstats
path: root/fileview.cpp
diff options
context:
space:
mode:
authorArno <am@disconnect.de>2010-10-30 08:37:40 +0200
committerArno <am@disconnect.de>2010-10-30 08:37:40 +0200
commitb4c2989e289e482a85a71db1c43f425079bcd15f (patch)
treee357b077beb55d97bfdb67d93c7b779bdffa8ba6 /fileview.cpp
parent7e0abc7cde4a9c02fabc27cc2b6506bd41f0588d (diff)
downloadSheMov-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.cpp88
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);