From 59e5e79cd32187b842bbb423a287a54a23a60f5f Mon Sep 17 00:00:00 2001 From: aqua Date: Sun, 11 Sep 2022 14:21:43 +0300 Subject: BookmarksMenu: show top-level bookmarks --- src/application.cpp | 2 +- src/application.hpp | 4 +- src/bookmarks/CMakeLists.txt | 3 +- src/bookmarks/bookmarksmenu.cpp | 148 ++++++++-------------------------------- src/bookmarks/bookmarksmenu.h | 64 ----------------- src/bookmarks/bookmarksmenu.hpp | 41 +++++++++++ src/rekonqwindow.ui | 7 +- src/rekonqwindow_class.cpp | 4 ++ src/test/application_mock.hpp | 2 +- 9 files changed, 86 insertions(+), 189 deletions(-) delete mode 100644 src/bookmarks/bookmarksmenu.h create mode 100644 src/bookmarks/bookmarksmenu.hpp diff --git a/src/application.cpp b/src/application.cpp index 0f86feec..efc1c2af 100644 --- a/src/application.cpp +++ b/src/application.cpp @@ -116,7 +116,7 @@ struct BookmarksModelPrivate { }; Q_GLOBAL_STATIC(BookmarksModelPrivate, bookmarks_d); -QAbstractItemModel *Application::bookmarks() const { return bookmarks_d->model; } +BookmarkModel *Application::bookmarks() const { return bookmarks_d->model; } /* int Application::newInstance() diff --git a/src/application.hpp b/src/application.hpp index c7401563..2f08a575 100644 --- a/src/application.hpp +++ b/src/application.hpp @@ -22,7 +22,7 @@ class RekonqView; class RekonqWindow; class PluginLoader; class RekonqSettings; -class QAbstractItemModel; +class BookmarkModel; using RekonqPluginList = QList>; using RekonqWindowList = QList>; @@ -46,7 +46,7 @@ public: // int newInstance(); static Application *instance() { return (qobject_cast(QCoreApplication::instance())); } [[nodiscard]] auto *settings() const { return m_settings; } - REKONQ_TEST_VIRTUAL QAbstractItemModel *bookmarks() const REKONQ_TEST_PURE; + REKONQ_TEST_VIRTUAL BookmarkModel *bookmarks() const REKONQ_TEST_PURE; // RekonqWindow *rekonqWindow(const QString &activityID = QString()); [[nodiscard]] auto windowList() const { return m_windows; } diff --git a/src/bookmarks/CMakeLists.txt b/src/bookmarks/CMakeLists.txt index 38a14204..2ff32c80 100644 --- a/src/bookmarks/CMakeLists.txt +++ b/src/bookmarks/CMakeLists.txt @@ -1,7 +1,6 @@ add_library(bookmarks STATIC # bookmarkmanager.cpp bookmarkmanager.h # bookmarkowner.cpp bookmarkowner.h -# bookmarksmenu.cpp bookmarksmenu.h # bookmarkstoolbar.cpp bookmarkstoolbar.h # Bookmarks Model bookmark.cpp bookmark.hpp @@ -11,6 +10,8 @@ add_library(bookmarks STATIC bookmarkstreeformat_xbel_read.cpp bookmarkstreeformat_xbel_write.cpp # Bookmark Manager bookmarkmanager.cpp bookmarkmanager.hpp + # UI + bookmarksmenu.cpp bookmarksmenu.hpp ) target_include_directories(bookmarks PUBLIC ${CMAKE_SOURCE_DIR}/src) target_link_libraries(bookmarks PUBLIC Qt6::Core Qt6::Widgets) diff --git a/src/bookmarks/bookmarksmenu.cpp b/src/bookmarks/bookmarksmenu.cpp index 445b81b7..761a0026 100644 --- a/src/bookmarks/bookmarksmenu.cpp +++ b/src/bookmarks/bookmarksmenu.cpp @@ -1,133 +1,43 @@ /* ============================================================ - * - * This file is a part of the rekonq project - * + * The rekonq project + * ============================================================ + * SPDX-License-Identifier: GPL-2.0-or-later * Copyright (C) 2008-2013 by Andrea Diamantini * Copyright (C) 2010 by Yoann Laissus - * - * - * 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) version 3 or any later version - * accepted by the membership of KDE e.V. (or its successor approved - * by the membership of KDE e.V.), which shall act as a proxy - * defined in Section 14 of version 3 of the license. - * - * 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, see . - * + * SPDX-License-Identifier: GPL-3.0-only + * Copyright (C) 2022 aqua + * ============================================================ + * Description: rekonq bookmarks menu * ============================================================ */ -// Self Includes -#include "bookmarksmenu.h" -#include "bookmarksmenu.moc" +#include "bookmarksmenu.hpp" +#include "bookmarkstreemodel.hpp" -// Local Includes -#include "bookmarkmanager.h" -#include "bookmarkowner.h" -#include "bookmarkscontextmenu.h" - -#include "iconmanager.h" -#include "webwindow.h" - -// Qt Includes -#include -#include -#include - -BookmarkMenu::BookmarkMenu(KBookmarkManager *manager, KBookmarkOwner *owner, KMenu *menu, - KActionCollection *actionCollection) - : KBookmarkMenu(manager, owner, menu, actionCollection) -{ -} - -BookmarkMenu::BookmarkMenu(KBookmarkManager *manager, KBookmarkOwner *owner, KMenu *parentMenu, - const QString &parentAddress) - : KBookmarkMenu(manager, owner, parentMenu, parentAddress) -{ -} - -BookmarkMenu::~BookmarkMenu() -{ - kDebug() << "Deleting BookmarkMenu.. See http://svn.reviewboard.kde.org/r/5606/ about."; -} - -KMenu *BookmarkMenu::contextMenu(QAction *act) +BookmarksMenu::BookmarksMenu(QWidget *parent) : QMenu(parent) { - KBookmarkActionInterface *action = dynamic_cast(act); - if (!action) return 0; - return new BookmarksContextMenu(action->bookmark(), manager(), static_cast(owner())); -} - -QAction *BookmarkMenu::actionForBookmark(const KBookmark &bookmark) -{ - if (bookmark.isGroup()) { - KBookmarkActionMenu *actionMenu = new KBookmarkActionMenu(bookmark, this); - BookmarkMenu *menu = new BookmarkMenu(manager(), owner(), actionMenu->menu(), bookmark.address()); - // An hack to get rid of bug 219274 - connect(actionMenu, SIGNAL(hovered()), menu, SLOT(slotAboutToShow())); - return actionMenu; - } - else if (bookmark.isSeparator()) { - return KBookmarkMenu::actionForBookmark(bookmark); - } - else { - KBookmarkAction *action = new KBookmarkAction(bookmark, owner(), this); - action->setIcon(IconManager::self()->iconForUrl(KUrl(bookmark.url()))); - return action; - } + connect(this, &QMenu::aboutToShow, this, &BookmarksMenu::refill); } -void BookmarkMenu::refill() +void BookmarksMenu::refill() { - clear(); - - if (isRoot()) { - addAddBookmark(); - addAddBookmarksList(); - - if (parentMenu()->actions().count() > 0) parentMenu()->addSeparator(); - - WebWindow *w = qobject_cast(parentMenu()->parent()); - QAction *a; - // bk page - a = w->actionByName(QL1S("open_bookmarks_page")); - parentMenu()->addAction(a); - a = w->actionByName(QL1S("show_bookmarks_toolbar")); - parentMenu()->addAction(a); - - addEditBookmarks(); - - if (parentMenu()->actions().count() > 0) parentMenu()->addSeparator(); - } + Q_CHECK_PTR(model); - fillBookmarks(); - - if (!isRoot()) { - if (parentMenu()->actions().count() > 0) parentMenu()->addSeparator(); - - addOpenFolderInTabs(); - addAddBookmarksList(); + for (auto *a : actions) { + removeAction(a); + delete a; } -} - -void BookmarkMenu::addOpenFolderInTabs() -{ - KBookmarkGroup group = manager()->findByAddress(parentAddress()).toGroup(); - - if (!group.first().isNull()) { - KBookmark bookmark = group.first(); - - while (bookmark.isGroup() || bookmark.isSeparator()) { bookmark = group.next(bookmark); } - - if (!bookmark.isNull()) { - parentMenu()->addAction(BookmarkManager::self()->owner()->createAction(group, BookmarkOwner::OPEN_FOLDER)); - } + actions.clear(); + + actions.append(addSeparator()); + + const auto *root = model->item(); + Q_CHECK_PTR(root); + for (int i = 0; i < root->childCount(); ++i) { + const auto *child = root->child(i); + if (child->type() != BookmarksTreeItem::Bookmark) continue; + auto *action = addAction(child->data(BookmarksTreeItem::Title).toString(), this, [this, child]() { + emit loadUrl(child->data(BookmarksTreeItem::Href).toUrl(), rekonq::CurrentTab); + }); + actions.append(action); } } diff --git a/src/bookmarks/bookmarksmenu.h b/src/bookmarks/bookmarksmenu.h deleted file mode 100644 index 2b690d91..00000000 --- a/src/bookmarks/bookmarksmenu.h +++ /dev/null @@ -1,64 +0,0 @@ -/* ============================================================ -* -* This file is a part of the rekonq project -* -* Copyright (C) 2008-2013 by Andrea Diamantini -* Copyright (C) 2010 by Yoann Laissus -* -* -* 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) version 3 or any later version -* accepted by the membership of KDE e.V. (or its successor approved -* by the membership of KDE e.V.), which shall act as a proxy -* defined in Section 14 of version 3 of the license. -* -* 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, see . -* -* ============================================================ */ - - -#ifndef BOOKMARKS_MENU_H -#define BOOKMARKS_MENU_H - -#include "rekonq.hpp" - -/** - * This class represent the rekonq bookmarks menu. - * It's just a simple class inherited from KBookmarkMenu - * - */ -class BookmarkMenu : public KBookmarkMenu -{ - Q_OBJECT - -public: - BookmarkMenu(KBookmarkManager* manager, - KBookmarkOwner* owner, - KMenu* menu, - KActionCollection* actionCollection); - - BookmarkMenu(KBookmarkManager *manager, - KBookmarkOwner *owner, - KMenu *parentMenu, - const QString &parentAddress); - - ~BookmarkMenu(); - -protected: - virtual KMenu * contextMenu(QAction * act); - virtual void refill(); - virtual QAction* actionForBookmark(const KBookmark &bookmark); - -private: - void addOpenFolderInTabs(); -}; - -#endif // BOOKMARKS_MENU_H diff --git a/src/bookmarks/bookmarksmenu.hpp b/src/bookmarks/bookmarksmenu.hpp new file mode 100644 index 00000000..6199708f --- /dev/null +++ b/src/bookmarks/bookmarksmenu.hpp @@ -0,0 +1,41 @@ +/* ============================================================ + * The rekonq project + * ============================================================ + * SPDX-License-Identifier: GPL-2.0-or-later + * Copyright (C) 2008-2013 by Andrea Diamantini + * Copyright (C) 2010 by Yoann Laissus + * SPDX-License-Identifier: GPL-3.0-only + * Copyright (C) 2022 aqua + * ============================================================ + * Description: rekonq bookmarks menu + * ============================================================ */ + +#pragma once + +#include "rekonq.hpp" +#include + +class BookmarkModel; +class BookmarksMenu : public QMenu { + Q_OBJECT + +public: + explicit BookmarksMenu(QWidget *parent = nullptr); + ~BookmarksMenu() override = default; + + void setModel(const BookmarkModel *ptr) + { + Q_CHECK_PTR(ptr); + model = ptr; + } + +signals: + void loadUrl(const QUrl &url, rekonq::OpenType type); + +private slots: + void refill(); + +private: + const BookmarkModel *model = nullptr; + QList actions; +}; diff --git a/src/rekonqwindow.ui b/src/rekonqwindow.ui index 64e1a517..e12fc519 100644 --- a/src/rekonqwindow.ui +++ b/src/rekonqwindow.ui @@ -180,7 +180,7 @@ History - + Bookmarks @@ -273,6 +273,11 @@ QTreeView
panels/bookmarkspanel.hpp
+ + BookmarksMenu + QMenu +
bookmarks/bookmarksmenu.hpp
+
diff --git a/src/rekonqwindow_class.cpp b/src/rekonqwindow_class.cpp index c83fd3ae..517742f4 100644 --- a/src/rekonqwindow_class.cpp +++ b/src/rekonqwindow_class.cpp @@ -15,6 +15,7 @@ #ifndef REKONQ_TEST #include "application.hpp" +#include "bookmarks/bookmarkstreemodel.hpp" #include "settings/settingsdialog.h" #include "taskmanager.h" #include @@ -30,9 +31,12 @@ RekonqWindow::RekonqWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::Re #ifndef REKONQ_TEST ui->bookmarksPanel->setModel(Application::instance()->bookmarks()); + ui->menuBookmarks->setModel(Application::instance()->bookmarks()); #endif connect(ui->bookmarksPanel, &BookmarksPanel::loadUrl, this, qOverload(&RekonqWindow::loadUrl)); + connect(ui->menuBookmarks, &BookmarksMenu::loadUrl, this, + qOverload(&RekonqWindow::loadUrl)); connect(ui->tabs, &TabBar::currentChanged, this, [this](RekonqView *view) { if (view == nullptr) { // last tab has been closed diff --git a/src/test/application_mock.hpp b/src/test/application_mock.hpp index 7b3af1d1..cff135a8 100644 --- a/src/test/application_mock.hpp +++ b/src/test/application_mock.hpp @@ -11,7 +11,7 @@ public: ~FakeApplication() override = default; MOCK_METHOD(bool, registerPlugin, (const QString &), (override)); - MOCK_METHOD(QAbstractItemModel *, bookmarks, (), (const override)); + MOCK_METHOD(BookmarkModel *, bookmarks, (), (const override)); MOCK_METHOD(RekonqWindow *, newWindow, (), (override)); MOCK_METHOD(RekonqView *, newView, (const QUrl &, RekonqWindow *), (override)); -- cgit v1.2.1