]> cloud.milkyroute.net Git - dolphin.git/commitdiff
improve the handling when applying item effects to cut items
authorPeter Penz <peter.penz19@gmail.com>
Thu, 22 Mar 2007 19:25:44 +0000 (19:25 +0000)
committerPeter Penz <peter.penz19@gmail.com>
Thu, 22 Mar 2007 19:25:44 +0000 (19:25 +0000)
svn path=/trunk/KDE/kdebase/apps/; revision=645516

src/dolphinmainwindow.cpp
src/dolphinview.cpp
src/dolphinview.h

index a2bb16b8ab8f3206b3bc7667788a56bd57b5b318..deb418681db4f7daf2d1b6895f5b4c841c8a1286 100644 (file)
@@ -585,32 +585,11 @@ void DolphinMainWindow::undo()
 \r
 void DolphinMainWindow::cut()\r
 {\r
-    QClipboard* clipboard = QApplication::clipboard();\r
-    const QMimeData* currentMimeData = clipboard->mimeData();\r
-    const bool hadCutSelection = KonqMimeData::decodeIsCutSelection(currentMimeData);\r
-\r
     QMimeData* mimeData = new QMimeData();\r
     const KUrl::List kdeUrls = m_activeView->selectedUrls();\r
     const KUrl::List mostLocalUrls;\r
     KonqMimeData::populateMimeData(mimeData, kdeUrls, mostLocalUrls, true);\r
     QApplication::clipboard()->setMimeData(mimeData);\r
-\r
-    if (hadCutSelection) {\r
-        // If an old cut selection has been applied, the view must\r
-        // be reloaded to get the original icons of the items without an\r
-        // applied item effect.\r
-        m_view[PrimaryIdx]->reload();\r
-        if (m_view[SecondaryIdx] != 0) {\r
-            m_view[SecondaryIdx]->reload();\r
-        }\r
-    }\r
-    else {\r
-        // apply an item effect for the icons of all cut items\r
-        m_view[PrimaryIdx]->updateCutItems();\r
-        if (m_view[SecondaryIdx] != 0) {\r
-            m_view[SecondaryIdx]->updateCutItems();\r
-        }\r
-    }\r
 }\r
 \r
 void DolphinMainWindow::copy()\r
index e49690a04863809e2fb701c252e875e79c0bb093..6dfdd3d7bdb84c9c9f3d25d6418ff9bfcf547265 100644 (file)
@@ -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<QIcon>(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<CutItem>::const_iterator it = m_cutItemsCache.begin();
+    QList<CutItem>::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<QIcon>(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"
index e00cc98f27f4e4260ca2d369cfc08c208e6c299c..c2d0a1cc869025d9633cf4fee5653e36fc741233 100644 (file)
@@ -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<CutItem> m_cutItemsCache;
 };
 
 #endif // _DOLPHINVIEW_H_