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/dolphinview.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/dolphinview.cpp')
| -rw-r--r-- | src/dolphinview.cpp | 19 |
1 files changed, 17 insertions, 2 deletions
diff --git a/src/dolphinview.cpp b/src/dolphinview.cpp index d4dbbd2c2..4a81b12ea 100644 --- a/src/dolphinview.cpp +++ b/src/dolphinview.cpp @@ -98,6 +98,7 @@ DolphinView::DolphinView(QWidget* parent, m_columnView(0), m_fileItemDelegate(0), m_selectionModel(0), + m_selectionChangedTimer(0), m_dolphinModel(dolphinModel), m_dirLister(dirLister), m_proxyModel(proxyModel), @@ -188,7 +189,7 @@ void DolphinView::setActive(bool active) QColor color = KColorScheme(QPalette::Active, KColorScheme::View).background().color(); if (active) { - emit selectionChanged(selectedItems()); + emitSelectionChangedSignal(); } else { color.setAlpha(150); } @@ -958,6 +959,14 @@ void DolphinView::triggerItem(const KFileItem& item) emit itemTriggered(item); // caught by DolphinViewContainer or DolphinPart } +void DolphinView::emitDelayedSelectionChangedSignal() +{ + // Invoke emitSelectionChangedSignal() with a delay of 300 ms. This assures + // that fast selection changes don't result in expensive operations to + // collect all file items for the signal (see DolphinView::selectedItems()). + m_selectionChangedTimer->start(); +} + void DolphinView::emitSelectionChangedSignal() { emit selectionChanged(DolphinView::selectedItems()); @@ -1436,6 +1445,12 @@ void DolphinView::createView() m_selectionModel = view->selectionModel(); } + m_selectionChangedTimer = new QTimer(this); + m_selectionChangedTimer->setSingleShot(true); + m_selectionChangedTimer->setInterval(300); + connect(m_selectionChangedTimer, SIGNAL(timeout()), + this, SLOT(emitSelectionChangedSignal())); + // reparent the selection model, as it should not be deleted // when deleting the model m_selectionModel->setParent(this); @@ -1454,7 +1469,7 @@ void DolphinView::createView() m_topLayout->insertWidget(1, view); connect(view->selectionModel(), SIGNAL(selectionChanged(const QItemSelection&, const QItemSelection&)), - this, SLOT(emitSelectionChangedSignal())); + this, SLOT(emitDelayedSelectionChangedSignal())); connect(view->verticalScrollBar(), SIGNAL(valueChanged(int)), this, SLOT(emitContentsMoved())); connect(view->horizontalScrollBar(), SIGNAL(valueChanged(int)), |
