┌   ┐
54
└   ┘

summaryrefslogtreecommitdiff
path: root/src/dolphinviewcontainer.cpp
diff options
context:
space:
mode:
authorPeter Penz <[email protected]>2009-07-11 17:48:05 +0000
committerPeter Penz <[email protected]>2009-07-11 17:48:05 +0000
commit8e6dbadef2e7f25caed42559c4ffc832e03d387b (patch)
treefcf01df972da3011e8fe56f1937bd87bd1520335 /src/dolphinviewcontainer.cpp
parentebd0f1b06fdf94fc7be5c44a434dd6fc96a34e4a (diff)
Fixed performance issues related to selections and deleting of files:
- Don't connect to KDirLister::itemDeleted(const KFileItem&), but KDirLister::itemsDeleted(const KFileItemList&). Otherwise Dolphin is informed about each single file deletion instead of getting the deleted items as a list. Thanks to David Faure for the hint! - DolphinViewContainer::updateStatusBar() can be expensive when a lot of files are selected, as the file size must get retrieved. Assure that fast calls for updateStatusBar() don't trigger a synchronous update, do the update after 300 ms where no further update has been triggered. - Dolphin provides a list of file items when emitting the selectionChanged() signal. Collecting the file items is a quite expensive operation, so use the same approach as when updating the statusbar: only emit the selection changed signal when no change has been done within 300 ms. This improves the performance when doing huge selections a lot. - Make updateStatusBar() a private method, the main window should not need to take care about updating the statusbar (this is done internally now by DolphinViewContainer). BUG: 199090 BUG: 195787 CCBUG: 199352 CCBUG: 188218 svn path=/trunk/KDE/kdebase/apps/; revision=995015
Diffstat (limited to 'src/dolphinviewcontainer.cpp')
-rw-r--r--src/dolphinviewcontainer.cpp72
1 files changed, 44 insertions, 28 deletions
diff --git a/src/dolphinviewcontainer.cpp b/src/dolphinviewcontainer.cpp
index d8f90f357..356ff274e 100644
--- a/src/dolphinviewcontainer.cpp
+++ b/src/dolphinviewcontainer.cpp
@@ -75,6 +75,7 @@ DolphinViewContainer::DolphinViewContainer(DolphinMainWindow* mainWindow,
m_view(0),
m_filterBar(0),
m_statusBar(0),
+ m_statusBarTimer(0),
m_dirLister(0),
m_proxyModel(0)
{
@@ -113,11 +114,11 @@ DolphinViewContainer::DolphinViewContainer(DolphinMainWindow* mainWindow,
m_proxyModel->setFilterCaseSensitivity(Qt::CaseInsensitive);
connect(m_dirLister, SIGNAL(clear()),
- this, SLOT(updateStatusBar()));
+ this, SLOT(delayedStatusBarUpdate()));
connect(m_dirLister, SIGNAL(percent(int)),
this, SLOT(updateProgress(int)));
- connect(m_dirLister, SIGNAL(deleteItem(const KFileItem&)),
- this, SLOT(updateStatusBar()));
+ connect(m_dirLister, SIGNAL(itemsDeleted(const KFileItemList&)),
+ this, SLOT(delayedStatusBarUpdate()));
connect(m_dirLister, SIGNAL(completed()),
this, SLOT(slotDirListerCompleted()));
connect(m_dirLister, SIGNAL(infoMessage(const QString&)),
@@ -152,6 +153,8 @@ DolphinViewContainer::DolphinViewContainer(DolphinMainWindow* mainWindow,
this, SLOT(saveRootUrl(const KUrl&)));
connect(m_view, SIGNAL(redirection(KUrl, KUrl)),
this, SLOT(redirect(KUrl, KUrl)));
+ connect(m_view, SIGNAL(selectionChanged(const KFileItemList&)),
+ this, SLOT(delayedStatusBarUpdate()));
connect(m_urlNavigator, SIGNAL(urlChanged(const KUrl&)),
this, SLOT(restoreView(const KUrl&)));
@@ -159,6 +162,11 @@ DolphinViewContainer::DolphinViewContainer(DolphinMainWindow* mainWindow,
this, SLOT(slotHistoryChanged()));
m_statusBar = new DolphinStatusBar(this, m_view);
+ m_statusBarTimer = new QTimer(this);
+ m_statusBarTimer->setSingleShot(true);
+ m_statusBarTimer->setInterval(300);
+ connect(m_statusBarTimer, SIGNAL(timeout()),
+ this, SLOT(updateStatusBar()));
m_filterBar = new FilterBar(this);
m_filterBar->setVisible(settings->filterBar());
@@ -246,6 +254,37 @@ bool DolphinViewContainer::isUrlEditable() const
return m_urlNavigator->isUrlEditable();
}
+void DolphinViewContainer::delayedStatusBarUpdate()
+{
+ // Invoke updateStatusBar() with a small delay. This assures that
+ // when a lot of delayedStatusBarUpdates() are done in a short time,
+ // no bottleneck is given.
+ m_statusBarTimer->start();
+}
+
+void DolphinViewContainer::updateStatusBar()
+{
+ // As the item count information is less important
+ // in comparison with other messages, it should only
+ // be shown if:
+ // - the status bar is empty or
+ // - shows already the item count information or
+ // - shows only a not very important information
+ // - if any progress is given don't show the item count info at all
+ const QString msg(m_statusBar->message());
+ const bool updateStatusBarMsg = (msg.isEmpty()
+ || (msg == m_statusBar->defaultText())
+ || (m_statusBar->type() == DolphinStatusBar::Information))
+ && (m_statusBar->progress() == 100);
+
+ const QString text(m_view->statusBarText());
+ m_statusBar->setDefaultText(text);
+
+ if (updateStatusBarMsg) {
+ m_statusBar->setMessage(text, DolphinStatusBar::Default);
+ }
+}
+
void DolphinViewContainer::updateProgress(int percent)
{
if (!m_showProgress) {
@@ -274,7 +313,7 @@ void DolphinViewContainer::slotDirListerCompleted()
m_showProgress = false;
}
- updateStatusBar();
+ delayedStatusBarUpdate();
QMetaObject::invokeMethod(this, "restoreContentsPos", Qt::QueuedConnection);
// Enable the 'File'->'Create New...' menu only if the directory
@@ -325,33 +364,10 @@ void DolphinViewContainer::closeFilterBar()
emit showFilterBarChanged(false);
}
-void DolphinViewContainer::updateStatusBar()
-{
- // As the item count information is less important
- // in comparison with other messages, it should only
- // be shown if:
- // - the status bar is empty or
- // - shows already the item count information or
- // - shows only a not very important information
- // - if any progress is given don't show the item count info at all
- const QString msg(m_statusBar->message());
- const bool updateStatusBarMsg = (msg.isEmpty() ||
- (msg == m_statusBar->defaultText()) ||
- (m_statusBar->type() == DolphinStatusBar::Information)) &&
- (m_statusBar->progress() == 100);
-
- const QString text(m_view->statusBarText());
- m_statusBar->setDefaultText(text);
-
- if (updateStatusBarMsg) {
- m_statusBar->setMessage(text, DolphinStatusBar::Default);
- }
-}
-
void DolphinViewContainer::setNameFilter(const QString& nameFilter)
{
m_view->setNameFilter(nameFilter);
- updateStatusBar();
+ delayedStatusBarUpdate();
}
void DolphinViewContainer::openContextMenu(const KFileItem& item,