From: Peter Penz Date: Sat, 10 Mar 2007 21:58:55 +0000 (+0000) Subject: Apply an item effect to all cut items. As discussed with Fredrik this should be done... X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/commitdiff_plain/fca6867fea49edb4134332562f518ddddd3fc2a1 Apply an item effect to all cut items. As discussed with Fredrik this should be done in the application itself and not inside KDirModel to be able to do some optimizations. svn path=/trunk/KDE/kdebase/apps/; revision=641317 --- diff --git a/src/dolphinmainwindow.cpp b/src/dolphinmainwindow.cpp index 6e2517344..e0a0a5633 100644 --- a/src/dolphinmainwindow.cpp +++ b/src/dolphinmainwindow.cpp @@ -528,11 +528,32 @@ 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 3927d9c6d..50f56a478 100644 --- a/src/dolphinview.cpp +++ b/src/dolphinview.cpp @@ -23,6 +23,7 @@ #include #include +#include #include #include #include @@ -31,10 +32,12 @@ #include #include #include +#include #include #include #include #include +#include #include #include @@ -110,6 +113,8 @@ DolphinView::DolphinView(DolphinMainWindow* mainWindow, this, SLOT(updateStatusBar())); connect(m_dirLister, SIGNAL(completed()), this, SLOT(updateItemCount())); + connect(m_dirLister, SIGNAL(completed()), + this, SLOT(updateCutItems())); connect(m_dirLister, SIGNAL(newItems(const KFileItemList&)), this, SLOT(generatePreviews(const KFileItemList&))); connect(m_dirLister, SIGNAL(infoMessage(const QString&)), @@ -724,6 +729,11 @@ void DolphinView::generatePreviews(const KFileItemList& items) connect(job, SIGNAL(gotPreview(const KFileItem*, const QPixmap&)), this, SLOT(showPreview(const KFileItem*, const QPixmap&))); } + + const QMimeData* mimeData = QApplication::clipboard()->mimeData(); + if (KonqMimeData::decodeIsCutSelection(mimeData)) { + QTimer::singleShot(1000, this, SLOT(applyCutEffect())); + } } void DolphinView::showPreview(const KFileItem* item, const QPixmap& pixmap) @@ -731,7 +741,15 @@ void DolphinView::showPreview(const KFileItem* item, const QPixmap& pixmap) Q_ASSERT(item != 0); const QModelIndex idx = m_dirModel->indexForItem(*item); if (idx.isValid() && (idx.column() == 0)) { - m_dirModel->setData(idx, pixmap, Qt::DecorationRole); + const QMimeData* mimeData = QApplication::clipboard()->mimeData(); + if (KonqMimeData::decodeIsCutSelection(mimeData) && isCutItem(*item)) { + KIconEffect iconEffect; + QPixmap cutPixmap = iconEffect.apply(pixmap, K3Icon::Desktop, K3Icon::DisabledState); + m_dirModel->setData(idx, cutPixmap, Qt::DecorationRole); + } + else { + m_dirModel->setData(idx, pixmap, Qt::DecorationRole); + } } } @@ -889,6 +907,31 @@ 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)) { + QPixmap pixmap = item->pixmap(0); + KIconEffect iconEffect; + pixmap = iconEffect.apply(pixmap, K3Icon::Desktop, K3Icon::DisabledState); + const QModelIndex idx = m_dirModel->indexForItem(*item); + if (idx.isValid()) { + m_dirModel->setData(idx, pixmap, Qt::DecorationRole); + } + } + ++it; + } +} + void DolphinView::changeNameFilter(const QString& nameFilter) { // The name filter of KDirLister does a 'hard' filtering, which @@ -1052,4 +1095,22 @@ bool DolphinView::isValidNameIndex(const QModelIndex& index) const return index.isValid() && (index.column() == KDirModel::Name); } +bool DolphinView::isCutItem(const KFileItem& item) const +{ + const QMimeData* mimeData = QApplication::clipboard()->mimeData(); + const KUrl::List cutUrls = KUrl::List::fromMimeData(mimeData); + + const KUrl& itemUrl = item.url(); + KUrl::List::const_iterator it = cutUrls.begin(); + const KUrl::List::const_iterator end = cutUrls.end(); + while (it != end){ + if (*it == itemUrl) { + return true; + } + ++it; + } + + return false; +} + #include "dolphinview.moc" diff --git a/src/dolphinview.h b/src/dolphinview.h index 2507e9e8e..5cfd7904d 100644 --- a/src/dolphinview.h +++ b/src/dolphinview.h @@ -346,6 +346,9 @@ 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); @@ -522,6 +525,12 @@ private: */ bool isValidNameIndex(const QModelIndex& index) const; + /** + * Returns true, if the item \a item has been cut into + * the clipboard. + */ + bool isCutItem(const KFileItem& item) const; + private: bool m_showProgress; Mode m_mode;