tabs menu related code from DolphinMainWindow in a new class.
The DolphinRecentTabsMenu remembers the tab configuration if a
tab has been closed.
REVIEW: 118805
dolphinmainwindow.cpp
dolphinviewcontainer.cpp
dolphincontextmenu.cpp
+ dolphinrecenttabsmenu.cpp
filterbar/filterbar.cpp
main.cpp
panels/information/filemetadataconfigurationdialog.cpp
#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"
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),
}
}
-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));
// 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();
}
}
+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);
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)));
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);
#include <kio/fileundomanager.h>
#include <ksortablelist.h>
#include <kxmlguiwindow.h>
-#include <KActionMenu>
#include <KIcon>
#include <QList>
*/
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);
*/
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);
*/
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
*/
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
};
KNewFileMenu* m_newFileMenu;
- KActionMenu* m_recentTabsMenu;
KTabBar* m_tabBar;
DolphinViewContainer* m_activeViewContainer;
QVBoxLayout* m_centralWidgetLayout;
--- /dev/null
+/***************************************************************************
+ * 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
--- /dev/null
+/***************************************************************************
+ * 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