]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/dolphinview.cpp
Create shared lib as discussed with David and Peter
[dolphin.git] / src / dolphinview.cpp
index 8f06d3dc84224b9be6af51a5bc47fa4b52e08e6e..6dfdd3d7bdb84c9c9f3d25d6418ff9bfcf547265 100644 (file)
@@ -59,6 +59,7 @@ DolphinView::DolphinView(DolphinMainWindow* mainWindow,
                          bool showHiddenFiles) :
     QWidget(parent),
     m_showProgress(false),
+    m_blockContentsMovedSignal(false),
     m_mode(mode),
     m_iconSize(0),
     m_folderCount(0),
@@ -85,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&)),
@@ -460,6 +465,11 @@ bool DolphinView::hasSelection() const
     return itemView()->selectionModel()->hasSelection();
 }
 
+void DolphinView::clearSelection()
+{
+    itemView()->selectionModel()->clear();
+}
+
 KFileItemList DolphinView::selectedItems() const
 {
     const QAbstractItemView* view = itemView();
@@ -670,14 +680,14 @@ void DolphinView::triggerItem(const QModelIndex& index)
     else if (item->isFile()) {
         // allow to browse through ZIP and tar files
         KMimeType::Ptr mime = item->mimeTypePtr();
-        if (mime->is("application/x-zip")) {
+        if (mime->is("application/zip")) {
             url.setProtocol("zip");
             setUrl(url);
         }
         else if (mime->is("application/x-tar") ||
                  mime->is("application/x-tarz") ||
-                 mime->is("application/x-tbz") ||
-                 mime->is("application/x-tgz") ||
+                 mime->is("application/x-bzip-compressed-tar") ||
+                 mime->is("application/x-compressed-tar") ||
                  mime->is("application/x-tzo")) {
             url.setProtocol("tar");
             setUrl(url);
@@ -726,6 +736,7 @@ void DolphinView::updateItemCount()
 
     updateStatusBar();
 
+    m_blockContentsMovedSignal = false;
     QTimer::singleShot(0, this, SLOT(restoreContentsPos()));
 }
 
@@ -736,11 +747,6 @@ 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(0, this, SLOT(applyCutEffect()));
-    }
 }
 
 void DolphinView::showPreview(const KFileItem* item, const QPixmap& pixmap)
@@ -751,11 +757,11 @@ void DolphinView::showPreview(const KFileItem* item, const QPixmap& pixmap)
         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);
+            const QPixmap cutPixmap = iconEffect.apply(pixmap, K3Icon::Desktop, K3Icon::DisabledState);
+            m_dirModel->setData(idx, QIcon(cutPixmap), Qt::DecorationRole);
         }
         else {
-            m_dirModel->setData(idx, pixmap, Qt::DecorationRole);
+            m_dirModel->setData(idx, QIcon(pixmap), Qt::DecorationRole);
         }
     }
 }
@@ -821,6 +827,8 @@ 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);
 }
@@ -914,31 +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)) {
-            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
@@ -973,10 +956,7 @@ void DolphinView::openContextMenu(const QPoint& pos)
         item = fileItem(index);
     }
 
-    DolphinContextMenu contextMenu(m_mainWindow,
-                                   item,
-                                   url(),
-                                   selectedItems());
+    DolphinContextMenu contextMenu(m_mainWindow, item, url());
     contextMenu.open();
 }
 
@@ -1002,9 +982,6 @@ void DolphinView::dropUrls(const KUrl::List& urls,
 
     const KUrl& destination = (directory == 0) ? url() :
                                                  directory->url();
-
-    kDebug() << "DolphinView::dropUrls() - destination: " << destination.prettyUrl() << endl;
-
     dropUrls(urls, destination);
 }
 
@@ -1014,7 +991,6 @@ void DolphinView::dropUrls(const KUrl::List& urls,
     m_mainWindow->dropUrls(urls, destination);
 }
 
-
 void DolphinView::updateSorting(DolphinView::Sorting sorting)
 {
     ViewProperties props(url());
@@ -1037,7 +1013,9 @@ void DolphinView::updateSortOrder(Qt::SortOrder order)
 
 void DolphinView::emitContentsMoved()
 {
-    emit contentsMoved(contentsX(), contentsY());
+    if (!m_blockContentsMovedSignal) {
+        emit contentsMoved(contentsX(), contentsY());
+    }
 }
 
 void DolphinView::updateActivationState()
@@ -1045,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
@@ -1139,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"