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 }