summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoraqua <aqua@iserlohn-fortress.net>2022-09-11 14:21:43 +0300
committeraqua <aqua@iserlohn-fortress.net>2022-09-14 08:51:10 +0300
commit59e5e79cd32187b842bbb423a287a54a23a60f5f (patch)
tree2a730a663c9a1917e08da62eb87d6b2c5e2ebd5c
parentBookmarksPanel: add custom context menu (diff)
downloadrekonq-59e5e79cd32187b842bbb423a287a54a23a60f5f.tar.xz
BookmarksMenu: show top-level bookmarks
-rw-r--r--src/application.cpp2
-rw-r--r--src/application.hpp4
-rw-r--r--src/bookmarks/CMakeLists.txt3
-rw-r--r--src/bookmarks/bookmarksmenu.cpp148
-rw-r--r--src/bookmarks/bookmarksmenu.h64
-rw-r--r--src/bookmarks/bookmarksmenu.hpp41
-rw-r--r--src/rekonqwindow.ui7
-rw-r--r--src/rekonqwindow_class.cpp4
-rw-r--r--src/test/application_mock.hpp2
9 files changed, 86 insertions, 189 deletions
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<QPointer<PluginLoader>>;
using RekonqWindowList = QList<QPointer<RekonqWindow>>;
@@ -46,7 +46,7 @@ public:
// int newInstance();
static Application *instance() { return (qobject_cast<Application *>(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 <adjam7 at gmail dot com>
* Copyright (C) 2010 by Yoann Laissus <yoann dot laissus at gmail dot 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) 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 <http://www.gnu.org/licenses/>.
- *
+ * SPDX-License-Identifier: GPL-3.0-only
+ * Copyright (C) 2022 aqua <aqua@iserlohn-fortress.net>
+ * ============================================================
+ * 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 <QActionEvent>
-#include <QApplication>
-#include <QFrame>
-
-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<KBookmarkActionInterface *>(act);
- if (!action) return 0;
- return new BookmarksContextMenu(action->bookmark(), manager(), static_cast<BookmarkOwner *>(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<WebWindow *>(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 <adjam7 at gmail dot com>
-* Copyright (C) 2010 by Yoann Laissus <yoann dot laissus at gmail dot 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) 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 <http://www.gnu.org/licenses/>.
-*
-* ============================================================ */
-
-
-#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 <adjam7 at gmail dot com>
+ * Copyright (C) 2010 by Yoann Laissus <yoann dot laissus at gmail dot com>
+ * SPDX-License-Identifier: GPL-3.0-only
+ * Copyright (C) 2022 aqua <aqua@iserlohn-fortress.net>
+ * ============================================================
+ * Description: rekonq bookmarks menu
+ * ============================================================ */
+
+#pragma once
+
+#include "rekonq.hpp"
+#include <QMenu>
+
+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<QAction *> 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 @@
<string>History</string>
</property>
</widget>
- <widget class="QMenu" name="menuBookmarks">
+ <widget class="BookmarksMenu" name="menuBookmarks">
<property name="title">
<string>Bookmarks</string>
</property>
@@ -273,6 +273,11 @@
<extends>QTreeView</extends>
<header>panels/bookmarkspanel.hpp</header>
</customwidget>
+ <customwidget>
+ <class>BookmarksMenu</class>
+ <extends>QMenu</extends>
+ <header>bookmarks/bookmarksmenu.hpp</header>
+ </customwidget>
</customwidgets>
<resources/>
<connections>
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 <spdlog/spdlog.h>
@@ -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<const QUrl &, rekonq::OpenType>(&RekonqWindow::loadUrl));
+ connect(ui->menuBookmarks, &BookmarksMenu::loadUrl, this,
+ qOverload<const QUrl &, rekonq::OpenType>(&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));