]> cloud.milkyroute.net Git - dolphin.git/commitdiff
Implemented DolphinRecentTabsMenu to encapsulate the recent
authorEmmanuel Pescosta <emmanuelpescosta099@gmail.com>
Thu, 19 Jun 2014 20:04:36 +0000 (22:04 +0200)
committerEmmanuel Pescosta <emmanuelpescosta099@gmail.com>
Thu, 19 Jun 2014 20:04:36 +0000 (22:04 +0200)
tabs menu related code from DolphinMainWindow in a new class.

The DolphinRecentTabsMenu remembers the tab configuration if a
tab has been closed.

REVIEW: 118805

src/CMakeLists.txt
src/dolphinmainwindow.cpp
src/dolphinmainwindow.h
src/dolphinrecenttabsmenu.cpp [new file with mode: 0644]
src/dolphinrecenttabsmenu.h [new file with mode: 0644]

index 0a72721a9887be06668d02e503044daca7b53aeb..ce9d9a485d970ae05947660a38a0969e138cf113 100644 (file)
@@ -171,6 +171,7 @@ set(dolphin_SRCS
     dolphinmainwindow.cpp
     dolphinviewcontainer.cpp
     dolphincontextmenu.cpp
+    dolphinrecenttabsmenu.cpp
     filterbar/filterbar.cpp
     main.cpp
     panels/information/filemetadataconfigurationdialog.cpp
index 0ad224cbcae2760abcf1559557cbd9cbae4653d0..c60951d2c6de54ba4501b2b41eac34ae67bc0c18 100644 (file)
@@ -25,6 +25,7 @@
 #include "dolphindockwidget.h"
 #include "dolphincontextmenu.h"
 #include "dolphinnewfilemenu.h"
+#include "dolphinrecenttabsmenu.h"
 #include "dolphinviewcontainer.h"
 #include "panels/folders/folderspanel.h"
 #include "panels/places/placespanel.h"
@@ -93,19 +94,6 @@ namespace {
     const int CurrentDolphinVersion = 200;
 };
 
-/*
- * Remembers the tab configuration if a tab has been closed.
- * Each closed tab can be restored by the menu
- * "Go -> Recently Closed Tabs".
- */
-struct ClosedTab
-{
-    KUrl primaryUrl;
-    KUrl secondaryUrl;
-    bool isSplit;
-};
-Q_DECLARE_METATYPE(ClosedTab)
-
 DolphinMainWindow::DolphinMainWindow() :
     KXmlGuiWindow(0),
     m_newFileMenu(0),
@@ -739,35 +727,6 @@ void DolphinMainWindow::slotUndoAvailable(bool available)
     }
 }
 
-void DolphinMainWindow::restoreClosedTab(QAction* action)
-{
-    if (action->data().toBool()) {
-        // clear all actions except the "Empty Recently Closed Tabs"
-        // action and the separator
-        QList<QAction*> actions = m_recentTabsMenu->menu()->actions();
-        const int count = actions.size();
-        for (int i = 2; i < count; ++i) {
-            m_recentTabsMenu->menu()->removeAction(actions.at(i));
-        }
-    } else {
-        const ClosedTab closedTab = action->data().value<ClosedTab>();
-        openNewTab(closedTab.primaryUrl);
-        m_tabBar->setCurrentIndex(m_viewTab.count() - 1);
-
-        if (closedTab.isSplit) {
-            // create secondary view
-            toggleSplitView();
-            m_viewTab[m_tabIndex].secondaryView->setUrl(closedTab.secondaryUrl);
-        }
-
-        m_recentTabsMenu->removeAction(action);
-    }
-
-    if (m_recentTabsMenu->menu()->actions().count() == 2) {
-        m_recentTabsMenu->setEnabled(false);
-    }
-}
-
 void DolphinMainWindow::slotUndoTextChanged(const QString& text)
 {
     QAction* undoAction = actionCollection()->action(KStandardAction::name(KStandardAction::Undo));
@@ -1136,7 +1095,10 @@ void DolphinMainWindow::closeTab(int index)
         // previous tab before closing the tab.
         m_tabBar->setCurrentIndex((index > 0) ? index - 1 : 1);
     }
-    rememberClosedTab(index);
+
+    const KUrl primaryUrl(m_viewTab[index].primaryView->url());
+    const KUrl secondaryUrl(m_viewTab[index].secondaryView ? m_viewTab[index].secondaryView->url() : KUrl());
+    emit rememberClosedTab(primaryUrl, secondaryUrl);
 
     // delete tab
     m_viewTab[index].primaryView->deleteLater();
@@ -1434,6 +1396,18 @@ void DolphinMainWindow::slotPlaceActivated(const KUrl& url)
     }
 }
 
+void DolphinMainWindow::restoreClosedTab(const KUrl& primaryUrl, const KUrl& secondaryUrl)
+{
+    openNewActivatedTab(primaryUrl);
+
+    if (!secondaryUrl.isEmpty() && secondaryUrl.isValid()) {
+        const int index = m_tabBar->currentIndex();
+        createSecondaryView(index);
+        setActiveViewContainer(m_viewTab[index].secondaryView);
+        m_viewTab[index].secondaryView->setUrl(secondaryUrl);
+    }
+}
+
 void DolphinMainWindow::setActiveViewContainer(DolphinViewContainer* viewContainer)
 {
     Q_ASSERT(viewContainer);
@@ -1582,19 +1556,12 @@ void DolphinMainWindow::setupActions()
     backShortcut.setAlternate(Qt::Key_Backspace);
     backAction->setShortcut(backShortcut);
 
-    m_recentTabsMenu = new KActionMenu(i18n("Recently Closed Tabs"), this);
-    m_recentTabsMenu->setIcon(KIcon("edit-undo"));
-    m_recentTabsMenu->setDelayed(false);
-    actionCollection()->addAction("closed_tabs", m_recentTabsMenu);
-    connect(m_recentTabsMenu->menu(), SIGNAL(triggered(QAction*)),
-            this, SLOT(restoreClosedTab(QAction*)));
-
-    QAction* action = new QAction(i18n("Empty Recently Closed Tabs"), m_recentTabsMenu);
-    action->setIcon(KIcon("edit-clear-list"));
-    action->setData(QVariant::fromValue(true));
-    m_recentTabsMenu->addAction(action);
-    m_recentTabsMenu->addSeparator();
-    m_recentTabsMenu->setEnabled(false);
+    DolphinRecentTabsMenu* recentTabsMenu = new DolphinRecentTabsMenu(this);
+    actionCollection()->addAction("closed_tabs", recentTabsMenu);
+    connect(this, SIGNAL(rememberClosedTab(KUrl,KUrl)),
+            recentTabsMenu, SLOT(rememberClosedTab(KUrl,KUrl)));
+    connect(recentTabsMenu, SIGNAL(restoreClosedTab(KUrl,KUrl)),
+            this, SLOT(restoreClosedTab(KUrl,KUrl)));
 
     KAction* forwardAction = KStandardAction::forward(this, SLOT(goForward()), actionCollection());
     connect(forwardAction, SIGNAL(triggered(Qt::MouseButtons,Qt::KeyboardModifiers)), this, SLOT(goForward(Qt::MouseButtons)));
@@ -1903,44 +1870,6 @@ bool DolphinMainWindow::addActionToMenu(QAction* action, KMenu* menu)
     return true;
 }
 
-void DolphinMainWindow::rememberClosedTab(int index)
-{
-    KMenu* tabsMenu = m_recentTabsMenu->menu();
-
-    const QString primaryPath = m_viewTab[index].primaryView->url().path();
-    const QString iconName = KMimeType::iconNameForUrl(primaryPath);
-
-    QAction* action = new QAction(squeezedText(primaryPath), tabsMenu);
-
-    ClosedTab closedTab;
-    closedTab.primaryUrl = m_viewTab[index].primaryView->url();
-
-    if (m_viewTab[index].secondaryView) {
-        closedTab.secondaryUrl = m_viewTab[index].secondaryView->url();
-        closedTab.isSplit = true;
-    } else {
-        closedTab.isSplit = false;
-    }
-
-    action->setData(QVariant::fromValue(closedTab));
-    action->setIcon(KIcon(iconName));
-
-    // add the closed tab menu entry after the separator and
-    // "Empty Recently Closed Tabs" entry
-    if (tabsMenu->actions().size() == 2) {
-        tabsMenu->addAction(action);
-    } else {
-        tabsMenu->insertAction(tabsMenu->actions().at(2), action);
-    }
-
-    // assure that only up to 8 closed tabs are shown in the menu
-    if (tabsMenu->actions().size() > 8) {
-        tabsMenu->removeAction(tabsMenu->actions().last());
-    }
-    actionCollection()->action("closed_tabs")->setEnabled(true);
-    KAcceleratorManager::manage(tabsMenu);
-}
-
 void DolphinMainWindow::refreshViews()
 {
     Q_ASSERT(m_viewTab[m_tabIndex].primaryView);
index cb976129f344b9ce1886b1a8d70af3cfc46198f6..acf60a4f6e0a2bddcab7c0d0eea1399ad8bb2393 100644 (file)
@@ -28,7 +28,6 @@
 #include <kio/fileundomanager.h>
 #include <ksortablelist.h>
 #include <kxmlguiwindow.h>
-#include <KActionMenu>
 #include <KIcon>
 
 #include <QList>
@@ -156,6 +155,11 @@ signals:
      */
     void settingsChanged();
 
+    /**
+     * Is emitted when a tab has been closed.
+     */
+    void rememberClosedTab(const KUrl& primaryUrl, const KUrl& secondaryUrl);
+
 protected:
     /** @see QWidget::showEvent() */
     virtual void showEvent(QShowEvent* event);
@@ -192,9 +196,6 @@ private slots:
      */
     void slotUndoAvailable(bool available);
 
-    /** Invoked when an action in the recent tabs menu is clicked. */
-    void restoreClosedTab(QAction* action);
-
     /** Sets the text of the 'Undo' menu action to \a text. */
     void slotUndoTextChanged(const QString& text);
 
@@ -473,6 +474,12 @@ private slots:
      */
     void slotPlaceActivated(const KUrl& url);
 
+    /**
+     * Is called when the user wants to reopen a previously closed \a tab from
+     * the recent tabs menu.
+     */
+    void restoreClosedTab(const KUrl& primaryUrl, const KUrl& secondaryUrl);
+
 private:
     /**
      * Activates the given view, which means that
@@ -503,11 +510,6 @@ private:
      */
     bool addActionToMenu(QAction* action, KMenu* menu);
 
-    /**
-     * Adds the tab[\a index] to the closed tab menu's list of actions.
-     */
-    void rememberClosedTab(int index);
-
     /**
      * Connects the signals from the created DolphinView with
      * the DolphinViewContainer \a container with the corresponding slots of
@@ -572,7 +574,6 @@ private:
     };
 
     KNewFileMenu* m_newFileMenu;
-    KActionMenu* m_recentTabsMenu;
     KTabBar* m_tabBar;
     DolphinViewContainer* m_activeViewContainer;
     QVBoxLayout* m_centralWidgetLayout;
diff --git a/src/dolphinrecenttabsmenu.cpp b/src/dolphinrecenttabsmenu.cpp
new file mode 100644 (file)
index 0000000..a39f994
--- /dev/null
@@ -0,0 +1,96 @@
+/***************************************************************************
+ * Copyright (C) 2014 by Emmanuel Pescosta <emmanuelpescosta099@gmail.com> *
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ *   This program is distributed in the hope that it will be useful,       *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+ *   GNU General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU General Public License     *
+ *   along with this program; if not, write to the                         *
+ *   Free Software Foundation, Inc.,                                       *
+ *   51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA            *
+ ***************************************************************************/
+
+#include "dolphinrecenttabsmenu.h"
+
+#include <KLocalizedString>
+#include <KAcceleratorManager>
+#include <KMimeType>
+#include <KMenu>
+
+DolphinRecentTabsMenu::DolphinRecentTabsMenu(QObject* parent) :
+    KActionMenu(KIcon("edit-undo"), i18n("Recently Closed Tabs"), parent)
+{
+    setDelayed(false);
+    setEnabled(false);
+
+    m_clearListAction = new QAction(i18n("Empty Recently Closed Tabs"), this);
+    m_clearListAction->setIcon(KIcon("edit-clear-list"));
+    addAction(m_clearListAction);
+
+    addSeparator();
+
+    connect(menu(), SIGNAL(triggered(QAction*)),
+            this, SLOT(handleAction(QAction*)));
+}
+
+void DolphinRecentTabsMenu::rememberClosedTab(const KUrl& primaryUrl, const KUrl& secondaryUrl)
+{
+    QAction* action = new QAction(menu());
+    action->setText(primaryUrl.path());
+
+    const QString iconName = KMimeType::iconNameForUrl(primaryUrl);
+    action->setIcon(KIcon(iconName));
+
+    KUrl::List urls;
+    urls << primaryUrl;
+    urls << secondaryUrl;
+    action->setData(QVariant::fromValue(urls));
+
+    // Add the closed tab menu entry after the separator and
+    // "Empty Recently Closed Tabs" entry
+    if (menu()->actions().size() == 2) {
+        addAction(action);
+    } else {
+        insertAction(menu()->actions().at(2), action);
+    }
+
+    // Assure that only up to 6 closed tabs are shown in the menu.
+    // 8 because of clear action + separator + 6 closed tabs
+    if (menu()->actions().size() > 8) {
+        removeAction(menu()->actions().last());
+    }
+    setEnabled(true);
+    KAcceleratorManager::manage(menu());
+}
+
+void DolphinRecentTabsMenu::handleAction(QAction* action)
+{
+    if (action == m_clearListAction) {
+        // Clear all actions except the "Empty Recently Closed Tabs"
+        // action and the separator
+        QList<QAction*> actions = menu()->actions();
+        const int count = actions.size();
+        for (int i = 2; i < count; ++i) {
+            removeAction(actions.at(i));
+        }
+    } else {
+        const KUrl::List urls = action->data().value<KUrl::List>();
+        if (urls.count() == 2) {
+            emit restoreClosedTab(urls.first(), urls.last());
+        }
+        removeAction(action);
+        delete action;
+        action = 0;
+    }
+
+    if (menu()->actions().count() <= 2) {
+        setEnabled(false);
+    }
+}
\ No newline at end of file
diff --git a/src/dolphinrecenttabsmenu.h b/src/dolphinrecenttabsmenu.h
new file mode 100644 (file)
index 0000000..34d4153
--- /dev/null
@@ -0,0 +1,49 @@
+/***************************************************************************
+ * Copyright (C) 2014 by Emmanuel Pescosta <emmanuelpescosta099@gmail.com> *
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ *   This program is distributed in the hope that it will be useful,       *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+ *   GNU General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU General Public License     *
+ *   along with this program; if not, write to the                         *
+ *   Free Software Foundation, Inc.,                                       *
+ *   51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA            *
+ ***************************************************************************/
+
+#ifndef DOLPHIN_RECENT_TABS_MENU_H
+#define DOLPHIN_RECENT_TABS_MENU_H
+
+#include <KActionMenu>
+#include <KUrl>
+
+class DolphinTabPage;
+class QAction;
+
+class DolphinRecentTabsMenu : public KActionMenu
+{
+    Q_OBJECT
+
+public:
+    explicit DolphinRecentTabsMenu(QObject* parent);
+
+public slots:
+    void rememberClosedTab(const KUrl& primaryUrl, const KUrl& secondaryUrl);
+
+signals:
+    void restoreClosedTab(const KUrl& primaryUrl, const KUrl& secondaryUrl);
+
+private slots:
+    void handleAction(QAction* action);
+
+private:
+    QAction* m_clearListAction;
+};
+
+#endif
\ No newline at end of file