diff options
| author | aqua <aqua@iserlohn-fortress.net> | 2022-09-18 09:57:29 +0300 | 
|---|---|---|
| committer | aqua <aqua@iserlohn-fortress.net> | 2022-09-18 09:57:29 +0300 | 
| commit | 1b1e327cb73491c17972a33a07c3c9beafe7f938 (patch) | |
| tree | 57fa4bc121fc2e172db42288fec7cdd7ff95399c /src/bookmarks | |
| parent | Add Bookmarks toolbar (diff) | |
| download | rekonq-1b1e327cb73491c17972a33a07c3c9beafe7f938.tar.xz | |
Add Navigation and Tab toolbars
Diffstat (limited to 'src/bookmarks')
| -rw-r--r-- | src/bookmarks/CMakeLists.txt | 3 | ||||
| -rw-r--r-- | src/bookmarks/bookmarksmenu.cpp | 41 | ||||
| -rw-r--r-- | src/bookmarks/bookmarksmenu.hpp | 39 | ||||
| -rw-r--r-- | src/bookmarks/bookmarkstoolbar.cpp | 391 | ||||
| -rw-r--r-- | src/bookmarks/bookmarkstoolbar.hpp | 58 | ||||
| -rw-r--r-- | src/bookmarks/bookmarkstreeitem.cpp | 4 | ||||
| -rw-r--r-- | src/bookmarks/bookmarkstreeitem.hpp | 31 | 
7 files changed, 12 insertions, 555 deletions
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 <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> - * ============================================================ */ - -#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 <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> - * ============================================================ */ - -#pragma once - -#include "rekonq.hpp" -#include <QMenu> - -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<QAction *> 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 <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> - * ============================================================ */ - -#include "bookmarkstoolbar.hpp" -#include "bookmarkstreemodel.hpp" -#include <QShowEvent> - -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<KBookmarkActionInterface *>(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<KMenu *>(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<KBookmarkActionMenu *>(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<QActionEvent *>(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<QActionEvent *>(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<QDragEnterEvent *>(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<QDragLeaveEvent *>(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<QDragMoveEvent *>(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<KBookmarkActionInterface *>(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<QDropEvent *>(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<WebWindow *>(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<WebWindow *>(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<KBookmarkActionInterface *>(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<QMouseEvent *>(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<KBookmarkActionInterface *>(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<KBookmarkActionInterface *>(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<KBookmarkActionMenu *>(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<KBookmarkActionInterface *>(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 <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> - * ============================================================ */ - -#pragma once - -#include "rekonq.hpp" -#include <QToolBar> - -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 <aqua@iserlohn-fortress.net> - * ============================================================ - * 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 <aqua@iserlohn-fortress.net>   * ============================================================ - * Description: rekonq bookmarks model + * Description: rekonq bookmark tree item   * ============================================================ */  #pragma once +#include "rekonq.hpp" +#include <QAction>  #include <QDateTime>  #include <QIcon>  #include <QUrl> @@ -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 <typename T> [[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; }    /**  | 
