]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/views/dolphinview.cpp
Enable "menu key" functionality
[dolphin.git] / src / views / dolphinview.cpp
index 6312d27cf53d8a173fc04a447cb13363a77b5b4d..8730746534d5e5ad157110b99078222c1a18d105 100644 (file)
@@ -64,7 +64,6 @@
 #include "dolphinitemlistcontainer.h"
 #include "draganddrophelper.h"
 #include "renamedialog.h"
-#include "settings/dolphinsettings.h"
 #include "versioncontrol/versioncontrolobserver.h"
 #include "viewmodecontroller.h"
 #include "viewproperties.h"
@@ -100,39 +99,6 @@ DolphinView::DolphinView(const KUrl& url, QWidget* parent) :
     m_topLayout->setSpacing(0);
     m_topLayout->setMargin(0);
 
-    //m_dolphinViewController = new DolphinViewController(this);
-
-    //m_viewModeController = new ViewModeController(this);
-    //m_viewModeController->setUrl(url);
-
-    /*connect(m_viewModeController, SIGNAL(urlChanged(KUrl)),
-            this, SIGNAL(urlChanged(KUrl)));
-
-    connect(m_dolphinViewController, SIGNAL(requestContextMenu(QPoint,QList<QAction*>)),
-            this, SLOT(openContextMenu(QPoint,QList<QAction*>)));
-    connect(m_dolphinViewController, SIGNAL(urlsDropped(KFileItem,KUrl,QDropEvent*)),
-            this, SLOT(dropUrls(KFileItem,KUrl,QDropEvent*)));
-    connect(m_dolphinViewController, SIGNAL(sortingChanged(DolphinView::Sorting)),
-            this, SLOT(updateSorting(DolphinView::Sorting)));
-    connect(m_dolphinViewController, SIGNAL(sortOrderChanged(Qt::SortOrder)),
-            this, SLOT(updateSortOrder(Qt::SortOrder)));
-    connect(m_dolphinViewController, SIGNAL(sortFoldersFirstChanged(bool)),
-            this, SLOT(updateSortFoldersFirst(bool)));
-    connect(m_dolphinViewController, SIGNAL(additionalInfoChanged(QList<DolphinView::AdditionalInfo>)),
-            this, SLOT(updateAdditionalInfo(QList<DolphinView::AdditionalInfo>)));*/
-    //connect(m_dolphinViewController, SIGNAL(itemActivated(KFileItem)),
-    //        this, SLOT(triggerItem(KFileItem)));
-    //connect(m_dolphinViewController, SIGNAL(tabRequested(KUrl)),
-    //        this, SIGNAL(tabRequested(KUrl)));
-    /*connect(m_dolphinViewController, SIGNAL(activated()),
-            this, SLOT(activate()));
-    connect(m_dolphinViewController, SIGNAL(itemEntered(KFileItem)),
-            this, SLOT(showHoverInformation(KFileItem)));
-    connect(m_dolphinViewController, SIGNAL(viewportEntered()),
-            this, SLOT(clearHoverInformation()));
-    connect(m_dolphinViewController, SIGNAL(urlChangeRequested(KUrl)),
-            this, SLOT(slotUrlChangeRequested(KUrl)));*/
-
     // When a new item has been created by the "Create New..." menu, the item should
     // get selected and it must be assured that the item will get visible. As the
     // creation is done asynchronously, several signals must be checked:
@@ -165,16 +131,19 @@ DolphinView::DolphinView(const KUrl& url, QWidget* parent) :
     m_container = new DolphinItemListContainer(m_dirLister, this);
     m_container->setVisibleRoles(QList<QByteArray>() << "name");
     m_container->installEventFilter(this);
+    setFocusProxy(m_container);
 
     KItemListController* controller = m_container->controller();
     controller->setSelectionBehavior(KItemListController::MultiSelection);
-    connect(controller, SIGNAL(itemActivated(int)),
-            this, SLOT(slotItemActivated(int)));
+    if (GeneralSettings::autoExpandFolders()) {
+        controller->setAutoActivationDelay(750);
+    }
+    connect(controller, SIGNAL(itemActivated(int)), this, SLOT(slotItemActivated(int)));
+    connect(controller, SIGNAL(itemsActivated(QSet<int>)), this, SLOT(slotItemsActivated(QSet<int>)));
     connect(controller, SIGNAL(itemMiddleClicked(int)), this, SLOT(slotItemMiddleClicked(int)));
     connect(controller, SIGNAL(itemContextMenuRequested(int,QPointF)), this, SLOT(slotItemContextMenuRequested(int,QPointF)));
     connect(controller, SIGNAL(viewContextMenuRequested(QPointF)), this, SLOT(slotViewContextMenuRequested(QPointF)));
     connect(controller, SIGNAL(headerContextMenuRequested(QPointF)), this, SLOT(slotHeaderContextMenuRequested(QPointF)));
-    connect(controller, SIGNAL(itemExpansionToggleClicked(int)), this, SLOT(slotItemExpansionToggleClicked(int)));
     connect(controller, SIGNAL(itemHovered(int)), this, SLOT(slotItemHovered(int)));
     connect(controller, SIGNAL(itemUnhovered(int)), this, SLOT(slotItemUnhovered(int)));
     connect(controller, SIGNAL(itemDropEvent(int,QGraphicsSceneDragDropEvent*)), this, SLOT(slotItemDropEvent(int,QGraphicsSceneDragDropEvent*)));
@@ -225,25 +194,20 @@ void DolphinView::setActive(bool active)
         color.setAlpha(150);
     }
 
-    /*QAbstractItemView* view = m_viewAccessor.itemView();
-    QWidget* viewport = view ? view->viewport() : 0;
+    QWidget* viewport = m_container->viewport();
     if (viewport) {
         QPalette palette;
         palette.setColor(viewport->backgroundRole(), color);
         viewport->setPalette(palette);
-    }*/
+    }
 
     update();
 
     if (active) {
-        //if (view) {
-        //    view->setFocus();
-        //}
+        m_container->setFocus();
         emit activated();
         emit writeStateChanged(m_isFolderWritable);
     }
-
-    //m_viewModeController->indicateActivationChange(active);
 }
 
 bool DolphinView::isActive() const
@@ -377,7 +341,7 @@ void DolphinView::setItemSelectionEnabled(const QRegExp& pattern, bool enabled)
 
     for (int index = 0; index < model->count(); index++) {
         const KFileItem item = model->fileItem(index);
-        if (pattern.exactMatch(item.name())) {
+        if (pattern.exactMatch(item.text())) {
             // An alternative approach would be to store the matching items in a QSet<int> and
             // select them in one go after the loop, but we'd need a new function
             // KItemListSelectionManager::setSelected(QSet<int>, SelectionMode mode)
@@ -495,13 +459,12 @@ void DolphinView::refresh()
 
 void DolphinView::setNameFilter(const QString& nameFilter)
 {
-    Q_UNUSED(nameFilter);
-    //m_viewModeController->setNameFilter(nameFilter);
+    fileItemModel()->setNameFilter(nameFilter);
 }
 
 QString DolphinView::nameFilter() const
 {
-    return QString(); //m_viewModeController->nameFilter();
+    return fileItemModel()->nameFilter();
 }
 
 void DolphinView::calculateItemCount(int& fileCount,
@@ -629,6 +592,8 @@ void DolphinView::renameSelectedItems()
         return;
     }
 
+    // TODO: The new view-engine introduced with Dolphin 2.0 does not support inline
+    // renaming yet.
     /*if ((itemCount == 1) && DolphinSettings::instance().generalSettings()->renameInline()) {
         const QModelIndex dirIndex = m_viewAccessor.dirModel()->indexForItem(items.first());
         const QModelIndex proxyIndex = m_viewAccessor.proxyModel()->mapFromSource(dirIndex);
@@ -729,22 +694,30 @@ void DolphinView::activate()
 
 void DolphinView::slotItemActivated(int index)
 {
-    Q_UNUSED(index);
+    const KFileItem item = fileItemModel()->fileItem(index);
+    if (!item.isNull()) {
+        emit itemActivated(item);
+    }
+}
 
-    const KFileItemList items = selectedItems();
-    if (items.isEmpty()) {
-        return;
+void DolphinView::slotItemsActivated(const QSet<int>& indexes)
+{
+    Q_ASSERT(indexes.count() >= 2);
+
+    KFileItemList items;
+
+    KFileItemModel* model = fileItemModel();
+    QSetIterator<int> it(indexes);
+    while (it.hasNext()) {
+        const int index = it.next();
+        items.append(model->fileItem(index));
     }
 
-    if (items.count() == 1) {
-        emit itemActivated(items.at(0)); // caught by DolphinViewContainer or DolphinPart
-    } else {
-        foreach (const KFileItem& item, items) {
-            if (item.isDir()) {
-                emit tabRequested(item.url());
-            } else {
-                emit itemActivated(item);
-            }
+    foreach (const KFileItem& item, items) {
+        if (item.isDir()) {
+            emit tabRequested(item.url());
+        } else {
+            emit itemActivated(item);
         }
     }
 }
@@ -824,23 +797,12 @@ void DolphinView::slotHeaderContextMenuRequested(const QPointF& pos)
     delete menu.data();
 }
 
-void DolphinView::slotItemExpansionToggleClicked(int index)
-{
-    // TODO: When doing a model->setExpanded(false) it should
-    // be checked here whether the current index is part of the
-    // closed sub-tree. If this is the case, the current index
-    // should be adjusted to the parent index.
-    KFileItemModel* model = fileItemModel();
-    const bool expanded = model->isExpanded(index);
-    model->setExpanded(index, !expanded);
-}
-
 void DolphinView::slotItemHovered(int index)
 {
     const KFileItem item = fileItemModel()->fileItem(index);
 
     if (GeneralSettings::showToolTips()) {
-        QRectF itemRect = m_container->controller()->view()->itemRect(index);
+        QRectF itemRect = m_container->controller()->view()->itemContextRect(index);
         const QPoint pos = m_container->mapToGlobal(itemRect.topLeft().toPoint());
         itemRect.moveTo(pos);
 
@@ -869,7 +831,7 @@ void DolphinView::slotItemDropEvent(int index, QGraphicsSceneDragDropEvent* even
                          event->buttons(),
                          event->modifiers());
 
-    DragAndDropHelper::dropUrls(destItem, url(), &dropEvent, this);
+    DragAndDropHelper::dropUrls(destItem, url(), &dropEvent);
 }
 
 void DolphinView::slotModelChanged(KItemModelBase* current, KItemModelBase* previous)
@@ -988,6 +950,7 @@ void DolphinView::saveState(QDataStream& stream)
     const int currentIndex = m_container->controller()->selectionManager()->currentItem();
     if (currentIndex != -1) {
         KFileItem item = fileItemModel()->fileItem(currentIndex);
+        Q_ASSERT(!item.isNull()); // If the current index is valid a item must exist
         KUrl currentItemUrl = item.url();
         stream << currentItemUrl;
     } else {
@@ -1163,9 +1126,23 @@ void DolphinView::applyViewProperties()
     m_container->beginTransaction();
 
     const ViewProperties props(url());
+    KFileItemModel* model = fileItemModel();
 
     const Mode mode = props.viewMode();
     if (m_mode != mode) {
+        // Prevent an animated transition of the position and size of the items when switching
+        // the view-mode by temporary clearing the model and updating it again after the view mode
+        // has been modified.
+        const bool restoreModel = (model->count() > 0);
+        if (restoreModel) {
+            const int currentItemIndex = m_container->controller()->selectionManager()->currentItem();
+            if (currentItemIndex >= 0) {
+                m_currentItemUrl = model->fileItem(currentItemIndex).url();
+            }
+            m_selectedUrls = selectedItems().urlList();
+            model->clear();
+        }
+
         const Mode previousMode = m_mode;
         m_mode = mode;
 
@@ -1186,6 +1163,10 @@ void DolphinView::applyViewProperties()
         if (m_container->zoomLevel() != oldZoomLevel) {
             emit zoomLevelChanged(m_container->zoomLevel(), oldZoomLevel);
         }
+
+        if (restoreModel) {
+            loadDirectory(url());
+        }
     }
 
     const bool hiddenFilesShown = props.hiddenFilesShown();
@@ -1195,8 +1176,6 @@ void DolphinView::applyViewProperties()
         emit hiddenFilesShownChanged(hiddenFilesShown);
     }
 
-    KFileItemModel* model = fileItemModel();
-
     const bool groupedSorting = props.groupedSorting();
     if (groupedSorting != model->groupedSorting()) {
         model->setGroupedSorting(groupedSorting);