diff options
| author | Peter Penz <[email protected]> | 2009-07-11 17:48:05 +0000 |
|---|---|---|
| committer | Peter Penz <[email protected]> | 2009-07-11 17:48:05 +0000 |
| commit | 8e6dbadef2e7f25caed42559c4ffc832e03d387b (patch) | |
| tree | fcf01df972da3011e8fe56f1937bd87bd1520335 /src/dolphinviewcontainer.cpp | |
| parent | ebd0f1b06fdf94fc7be5c44a434dd6fc96a34e4a (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.cpp | 72 |
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, |
