From ae338af47408467c6ba481ff015ef18ad401f046 Mon Sep 17 00:00:00 2001 From: Peter Penz Date: Thu, 22 Mar 2007 19:25:44 +0000 Subject: [PATCH] improve the handling when applying item effects to cut items svn path=/trunk/KDE/kdebase/apps/; revision=645516 --- src/dolphinmainwindow.cpp | 21 --------- src/dolphinview.cpp | 91 ++++++++++++++++++++++++++------------- src/dolphinview.h | 20 +++++++-- 3 files changed, 78 insertions(+), 54 deletions(-) diff --git a/src/dolphinmainwindow.cpp b/src/dolphinmainwindow.cpp index a2bb16b8ab..deb418681d 100644 --- a/src/dolphinmainwindow.cpp +++ b/src/dolphinmainwindow.cpp @@ -585,32 +585,11 @@ void DolphinMainWindow::undo() void DolphinMainWindow::cut() { - QClipboard* clipboard = QApplication::clipboard(); - const QMimeData* currentMimeData = clipboard->mimeData(); - const bool hadCutSelection = KonqMimeData::decodeIsCutSelection(currentMimeData); - QMimeData* mimeData = new QMimeData(); const KUrl::List kdeUrls = m_activeView->selectedUrls(); const KUrl::List mostLocalUrls; KonqMimeData::populateMimeData(mimeData, kdeUrls, mostLocalUrls, true); QApplication::clipboard()->setMimeData(mimeData); - - if (hadCutSelection) { - // If an old cut selection has been applied, the view must - // be reloaded to get the original icons of the items without an - // applied item effect. - m_view[PrimaryIdx]->reload(); - if (m_view[SecondaryIdx] != 0) { - m_view[SecondaryIdx]->reload(); - } - } - else { - // apply an item effect for the icons of all cut items - m_view[PrimaryIdx]->updateCutItems(); - if (m_view[SecondaryIdx] != 0) { - m_view[SecondaryIdx]->updateCutItems(); - } - } } void DolphinMainWindow::copy() diff --git a/src/dolphinview.cpp b/src/dolphinview.cpp index e49690a048..6dfdd3d7bd 100644 --- a/src/dolphinview.cpp +++ b/src/dolphinview.cpp @@ -86,6 +86,10 @@ DolphinView::DolphinView(DolphinMainWindow* mainWindow, connect(m_mainWindow, SIGNAL(activeViewChanged()), this, SLOT(updateActivationState())); + QClipboard* clipboard = QApplication::clipboard(); + connect(clipboard, SIGNAL(dataChanged()), + this, SLOT(updateCutItems())); + m_urlNavigator = new UrlNavigator(url, this); m_urlNavigator->setShowHiddenFiles(showHiddenFiles); connect(m_urlNavigator, SIGNAL(urlChanged(const KUrl&)), @@ -823,6 +827,7 @@ void DolphinView::startDirLister(const KUrl& url, bool reload) m_statusBar->setProgress(0); } + m_cutItemsCache.clear(); m_blockContentsMovedSignal = true; m_dirLister->stop(); m_dirLister->openUrl(url, false, reload); @@ -917,34 +922,6 @@ void DolphinView::requestActivation() m_mainWindow->setActiveView(this); } -void DolphinView::updateCutItems() -{ - const QMimeData* mimeData = QApplication::clipboard()->mimeData(); - if (!KonqMimeData::decodeIsCutSelection(mimeData)) { - return; - } - - KFileItemList items(m_dirLister->items()); - KFileItemList::const_iterator it = items.begin(); - const KFileItemList::const_iterator end = items.end(); - while (it != end) { - KFileItem* item = *it; - if (isCutItem(*item)) { - const QModelIndex idx = m_dirModel->indexForItem(*item); - const QVariant value = m_dirModel->data(idx, Qt::DecorationRole); - if (value.type() == QVariant::Icon) { - const QIcon icon(qvariant_cast(value)); - KIconEffect iconEffect; - const QPixmap pixmap = iconEffect.apply(icon.pixmap(128, 128), - K3Icon::Desktop, - K3Icon::DisabledState); - m_dirModel->setData(idx, QIcon(pixmap), Qt::DecorationRole); - } - } - ++it; - } -} - void DolphinView::changeNameFilter(const QString& nameFilter) { // The name filter of KDirLister does a 'hard' filtering, which @@ -1005,7 +982,6 @@ void DolphinView::dropUrls(const KUrl::List& urls, const KUrl& destination = (directory == 0) ? url() : directory->url(); - dropUrls(urls, destination); } @@ -1015,7 +991,6 @@ void DolphinView::dropUrls(const KUrl::List& urls, m_mainWindow->dropUrls(urls, destination); } - void DolphinView::updateSorting(DolphinView::Sorting sorting) { ViewProperties props(url()); @@ -1048,6 +1023,25 @@ void DolphinView::updateActivationState() m_urlNavigator->setActive(isActive()); } +void DolphinView::updateCutItems() +{ + // restore the icons of all previously selected items to the + // original state... + QList::const_iterator it = m_cutItemsCache.begin(); + QList::const_iterator end = m_cutItemsCache.end(); + while (it != end) { + const QModelIndex index = m_dirModel->indexForUrl((*it).url); + if (index.isValid()) { + m_dirModel->setData(index, QIcon((*it).pixmap), Qt::DecorationRole); + } + ++it; + } + m_cutItemsCache.clear(); + + // ... and apply an item effect to all currently cut items + applyCutItemEffect(); +} + void DolphinView::createView() { // delete current view @@ -1142,4 +1136,41 @@ bool DolphinView::isCutItem(const KFileItem& item) const return false; } +void DolphinView::applyCutItemEffect() +{ + const QMimeData* mimeData = QApplication::clipboard()->mimeData(); + if (!KonqMimeData::decodeIsCutSelection(mimeData)) { + return; + } + + KFileItemList items(m_dirLister->items()); + KFileItemList::const_iterator it = items.begin(); + const KFileItemList::const_iterator end = items.end(); + while (it != end) { + KFileItem* item = *it; + if (isCutItem(*item)) { + const QModelIndex index = m_dirModel->indexForItem(*item); + const KFileItem* item = m_dirModel->itemForIndex(index); + const QVariant value = m_dirModel->data(index, Qt::DecorationRole); + if ((value.type() == QVariant::Icon) && (item != 0)) { + const QIcon icon(qvariant_cast(value)); + QPixmap pixmap = icon.pixmap(128, 128); + + // remember current pixmap for the item to be able + // to restore it when other items get cut + CutItem cutItem; + cutItem.url = item->url(); + cutItem.pixmap = pixmap; + m_cutItemsCache.append(cutItem); + + // apply icon effect to the cut item + KIconEffect iconEffect; + pixmap = iconEffect.apply(pixmap, K3Icon::Desktop, K3Icon::DisabledState); + m_dirModel->setData(index, QIcon(pixmap), Qt::DecorationRole); + } + } + ++it; + } +} + #include "dolphinview.moc" diff --git a/src/dolphinview.h b/src/dolphinview.h index e00cc98f27..c2d0a1cc86 100644 --- a/src/dolphinview.h +++ b/src/dolphinview.h @@ -353,9 +353,6 @@ public slots: */ void requestActivation(); - /** Applies an item effect to all cut items of the clipboard. */ - void updateCutItems(); - signals: /** Is emitted if URL of the view has been changed to \a url. */ void urlChanged(const KUrl& url); @@ -496,6 +493,9 @@ private slots: */ void updateActivationState(); + /** Applies an item effect to all cut items of the clipboard. */ + void updateCutItems(); + private: void startDirLister(const KUrl& url, bool reload = false); @@ -541,7 +541,19 @@ private: */ bool isCutItem(const KFileItem& item) const; + /** Applies an item effect to all cut items. */ + void applyCutItemEffect(); + private: + /** + * Remembers the original pixmap for an item before + * the cut effect is applied. + */ + struct CutItem { + KUrl url; + QPixmap pixmap; + }; + bool m_showProgress; bool m_blockContentsMovedSignal; Mode m_mode; @@ -565,6 +577,8 @@ private: KDirModel* m_dirModel; DolphinDirLister* m_dirLister; DolphinSortFilterProxyModel* m_proxyModel; + + QList m_cutItemsCache; }; #endif // _DOLPHINVIEW_H_