]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/dolphinmainwindow.cpp
Move "Filter"-action to the bottom and apply icon + shortcut
[dolphin.git] / src / dolphinmainwindow.cpp
index 722a90f9383a4b5883cafb7c28ba40a952f16e4c..54e6d8b6c39394bff578547e006c4d7dea2146b9 100644 (file)
@@ -28,6 +28,7 @@
 #include "dolphinnewfilemenu.h"
 #include "dolphinviewcontainer.h"
 #include "mainwindowadaptor.h"
+#include "panels/filter/filterpanel.h"
 #include "panels/folders/folderspanel.h"
 #include "panels/places/placespanel.h"
 #include "panels/information/informationpanel.h"
@@ -52,6 +53,7 @@
 #include <kconfig.h>
 #include <kdesktopfile.h>
 #include <kdeversion.h>
+#include <kdualaction.h>
 #include <kfiledialog.h>
 #include <kfileplacesmodel.h>
 #include <kglobal.h>
@@ -114,8 +116,14 @@ DolphinMainWindow::DolphinMainWindow(int id) :
     m_actionHandler(0),
     m_remoteEncoding(0),
     m_settingsDialog(0),
-    m_lastHandleUrlStatJob(0)
+    m_lastHandleUrlStatJob(0),
+    m_filterDockIsTemporaryVisible(false)
 {
+    // Workaround for a X11-issue in combination with KModifierInfo
+    // (see DolphinContextMenu::initializeModifierKeyInfo() for
+    // more information):
+    DolphinContextMenu::initializeModifierKeyInfo();
+
     setObjectName("Dolphin#");
 
     m_viewTab.append(ViewTab());
@@ -457,17 +465,27 @@ void DolphinMainWindow::activatePrevTab()
 void DolphinMainWindow::openInNewTab()
 {
     const KFileItemList list = m_activeViewContainer->view()->selectedItems();
-    if ((list.count() == 1) && list[0].isDir()) {
-        openNewTab(m_activeViewContainer->view()->selectedUrls()[0]);
+    if (list.isEmpty()) {
+        openNewTab(m_activeViewContainer->url());
+    } else if ((list.count() == 1) && list[0].isDir()) {
+        openNewTab(list[0].url());
     }
 }
 
 void DolphinMainWindow::openInNewWindow()
 {
+    KUrl newWindowUrl;
+
     const KFileItemList list = m_activeViewContainer->view()->selectedItems();
-    if ((list.count() == 1) && list[0].isDir()) {
+    if (list.isEmpty()) {
+        newWindowUrl = m_activeViewContainer->url();
+    } else if ((list.count() == 1) && list[0].isDir()) {
+        newWindowUrl = list[0].url();
+    }
+
+    if (!newWindowUrl.isEmpty()) {
         DolphinMainWindow* window = DolphinApplication::app()->createMainWindow();
-        window->changeUrl(m_activeViewContainer->view()->selectedUrls()[0]);
+        window->changeUrl(newWindowUrl);
         window->show();
     }
 }
@@ -554,6 +572,14 @@ void DolphinMainWindow::closeEvent(QCloseEvent* event)
 
     settings.save();
 
+    if (m_filterDockIsTemporaryVisible) {
+        QDockWidget* filterDock = findChild<QDockWidget*>("filterDock");
+        if (filterDock != 0) {
+            filterDock->hide();
+        }
+        m_filterDockIsTemporaryVisible = false;
+    }
+
     KXmlGuiWindow::closeEvent(event);
 }
 
@@ -786,6 +812,17 @@ void DolphinMainWindow::reloadView()
 
 void DolphinMainWindow::stopLoading()
 {
+    m_activeViewContainer->view()->stopLoading();
+}
+
+void DolphinMainWindow::enableStopAction()
+{
+    actionCollection()->action("stop")->setEnabled(true);
+}
+
+void DolphinMainWindow::disableStopAction()
+{
+    actionCollection()->action("stop")->setEnabled(false);
 }
 
 void DolphinMainWindow::toggleFilterBarVisibility(bool show)
@@ -886,30 +923,31 @@ void DolphinMainWindow::compareFiles()
 
     KUrl urlA;
     KUrl urlB;
-    KUrl::List urls = m_viewTab[m_tabIndex].primaryView->view()->selectedUrls();
 
-    switch (urls.count()) {
+    KFileItemList items = m_viewTab[m_tabIndex].primaryView->view()->selectedItems();
+
+    switch (items.count()) {
     case 0: {
         Q_ASSERT(m_viewTab[m_tabIndex].secondaryView != 0);
-        urls = m_viewTab[m_tabIndex].secondaryView->view()->selectedUrls();
-        Q_ASSERT(urls.count() == 2);
-        urlA = urls[0];
-        urlB = urls[1];
+        items = m_viewTab[m_tabIndex].secondaryView->view()->selectedItems();
+        Q_ASSERT(items.count() == 2);
+        urlA = items[0].url();
+        urlB = items[1].url();
         break;
     }
 
     case 1: {
-        urlA = urls[0];
+        urlA = items[0].url();
         Q_ASSERT(m_viewTab[m_tabIndex].secondaryView != 0);
-        urls = m_viewTab[m_tabIndex].secondaryView->view()->selectedUrls();
-        Q_ASSERT(urls.count() == 1);
-        urlB = urls[0];
+        items = m_viewTab[m_tabIndex].secondaryView->view()->selectedItems();
+        Q_ASSERT(items.count() == 1);
+        urlB = items[0].url();
         break;
     }
 
     case 2: {
-        urlA = urls[0];
-        urlB = urls[1];
+        urlA = items[0].url();
+        urlB = items[1].url();
         break;
     }
 
@@ -953,7 +991,7 @@ void DolphinMainWindow::openTerminal()
 void DolphinMainWindow::editSettings()
 {
     if (m_settingsDialog == 0) {
-        const KUrl& url = activeViewContainer()->url();
+        const KUrl url = activeViewContainer()->url();
         m_settingsDialog = new DolphinSettingsDialog(url, this);
         m_settingsDialog->setAttribute(Qt::WA_DeleteOnClose);
         m_settingsDialog->show();
@@ -1162,13 +1200,52 @@ void DolphinMainWindow::slotWriteStateChanged(bool isFolderWritable)
     newFileMenu()->setEnabled(isFolderWritable);
 }
 
+void DolphinMainWindow::slotSearchModeChanged(bool enabled)
+{
+    QDockWidget* filterDock = findChild<QDockWidget*>("filterDock");
+    if (filterDock == 0) {
+        return;
+    }
+
+    if (enabled) {
+        if (!filterDock->isVisible()) {
+            m_filterDockIsTemporaryVisible = true;
+        }
+        filterDock->show();
+    } else {
+        if (filterDock->isVisible() && m_filterDockIsTemporaryVisible) {
+            filterDock->hide();
+        }
+        m_filterDockIsTemporaryVisible = false;
+    }
+}
+
 void DolphinMainWindow::openContextMenu(const KFileItem& item,
                                         const KUrl& url,
                                         const QList<QAction*>& customActions)
 {
-    DolphinContextMenu contextMenu(this, item, url);
-    contextMenu.setCustomActions(customActions);
-    contextMenu.open();
+    QPointer<DolphinContextMenu> contextMenu = new DolphinContextMenu(this, item, url);
+    contextMenu->setCustomActions(customActions);
+    const DolphinContextMenu::Command command = contextMenu->open();
+
+    switch (command) {
+    case DolphinContextMenu::OpenParentFolderInNewWindow: {
+        DolphinMainWindow* window = DolphinApplication::app()->createMainWindow();
+        window->changeUrl(item.url().upUrl());
+        window->show();
+        break;
+    }
+
+    case DolphinContextMenu::OpenParentFolderInNewTab:
+        openNewTab(item.url().upUrl());
+        break;
+
+    case DolphinContextMenu::None:
+    default:
+        break;
+    }
+
+    delete contextMenu;
 }
 
 void DolphinMainWindow::init()
@@ -1190,7 +1267,7 @@ void DolphinMainWindow::init()
 
     setupActions();
 
-    const KUrl& homeUrl = generalSettings->homeUrl();
+    const KUrl homeUrl(generalSettings->homeUrl());
     setUrlAsCaption(homeUrl);
     m_actionHandler = new DolphinViewActionHandler(actionCollection(), this);
     connect(m_actionHandler, SIGNAL(actionBeingHandled()), SLOT(clearStatusBar()));
@@ -1294,9 +1371,9 @@ void DolphinMainWindow::setActiveViewContainer(DolphinViewContainer* viewContain
     updateViewActions();
     updateGoActions();
 
-    const KUrl& url = m_activeViewContainer->url();
+    const KUrl url = m_activeViewContainer->url();
     setUrlAsCaption(url);
-    if (m_viewTab.count() > 1 && m_viewTab[m_tabIndex].secondaryView != 0) {
+    if (m_viewTab.count() > 1) {
         m_tabBar->setTabText(m_tabIndex, tabName(url));
         m_tabBar->setTabIcon(m_tabIndex, KIcon(KMimeType::iconNameForUrl(url)));
     }
@@ -1443,7 +1520,7 @@ void DolphinMainWindow::setupActions()
     connect(openTerminal, SIGNAL(triggered()), this, SLOT(openTerminal()));
 
     // setup 'Settings' menu
-    m_showMenuBar = KStandardAction::showMenubar(this, SLOT(toggleShowMenuBar()), actionCollection());
+    m_showMenuBar = KStandardAction::showHideMenubar(this, SLOT(toggleShowMenuBar()), actionCollection());
     KStandardAction::preferences(this, SLOT(editSettings()), actionCollection());
 
     // not in menu actions
@@ -1535,12 +1612,32 @@ void DolphinMainWindow::setupDockWidgets()
             terminalPanel, SLOT(setUrl(KUrl)));
 #endif
 
+    // setup "Filter"
+#ifdef HAVE_NEPOMUK
+    QDockWidget* filterDock = new QDockWidget(i18nc("@title:window", "Filter"));
+    filterDock->setObjectName("filterDock");
+    filterDock->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);
+    Panel* filterPanel = new FilterPanel(filterDock);
+    connect(filterPanel, SIGNAL(urlActivated(KUrl)), this, SLOT(handleUrl(KUrl)));
+    filterDock->setWidget(filterPanel);
+
+    QAction* filterAction = filterDock->toggleViewAction();
+    filterAction->setShortcut(Qt::Key_F12);
+    filterAction->setIcon(KIcon("view-filter"));
+    addDockWidget(Qt::RightDockWidgetArea, filterDock);
+    connect(this, SIGNAL(urlChanged(KUrl)),
+           filterPanel, SLOT(setUrl(KUrl)));
+#endif
+
     const bool firstRun = DolphinSettings::instance().generalSettings()->firstRun();
     if (firstRun) {
         infoDock->hide();
         foldersDock->hide();
 #ifndef Q_OS_WIN
         terminalDock->hide();
+#endif
+#ifdef HAVE_NEPOMUK
+        filterDock->hide();
 #endif
     }
 
@@ -1573,6 +1670,9 @@ void DolphinMainWindow::setupDockWidgets()
 #ifndef Q_OS_WIN
     panelsMenu->addAction(terminalAction);
 #endif
+#ifdef HAVE_NEPOMUK
+    panelsMenu->addAction(filterAction);
+#endif
 }
 
 void DolphinMainWindow::updateEditActions()
@@ -1619,7 +1719,7 @@ void DolphinMainWindow::updateViewActions()
 void DolphinMainWindow::updateGoActions()
 {
     QAction* goUpAction = actionCollection()->action(KStandardAction::name(KStandardAction::Up));
-    const KUrl& currentUrl = m_activeViewContainer->url();
+    const KUrl currentUrl = m_activeViewContainer->url();
     goUpAction->setEnabled(currentUrl.upUrl() != currentUrl);
 }
 
@@ -1672,6 +1772,8 @@ void DolphinMainWindow::connectViewSignals(DolphinViewContainer* container)
             this, SLOT(updateFilterBarAction(bool)));
     connect(container, SIGNAL(writeStateChanged(bool)),
             this, SLOT(slotWriteStateChanged(bool)));
+    connect(container, SIGNAL(searchModeChanged(bool)),
+            this, SLOT(slotSearchModeChanged(bool)));
 
     DolphinView* view = container->view();
     connect(view, SIGNAL(selectionChanged(KFileItemList)),
@@ -1684,6 +1786,10 @@ void DolphinMainWindow::connectViewSignals(DolphinViewContainer* container)
             this, SLOT(openNewTab(const KUrl&)));
     connect(view, SIGNAL(requestContextMenu(KFileItem, const KUrl&, const QList<QAction*>&)),
             this, SLOT(openContextMenu(KFileItem, const KUrl&, const QList<QAction*>&)));
+    connect(view, SIGNAL(startedPathLoading(KUrl)),
+            this, SLOT(enableStopAction()));
+    connect(view, SIGNAL(finishedPathLoading(KUrl)),
+            this, SLOT(disableStopAction()));
 
     const KUrlNavigator* navigator = container->urlNavigator();
     connect(navigator, SIGNAL(urlChanged(const KUrl&)),