]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/views/dolphinview.cpp
Select files which have been pasted or dropped
[dolphin.git] / src / views / dolphinview.cpp
index f3d386b3b7f24f3602dd29bb15f969200234e925..ab81316e113605a574317adce44f84193a879397 100644 (file)
@@ -41,6 +41,7 @@
 #include <KLocale>
 #include <kitemviews/kfileitemmodel.h>
 #include <kitemviews/kfileitemlistview.h>
+#include <kitemviews/kitemlistheader.h>
 #include <kitemviews/kitemlistselectionmanager.h>
 #include <kitemviews/kitemlistview.h>
 #include <kitemviews/kitemlistcontroller.h>
@@ -161,6 +162,8 @@ DolphinView::DolphinView(const KUrl& url, QWidget* parent) :
             this, SLOT(slotSortRoleChangedByHeader(QByteArray,QByteArray)));
     connect(view, SIGNAL(visibleRolesChanged(QList<QByteArray>,QList<QByteArray>)),
             this, SLOT(slotVisibleRolesChangedByHeader(QList<QByteArray>,QList<QByteArray>)));
+    connect(view->header(), SIGNAL(columnWidthChanged(QByteArray,qreal,qreal)),
+            this, SLOT(slotHeaderColumnWidthChanged(QByteArray,qreal,qreal)));
 
     KItemListSelectionManager* selectionManager = controller->selectionManager();
     connect(selectionManager, SIGNAL(selectionChanged(QSet<int>,QSet<int>)),
@@ -774,7 +777,9 @@ void DolphinView::slotViewContextMenuRequested(const QPointF& pos)
 
 void DolphinView::slotHeaderContextMenuRequested(const QPointF& pos)
 {
-    QWeakPointer<KMenu> menu = new KMenu(QApplication::activeWindow());
+    ViewProperties props(url());
+
+    QPointer<KMenu> menu = new KMenu(QApplication::activeWindow());
 
     KItemListView* view = m_container->controller()->view();
     const QSet<QByteArray> visibleRolesSet = view->visibleRoles().toSet();
@@ -793,11 +798,11 @@ void DolphinView::slotHeaderContextMenuRequested(const QPointF& pos)
         const QString text = fileItemModel()->roleDescription(info.role);
         QAction* action = 0;
         if (info.group.isEmpty()) {
-            action = menu.data()->addAction(text);
+            action = menu->addAction(text);
         } else {
             if (!groupMenu || info.group != groupName) {
                 groupName = info.group;
-                groupMenu = menu.data()->addMenu(groupName);
+                groupMenu = menu->addMenu(groupName);
             }
 
             action = groupMenu->addAction(text);
@@ -808,24 +813,87 @@ void DolphinView::slotHeaderContextMenuRequested(const QPointF& pos)
         action->setData(info.role);
     }
 
-    QAction* action = menu.data()->exec(pos.toPoint());
-    if (action) {
-        // Show or hide the selected role
-        const QByteArray selectedRole = action->data().toByteArray();
-
-        ViewProperties props(url());
-        QList<QByteArray> visibleRoles = view->visibleRoles();
-        if (action->isChecked()) {
-            visibleRoles.append(selectedRole);
+    menu->addSeparator();
+
+    QActionGroup* widthsGroup = new QActionGroup(menu);
+    const bool autoColumnWidths = props.headerColumnWidths().isEmpty();
+
+    QAction* autoAdjustWidthsAction = menu->addAction(i18nc("@action:inmenu", "Automatic Column Widths"));
+    autoAdjustWidthsAction->setCheckable(true);
+    autoAdjustWidthsAction->setChecked(autoColumnWidths);
+    autoAdjustWidthsAction->setActionGroup(widthsGroup);
+
+    QAction* customWidthsAction = menu->addAction(i18nc("@action:inmenu", "Custom Column Widths"));
+    customWidthsAction->setCheckable(true);
+    customWidthsAction->setChecked(!autoColumnWidths);
+    customWidthsAction->setActionGroup(widthsGroup);
+
+    QAction* action = menu->exec(pos.toPoint());
+    if (menu && action) {
+        KItemListHeader* header = view->header();
+
+        if (action == autoAdjustWidthsAction) {
+            // Clear the column-widths from the viewproperties and turn on
+            // the automatic resizing of the columns
+            props.setHeaderColumnWidths(QList<int>());
+            header->setAutomaticColumnResizing(true);
+        } else if (action == customWidthsAction) {
+            // Apply the current column-widths as custom column-widths and turn
+            // off the automatic resizing of the columns
+            QList<int> columnWidths;
+            foreach (const QByteArray& role, view->visibleRoles()) {
+                columnWidths.append(header->columnWidth(role));
+            }
+            props.setHeaderColumnWidths(columnWidths);
+            header->setAutomaticColumnResizing(false);
         } else {
-            visibleRoles.removeOne(selectedRole);
+            // Show or hide the selected role
+            const QByteArray selectedRole = action->data().toByteArray();
+
+            QList<QByteArray> visibleRoles = view->visibleRoles();
+            if (action->isChecked()) {
+                visibleRoles.append(selectedRole);
+            } else {
+                visibleRoles.removeOne(selectedRole);
+            }
+
+            view->setVisibleRoles(visibleRoles);
+            props.setVisibleRoles(visibleRoles);
+
+            QList<int> columnWidths;
+            foreach (const QByteArray& role, view->visibleRoles()) {
+                columnWidths.append(header->columnWidth(role));
+            }
+            props.setHeaderColumnWidths(columnWidths);
         }
+    }
+
+    delete menu;
+}
+
+void DolphinView::slotHeaderColumnWidthChanged(const QByteArray& role, qreal current, qreal previous)
+{
+    Q_UNUSED(previous);
 
-        view->setVisibleRoles(visibleRoles);
-        props.setVisibleRoles(visibleRoles);
+    const QList<QByteArray> visibleRoles = m_container->visibleRoles();
+
+    ViewProperties props(url());
+    QList<int> columnWidths = props.headerColumnWidths();
+    if (columnWidths.count() != visibleRoles.count()) {
+        columnWidths.clear();
+        columnWidths.reserve(visibleRoles.count());
+        const KItemListHeader* header = m_container->controller()->view()->header();
+        foreach (const QByteArray& role, visibleRoles) {
+            const int width = header->columnWidth(role);
+            columnWidths.append(width);
+        }
     }
 
-    delete menu.data();
+    const int roleIndex = visibleRoles.indexOf(role);
+    Q_ASSERT(roleIndex >= 0 && roleIndex < columnWidths.count());
+    columnWidths[roleIndex] = current;
+
+    props.setHeaderColumnWidths(columnWidths);
 }
 
 void DolphinView::slotItemHovered(int index)
@@ -874,6 +942,11 @@ void DolphinView::slotItemDropEvent(int index, QGraphicsSceneDragDropEvent* even
     if (!error.isEmpty()) {
         emit errorMessage(error);
     }
+
+    if (destUrl == url()) {
+        // Mark the dropped urls as selected.
+        markPastedUrlsAsSelected(event->mimeData());
+    }
 }
 
 void DolphinView::slotModelChanged(KItemModelBase* current, KItemModelBase* previous)
@@ -1078,6 +1151,8 @@ void DolphinView::updateViewState()
     }
 
     if (!m_selectedUrls.isEmpty()) {
+        clearSelection();
+
         KItemListSelectionManager* selectionManager = m_container->controller()->selectionManager();
         QSet<int> selectedItems = selectionManager->selectedItems();
         const KFileItemModel* model = fileItemModel();
@@ -1294,6 +1369,24 @@ void DolphinView::applyViewProperties()
         }
     }
 
+    KItemListView* itemListView = m_container->controller()->view();
+    if (itemListView->isHeaderVisible()) {
+        KItemListHeader* header = itemListView->header();
+        const QList<int> headerColumnWidths = props.headerColumnWidths();
+        const int rolesCount = m_visibleRoles.count();
+        if (headerColumnWidths.count() == rolesCount) {
+            header->setAutomaticColumnResizing(false);
+
+            QHash<QByteArray, qreal> columnWidths;
+            for (int i = 0; i < rolesCount; ++i) {
+                columnWidths.insert(m_visibleRoles[i], headerColumnWidths[i]);
+            }
+            header->setColumnWidths(columnWidths);
+        } else {
+            header->setAutomaticColumnResizing(true);
+        }
+    }
+
     m_container->endTransaction();
 }
 
@@ -1331,8 +1424,13 @@ QMimeData* DolphinView::selectionMimeData() const
 
 void DolphinView::markPastedUrlsAsSelected(const QMimeData* mimeData)
 {
-    const KUrl::List urls = KUrl::List::fromMimeData(mimeData);
-    markUrlsAsSelected(urls);
+    const KUrl::List sourceUrls = KUrl::List::fromMimeData(mimeData);
+    KUrl::List destUrls;
+    foreach (const KUrl& source, sourceUrls) {
+        KUrl destination(url().url() + "/" + source.fileName());
+        destUrls << destination;
+    }
+    markUrlsAsSelected(destUrls);
 }
 
 void DolphinView::updateWritableState()