File indexing completed on 2024-05-12 04:57:57

0001 /* ============================================================
0002 * Falkon - Qt web browser
0003 * Copyright (C) 2014  David Rosca <nowrep@gmail.com>
0004 *
0005 * This program is free software: you can redistribute it and/or modify
0006 * it under the terms of the GNU General Public License as published by
0007 * the Free Software Foundation, either version 3 of the License, or
0008 * (at your option) any later version.
0009 *
0010 * This program is distributed in the hope that it will be useful,
0011 * but WITHOUT ANY WARRANTY; without even the implied warranty of
0012 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
0013 * GNU General Public License for more details.
0014 *
0015 * You should have received a copy of the GNU General Public License
0016 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
0017 * ============================================================ */
0018 #include "bookmarksmenu.h"
0019 #include "bookmarkstools.h"
0020 #include "bookmarkitem.h"
0021 #include "bookmarks.h"
0022 #include "mainapplication.h"
0023 #include "browsinglibrary.h"
0024 #include "browserwindow.h"
0025 #include "qzsettings.h"
0026 #include "tabwidget.h"
0027 #include "iconprovider.h"
0028 
0029 BookmarksMenu::BookmarksMenu(QWidget* parent)
0030     : Menu(parent)
0031     , m_window(nullptr)
0032     , m_changed(true)
0033 {
0034     init();
0035 
0036     connect(mApp->bookmarks(), &Bookmarks::bookmarkAdded, this, &BookmarksMenu::bookmarksChanged);
0037     connect(mApp->bookmarks(), &Bookmarks::bookmarkRemoved, this, &BookmarksMenu::bookmarksChanged);
0038     connect(mApp->bookmarks(), &Bookmarks::bookmarkChanged, this, &BookmarksMenu::bookmarksChanged);
0039 }
0040 
0041 void BookmarksMenu::setMainWindow(BrowserWindow* window)
0042 {
0043     Q_ASSERT(window);
0044 
0045     m_window = window;
0046 }
0047 
0048 void BookmarksMenu::bookmarkPage()
0049 {
0050     if (m_window) {
0051         m_window->bookmarkPage();
0052     }
0053 }
0054 
0055 void BookmarksMenu::bookmarkAllTabs()
0056 {
0057     if (m_window) {
0058         BookmarksTools::bookmarkAllTabsDialog(m_window, m_window->tabWidget());
0059     }
0060 }
0061 
0062 void BookmarksMenu::showBookmarksManager()
0063 {
0064     if (m_window) {
0065         mApp->browsingLibrary()->showBookmarks(m_window);
0066     }
0067 }
0068 
0069 void BookmarksMenu::bookmarksChanged()
0070 {
0071     m_changed = true;
0072 }
0073 
0074 void BookmarksMenu::aboutToShow()
0075 {
0076     if (m_changed) {
0077         refresh();
0078         m_changed = false;
0079     }
0080 }
0081 
0082 void BookmarksMenu::menuAboutToShow()
0083 {
0084     Q_ASSERT(qobject_cast<Menu*>(sender()));
0085     Menu *menu = static_cast<Menu*>(sender());
0086 
0087     const auto menuActions = menu->actions();
0088     for (QAction *action : menuActions) {
0089         BookmarkItem *item = static_cast<BookmarkItem*>(action->data().value<void*>());
0090         if (item && item->type() == BookmarkItem::Url && action->icon().isNull()) {
0091             action->setIcon(item->icon());
0092         }
0093     }
0094 }
0095 
0096 void BookmarksMenu::menuMiddleClicked(Menu* menu)
0097 {
0098     BookmarkItem* item = static_cast<BookmarkItem*>(menu->menuAction()->data().value<void*>());
0099     Q_ASSERT(item);
0100     openFolder(item);
0101 }
0102 
0103 void BookmarksMenu::bookmarkActivated()
0104 {
0105     if (auto* action = qobject_cast<QAction*>(sender())) {
0106         BookmarkItem* item = static_cast<BookmarkItem*>(action->data().value<void*>());
0107         Q_ASSERT(item);
0108         openBookmark(item);
0109     }
0110 }
0111 
0112 void BookmarksMenu::bookmarkCtrlActivated()
0113 {
0114     if (auto* action = qobject_cast<QAction*>(sender())) {
0115         BookmarkItem* item = static_cast<BookmarkItem*>(action->data().value<void*>());
0116         Q_ASSERT(item);
0117         openBookmarkInNewTab(item);
0118     }
0119 }
0120 
0121 void BookmarksMenu::bookmarkShiftActivated()
0122 {
0123     if (auto* action = qobject_cast<QAction*>(sender())) {
0124         BookmarkItem* item = static_cast<BookmarkItem*>(action->data().value<void*>());
0125         Q_ASSERT(item);
0126         openBookmarkInNewWindow(item);
0127     }
0128 }
0129 
0130 void BookmarksMenu::openFolder(BookmarkItem* item)
0131 {
0132     Q_ASSERT(item->isFolder());
0133 
0134     if (m_window) {
0135         BookmarksTools::openFolderInTabs(m_window, item);
0136     }
0137 }
0138 
0139 void BookmarksMenu::openBookmark(BookmarkItem* item)
0140 {
0141     Q_ASSERT(item->isUrl());
0142 
0143     if (m_window) {
0144         BookmarksTools::openBookmark(m_window, item);
0145     }
0146 }
0147 
0148 void BookmarksMenu::openBookmarkInNewTab(BookmarkItem* item)
0149 {
0150     Q_ASSERT(item->isUrl());
0151 
0152     if (m_window) {
0153         BookmarksTools::openBookmarkInNewTab(m_window, item);
0154     }
0155 }
0156 
0157 void BookmarksMenu::openBookmarkInNewWindow(BookmarkItem* item)
0158 {
0159     Q_ASSERT(item->isUrl());
0160 
0161     BookmarksTools::openBookmarkInNewWindow(item);
0162 }
0163 
0164 void BookmarksMenu::init()
0165 {
0166     setTitle(tr("&Bookmarks"));
0167 
0168     addAction(tr("Bookmark &This Page"), this, &BookmarksMenu::bookmarkPage)->setShortcut(QKeySequence(QSL("Ctrl+D")));
0169     addAction(tr("Bookmark &All Tabs"), this, &BookmarksMenu::bookmarkAllTabs);
0170     addAction(QIcon::fromTheme(QSL("bookmarks-organize")), tr("Organize &Bookmarks"), this, &BookmarksMenu::showBookmarksManager)->setShortcut(QKeySequence(QSL("Ctrl+Shift+O")));
0171     addSeparator();
0172 
0173     connect(this, SIGNAL(aboutToShow()), this, SLOT(aboutToShow()));
0174     connect(this, SIGNAL(aboutToShow()), this, SLOT(menuAboutToShow()));
0175     connect(this, SIGNAL(menuMiddleClicked(Menu*)), this, SLOT(menuMiddleClicked(Menu*)));
0176 }
0177 
0178 void BookmarksMenu::refresh()
0179 {
0180     while (actions().count() != 4) {
0181         QAction* act = actions().at(4);
0182         if (act->menu()) {
0183             act->menu()->clear();
0184         }
0185         removeAction(act);
0186         delete act;
0187     }
0188 
0189     BookmarksTools::addActionToMenu(this, this, mApp->bookmarks()->toolbarFolder());
0190     addSeparator();
0191 
0192     const auto children = mApp->bookmarks()->menuFolder()->children();
0193     for (BookmarkItem* child : children) {
0194         BookmarksTools::addActionToMenu(this, this, child);
0195     }
0196 
0197     addSeparator();
0198     BookmarksTools::addActionToMenu(this, this, mApp->bookmarks()->unsortedFolder());
0199 }