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,57 @@ +/*************************************************************************** + * 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 KBookmarkMenu; +class QMenu; + +class DolphinBookmarkHandler : public QObject, public KBookmarkOwner +{ + Q_OBJECT +public: + DolphinBookmarkHandler(DolphinMainWindow *mainWindow, KActionCollection *collection, QMenu *menu, QObject *parent); + ~DolphinBookmarkHandler() override; +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_; + QScopedPointer bookmarkMenu_; +}; + +#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,124 @@ +/*************************************************************************** + * 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 = QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation) + + QStringLiteral("/dolphin"); + QDir().mkpath(bookmarksFile); + bookmarksFile += QStringLiteral("/bookmarks.xml"); + } + KBookmarkManager *manager = KBookmarkManager::managerForFile(bookmarksFile, QStringLiteral("dolphin")); + manager->setUpdate(true); + bookmarkMenu_.reset(new KBookmarkMenu(manager, this, menu, collection)); +} + +DolphinBookmarkHandler::~DolphinBookmarkHandler() +{ +} + +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 @@ -71,6 +71,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 +123,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 +345,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. */ 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" @@ -183,6 +184,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); @@ -1233,6 +1244,11 @@ } #endif + // setup 'Bookmarks' menu + KActionMenu *bookmarkMenu = new KActionMenu(i18nc("@title:menu", "&Bookmarks"), this); + new DolphinBookmarkHandler(this, actionCollection(), bookmarkMenu->menu(), this); + actionCollection()->addAction(QStringLiteral("bookmark"), 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 @@ -43,6 +43,7 @@ +