From 1b1e327cb73491c17972a33a07c3c9beafe7f938 Mon Sep 17 00:00:00 2001 From: aqua Date: Sun, 18 Sep 2022 09:57:29 +0300 Subject: Add Navigation and Tab toolbars --- src/CMakeLists.txt | 6 + src/bookmarks/CMakeLists.txt | 3 - src/bookmarks/bookmarksmenu.cpp | 41 ---- src/bookmarks/bookmarksmenu.hpp | 39 ---- src/bookmarks/bookmarkstoolbar.cpp | 391 ------------------------------------ src/bookmarks/bookmarkstoolbar.hpp | 58 ------ src/bookmarks/bookmarkstreeitem.cpp | 4 +- src/bookmarks/bookmarkstreeitem.hpp | 31 +-- src/panels/bookmarksmenu.cpp | 41 ++++ src/panels/bookmarksmenu.hpp | 39 ++++ src/panels/bookmarkstoolbar.cpp | 389 +++++++++++++++++++++++++++++++++++ src/panels/bookmarkstoolbar.hpp | 58 ++++++ src/panels/navigationtoolbar.cpp | 49 +++++ src/panels/navigationtoolbar.hpp | 36 ++++ src/panels/tabtoolbar.cpp | 49 +++++ src/panels/tabtoolbar.hpp | 33 +++ src/rekonqwindow.cpp | 31 +-- src/rekonqwindow.hpp | 1 - src/rekonqwindow.ui | 143 ++++--------- src/rekonqwindow_class.cpp | 27 +-- src/tabbar/tabbar.cpp | 28 ++- src/tabbar/tabbar.h | 5 +- src/test/rekonqwindow_mock.hpp | 1 - src/test/test_rekonqwindow.cpp | 1 - src/urlbar/urlbar.cpp | 14 +- src/urlbar/urlbar.hpp | 7 +- 26 files changed, 784 insertions(+), 741 deletions(-) delete mode 100644 src/bookmarks/bookmarksmenu.cpp delete mode 100644 src/bookmarks/bookmarksmenu.hpp delete mode 100644 src/bookmarks/bookmarkstoolbar.cpp delete mode 100644 src/bookmarks/bookmarkstoolbar.hpp create mode 100644 src/panels/bookmarksmenu.cpp create mode 100644 src/panels/bookmarksmenu.hpp create mode 100644 src/panels/bookmarkstoolbar.cpp create mode 100644 src/panels/bookmarkstoolbar.hpp create mode 100644 src/panels/navigationtoolbar.cpp create mode 100644 src/panels/navigationtoolbar.hpp create mode 100644 src/panels/tabtoolbar.cpp create mode 100644 src/panels/tabtoolbar.hpp diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index e3a03dba..a2e16cad 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -11,7 +11,13 @@ set(rekonqwindow_SRCS rekonqwindow_class.cpp rekonqwindow.hpp rekonqwindow.ui tabbar/tabbar.cpp tabbar/tabbar.h urlbar/urlbar.cpp urlbar/urlbar.hpp urlbar/completer.cpp urlbar/completer.hpp + # navigation + panels/tabtoolbar.cpp panels/tabtoolbar.hpp + panels/navigationtoolbar.cpp panels/navigationtoolbar.hpp + # bookmarks panels/bookmarkspanel.cpp panels/bookmarkspanel.hpp + panels/bookmarkstoolbar.cpp panels/bookmarkstoolbar.hpp + panels/bookmarksmenu.cpp panels/bookmarksmenu.hpp ) set(rekonqwindow_IFACES ${PROJECT_SOURCE_DIR}/include/rview.hpp) diff --git a/src/bookmarks/CMakeLists.txt b/src/bookmarks/CMakeLists.txt index d2651ce9..0fdbbad8 100644 --- a/src/bookmarks/CMakeLists.txt +++ b/src/bookmarks/CMakeLists.txt @@ -5,9 +5,6 @@ add_library(bookmarks STATIC bookmarkstreemodel.cpp bookmarkstreemodel.hpp bookmarkstreeformats.hpp bookmarkstreeformat_xbel_read.cpp bookmarkstreeformat_xbel_write.cpp - # UI - bookmarksmenu.cpp bookmarksmenu.hpp - bookmarkstoolbar.cpp bookmarkstoolbar.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 deleted file mode 100644 index aad7289e..00000000 --- a/src/bookmarks/bookmarksmenu.cpp +++ /dev/null @@ -1,41 +0,0 @@ -/* ============================================================ - * 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 - * ============================================================ */ - -#include "bookmarksmenu.hpp" -#include "bookmarkstreemodel.hpp" - -BookmarksMenu::BookmarksMenu(QWidget *parent) : QMenu(parent) -{ - connect(this, &QMenu::aboutToShow, this, &BookmarksMenu::refill); -} - -void BookmarksMenu::refill() -{ - Q_CHECK_PTR(model); - - for (auto *a : actions) { - removeAction(a); - delete a; - } - 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.hpp b/src/bookmarks/bookmarksmenu.hpp deleted file mode 100644 index f162244e..00000000 --- a/src/bookmarks/bookmarksmenu.hpp +++ /dev/null @@ -1,39 +0,0 @@ -/* ============================================================ - * 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 - * ============================================================ */ - -#pragma once - -#include "rekonq.hpp" -#include - -class BookmarksTreeModel; -class BookmarksMenu : public QMenu { - Q_OBJECT - -public: - explicit BookmarksMenu(QWidget *parent = nullptr); - ~BookmarksMenu() override = default; - - void setModel(const BookmarksTreeModel *ptr) - { - Q_CHECK_PTR(ptr); - model = ptr; - } - -signals: - void loadUrl(const QUrl &url, rekonq::OpenType type); - -private slots: - void refill(); - -private: - const BookmarksTreeModel *model = nullptr; - QList actions; -}; diff --git a/src/bookmarks/bookmarkstoolbar.cpp b/src/bookmarks/bookmarkstoolbar.cpp deleted file mode 100644 index 353e61b9..00000000 --- a/src/bookmarks/bookmarkstoolbar.cpp +++ /dev/null @@ -1,391 +0,0 @@ -/* ============================================================ - * 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 - * ============================================================ */ - -#include "bookmarkstoolbar.hpp" -#include "bookmarkstreemodel.hpp" -#include - -BookmarkToolBar::BookmarkToolBar(QWidget *parent) : QToolBar(parent) -{ - /* -setContextMenuPolicy(Qt::CustomContextMenu); - -connect(this, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(contextMenu(QPoint))); -connect(BookmarkManager::self()->manager(), SIGNAL(changed(QString, QString)), this, SLOT(hideMenu())); - -setAcceptDrops(true); -installEventFilter(this); -setShortcutEnabled(false); - -if (isVisible()) { - BookmarkManager::self()->fillBookmarkBar(this); - m_filled = true; -} -*/ -} - -void BookmarkToolBar::showEvent(QShowEvent *event) -{ - Q_CHECK_PTR(model); - - clear(); - - 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); - }); - } - - event->accept(); -} - -/* -void BookmarkToolBar::contextMenu(const QPoint &point) -{ - KBookmarkActionInterface *action = dynamic_cast(actionAt(point)); - KBookmark bookmark = BookmarkManager::self()->manager()->toolbar(); - bool nullAction = true; - if (action) { - bookmark = action->bookmark(); - nullAction = false; - } - - BookmarksContextMenu menu(bookmark, BookmarkManager::self()->manager(), BookmarkManager::self()->owner(), nullAction); - - menu.exec(mapToGlobal(point)); -} - -void BookmarkToolBar::menuDisplayed() -{ - qApp->installEventFilter(this); - m_currentMenu = qobject_cast(sender()); -} - -void BookmarkToolBar::menuHidden() -{ - qApp->removeEventFilter(this); - m_currentMenu = 0; -} - -void BookmarkToolBar::hideMenu() -{ - if (m_currentMenu) m_currentMenu->hide(); -} - -bool BookmarkToolBar::eventFilter(QObject *watched, QEvent *event) -{ - if (m_currentMenu && m_currentMenu->isVisible() && - !m_currentMenu->rect().contains(m_currentMenu->mapFromGlobal(QCursor::pos()))) { - // To switch root folders as in a menubar - - KBookmarkActionMenu *act = dynamic_cast(actionAt(mapFromGlobal(QCursor::pos()))); - - if (event->type() == QEvent::MouseMove && act && act->menu() != m_currentMenu) { - m_currentMenu->hide(); - QPoint pos = mapToGlobal(widgetForAction(act)->pos()); - act->menu()->popup(QPoint(pos.x(), pos.y() + widgetForAction(act)->height())); - } - else if (event->type() == QEvent::MouseButtonPress && act) { - m_currentMenu->hide(); - } - - return QObject::eventFilter(watched, event); - } - - switch (event->type()) { - case QEvent::Show: { - if (!m_filled) { - BookmarkManager::self()->fillBookmarkBar(this); - m_filled = true; - } - } break; - - case QEvent::ActionRemoved: { - QActionEvent *actionEvent = static_cast(event); - if (actionEvent && actionEvent->action() != m_dropAction) { - QWidget *widget = widgetForAction(actionEvent->action()); - if (widget) { widget->removeEventFilter(this); } - } - } break; - - case QEvent::ParentChange: { - QActionEvent *actionEvent = static_cast(event); - if (actionEvent && actionEvent->action() != m_dropAction) { - QWidget *widget = widgetForAction(actionEvent->action()); - if (widget) { widget->removeEventFilter(this); } - } - } break; - - case QEvent::DragEnter: { - QDragEnterEvent *dragEvent = static_cast(event); - if (dragEvent->mimeData()->hasFormat(BookmarkManager::bookmark_mime_type()) || - dragEvent->mimeData()->hasFormat("text/uri-list") || dragEvent->mimeData()->hasFormat("text/plain")) { - QFrame *dropIndicatorWidget = new QFrame(this); - dropIndicatorWidget->setFrameShape(QFrame::VLine); - m_dropAction = insertWidget(actionAt(dragEvent->pos()), dropIndicatorWidget); - - dragEvent->accept(); - } - } break; - - case QEvent::DragLeave: { - QDragLeaveEvent *dragEvent = static_cast(event); - - if (m_checkedAction) { - m_checkedAction->setCheckable(false); - m_checkedAction->setChecked(false); - } - - delete m_dropAction; - m_dropAction = 0; - dragEvent->accept(); - } break; - - case QEvent::DragMove: { - QDragMoveEvent *dragEvent = static_cast(event); - if (dragEvent->mimeData()->hasFormat(BookmarkManager::bookmark_mime_type()) || - dragEvent->mimeData()->hasFormat("text/uri-list") || dragEvent->mimeData()->hasFormat("text/plain")) { - QAction *overAction = actionAt(dragEvent->pos()); - KBookmarkActionInterface *overActionBK = dynamic_cast(overAction); - QWidget *widgetAction = widgetForAction(overAction); - - if (overAction != m_dropAction && overActionBK && widgetAction && m_dropAction) { - removeAction(m_dropAction); - if (m_checkedAction) { - m_checkedAction->setCheckable(false); - m_checkedAction->setChecked(false); - } - - if (!overActionBK->bookmark().isGroup()) { - if ((dragEvent->pos().x() - widgetAction->pos().x()) > (widgetAction->width() / 2)) { - if (actions().count() > actions().indexOf(overAction) + 1) { - insertAction(actions().at(actions().indexOf(overAction) + 1), m_dropAction); - } - else { - addAction(m_dropAction); - } - } - else { - insertAction(overAction, m_dropAction); - } - } - else { - if ((dragEvent->pos().x() - widgetAction->pos().x()) >= (widgetAction->width() * 0.75)) { - if (actions().count() > actions().indexOf(overAction) + 1) { - insertAction(actions().at(actions().indexOf(overAction) + 1), m_dropAction); - } - else { - addAction(m_dropAction); - } - } - else if ((dragEvent->pos().x() - widgetAction->pos().x()) <= (widgetAction->width() * 0.25)) { - insertAction(overAction, m_dropAction); - } - else { - overAction->setCheckable(true); - overAction->setChecked(true); - m_checkedAction = overAction; - } - } - - dragEvent->accept(); - } - } - } break; - - case QEvent::Drop: { - QDropEvent *dropEvent = static_cast(event); - KBookmark bookmark; - KBookmarkGroup root = BookmarkManager::self()->manager()->toolbar(); - - if (m_checkedAction) { - m_checkedAction->setCheckable(false); - m_checkedAction->setChecked(false); - } - - if (dropEvent->mimeData()->hasFormat(BookmarkManager::bookmark_mime_type())) { - QByteArray addresses = dropEvent->mimeData()->data(BookmarkManager::bookmark_mime_type()); - bookmark = BookmarkManager::self()->findByAddress(QString::fromLatin1(addresses.data())); - if (bookmark.isNull()) return false; - } - else if (dropEvent->mimeData()->hasFormat("text/uri-list")) { - // DROP is URL - QString url = dropEvent->mimeData()->urls().at(0).toString(); - WebWindow *w = qobject_cast(parent()); - QString title = url.contains(w->url().url()) ? w->title() : url; - bookmark = root.addBookmark(title, url); - } - else if (dropEvent->mimeData()->hasFormat("text/plain")) { - // DROP is TEXT - QString url = dropEvent->mimeData()->text(); - KUrl u(url); - if (u.isValid()) { - WebWindow *w = qobject_cast(parent()); - QString title = url.contains(w->url().url()) ? w->title() : url; - bookmark = root.addBookmark(title, url); - } - } - else { - return false; - } - - QAction *destAction = actionAt(dropEvent->pos()); - if (destAction && destAction == m_dropAction) { - if (actions().indexOf(m_dropAction) > 0) { destAction = actions().at(actions().indexOf(m_dropAction) - 1); } - else { - destAction = actions().at(1); - } - } - - if (destAction) { - KBookmarkActionInterface *destBookmarkAction = dynamic_cast(destAction); - QWidget *widgetAction = widgetForAction(destAction); - - if (destBookmarkAction && !destBookmarkAction->bookmark().isNull() && widgetAction && - bookmark.address() != destBookmarkAction->bookmark().address()) { - KBookmark destBookmark = destBookmarkAction->bookmark(); - - if (!destBookmark.isGroup()) { - if ((dropEvent->pos().x() - widgetAction->pos().x()) >= (widgetAction->width() / 2)) { - root.moveBookmark(bookmark, destBookmark); - } - else { - root.moveBookmark(bookmark, destBookmark.parentGroup().previous(destBookmark)); - } - } - else { - if ((dropEvent->pos().x() - widgetAction->pos().x()) >= (widgetAction->width() * 0.75)) { - root.moveBookmark(bookmark, destBookmark); - } - else if ((dropEvent->pos().x() - widgetAction->pos().x()) <= (widgetAction->width() * 0.25)) { - root.moveBookmark(bookmark, destBookmark.parentGroup().previous(destBookmark)); - } - else { - destBookmark.toGroup().addBookmark(bookmark); - } - } - - BookmarkManager::self()->emitChanged(); - } - } - else { - root.deleteBookmark(bookmark); - bookmark = root.addBookmark(bookmark); - if (dropEvent->pos().x() < widgetForAction(actions().first())->pos().x()) { - root.moveBookmark(bookmark, KBookmark()); - } - - BookmarkManager::self()->emitChanged(); - } - dropEvent->accept(); - } break; - - default: - break; - } - - QMouseEvent *mouseEvent = static_cast(event); - - // These events need to be handled only for Bookmark actions and not the bar - if (watched != this && mouseEvent) { - switch (event->type()) { - case QEvent::MouseButtonPress: // drag handling - { - QPoint pos = mapFromGlobal(QCursor::pos()); - KBookmarkActionInterface *action = dynamic_cast(actionAt(pos)); - - if (action && mouseEvent->button() != Qt::MidButton) { - m_dragAction = actionAt(pos); - m_startDragPos = pos; - - // The menu is displayed only when the mouse button is released - if (action->bookmark().isGroup()) return true; - } - } break; - - case QEvent::MouseMove: { - int distance = (mapFromGlobal(QCursor::pos()) - m_startDragPos).manhattanLength(); - if (!m_currentMenu && distance >= QApplication::startDragDistance()) { startDrag(); } - } break; - - case QEvent::MouseButtonRelease: { - QPoint destPos = mapFromGlobal(QCursor::pos()); - int distance = (destPos - m_startDragPos).manhattanLength(); - KBookmarkActionInterface *action = dynamic_cast(actionAt(destPos)); - - if (action) { - if (action->bookmark().isGroup()) { - if (mouseEvent->button() == Qt::MidButton) { - BookmarkManager::self()->owner()->loadBookmarkFolder(action->bookmark()); - } - else if (distance < QApplication::startDragDistance()) { - KBookmarkActionMenu *menu = dynamic_cast(actionAt(m_startDragPos)); - QPoint actionPos = mapToGlobal(widgetForAction(menu)->pos()); - menu->menu()->popup(QPoint(actionPos.x(), actionPos.y() + widgetForAction(menu)->height())); - } - } - else { - if (!action->bookmark().isNull() && !action->bookmark().isSeparator()) { - if (mouseEvent->button() == Qt::MidButton) { - BookmarkManager::self()->owner()->loadBookmarkInNewTab(action->bookmark()); - } - } - } - } - } break; - - default: - break; - } - } - - return QObject::eventFilter(watched, event); -} - -void BookmarkToolBar::startDrag() -{ - KBookmarkActionInterface *action = dynamic_cast(m_dragAction); - if (action) { - QMimeData *mimeData = new QMimeData; - KBookmark bookmark = action->bookmark(); - - QByteArray address = bookmark.address().toLatin1(); - mimeData->setData(BookmarkManager::bookmark_mime_type(), address); - bookmark.populateMimeData(mimeData); - - QDrag *drag = new QDrag(this); - drag->setMimeData(mimeData); - - if (bookmark.isGroup()) { drag->setPixmap(KIcon(bookmark.icon()).pixmap(24, 24)); } - else { - drag->setPixmap(IconManager::self()->iconForUrl(action->bookmark().url()).pixmap(24, 24)); - } - - drag->start(Qt::MoveAction); - connect(drag, SIGNAL(destroyed()), this, SLOT(dragDestroyed())); - } -} - -void BookmarkToolBar::dragDestroyed() -{ - // A workaround to get rid of the checked state of the dragged action - if (m_dragAction) { - m_dragAction->setVisible(false); - m_dragAction->setVisible(true); - m_dragAction = 0; - } - delete m_dropAction; - m_dropAction = 0; -} -*/ diff --git a/src/bookmarks/bookmarkstoolbar.hpp b/src/bookmarks/bookmarkstoolbar.hpp deleted file mode 100644 index 6aaa750a..00000000 --- a/src/bookmarks/bookmarkstoolbar.hpp +++ /dev/null @@ -1,58 +0,0 @@ -/* ============================================================ - * 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 - * ============================================================ */ - -#pragma once - -#include "rekonq.hpp" -#include - -class BookmarksTreeModel; - -/** - * This class manage the bookmark toolbar. - * Some events from the toolbar are handled to allow the drag and drop - */ -class BookmarkToolBar : public QToolBar { - Q_OBJECT - -public: - explicit BookmarkToolBar(QWidget *parent = nullptr); - ~BookmarkToolBar() override = default; - - void setModel(BookmarksTreeModel *ptr) - { - Q_CHECK_PTR(ptr); - model = ptr; - } - -signals: - void loadUrl(const QUrl &url, rekonq::OpenType type); - -protected: - void showEvent(QShowEvent *event) override; - // bool eventFilter(QObject *watched, QEvent *event); - -private slots: - // void contextMenu(const QPoint &); - // void menuDisplayed(); - // void menuHidden(); - // void hideMenu(); - // void dragDestroyed(); - -private: - BookmarksTreeModel *model = nullptr; - void startDrag(); - - QPoint m_startDragPos; - QAction *m_dragAction = nullptr; - QAction *m_dropAction = nullptr; - QAction *m_checkedAction = nullptr; - bool m_filled = false; -}; diff --git a/src/bookmarks/bookmarkstreeitem.cpp b/src/bookmarks/bookmarkstreeitem.cpp index fba1cc19..b868a14a 100644 --- a/src/bookmarks/bookmarkstreeitem.cpp +++ b/src/bookmarks/bookmarkstreeitem.cpp @@ -1,10 +1,8 @@ /* ============================================================ - * rekonq + * The rekonq project * ============================================================ * SPDX-License-Identifier: GPL-3.0-only * Copyright (C) 2022 aqua - * ============================================================ - * Description: rekonq bookmarks model * ============================================================ */ #include "bookmarkstreeitem.hpp" diff --git a/src/bookmarks/bookmarkstreeitem.hpp b/src/bookmarks/bookmarkstreeitem.hpp index 1f87ecad..05a71ce2 100644 --- a/src/bookmarks/bookmarkstreeitem.hpp +++ b/src/bookmarks/bookmarkstreeitem.hpp @@ -4,11 +4,13 @@ * SPDX-License-Identifier: GPL-3.0-only * Copyright (C) 2022 aqua * ============================================================ - * Description: rekonq bookmarks model + * Description: rekonq bookmark tree item * ============================================================ */ #pragma once +#include "rekonq.hpp" +#include #include #include #include @@ -18,25 +20,6 @@ class BookmarksTreeItem { public: - enum BookmarkAction { - OPEN = 0, - OPEN_IN_TAB, - OPEN_IN_WINDOW, - OPEN_FOLDER, - BOOKMARK_PAGE, - NEW_FOLDER, - NEW_SEPARATOR, - COPY, - EDIT, -#ifdef HAVE_NEPOMUK - FANCYBOOKMARK, -#endif - DELETE, - NUM_ACTIONS, - SET_TOOLBAR_FOLDER, - UNSET_TOOLBAR_FOLDER - }; - enum Types { Root, Folder, Bookmark, Separator, Alias }; constexpr static int TypesCount = 5; @@ -55,6 +38,14 @@ public: explicit BookmarksTreeItem(Types type, Attributes_t &&args, BookmarksTreeItem *parent); ~BookmarksTreeItem(); + template [[nodiscard]] QAction *action(T *sender, rekonq::OpenType type) const + { + auto *action = new QAction(m_data.title, sender); + QObject::connect(action, &QAction::triggered, sender, + [this, sender, type]() { emit sender->loadUrl(m_data.href, type); }); + return action; + }; + [[nodiscard]] BookmarksTreeItem *parent() const { return m_parent; } /** diff --git a/src/panels/bookmarksmenu.cpp b/src/panels/bookmarksmenu.cpp new file mode 100644 index 00000000..94615ff4 --- /dev/null +++ b/src/panels/bookmarksmenu.cpp @@ -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 + * ============================================================ */ + +#include "bookmarksmenu.hpp" +#include "bookmarks/bookmarkstreemodel.hpp" + +BookmarksMenu::BookmarksMenu(QWidget *parent) : QMenu(parent) +{ + connect(this, &QMenu::aboutToShow, this, &BookmarksMenu::refill); +} + +void BookmarksMenu::refill() +{ + Q_CHECK_PTR(model); + + for (auto *a : actions) { + removeAction(a); + delete a; + } + 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/panels/bookmarksmenu.hpp b/src/panels/bookmarksmenu.hpp new file mode 100644 index 00000000..f162244e --- /dev/null +++ b/src/panels/bookmarksmenu.hpp @@ -0,0 +1,39 @@ +/* ============================================================ + * 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 + * ============================================================ */ + +#pragma once + +#include "rekonq.hpp" +#include + +class BookmarksTreeModel; +class BookmarksMenu : public QMenu { + Q_OBJECT + +public: + explicit BookmarksMenu(QWidget *parent = nullptr); + ~BookmarksMenu() override = default; + + void setModel(const BookmarksTreeModel *ptr) + { + Q_CHECK_PTR(ptr); + model = ptr; + } + +signals: + void loadUrl(const QUrl &url, rekonq::OpenType type); + +private slots: + void refill(); + +private: + const BookmarksTreeModel *model = nullptr; + QList actions; +}; diff --git a/src/panels/bookmarkstoolbar.cpp b/src/panels/bookmarkstoolbar.cpp new file mode 100644 index 00000000..7c3517ec --- /dev/null +++ b/src/panels/bookmarkstoolbar.cpp @@ -0,0 +1,389 @@ +/* ============================================================ + * 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 + * ============================================================ */ + +#include "bookmarkstoolbar.hpp" +#include "bookmarks/bookmarkstreemodel.hpp" +#include + +BookmarkToolBar::BookmarkToolBar(QWidget *parent) : QToolBar(parent) +{ + /* +setContextMenuPolicy(Qt::CustomContextMenu); + +connect(this, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(contextMenu(QPoint))); +connect(BookmarkManager::self()->manager(), SIGNAL(changed(QString, QString)), this, SLOT(hideMenu())); + +setAcceptDrops(true); +installEventFilter(this); +setShortcutEnabled(false); + +if (isVisible()) { + BookmarkManager::self()->fillBookmarkBar(this); + m_filled = true; +} +*/ +} + +void BookmarkToolBar::showEvent(QShowEvent *event) +{ + Q_CHECK_PTR(model); + + clear(); + + 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; + addAction(child->action(this, rekonq::CurrentTab)); + } + + event->accept(); +} + +/* +void BookmarkToolBar::contextMenu(const QPoint &point) +{ + KBookmarkActionInterface *action = dynamic_cast(actionAt(point)); + KBookmark bookmark = BookmarkManager::self()->manager()->toolbar(); + bool nullAction = true; + if (action) { + bookmark = action->bookmark(); + nullAction = false; + } + + BookmarksContextMenu menu(bookmark, BookmarkManager::self()->manager(), BookmarkManager::self()->owner(), nullAction); + + menu.exec(mapToGlobal(point)); +} + +void BookmarkToolBar::menuDisplayed() +{ + qApp->installEventFilter(this); + m_currentMenu = qobject_cast(sender()); +} + +void BookmarkToolBar::menuHidden() +{ + qApp->removeEventFilter(this); + m_currentMenu = 0; +} + +void BookmarkToolBar::hideMenu() +{ + if (m_currentMenu) m_currentMenu->hide(); +} + +bool BookmarkToolBar::eventFilter(QObject *watched, QEvent *event) +{ + if (m_currentMenu && m_currentMenu->isVisible() && + !m_currentMenu->rect().contains(m_currentMenu->mapFromGlobal(QCursor::pos()))) { + // To switch root folders as in a menubar + + KBookmarkActionMenu *act = dynamic_cast(actionAt(mapFromGlobal(QCursor::pos()))); + + if (event->type() == QEvent::MouseMove && act && act->menu() != m_currentMenu) { + m_currentMenu->hide(); + QPoint pos = mapToGlobal(widgetForAction(act)->pos()); + act->menu()->popup(QPoint(pos.x(), pos.y() + widgetForAction(act)->height())); + } + else if (event->type() == QEvent::MouseButtonPress && act) { + m_currentMenu->hide(); + } + + return QObject::eventFilter(watched, event); + } + + switch (event->type()) { + case QEvent::Show: { + if (!m_filled) { + BookmarkManager::self()->fillBookmarkBar(this); + m_filled = true; + } + } break; + + case QEvent::ActionRemoved: { + QActionEvent *actionEvent = static_cast(event); + if (actionEvent && actionEvent->action() != m_dropAction) { + QWidget *widget = widgetForAction(actionEvent->action()); + if (widget) { widget->removeEventFilter(this); } + } + } break; + + case QEvent::ParentChange: { + QActionEvent *actionEvent = static_cast(event); + if (actionEvent && actionEvent->action() != m_dropAction) { + QWidget *widget = widgetForAction(actionEvent->action()); + if (widget) { widget->removeEventFilter(this); } + } + } break; + + case QEvent::DragEnter: { + QDragEnterEvent *dragEvent = static_cast(event); + if (dragEvent->mimeData()->hasFormat(BookmarkManager::bookmark_mime_type()) || + dragEvent->mimeData()->hasFormat("text/uri-list") || dragEvent->mimeData()->hasFormat("text/plain")) { + QFrame *dropIndicatorWidget = new QFrame(this); + dropIndicatorWidget->setFrameShape(QFrame::VLine); + m_dropAction = insertWidget(actionAt(dragEvent->pos()), dropIndicatorWidget); + + dragEvent->accept(); + } + } break; + + case QEvent::DragLeave: { + QDragLeaveEvent *dragEvent = static_cast(event); + + if (m_checkedAction) { + m_checkedAction->setCheckable(false); + m_checkedAction->setChecked(false); + } + + delete m_dropAction; + m_dropAction = 0; + dragEvent->accept(); + } break; + + case QEvent::DragMove: { + QDragMoveEvent *dragEvent = static_cast(event); + if (dragEvent->mimeData()->hasFormat(BookmarkManager::bookmark_mime_type()) || + dragEvent->mimeData()->hasFormat("text/uri-list") || dragEvent->mimeData()->hasFormat("text/plain")) { + QAction *overAction = actionAt(dragEvent->pos()); + KBookmarkActionInterface *overActionBK = dynamic_cast(overAction); + QWidget *widgetAction = widgetForAction(overAction); + + if (overAction != m_dropAction && overActionBK && widgetAction && m_dropAction) { + removeAction(m_dropAction); + if (m_checkedAction) { + m_checkedAction->setCheckable(false); + m_checkedAction->setChecked(false); + } + + if (!overActionBK->bookmark().isGroup()) { + if ((dragEvent->pos().x() - widgetAction->pos().x()) > (widgetAction->width() / 2)) { + if (actions().count() > actions().indexOf(overAction) + 1) { + insertAction(actions().at(actions().indexOf(overAction) + 1), m_dropAction); + } + else { + addAction(m_dropAction); + } + } + else { + insertAction(overAction, m_dropAction); + } + } + else { + if ((dragEvent->pos().x() - widgetAction->pos().x()) >= (widgetAction->width() * 0.75)) { + if (actions().count() > actions().indexOf(overAction) + 1) { + insertAction(actions().at(actions().indexOf(overAction) + 1), m_dropAction); + } + else { + addAction(m_dropAction); + } + } + else if ((dragEvent->pos().x() - widgetAction->pos().x()) <= (widgetAction->width() * 0.25)) { + insertAction(overAction, m_dropAction); + } + else { + overAction->setCheckable(true); + overAction->setChecked(true); + m_checkedAction = overAction; + } + } + + dragEvent->accept(); + } + } + } break; + + case QEvent::Drop: { + QDropEvent *dropEvent = static_cast(event); + KBookmark bookmark; + KBookmarkGroup root = BookmarkManager::self()->manager()->toolbar(); + + if (m_checkedAction) { + m_checkedAction->setCheckable(false); + m_checkedAction->setChecked(false); + } + + if (dropEvent->mimeData()->hasFormat(BookmarkManager::bookmark_mime_type())) { + QByteArray addresses = dropEvent->mimeData()->data(BookmarkManager::bookmark_mime_type()); + bookmark = BookmarkManager::self()->findByAddress(QString::fromLatin1(addresses.data())); + if (bookmark.isNull()) return false; + } + else if (dropEvent->mimeData()->hasFormat("text/uri-list")) { + // DROP is URL + QString url = dropEvent->mimeData()->urls().at(0).toString(); + WebWindow *w = qobject_cast(parent()); + QString title = url.contains(w->url().url()) ? w->title() : url; + bookmark = root.addBookmark(title, url); + } + else if (dropEvent->mimeData()->hasFormat("text/plain")) { + // DROP is TEXT + QString url = dropEvent->mimeData()->text(); + KUrl u(url); + if (u.isValid()) { + WebWindow *w = qobject_cast(parent()); + QString title = url.contains(w->url().url()) ? w->title() : url; + bookmark = root.addBookmark(title, url); + } + } + else { + return false; + } + + QAction *destAction = actionAt(dropEvent->pos()); + if (destAction && destAction == m_dropAction) { + if (actions().indexOf(m_dropAction) > 0) { destAction = actions().at(actions().indexOf(m_dropAction) - 1); } + else { + destAction = actions().at(1); + } + } + + if (destAction) { + KBookmarkActionInterface *destBookmarkAction = dynamic_cast(destAction); + QWidget *widgetAction = widgetForAction(destAction); + + if (destBookmarkAction && !destBookmarkAction->bookmark().isNull() && widgetAction && + bookmark.address() != destBookmarkAction->bookmark().address()) { + KBookmark destBookmark = destBookmarkAction->bookmark(); + + if (!destBookmark.isGroup()) { + if ((dropEvent->pos().x() - widgetAction->pos().x()) >= (widgetAction->width() / 2)) { + root.moveBookmark(bookmark, destBookmark); + } + else { + root.moveBookmark(bookmark, destBookmark.parentGroup().previous(destBookmark)); + } + } + else { + if ((dropEvent->pos().x() - widgetAction->pos().x()) >= (widgetAction->width() * 0.75)) { + root.moveBookmark(bookmark, destBookmark); + } + else if ((dropEvent->pos().x() - widgetAction->pos().x()) <= (widgetAction->width() * 0.25)) { + root.moveBookmark(bookmark, destBookmark.parentGroup().previous(destBookmark)); + } + else { + destBookmark.toGroup().addBookmark(bookmark); + } + } + + BookmarkManager::self()->emitChanged(); + } + } + else { + root.deleteBookmark(bookmark); + bookmark = root.addBookmark(bookmark); + if (dropEvent->pos().x() < widgetForAction(actions().first())->pos().x()) { + root.moveBookmark(bookmark, KBookmark()); + } + + BookmarkManager::self()->emitChanged(); + } + dropEvent->accept(); + } break; + + default: + break; + } + + QMouseEvent *mouseEvent = static_cast(event); + + // These events need to be handled only for Bookmark actions and not the bar + if (watched != this && mouseEvent) { + switch (event->type()) { + case QEvent::MouseButtonPress: // drag handling + { + QPoint pos = mapFromGlobal(QCursor::pos()); + KBookmarkActionInterface *action = dynamic_cast(actionAt(pos)); + + if (action && mouseEvent->button() != Qt::MidButton) { + m_dragAction = actionAt(pos); + m_startDragPos = pos; + + // The menu is displayed only when the mouse button is released + if (action->bookmark().isGroup()) return true; + } + } break; + + case QEvent::MouseMove: { + int distance = (mapFromGlobal(QCursor::pos()) - m_startDragPos).manhattanLength(); + if (!m_currentMenu && distance >= QApplication::startDragDistance()) { startDrag(); } + } break; + + case QEvent::MouseButtonRelease: { + QPoint destPos = mapFromGlobal(QCursor::pos()); + int distance = (destPos - m_startDragPos).manhattanLength(); + KBookmarkActionInterface *action = dynamic_cast(actionAt(destPos)); + + if (action) { + if (action->bookmark().isGroup()) { + if (mouseEvent->button() == Qt::MidButton) { + BookmarkManager::self()->owner()->loadBookmarkFolder(action->bookmark()); + } + else if (distance < QApplication::startDragDistance()) { + KBookmarkActionMenu *menu = dynamic_cast(actionAt(m_startDragPos)); + QPoint actionPos = mapToGlobal(widgetForAction(menu)->pos()); + menu->menu()->popup(QPoint(actionPos.x(), actionPos.y() + widgetForAction(menu)->height())); + } + } + else { + if (!action->bookmark().isNull() && !action->bookmark().isSeparator()) { + if (mouseEvent->button() == Qt::MidButton) { + BookmarkManager::self()->owner()->loadBookmarkInNewTab(action->bookmark()); + } + } + } + } + } break; + + default: + break; + } + } + + return QObject::eventFilter(watched, event); +} + +void BookmarkToolBar::startDrag() +{ + KBookmarkActionInterface *action = dynamic_cast(m_dragAction); + if (action) { + QMimeData *mimeData = new QMimeData; + KBookmark bookmark = action->bookmark(); + + QByteArray address = bookmark.address().toLatin1(); + mimeData->setData(BookmarkManager::bookmark_mime_type(), address); + bookmark.populateMimeData(mimeData); + + QDrag *drag = new QDrag(this); + drag->setMimeData(mimeData); + + if (bookmark.isGroup()) { drag->setPixmap(KIcon(bookmark.icon()).pixmap(24, 24)); } + else { + drag->setPixmap(IconManager::self()->iconForUrl(action->bookmark().url()).pixmap(24, 24)); + } + + drag->start(Qt::MoveAction); + connect(drag, SIGNAL(destroyed()), this, SLOT(dragDestroyed())); + } +} + +void BookmarkToolBar::dragDestroyed() +{ + // A workaround to get rid of the checked state of the dragged action + if (m_dragAction) { + m_dragAction->setVisible(false); + m_dragAction->setVisible(true); + m_dragAction = 0; + } + delete m_dropAction; + m_dropAction = 0; +} +*/ diff --git a/src/panels/bookmarkstoolbar.hpp b/src/panels/bookmarkstoolbar.hpp new file mode 100644 index 00000000..6aaa750a --- /dev/null +++ b/src/panels/bookmarkstoolbar.hpp @@ -0,0 +1,58 @@ +/* ============================================================ + * 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 + * ============================================================ */ + +#pragma once + +#include "rekonq.hpp" +#include + +class BookmarksTreeModel; + +/** + * This class manage the bookmark toolbar. + * Some events from the toolbar are handled to allow the drag and drop + */ +class BookmarkToolBar : public QToolBar { + Q_OBJECT + +public: + explicit BookmarkToolBar(QWidget *parent = nullptr); + ~BookmarkToolBar() override = default; + + void setModel(BookmarksTreeModel *ptr) + { + Q_CHECK_PTR(ptr); + model = ptr; + } + +signals: + void loadUrl(const QUrl &url, rekonq::OpenType type); + +protected: + void showEvent(QShowEvent *event) override; + // bool eventFilter(QObject *watched, QEvent *event); + +private slots: + // void contextMenu(const QPoint &); + // void menuDisplayed(); + // void menuHidden(); + // void hideMenu(); + // void dragDestroyed(); + +private: + BookmarksTreeModel *model = nullptr; + void startDrag(); + + QPoint m_startDragPos; + QAction *m_dragAction = nullptr; + QAction *m_dropAction = nullptr; + QAction *m_checkedAction = nullptr; + bool m_filled = false; +}; diff --git a/src/panels/navigationtoolbar.cpp b/src/panels/navigationtoolbar.cpp new file mode 100644 index 00000000..ae55ac02 --- /dev/null +++ b/src/panels/navigationtoolbar.cpp @@ -0,0 +1,49 @@ +/* ============================================================ + * The rekonq project + * ============================================================ + * SPDX-License-Identifier: GPL-3.0-only + * Copyright (C) 2022 aqua + * ============================================================ */ + +#include "navigationtoolbar.hpp" + +NavigationToolBar::NavigationToolBar(QWidget *parent) : QToolBar(parent), urlBar(new UrlBar(this)) +{ + auto *backAction = addAction(QIcon::fromTheme("go-previous"), "Back", this, [this]() { m_view->back(); }); + backAction->setObjectName("actionBack"); + auto *forwardAction = addAction(QIcon::fromTheme("go-next"), "Forward", this, [this]() { m_view->forward(); }); + forwardAction->setObjectName("actionForward"); + auto *refreshAction = addAction(QIcon::fromTheme("view-refresh"), "Refresh", this, [this]() { m_view->refresh(); }); + refreshAction->setObjectName("actionRefresh"); + addAction(QIcon::fromTheme("go-home"), "Home", this, + [this]() { emit loadUrl(rekonq::HomePage, rekonq::CurrentTab); }); + // TODO homeAction->setObjectName("actionHome"); + + addWidget(urlBar); + + auto *actionFocusUrlBar = new QAction(parent); + actionFocusUrlBar->setShortcut({"F6"}); + connect(actionFocusUrlBar, &QAction::triggered, urlBar, [this]() { + urlBar->setFocus(); + urlBar->selectAll(); + }); + parent->addAction(actionFocusUrlBar); +} + +void NavigationToolBar::setCurrentView(RekonqView *view) +{ + Q_CHECK_PTR(view); + m_view = view; + + disconnect(urlChanged_conn); + disconnect(loadStarted_conn); + disconnect(loadProgress_conn); + disconnect(loadFinished_conn); + + urlChanged_conn = connect(view, &RekonqView::urlChanged, urlBar, &UrlBar::setUrl); + loadStarted_conn = connect(view, &RekonqView::loadStarted, urlBar, &UrlBar::loadStarted); + loadProgress_conn = connect(view, &RekonqView::loadProgress, urlBar, &UrlBar::loadProgress); + loadFinished_conn = connect(view, &RekonqView::loadFinished, urlBar, &UrlBar::loadFinished); + + urlBar->setCurrentView(view); +} diff --git a/src/panels/navigationtoolbar.hpp b/src/panels/navigationtoolbar.hpp new file mode 100644 index 00000000..eaf5b145 --- /dev/null +++ b/src/panels/navigationtoolbar.hpp @@ -0,0 +1,36 @@ +/* ============================================================ + * The rekonq project + * ============================================================ + * SPDX-License-Identifier: GPL-3.0-only + * Copyright (C) 2022 aqua + * ============================================================ */ + +#pragma once + +#include "rekonq.hpp" +#include "urlbar/urlbar.hpp" +#include + +class RekonqView; +class NavigationToolBar : public QToolBar { + Q_OBJECT + +public: + explicit NavigationToolBar(QWidget *parent = nullptr); + ~NavigationToolBar() override = default; + +signals: + void loadUrl(rekonq::DefaultUrl url, rekonq::OpenType type = rekonq::CurrentTab); + +public slots: + void setCurrentView(RekonqView *view); + +private: + RekonqView *m_view; + UrlBar *urlBar; + + QMetaObject::Connection urlChanged_conn; + QMetaObject::Connection loadStarted_conn; + QMetaObject::Connection loadProgress_conn; + QMetaObject::Connection loadFinished_conn; +}; diff --git a/src/panels/tabtoolbar.cpp b/src/panels/tabtoolbar.cpp new file mode 100644 index 00000000..be3f1384 --- /dev/null +++ b/src/panels/tabtoolbar.cpp @@ -0,0 +1,49 @@ +/* ============================================================ + * The rekonq project + * ============================================================ + * SPDX-License-Identifier: GPL-3.0-only + * Copyright (C) 2022 aqua + * ============================================================ */ + +#include "tabtoolbar.hpp" + +TabToolBar::TabToolBar(QWidget *parent) : QToolBar(parent), tabs(new TabBar(this)) +{ + addWidget(tabs); + + auto *spacer = new QWidget(this); + spacer->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); + addWidget(spacer); + + auto *actionNewTab = parent->findChild("actionNewTab"); + Q_CHECK_PTR(actionNewTab); + addAction(QIcon::fromTheme("document-new"), "Add Tab", actionNewTab, &QAction::trigger); + + // currentViewChanged + connect(tabs, &QTabBar::currentChanged, this, [this](int index) { + if (index == -1) emit currentViewChanged(nullptr); + else { + auto view = tabs->view(index); + Q_CHECK_PTR(view); + emit currentViewChanged(view); + } + }); + + // removeView + connect(tabs, &QTabBar::tabCloseRequested, this, [this](int index) { emit tabClosed(tabs->removeTab(index)); }); +} + +int TabToolBar::addView(RekonqView *view) +{ + Q_CHECK_PTR(view); + return tabs->addTab(view); +} + +void TabToolBar::setCurrentView(RekonqView *view) { tabs->setCurrentView(view); } + +RekonqView *TabToolBar::currentView() const +{ + auto *view = tabs->view(tabs->currentIndex()); + Q_CHECK_PTR(view); + return view; +} diff --git a/src/panels/tabtoolbar.hpp b/src/panels/tabtoolbar.hpp new file mode 100644 index 00000000..1c61ed2a --- /dev/null +++ b/src/panels/tabtoolbar.hpp @@ -0,0 +1,33 @@ +/* ============================================================ + * The rekonq project + * ============================================================ + * SPDX-License-Identifier: GPL-3.0-only + * Copyright (C) 2022 aqua + * ============================================================ */ + +#pragma once + +#include "tabbar/tabbar.h" +#include + +class TabToolBar : public QToolBar { + Q_OBJECT + +public: + explicit TabToolBar(QWidget *parent = nullptr); + ~TabToolBar() override = default; + + int addView(RekonqView *view); + void setCurrentView(RekonqView *view); + [[nodiscard]] RekonqView *currentView() const; + +signals: + void currentViewChanged(RekonqView *view); + void tabClosed(RekonqView *view); + +public slots: + void closeCurrentTab() { emit tabs->tabCloseRequested(tabs->currentIndex()); } + +private: + TabBar *tabs; +}; diff --git a/src/rekonqwindow.cpp b/src/rekonqwindow.cpp index 461de12e..2295cd50 100644 --- a/src/rekonqwindow.cpp +++ b/src/rekonqwindow.cpp @@ -15,36 +15,11 @@ // -------------------------------------------------------------------------------------------------- -RekonqView *RekonqWindow::currentView() -{ - auto *view = ui->tabs->view(ui->tabs->currentIndex()); - Q_CHECK_PTR(view); - return view; -} - int RekonqWindow::addView(RekonqView *view) { Q_CHECK_PTR(view); - ui->views->addWidget(view); - const auto index = ui->tabs->addTab(view); - connect(view, &RekonqView::urlChanged, [this, view](const QUrl &url) { - if (view == currentView()) ui->urlBar->setUrl(url); - }); - connect(view, &RekonqView::titleChanged, [this, view](const QString &title) { - const auto idx = ui->views->indexOf(view); - ui->tabs->setTabText(idx, title); - }); - connect(view, &RekonqView::iconChanged, [this, view](const QIcon &icon) { - const auto idx = ui->views->indexOf(view); - ui->tabs->setTabIcon(idx, icon); - }); - - connect(view, &RekonqView::loadStarted, ui->urlBar, &UrlBar::loadStarted); - connect(view, &RekonqView::loadProgress, ui->urlBar, &UrlBar::loadProgress); - connect(view, &RekonqView::loadFinished, ui->urlBar, &UrlBar::loadFinished); - - return index; + return ui->tabToolBar->addView(view); } void RekonqWindow::loadUrl(rekonq::DefaultUrl url, rekonq::OpenType type) @@ -67,13 +42,13 @@ void RekonqWindow::loadUrl(const QUrl &url, rekonq::OpenType type) { switch (type) { case rekonq::CurrentTab: - currentView()->load(url); + ui->tabToolBar->currentView()->load(url); break; case rekonq::NewTab: Application::instance()->newView(url, this); break; case rekonq::NewFocusedTab: - ui->tabs->setCurrentView(Application::instance()->newView(url, this)); + ui->tabToolBar->setCurrentView(Application::instance()->newView(url, this)); break; case rekonq::NewBackGroundTab: break; diff --git a/src/rekonqwindow.hpp b/src/rekonqwindow.hpp index 04287a90..82542274 100644 --- a/src/rekonqwindow.hpp +++ b/src/rekonqwindow.hpp @@ -30,7 +30,6 @@ public: ~RekonqWindow() override; void setupShortcuts(RekonqSettings *settings); - [[nodiscard]] REKONQ_TEST_VIRTUAL RekonqView *currentView() REKONQ_TEST_PURE; public slots: REKONQ_TEST_VIRTUAL int addView(RekonqView *view) REKONQ_TEST_PURE; diff --git a/src/rekonqwindow.ui b/src/rekonqwindow.ui index 7879f848..a00f33f6 100644 --- a/src/rekonqwindow.ui +++ b/src/rekonqwindow.ui @@ -15,100 +15,6 @@ - - - - - - - - - border: none; - - - Add Tab - - - - .. - - - - - - - - - - - Back - - - - .. - - - - - - - Forward - - - - .. - - - - - - - Reload - - - - .. - - - - - - - Home - - - - .. - - - - - - - - - - Load - - - - .. - - - - - - - Menu - - - - .. - - - - - @@ -209,7 +115,7 @@ - + toolBar @@ -220,6 +126,28 @@ false + + + toolBar + + + TopToolBarArea + + + true + + + + + toolBar + + + TopToolBarArea + + + true + + Task Manager @@ -268,17 +196,6 @@ - - UrlBar - QLineEdit -
urlbar/urlbar.hpp
-
- - TabBar - QWidget -
tabbar/tabbar.h
- 1 -
BookmarksPanel QTreeView @@ -287,12 +204,22 @@ BookmarksMenu QMenu -
bookmarks/bookmarksmenu.hpp
+
panels/bookmarksmenu.hpp
BookmarkToolBar QToolBar -
bookmarks/bookmarkstoolbar.hpp
+
panels/bookmarkstoolbar.hpp
+
+ + NavigationToolBar + QToolBar +
panels/navigationtoolbar.hpp
+
+ + TabToolBar + QToolBar +
panels/tabtoolbar.hpp
diff --git a/src/rekonqwindow_class.cpp b/src/rekonqwindow_class.cpp index cf721448..996e1b6f 100644 --- a/src/rekonqwindow_class.cpp +++ b/src/rekonqwindow_class.cpp @@ -34,6 +34,8 @@ RekonqWindow::RekonqWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::Re ui->bookmarksToolBar->setModel(Application::instance()->bookmarks()); ui->menuBookmarks->setModel(Application::instance()->bookmarks()); #endif + connect(ui->navigationToolBar, &NavigationToolBar::loadUrl, this, + qOverload(&RekonqWindow::loadUrl)); connect(ui->bookmarksPanel, &BookmarksPanel::loadUrl, this, qOverload(&RekonqWindow::loadUrl)); connect(ui->bookmarksToolBar, &BookmarkToolBar::loadUrl, this, @@ -41,29 +43,17 @@ RekonqWindow::RekonqWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::Re connect(ui->menuBookmarks, &BookmarksMenu::loadUrl, this, qOverload(&RekonqWindow::loadUrl)); - connect(ui->tabs, &TabBar::currentChanged, this, [this](RekonqView *view) { + // ::setCurrentView + connect(ui->tabToolBar, &TabToolBar::currentViewChanged, this, [this](RekonqView *view) { if (view == nullptr) { // last tab has been closed close(); return; } ui->views->setCurrentWidget(view); - ui->urlBar->setCurrentView(view); + ui->navigationToolBar->setCurrentView(view); }); - connect(ui->tabs, &TabBar::removeView, this, [this](RekonqView *view) { ui->views->removeWidget(view); }); - - connect(ui->back, &QToolButton::clicked, this, [this]() { currentView()->back(); }); - connect(ui->forward, &QToolButton::clicked, this, [this]() { currentView()->forward(); }); - connect(ui->refresh, &QToolButton::clicked, this, [this]() { currentView()->refresh(); }); - connect(ui->home, &QToolButton::clicked, this, [this]() { loadUrl(rekonq::HomePage, rekonq::CurrentTab); }); - - auto *actionFocusUrlBar = new QAction(this); - actionFocusUrlBar->setShortcut({"F6"}); - connect(actionFocusUrlBar, &QAction::triggered, this, [this]() { - ui->urlBar->setFocus(); - ui->urlBar->selectAll(); - }); - addAction(actionFocusUrlBar); + connect(ui->tabToolBar, &TabToolBar::tabClosed, this, [this](RekonqView *view) { ui->views->removeWidget(view); }); // connect menu actions // file menu @@ -76,8 +66,7 @@ RekonqWindow::RekonqWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::Re #endif connect(ui->actionNewTab, &QAction::triggered, this, [this]() { loadUrl(rekonq::NewTabPage, rekonq::NewFocusedTab); }); - connect(ui->actionCloseTab, &QAction::triggered, this, - [this]() { emit ui->tabs->tabCloseRequested(ui->tabs->currentIndex()); }); + connect(ui->actionCloseTab, &QAction::triggered, ui->tabToolBar, &TabToolBar::closeCurrentTab); connect(ui->actionQuit, &QAction::triggered, qApp, &QApplication::quit); // edit menu // view menu @@ -92,8 +81,6 @@ RekonqWindow::RekonqWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::Re #endif // help menu connect(ui->actionAboutQt, &QAction::triggered, qApp, &QApplication::aboutQt); - - connect(ui->newTab, &QToolButton::clicked, ui->actionNewTab, &QAction::trigger); } RekonqWindow::~RekonqWindow() { delete ui; } diff --git a/src/tabbar/tabbar.cpp b/src/tabbar/tabbar.cpp index 849dfbc1..4cd39550 100644 --- a/src/tabbar/tabbar.cpp +++ b/src/tabbar/tabbar.cpp @@ -22,23 +22,8 @@ TabBar::TabBar(QWidget *parent) : QTabBar(parent) setMovable(true); setAcceptDrops(true); - connect(this, &QTabBar::currentChanged, this, [this](int index) { - if (index == -1) { - emit currentChanged(nullptr); - return; - } - auto view = m_views.at(index); - Q_ASSERT(!view.isNull()); - emit currentChanged(view); - }); connect(this, &QTabBar::tabMoved, this, [this](int from, int to) { m_views.move(from, to); }); - connect(this, &QTabBar::tabCloseRequested, this, [this](int index) { - removeTab(index); - emit removeView(m_views.at(index)); - m_views.removeAt(index); - }); - /* // context menu(s) setContextMenuPolicy(Qt::CustomContextMenu); @@ -62,10 +47,23 @@ int TabBar::addTab(RekonqView *view) const int index = m_views.indexOf(view); setTabText(index, title); }); + connect(view, &RekonqView::iconChanged, this, [this, view](const QIcon &icon) { + const int index = m_views.indexOf(view); + setTabIcon(index, icon); + }); return id; } +RekonqView *TabBar::removeTab(int index) +{ + RekonqView *view = m_views.at(index); + m_views.removeAt(index); + QTabBar::removeTab(index); + + return view; +} + // ------------------------------------------------------------------------------------ QSize TabBar::tabSizeHint(int index) const diff --git a/src/tabbar/tabbar.h b/src/tabbar/tabbar.h index 793e2acf..db2e6d1c 100644 --- a/src/tabbar/tabbar.h +++ b/src/tabbar/tabbar.h @@ -23,6 +23,7 @@ public: explicit TabBar(QWidget *parent = nullptr); int addTab(RekonqView *view); + RekonqView *removeTab(int index); [[nodiscard]] RekonqView *view(int index) { return m_views.at(index); } /* void setTabHighlighted(int index, bool b); @@ -35,10 +36,6 @@ public: setCurrentIndex(index); } -signals: - void currentChanged(RekonqView *view); - void removeView(RekonqView *); - protected: [[nodiscard]] QSize tabSizeHint(int index) const override; /* diff --git a/src/test/rekonqwindow_mock.hpp b/src/test/rekonqwindow_mock.hpp index 403237d4..7ec30d88 100644 --- a/src/test/rekonqwindow_mock.hpp +++ b/src/test/rekonqwindow_mock.hpp @@ -10,7 +10,6 @@ public: explicit FakeWindow(QWidget *parent = nullptr) : RekonqWindow(parent) {} ~FakeWindow() override = default; - MOCK_METHOD(RekonqView *, currentView, (), (override)); MOCK_METHOD(int, addView, (RekonqView *), (override)); MOCK_METHOD(void, loadUrl, (rekonq::DefaultUrl, rekonq::OpenType), (override)); MOCK_METHOD(void, loadUrl, (const QUrl &, rekonq::OpenType), (override)); diff --git a/src/test/test_rekonqwindow.cpp b/src/test/test_rekonqwindow.cpp index 9e90cd94..46c63e53 100644 --- a/src/test/test_rekonqwindow.cpp +++ b/src/test/test_rekonqwindow.cpp @@ -11,7 +11,6 @@ using ::testing::ReturnArg; TEST(RekonqWindow, mock_shortcuts) { FakeWindow window; - EXPECT_CALL(window, currentView).Times(0); EXPECT_CALL(window, addView).Times(0); EXPECT_CALL(window, loadUrl(Matcher(_), _)).Times(0); EXPECT_CALL(window, loadUrl(Matcher(_), _)).Times(0); diff --git a/src/urlbar/urlbar.cpp b/src/urlbar/urlbar.cpp index 18067f09..6c726d5a 100644 --- a/src/urlbar/urlbar.cpp +++ b/src/urlbar/urlbar.cpp @@ -80,8 +80,13 @@ UrlBar::UrlBar(QWidget *parent) // connect(_suggestionTimer, SIGNAL(timeout()), this, SLOT(suggest())); } +// ----------------------------------------------------------------------------------------------------------- +// slots + void UrlBar::setUrl(const QUrl &url) { + Q_ASSERT(sender() == m_currentView); + if (url.scheme() == QL1S("rekonq")) return; // we don't set empty url @@ -100,9 +105,6 @@ void UrlBar::setUrl(const QUrl &url) setCursorPosition(0); } -// ----------------------------------------------------------------------------------------------------------- -// slots - void UrlBar::loadRequestedUrl(const QUrl &url, rekonq::OpenType type) { clearFocus(); @@ -114,7 +116,7 @@ void UrlBar::loadRequestedUrl(const QUrl &url, rekonq::OpenType type) void UrlBar::loadStarted() { - if (sender() != m_currentView) return; + Q_ASSERT(sender() == m_currentView); m_currentView_progress = 1; _icon->setIcon(QIcon::fromTheme("text-html")); // clearRightIcons(); @@ -124,14 +126,14 @@ void UrlBar::loadStarted() void UrlBar::loadProgress(int progress) { - if (sender() != m_currentView) return; + Q_ASSERT(sender() == m_currentView); m_currentView_progress = progress; repaint(); } void UrlBar::loadFinished() { - if (sender() != m_currentView) return; + Q_ASSERT(sender() == m_currentView); m_currentView_progress = 100; // refreshFavicon(); // updateRightIcons(); diff --git a/src/urlbar/urlbar.hpp b/src/urlbar/urlbar.hpp index 8be97838..3e3b9059 100644 --- a/src/urlbar/urlbar.hpp +++ b/src/urlbar/urlbar.hpp @@ -42,8 +42,11 @@ public slots: void setCurrentView(RekonqView *view) { m_currentView = view; - loadProgress(view->progress()); - setUrl(view->url()); + m_currentView_progress = view->progress(); + + emit view->urlChanged(view->url()); + // setUrl(view->url()); + repaint(); } void setUrl(const QUrl &url); -- cgit v1.2.1