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 &bookmark, Qt::MouseButtons, Qt::KeyboardModifiers) override; + void openFolderinTabs(const KBookmarkGroup &bookmarkGroup) override; + void openInNewTab(const KBookmark &bookmark) override; + void openInNewWindow(const KBookmark &bookmark) override; + static QString title(DolphinViewContainer* viewContainer); + static QUrl url(DolphinViewContainer* viewContainer); + static QString icon(DolphinViewContainer* viewContainer); +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,135 @@ +/*************************************************************************** + * 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 +#include + +DolphinBookmarkHandler::DolphinBookmarkHandler(DolphinMainWindow *mainWindow, + KActionCollection* collection, + QMenu* menu, + QObject* parent) : + QObject(parent), + m_mainWindow(mainWindow) +{ + QString bookmarksFile = QStandardPaths::locate(QStandardPaths::GenericDataLocation, + QStringLiteral("kfile/bookmarks.xml")); + if (bookmarksFile.isEmpty()) { + QString genericDataLocation = QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation); + if (genericDataLocation.isEmpty()) { + qWarning() << "GenericDataLocation is empty! Bookmarks will not be saved correctly."; + } + bookmarksFile = QStringLiteral("%1/dolphin").arg(genericDataLocation); + QDir().mkpath(bookmarksFile); + bookmarksFile += QLatin1String("/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 title(m_mainWindow->activeViewContainer()); +} + +QUrl DolphinBookmarkHandler::currentUrl() const +{ + return url(m_mainWindow->activeViewContainer()); +} + +QString DolphinBookmarkHandler::currentIcon() const +{ + return icon(m_mainWindow->activeViewContainer()); +} + +bool DolphinBookmarkHandler::supportsTabs() const +{ + return true; +} + +QList DolphinBookmarkHandler::currentBookmarkList() const +{ + const auto viewContainers = m_mainWindow->viewContainers(); + QList bookmarks; + bookmarks.reserve(viewContainers.size()); + for (const auto viewContainer : viewContainers) { + bookmarks << FutureBookmark(title(viewContainer), url(viewContainer), icon(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& bookmark, Qt::MouseButtons, Qt::KeyboardModifiers) +{ + m_mainWindow->changeUrl(bookmark.url()); +} + +void DolphinBookmarkHandler::openFolderinTabs(const KBookmarkGroup& bookmarkGroup) +{ + m_mainWindow->openDirectories(bookmarkGroup.groupUrlList(), false); +} + +void DolphinBookmarkHandler::openInNewTab(const KBookmark& bookmark) +{ + m_mainWindow->openNewTabAfterCurrentTab(bookmark.url()); +} + +void DolphinBookmarkHandler::openInNewWindow(const KBookmark& bookmark) +{ + Dolphin::openNewWindow({bookmark.url()}, m_mainWindow); +} + +QString DolphinBookmarkHandler::title(DolphinViewContainer* viewContainer) +{ + return viewContainer->caption(); +} + +QUrl DolphinBookmarkHandler::url(DolphinViewContainer* viewContainer) +{ + return viewContainer->url(); +} + +QString DolphinBookmarkHandler::icon(DolphinViewContainer* viewContainer) +{ + return KIO::iconNameForUrl(viewContainer->url()); +} diff --git a/src/dolphinmainwindow.h b/src/dolphinmainwindow.h --- a/src/dolphinmainwindow.h +++ b/src/dolphinmainwindow.h @@ -32,9 +32,11 @@ #include #include #include +#include typedef KIO::FileUndoManager::CommandType CommandType; +class DolphinBookmarkHandler; class DolphinViewActionHandler; class DolphinSettingsDialog; class DolphinViewContainer; @@ -71,6 +73,11 @@ */ DolphinViewContainer* activeViewContainer() const; + /** + * Returns view container for all tabs + */ + QVector viewContainers() 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 +125,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 +347,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 +529,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 @@ { } +QVector DolphinMainWindow::viewContainers() const +{ + QVector 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); @@ -982,6 +994,9 @@ goMenu->addAction(ac->action(KStandardAction::name(KStandardAction::Up))); goMenu->addAction(ac->action(KStandardAction::name(KStandardAction::Home))); goMenu->addAction(ac->action(QStringLiteral("closed_tabs"))); + KActionMenu *bookmarkMenu = new KActionMenu(i18nc("@title:menu", "&Bookmarks"), goMenu); + m_bookmarkHandler->fillControlMenu(bookmarkMenu->menu(), ac); + goMenu->addAction(bookmarkMenu); menu->addMenu(goMenu); // Add "Tool" menu @@ -1240,6 +1255,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 @@ +