diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -190,6 +190,7 @@ ########################################## set(dolphinstatic_SRCS + dolphinbookmarkhandler.cpp dolphindockwidget.cpp dolphinmainwindow.cpp dolphinviewcontainer.cpp diff --git a/src/dolphinbookmarkhandler.h b/src/dolphinbookmarkhandler.h new file mode 100644 --- /dev/null +++ b/src/dolphinbookmarkhandler.h @@ -0,0 +1,61 @@ +/*************************************************************************** + * Copyright (C) 2019 by David Hallas * + * * + * 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 DOLPHINBOOKMARKHANDLER_H +#define DOLPHINBOOKMARKHANDLER_H + +#include +#include + +class DolphinMainWindow; +class DolphinViewContainer; +class KActionCollection; +class KBookmarkManager; +class KBookmarkMenu; +class QMenu; + +class DolphinBookmarkHandler : public QObject, public KBookmarkOwner +{ + Q_OBJECT +public: + DolphinBookmarkHandler(DolphinMainWindow *mainWindow, KActionCollection *collection, QMenu *menu, QObject *parent); + ~DolphinBookmarkHandler() override; + void fillControlMenu(QMenu *menu, KActionCollection *collection); +private: + QString currentTitle() const override; + QUrl currentUrl() const override; + QString currentIcon() const override; + bool supportsTabs() const override; + QList currentBookmarkList() const override; + bool enableOption(BookmarkOption option) const override; + void openBookmark(const KBookmark &bm, Qt::MouseButtons, Qt::KeyboardModifiers) override; + void openFolderinTabs(const KBookmarkGroup &bm) override; + void openInNewTab(const KBookmark &bm) override; + void openInNewWindow(const KBookmark &bm) override; + QString getTitle(DolphinViewContainer* viewContainer) const; + QUrl getUrl(DolphinViewContainer* viewContainer) const; + QString getIcon(DolphinViewContainer* viewContainer) const; +private: + DolphinMainWindow* m_mainWindow; + KBookmarkManager *m_bookmarkManager; + QScopedPointer m_bookmarkMenu; + QScopedPointer m_bookmarkControlMenu; +}; + +#endif // DOLPHINBOOKMARKHANDLER_H diff --git a/src/dolphinbookmarkhandler.cpp b/src/dolphinbookmarkhandler.cpp new file mode 100644 --- /dev/null +++ b/src/dolphinbookmarkhandler.cpp @@ -0,0 +1,132 @@ +/*************************************************************************** + * Copyright (C) 2019 by David Hallas * + * * + * 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 "dolphinbookmarkhandler.h" +#include "dolphinmainwindow.h" +#include "dolphinviewcontainer.h" +#include "global.h" +#include +#include +#include +#include + +DolphinBookmarkHandler::DolphinBookmarkHandler(DolphinMainWindow *mainWindow, + KActionCollection* collection, + QMenu* menu, + QObject* parent) : + QObject(parent), + m_mainWindow(mainWindow) +{ + QString bookmarksFile = QStandardPaths::locate(QStandardPaths::GenericDataLocation, + QStringLiteral("dolphin/bookmarks.xml")); + if (bookmarksFile.isEmpty()) { + bookmarksFile = QStringLiteral("%1/dolphin").arg(QStandardPaths::writableLocation( + QStandardPaths::GenericDataLocation)); + QDir().mkpath(bookmarksFile); + bookmarksFile += QStringLiteral("/bookmarks.xml"); + } + m_bookmarkManager = KBookmarkManager::managerForFile(bookmarksFile, QStringLiteral("dolphin")); + m_bookmarkManager->setUpdate(true); + m_bookmarkMenu.reset(new KBookmarkMenu(m_bookmarkManager, this, menu, collection)); +} + +DolphinBookmarkHandler::~DolphinBookmarkHandler() +{ +} + +void DolphinBookmarkHandler::fillControlMenu(QMenu* menu, KActionCollection* collection) +{ + m_bookmarkControlMenu.reset(new KBookmarkMenu(m_bookmarkManager, this, menu, collection)); +} + +QString DolphinBookmarkHandler::currentTitle() const +{ + return getTitle(m_mainWindow->activeViewContainer()); +} + +QUrl DolphinBookmarkHandler::currentUrl() const +{ + return getUrl(m_mainWindow->activeViewContainer()); +} + +QString DolphinBookmarkHandler::currentIcon() const +{ + return getIcon(m_mainWindow->activeViewContainer()); +} + +bool DolphinBookmarkHandler::supportsTabs() const +{ + return true; +} + +QList DolphinBookmarkHandler::currentBookmarkList() const +{ + QList allViewContainers = m_mainWindow->allViewContainers(); + QList bookmarks; + bookmarks.reserve(allViewContainers.size()); + for (int i = 0; i < allViewContainers.size(); ++i) { + DolphinViewContainer* viewContainer = allViewContainers.at(i); + bookmarks << FutureBookmark(getTitle(viewContainer), getUrl(viewContainer), getIcon(viewContainer)); + } + return bookmarks; +} + +bool DolphinBookmarkHandler::enableOption(KBookmarkOwner::BookmarkOption option) const +{ + switch (option) { + case BookmarkOption::ShowAddBookmark: return true; + case BookmarkOption::ShowEditBookmark: return true; + } + return false; +} + +void DolphinBookmarkHandler::openBookmark(const KBookmark& bm, Qt::MouseButtons, Qt::KeyboardModifiers) +{ + m_mainWindow->changeUrl(bm.url()); +} + +void DolphinBookmarkHandler::openFolderinTabs(const KBookmarkGroup& bm) +{ + m_mainWindow->openDirectories(bm.groupUrlList(), false); +} + +void DolphinBookmarkHandler::openInNewTab(const KBookmark& bm) +{ + m_mainWindow->openNewTabAfterCurrentTab(bm.url()); +} + +void DolphinBookmarkHandler::openInNewWindow(const KBookmark& bm) +{ + Dolphin::openNewWindow({bm.url()}, m_mainWindow); +} + +QString DolphinBookmarkHandler::getTitle(DolphinViewContainer* viewContainer) const +{ + return viewContainer->caption(); +} + +QUrl DolphinBookmarkHandler::getUrl(DolphinViewContainer* viewContainer) const +{ + return viewContainer->url(); +} + +QString DolphinBookmarkHandler::getIcon(DolphinViewContainer* viewContainer) const +{ + return KIO::iconNameForUrl(viewContainer->url()); +} diff --git a/src/dolphinmainwindow.h b/src/dolphinmainwindow.h --- a/src/dolphinmainwindow.h +++ b/src/dolphinmainwindow.h @@ -35,6 +35,7 @@ typedef KIO::FileUndoManager::CommandType CommandType; +class DolphinBookmarkHandler; class DolphinViewActionHandler; class DolphinSettingsDialog; class DolphinViewContainer; @@ -71,6 +72,11 @@ */ DolphinViewContainer* activeViewContainer() const; + /** + * Returns all view container for all tabs + */ + QList allViewContainers() const; + /** * Opens each directory in \p dirs in a separate tab. If \a splitView is set, * 2 directories are collected within one tab. @@ -118,6 +124,16 @@ /** Stores all settings and quits Dolphin. */ void quit(); + /** + * Opens a new tab and places it after the current tab + */ + void openNewTabAfterCurrentTab(const QUrl& url); + + /** + * Opens a new tab and places it as the last tab + */ + void openNewTabAfterLastTab(const QUrl& url); + signals: /** * Is sent if the selection of the currently active view has @@ -330,16 +346,6 @@ */ void openNewTab(const QUrl& url, DolphinTabWidget::TabPlacement tabPlacement); - /** - * Opens a new tab and places it after the current tab - */ - void openNewTabAfterCurrentTab(const QUrl& url); - - /** - * Opens a new tab and places it as the last tab - */ - void openNewTabAfterLastTab(const QUrl& url); - /** * Opens the selected folder in a new tab. */ @@ -522,6 +528,7 @@ DolphinViewActionHandler* m_actionHandler; DolphinRemoteEncoding* m_remoteEncoding; QPointer m_settingsDialog; + DolphinBookmarkHandler* m_bookmarkHandler; // Members for the toolbar menu that is shown when the menubar is hidden: QToolButton* m_controlButton; diff --git a/src/dolphinmainwindow.cpp b/src/dolphinmainwindow.cpp --- a/src/dolphinmainwindow.cpp +++ b/src/dolphinmainwindow.cpp @@ -23,6 +23,7 @@ #include "config-terminal.h" #include "global.h" +#include "dolphinbookmarkhandler.h" #include "dolphindockwidget.h" #include "dolphincontextmenu.h" #include "dolphinnewfilemenu.h" @@ -94,6 +95,7 @@ m_actionHandler(nullptr), m_remoteEncoding(nullptr), m_settingsDialog(), + m_bookmarkHandler(nullptr), m_controlButton(nullptr), m_updateToolBarTimer(nullptr), m_lastHandleUrlStatJob(nullptr), @@ -183,6 +185,16 @@ { } +QList DolphinMainWindow::allViewContainers() const +{ + QList viewContainers; + viewContainers.reserve(m_tabWidget->count()); + for (int i = 0; i < m_tabWidget->count(); ++i) { + viewContainers << m_tabWidget->tabPageAt(i)->activeViewContainer(); + } + return viewContainers; +} + void DolphinMainWindow::openDirectories(const QList& dirs, bool splitView) { m_tabWidget->openDirectories(dirs, splitView); @@ -980,6 +992,11 @@ goMenu->addAction(ac->action(QStringLiteral("closed_tabs"))); menu->addMenu(goMenu); + // Add "Bookmarks" menu + KActionMenu *bookmarkMenu = new KActionMenu(i18nc("@title:menu", "&Bookmarks"), menu); + m_bookmarkHandler->fillControlMenu(bookmarkMenu->menu(), ac); + addActionToMenu(bookmarkMenu, menu); + // Add "Tool" menu QMenu* toolsMenu = new QMenu(i18nc("@action:inmenu", "Tools"), menu); toolsMenu->addAction(ac->action(QStringLiteral("show_filter_bar"))); @@ -1237,6 +1254,11 @@ } #endif + // setup 'Bookmarks' menu + KActionMenu *bookmarkMenu = new KActionMenu(i18nc("@title:menu", "&Bookmarks"), this); + m_bookmarkHandler = new DolphinBookmarkHandler(this, actionCollection(), bookmarkMenu->menu(), this); + actionCollection()->addAction(QStringLiteral("bookmarks"), bookmarkMenu); + // setup 'Settings' menu KToggleAction* showMenuBar = KStandardAction::showMenubar(nullptr, nullptr, actionCollection()); connect(showMenuBar, &KToggleAction::triggered, // Fixes #286822 diff --git a/src/dolphinui.rc b/src/dolphinui.rc --- a/src/dolphinui.rc +++ b/src/dolphinui.rc @@ -1,5 +1,5 @@ - + @@ -43,6 +43,7 @@ +