Add code for expand url
[kdepim.git] / akregator / src / actions / actionmanagerimpl.cpp
blob5e80406849b3edfef69f1ca7797c0bb2978ad1b4
1 /*
2 This file is part of Akregator.
4 Copyright (C) 2005 Frank Osterfeld <osterfeld@kde.org>
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
20 As a special exception, permission is given to link this program
21 with any edition of Qt, and distribute the resulting executable,
22 without including the source code for Qt in the source distribution.
25 #include "actionmanagerimpl.h"
26 #include "akregatorconfig.h"
27 #include "akregator_part.h"
28 #include "articlelistview.h"
29 #include "feed.h"
30 #include "fetchqueue.h"
31 #include "folder.h"
32 #include "kernel.h"
33 #include "mainwidget.h"
34 #include "subscriptionlistview.h"
35 #include "tabwidget.h"
36 #include "trayicon.h"
37 #include "treenode.h"
38 #include "treenodevisitor.h"
40 #include <MessageViewer/ZoomActionMenu>
42 #include <kactionmenu.h>
43 #include <ktoolbarpopupaction.h>
44 #include <QAction>
45 #include <KToggleAction>
46 #include <kactioncollection.h>
47 #include "akregator_debug.h"
48 #include <KLocalizedString>
49 #include <QMenu>
50 #include <QKeySequence>
51 #include <kstandardshortcut.h>
52 #include <kstandardaction.h>
53 #include <kxmlguifactory.h>
54 #include <KGuiItem>
56 #include <QApplication>
57 #include <QHash>
58 #include <QWidget>
60 namespace Akregator
63 class ActionManagerImpl::NodeSelectVisitor : public TreeNodeVisitor
65 public:
66 NodeSelectVisitor(ActionManagerImpl *manager) : m_manager(manager) {}
68 bool visitFeed(Feed *node) Q_DECL_OVERRIDE {
69 QAction *remove = m_manager->action(QStringLiteral("feed_remove"));
70 if (remove)
72 remove->setEnabled(true);
74 QAction *hp = m_manager->action(QStringLiteral("feed_homepage"));
75 if (hp)
77 hp->setEnabled(!node->htmlUrl().isEmpty());
79 m_manager->action(QStringLiteral("feed_fetch"))->setText(i18n("&Fetch Feed"));
80 m_manager->action(QStringLiteral("feed_remove"))->setText(i18n("&Delete Feed"));
81 m_manager->action(QStringLiteral("feed_modify"))->setText(i18n("&Edit Feed..."));
82 m_manager->action(QStringLiteral("feed_mark_all_as_read"))->setText(i18n("&Mark Feed as Read"));
84 return true;
87 bool visitFolder(Folder *node) Q_DECL_OVERRIDE {
88 QAction *remove = m_manager->action(QStringLiteral("feed_remove"));
89 if (remove)
91 remove->setEnabled(node->parent()); // root nodes must not be deleted
93 QAction *hp = m_manager->action(QStringLiteral("feed_homepage"));
94 if (hp)
96 hp->setEnabled(false);
99 m_manager->action(QStringLiteral("feed_fetch"))->setText(i18n("&Fetch Feeds"));
100 m_manager->action(QStringLiteral("feed_remove"))->setText(i18n("&Delete Folder"));
101 m_manager->action(QStringLiteral("feed_modify"))->setText(i18n("&Rename Folder"));
102 m_manager->action(QStringLiteral("feed_mark_all_as_read"))->setText(i18n("&Mark Feeds as Read"));
104 return true;
107 private:
108 ActionManagerImpl *m_manager;
111 class ActionManagerImpl::ActionManagerImplPrivate
113 public:
114 QString quickSearchLineText() const;
115 NodeSelectVisitor *nodeSelectVisitor;
116 ArticleListView *articleList;
117 SubscriptionListView *subscriptionListView;
118 MainWidget *mainWidget;
119 Part *part;
120 TrayIcon *trayIcon;
121 KActionMenu *tagMenu;
122 KActionCollection *actionCollection;
123 TabWidget *tabWidget;
124 PimCommon::ShareServiceUrlManager *shareServiceManager;
125 MessageViewer::ZoomActionMenu *zoomActionMenu;
126 QAction *mQuickSearchAction;
129 void ActionManagerImpl::slotNodeSelected(TreeNode *node)
131 if (node != 0) {
132 d->nodeSelectVisitor->visit(node);
136 ActionManagerImpl::ActionManagerImpl(Part *part, QObject *parent)
137 : ActionManager(parent), d(new ActionManagerImplPrivate)
139 d->nodeSelectVisitor = new NodeSelectVisitor(this);
140 d->part = part;
141 d->subscriptionListView = 0;
142 d->articleList = 0;
143 d->trayIcon = 0;
144 d->mainWidget = 0;
145 d->tabWidget = 0;
146 d->tagMenu = 0;
147 d->actionCollection = part->actionCollection();
148 d->shareServiceManager = new PimCommon::ShareServiceUrlManager(this);
149 initPart();
152 ActionManagerImpl::~ActionManagerImpl()
154 delete d->nodeSelectVisitor;
155 delete d;
156 d = 0;
159 void ActionManagerImpl::setTrayIcon(TrayIcon *trayIcon)
161 if (trayIcon == 0) {
162 d->trayIcon = 0;
163 return;
165 if (d->trayIcon) {
166 return;
167 } else {
168 d->trayIcon = trayIcon;
171 QMenu *traypop = trayIcon->contextMenu();
173 if (QAction *act = actionCollection()->action(QStringLiteral("feed_fetch_all"))) {
174 traypop->addAction(act);
176 if (QAction *act = actionCollection()->action(QStringLiteral("options_configure"))) {
177 traypop->addAction(act);
181 void ActionManagerImpl::initPart()
183 QAction *action = d->actionCollection->addAction(QStringLiteral("file_import"));
184 action->setText(i18n("&Import Feeds..."));
185 action->setIcon(QIcon::fromTheme(QStringLiteral("document-import")));
186 connect(action, &QAction::triggered, d->part, &Part::fileImport);
187 action = d->actionCollection->addAction(QStringLiteral("file_export"));
188 action->setText(i18n("&Export Feeds..."));
189 action->setIcon(QIcon::fromTheme(QStringLiteral("document-export")));
190 connect(action, &QAction::triggered, d->part, &Part::fileExport);
192 QAction *configure = d->actionCollection->addAction(QStringLiteral("options_configure"));
193 configure->setText(i18n("&Configure Akregator..."));
194 configure->setIcon(QIcon::fromTheme(QStringLiteral("configure")));
195 connect(configure, &QAction::triggered, d->part, &Part::showOptions);
197 KStandardAction::configureNotifications(d->part, SLOT(showNotificationOptions()), d->actionCollection); // options_configure_notifications
200 void ActionManagerImpl::initMainWidget(MainWidget *mainWidget)
202 if (d->mainWidget) {
203 return;
206 d->mainWidget = mainWidget;
208 KActionCollection *coll = actionCollection();
210 // Feed/Feed Group popup menu
211 QAction *action = coll->addAction(QStringLiteral("feed_homepage"));
212 action->setText(i18n("&Open Homepage"));
213 connect(action, &QAction::triggered, d->mainWidget, &MainWidget::slotOpenHomepage);
214 coll->setDefaultShortcut(action, QKeySequence(QStringLiteral("Ctrl+H")));
216 action = coll->addAction(QStringLiteral("reload_all_tabs"));
217 action->setIcon(QIcon::fromTheme(QStringLiteral("view-refresh")));
218 action->setText(i18n("Reload All Tabs"));
219 connect(action, &QAction::triggered, d->mainWidget, &MainWidget::slotReloadAllTabs);
220 coll->setDefaultShortcut(action, QKeySequence(QStringLiteral("Shift+F5")));
222 action = coll->addAction(QStringLiteral("feed_add"));
223 action->setIcon(QIcon::fromTheme(QStringLiteral("feed-subscribe")));
224 action->setText(i18n("&Add Feed..."));
225 connect(action, &QAction::triggered, d->mainWidget, &MainWidget::slotFeedAdd);
226 coll->setDefaultShortcut(action, QKeySequence(QStringLiteral("Insert")));
228 action = coll->addAction(QStringLiteral("feed_add_group"));
229 action->setIcon(QIcon::fromTheme(QStringLiteral("folder-new")));
230 action->setText(i18n("Ne&w Folder..."));
231 connect(action, &QAction::triggered, d->mainWidget, &MainWidget::slotFeedAddGroup);
232 coll->setDefaultShortcut(action, QKeySequence(QStringLiteral("Shift+Insert")));
234 action = coll->addAction(QStringLiteral("feed_remove"));
235 action->setIcon(QIcon::fromTheme(QStringLiteral("edit-delete")));
236 action->setText(i18n("&Delete Feed"));
237 connect(action, &QAction::triggered, d->mainWidget, &MainWidget::slotFeedRemove);
238 coll->setDefaultShortcut(action, QKeySequence(QStringLiteral("Alt+Delete")));
240 action = coll->addAction(QStringLiteral("feed_modify"));
241 action->setIcon(QIcon::fromTheme(QStringLiteral("document-properties")));
242 action->setText(i18n("&Edit Feed..."));
243 connect(action, &QAction::triggered, d->mainWidget, &MainWidget::slotFeedModify);
244 coll->setDefaultShortcut(action, QKeySequence(QStringLiteral("F2")));
246 // toolbar / View
248 const MainWidget::ViewMode viewMode = static_cast<MainWidget::ViewMode>(Settings::viewMode());
249 QActionGroup *group = new QActionGroup(this);
250 action = coll->addAction(QStringLiteral("normal_view"));
251 action->setCheckable(true);
252 action->setChecked(viewMode == MainWidget::NormalView);
253 group->addAction(action);
254 action->setIcon(QIcon::fromTheme(QStringLiteral("view-split-top-bottom")));
255 action->setText(i18n("&Normal View"));
256 connect(action, &QAction::triggered, d->mainWidget, &MainWidget::slotNormalView);
257 coll->setDefaultShortcut(action, QKeySequence(QStringLiteral("Ctrl+Shift+1")));
259 action = coll->addAction(QStringLiteral("widescreen_view"));
260 action->setCheckable(true);
261 action->setChecked(viewMode == MainWidget::WidescreenView);
262 group->addAction(action);
263 action->setIcon(QIcon::fromTheme(QStringLiteral("view-split-left-right")));
264 action->setText(i18n("&Widescreen View"));
265 connect(action, &QAction::triggered, d->mainWidget, &MainWidget::slotWidescreenView);
266 coll->setDefaultShortcut(action, QKeySequence(QStringLiteral("Ctrl+Shift+2")));
268 action = coll->addAction(QStringLiteral("combined_view"));
269 action->setCheckable(true);
270 action->setChecked(viewMode == MainWidget::CombinedView);
271 group->addAction(action);
272 action->setIcon(QIcon::fromTheme(QStringLiteral("view-list-text")));
273 action->setText(i18n("C&ombined View"));
274 connect(action, &QAction::triggered, d->mainWidget, &MainWidget::slotCombinedView);
275 coll->setDefaultShortcut(action, QKeySequence(QStringLiteral("Ctrl+Shift+3")));
277 // toolbar / feed menu
278 action = coll->addAction(QStringLiteral("feed_fetch"));
279 action->setIcon(QIcon::fromTheme(QStringLiteral("go-down")));
280 action->setText(i18n("&Fetch Feed"));
281 connect(action, &QAction::triggered, d->mainWidget, &MainWidget::slotFetchCurrentFeed);
282 coll->setDefaultShortcuts(action, KStandardShortcut::shortcut(KStandardShortcut::Reload));
284 action = coll->addAction(QStringLiteral("feed_fetch_all"));
285 action->setIcon(QIcon::fromTheme(QStringLiteral("go-bottom")));
286 action->setText(i18n("Fe&tch All Feeds"));
287 connect(action, &QAction::triggered, d->mainWidget, &MainWidget::slotFetchAllFeeds);
288 coll->setDefaultShortcut(action, QKeySequence(QStringLiteral("Ctrl+L")));
290 QAction *stopAction = coll->addAction(QStringLiteral("feed_stop"));
291 stopAction->setIcon(QIcon::fromTheme(QStringLiteral("process-stop")));
292 stopAction->setText(i18n("C&ancel Feed Fetches"));
293 connect(stopAction, &QAction::triggered, Kernel::self()->fetchQueue(), &FetchQueue::slotAbort);
294 coll->setDefaultShortcut(stopAction, QKeySequence(Qt::Key_Escape));
295 stopAction->setEnabled(false);
297 action = coll->addAction(QStringLiteral("feed_mark_all_as_read"));
298 action->setIcon(QIcon::fromTheme(QStringLiteral("mail-mark-read")));
299 action->setText(i18n("&Mark Feed as Read"));
300 connect(action, &QAction::triggered, d->mainWidget, &MainWidget::slotMarkAllRead);
301 coll->setDefaultShortcut(action, QKeySequence(QStringLiteral("Ctrl+R")));
303 action = coll->addAction(QStringLiteral("feed_mark_all_feeds_as_read"));
304 action->setIcon(QIcon::fromTheme(QStringLiteral("mail-mark-read")));
305 action->setText(i18n("Ma&rk All Feeds as Read"));
306 connect(action, &QAction::triggered, d->mainWidget, &MainWidget::slotMarkAllFeedsRead);
307 coll->setDefaultShortcut(action, QKeySequence(QStringLiteral("Ctrl+Shift+R")));
309 // Settings menu
310 KToggleAction *sqf = coll->add<KToggleAction>(QStringLiteral("show_quick_filter"));
311 sqf->setText(i18n("Show Quick Filter"));
312 connect(sqf, &QAction::triggered, d->mainWidget, &MainWidget::slotToggleShowQuickFilter);
313 sqf->setChecked(Settings::showQuickFilter());
315 action = coll->addAction(QStringLiteral("article_open"));
316 action->setIcon(QIcon::fromTheme(QStringLiteral("tab-new")));
317 action->setText(i18n("Open in Tab"));
318 connect(action, &QAction::triggered, d->mainWidget, &MainWidget::slotOpenSelectedArticles);
319 coll->setDefaultShortcut(action, QKeySequence(QStringLiteral("Shift+Return")));
321 action = coll->addAction(QStringLiteral("article_open_in_background"));
322 action->setIcon(QIcon::fromTheme(QStringLiteral("tab-new")));
323 action->setText(i18n("Open in Background Tab"));
324 connect(action, &QAction::triggered, d->mainWidget, &MainWidget::slotOpenSelectedArticlesInBackground);
325 coll->setDefaultShortcut(action, QKeySequence(QStringLiteral("Return")));
327 action = coll->addAction(QStringLiteral("article_open_external"));
328 action->setIcon(QIcon::fromTheme(QStringLiteral("window-new")));
329 action->setText(i18n("Open in External Browser"));
330 connect(action, &QAction::triggered, d->mainWidget, &MainWidget::slotOpenSelectedArticlesInBrowser);
331 coll->setDefaultShortcut(action, QKeySequence(QStringLiteral("Ctrl+Shift+Return")));
333 action = coll->addAction(QStringLiteral("article_copy_link_address"));
334 action->setText(i18n("Copy Link Address"));
335 connect(action, &QAction::triggered, d->mainWidget, &MainWidget::slotCopyLinkAddress);
337 action = coll->addAction(QStringLiteral("go_prev_unread_article"));
338 action->setIcon(QIcon::fromTheme(QStringLiteral("go-previous")));
339 action->setText(i18n("Pre&vious Unread Article"));
340 connect(action, &QAction::triggered, d->mainWidget, &MainWidget::slotPrevUnreadArticle);
341 coll->setDefaultShortcuts(action, QList<QKeySequence>() << QKeySequence(Qt::Key_Minus) << QKeySequence(Qt::Key_Minus + Qt::KeypadModifier));
343 action = coll->addAction(QStringLiteral("go_next_unread_article"));
344 action->setIcon(QIcon::fromTheme(QStringLiteral("go-next")));
345 action->setText(i18n("Ne&xt Unread Article"));
346 connect(action, &QAction::triggered, d->mainWidget, &MainWidget::slotNextUnreadArticle);
347 coll->setDefaultShortcuts(action, QList<QKeySequence>() << QKeySequence(Qt::Key_Plus) << QKeySequence(Qt::Key_Plus + Qt::KeypadModifier)
348 << QKeySequence(Qt::Key_Equal) << QKeySequence(Qt::Key_Equal + Qt::KeypadModifier));
350 action = coll->addAction(QStringLiteral("article_delete"));
351 action->setIcon(QIcon::fromTheme(QStringLiteral("edit-delete")));
352 action->setText(i18n("&Delete"));
353 connect(action, &QAction::triggered, d->mainWidget, &MainWidget::slotArticleDelete);
354 coll->setDefaultShortcut(action, QKeySequence(QStringLiteral("Delete")));
356 KActionMenu *statusMenu = coll->add<KActionMenu>(QStringLiteral("article_set_status"));
357 statusMenu->setText(i18n("&Mark As"));
358 statusMenu->setEnabled(false);
360 action = coll->addAction(QStringLiteral("article_set_status_read"));
361 action->setText(i18nc("as in: mark as read", "&Read"));
362 action->setIcon(QIcon::fromTheme(QStringLiteral("mail-mark-read")));
363 action->setToolTip(i18n("Mark selected article as read"));
364 coll->setDefaultShortcut(action, QKeySequence(QStringLiteral("Ctrl+E")));
365 connect(action, &QAction::triggered, d->mainWidget, &MainWidget::slotSetSelectedArticleRead);
366 statusMenu->addAction(action);
368 action = coll->addAction(QStringLiteral("article_set_status_new"));
369 action->setText(i18nc("as in: mark as new", "&New"));
370 action->setIcon(QIcon::fromTheme(QStringLiteral("mail-mark-unread-new")));
371 coll->setDefaultShortcut(action, QKeySequence(QStringLiteral("Ctrl+N")));
372 action->setToolTip(i18n("Mark selected article as new"));
373 connect(action, &QAction::triggered, d->mainWidget, &MainWidget::slotSetSelectedArticleNew);
374 statusMenu->addAction(action);
376 action = coll->addAction(QStringLiteral("article_set_status_unread"));
377 action->setText(i18nc("as in: mark as unread", "&Unread"));
378 action->setIcon(QIcon::fromTheme(QStringLiteral("mail-mark-unread")));
379 action->setToolTip(i18n("Mark selected article as unread"));
380 coll->setDefaultShortcut(action, QKeySequence(QStringLiteral("Ctrl+U")));
381 connect(action, &QAction::triggered, d->mainWidget, &MainWidget::slotSetSelectedArticleUnread);
382 statusMenu->addAction(action);
384 KToggleAction *importantAction = coll->add<KToggleAction>(QStringLiteral("article_set_status_important"));
385 importantAction->setText(i18n("&Mark as Important"));
386 importantAction->setIcon(QIcon::fromTheme(QStringLiteral("mail-mark-important")));
387 QList<QKeySequence> importantSC;
388 importantSC << QKeySequence(QStringLiteral("Ctrl+I"));
389 importantSC << QKeySequence(Qt::Key_I);
390 coll->setDefaultShortcuts(importantAction, importantSC);
391 importantAction->setCheckedState(KGuiItem(i18n("Remove &Important Mark")));
392 connect(importantAction, &QAction::triggered, d->mainWidget, &MainWidget::slotArticleToggleKeepFlag);
394 action = coll->addAction(QStringLiteral("feedstree_move_up"));
395 action->setText(i18n("Move Node Up"));
396 connect(action, &QAction::triggered, mainWidget, &MainWidget::slotMoveCurrentNodeUp);
397 coll->setDefaultShortcut(action, QKeySequence(QStringLiteral("Shift+Alt+Up")));
399 action = coll->addAction(QStringLiteral("feedstree_move_down"));
400 action->setText(i18n("Move Node Down"));
401 connect(action, &QAction::triggered, mainWidget, &MainWidget::slotMoveCurrentNodeDown);
402 coll->setDefaultShortcut(action, QKeySequence(QStringLiteral("Shift+Alt+Down")));
404 action = coll->addAction(QStringLiteral("move_node_left"));
405 action->setText(i18n("Move Node Left"));
406 connect(action, &QAction::triggered, mainWidget, &MainWidget::slotMoveCurrentNodeLeft);
407 coll->setDefaultShortcut(action, QKeySequence(QStringLiteral("Shift+Alt+Left")));
409 action = coll->addAction(QStringLiteral("feedstree_move_right"));
410 action->setText(i18n("Move Node Right"));
411 connect(action, &QAction::triggered, mainWidget, &MainWidget::slotMoveCurrentNodeRight);
412 coll->setDefaultShortcut(action, QKeySequence(QStringLiteral("Shift+Alt+Right")));
414 action = coll->addAction(QStringLiteral("file_sendlink"));
415 action->setIcon(QIcon::fromTheme(QStringLiteral("mail-message-new")));
416 action->setText(i18n("Send &Link Address..."));
417 connect(action, &QAction::triggered, mainWidget, &MainWidget::slotSendLink);
419 action = coll->addAction(QStringLiteral("file_sendfile"));
420 action->setIcon(QIcon::fromTheme(QStringLiteral("mail-message-new")));
421 action->setText(i18n("Send &File..."));
422 connect(action, &QAction::triggered, mainWidget, &MainWidget::slotSendFile);
424 coll->addAction(QStringLiteral("share_serviceurl"), d->shareServiceManager->menu());
425 connect(d->shareServiceManager, &PimCommon::ShareServiceUrlManager::serviceUrlSelected, this, &ActionManagerImpl::slotServiceUrlSelected);
427 d->mQuickSearchAction = new QAction(i18n("Set Focus to Quick Search"), this);
428 //If change shortcut change Panel::setQuickSearchClickMessage(...) message
429 actionCollection()->setDefaultShortcut(d->mQuickSearchAction, QKeySequence(Qt::ALT + Qt::Key_Q));
430 actionCollection()->addAction(QStringLiteral("focus_to_quickseach"), d->mQuickSearchAction);
431 connect(d->mQuickSearchAction, &QAction::triggered, mainWidget, &MainWidget::slotFocusQuickSearch);
433 setArticleActionsEnabled(false);
436 void ActionManagerImpl::slotServiceUrlSelected(PimCommon::ShareServiceUrlManager::ServiceType type)
438 if (d->mainWidget) {
439 QString title;
440 QString link;
441 d->mainWidget->currentArticleInfo(link, title);
442 const QUrl url = d->shareServiceManager->generateServiceUrl(link, title, type);
443 d->shareServiceManager->openUrl(url);
447 void ActionManagerImpl::initArticleListView(ArticleListView *articleList)
449 if (d->articleList) {
450 return;
451 } else {
452 d->articleList = articleList;
455 QAction *action = actionCollection()->addAction(QStringLiteral("go_previous_article"));
456 action->setText(i18n("&Previous Article"));
457 connect(action, &QAction::triggered, articleList, &ArticleListView::slotPreviousArticle);
458 actionCollection()->setDefaultShortcut(action, QKeySequence(QStringLiteral("Left")));
459 action = actionCollection()->addAction(QStringLiteral("go_next_article"));
460 action->setText(i18n("&Next Article"));
461 connect(action, &QAction::triggered, articleList, &ArticleListView::slotNextArticle);
462 actionCollection()->setDefaultShortcut(action, QKeySequence(QStringLiteral("Right")));
465 void ActionManagerImpl::initSubscriptionListView(SubscriptionListView *subscriptionListView)
467 if (d->subscriptionListView) {
468 return;
469 } else {
470 d->subscriptionListView = subscriptionListView;
473 KActionCollection *coll = actionCollection();
475 QAction *action = coll->addAction(QStringLiteral("go_prev_feed"));
476 action->setText(i18n("&Previous Feed"));
477 connect(action, &QAction::triggered, subscriptionListView, &SubscriptionListView::slotPrevFeed);
478 coll->setDefaultShortcut(action, QKeySequence(QStringLiteral("P")));
480 action = coll->addAction(QStringLiteral("go_next_feed"));
481 action->setText(i18n("&Next Feed"));
482 connect(action, &QAction::triggered, subscriptionListView, &SubscriptionListView::slotNextFeed);
483 coll->setDefaultShortcut(action, QKeySequence(QStringLiteral("N")));
485 action = coll->addAction(QStringLiteral("go_next_unread_feed"));
486 action->setIcon(QIcon::fromTheme(QStringLiteral("go-down")));
487 action->setText(i18n("N&ext Unread Feed"));
488 connect(action, &QAction::triggered, subscriptionListView, &SubscriptionListView::slotNextUnreadFeed);
489 coll->setDefaultShortcut(action, QKeySequence(Qt::ALT + Qt::Key_Plus));
491 action = coll->addAction(QStringLiteral("go_prev_unread_feed"));
492 action->setIcon(QIcon::fromTheme(QStringLiteral("go-up")));
493 action->setText(i18n("Prev&ious Unread Feed"));
494 connect(action, &QAction::triggered, subscriptionListView, &SubscriptionListView::slotPrevUnreadFeed);
495 coll->setDefaultShortcut(action, QKeySequence(Qt::ALT + Qt::Key_Minus));
497 action = coll->addAction(QStringLiteral("feedstree_home"));
498 action->setText(i18n("Go to Top of Tree"));
499 connect(action, &QAction::triggered, subscriptionListView, &SubscriptionListView::slotItemBegin);
500 coll->setDefaultShortcut(action, QKeySequence(QStringLiteral("Ctrl+Home")));
502 action = coll->addAction(QStringLiteral("feedstree_end"));
503 action->setText(i18n("Go to Bottom of Tree"));
504 connect(action, &QAction::triggered, subscriptionListView, &SubscriptionListView::slotItemEnd);
505 coll->setDefaultShortcut(action, QKeySequence(QStringLiteral("Ctrl+End")));
507 action = coll->addAction(QStringLiteral("feedstree_left"));
508 action->setText(i18n("Go Left in Tree"));
509 connect(action, &QAction::triggered, subscriptionListView, &SubscriptionListView::slotItemLeft);
510 coll->setDefaultShortcut(action, QKeySequence(QStringLiteral("Ctrl+Left")));
512 action = coll->addAction(QStringLiteral("feedstree_right"));
513 action->setText(i18n("Go Right in Tree"));
514 connect(action, &QAction::triggered, subscriptionListView, &SubscriptionListView::slotItemRight);
515 coll->setDefaultShortcut(action, QKeySequence(QStringLiteral("Ctrl+Right")));
517 action = coll->addAction(QStringLiteral("feedstree_up"));
518 action->setText(i18n("Go Up in Tree"));
519 connect(action, &QAction::triggered, subscriptionListView, &SubscriptionListView::slotItemUp);
520 coll->setDefaultShortcut(action, QKeySequence(QStringLiteral("Ctrl+Up")));
522 action = coll->addAction(QStringLiteral("feedstree_down"));
523 action->setText(i18n("Go Down in Tree"));
524 connect(action, &QAction::triggered, subscriptionListView, &SubscriptionListView::slotItemDown);
525 coll->setDefaultShortcut(action, QKeySequence(QStringLiteral("Ctrl+Down")));
528 void ActionManagerImpl::initTabWidget(TabWidget *tabWidget)
530 if (d->tabWidget) {
531 return;
532 } else {
533 d->tabWidget = tabWidget;
536 KActionCollection *coll = actionCollection();
538 QAction *action = coll->addAction(QStringLiteral("select_next_tab"));
539 action->setText(i18n("Select Next Tab"));
540 connect(action, &QAction::triggered, d->tabWidget, &TabWidget::slotNextTab);
541 coll->setDefaultShortcut(action, QKeySequence(QStringLiteral("Ctrl+Period")));
543 action = coll->addAction(QStringLiteral("select_previous_tab"));
544 action->setText(i18n("Select Previous Tab"));
545 connect(action, &QAction::triggered, d->tabWidget, &TabWidget::slotPreviousTab);
546 coll->setDefaultShortcut(action, QKeySequence(QStringLiteral("Ctrl+Comma")));
548 action = coll->addAction(QStringLiteral("tab_detach"));
549 action->setIcon(QIcon::fromTheme(QStringLiteral("tab-detach")));
550 action->setText(i18n("Detach Tab"));
551 connect(action, &QAction::triggered, d->tabWidget, &TabWidget::slotDetachTab);
552 coll->setDefaultShortcut(action, QKeySequence(Qt::CTRL + Qt::SHIFT + Qt::Key_B));
554 action = KStandardAction::copy(d->tabWidget, SLOT(slotCopy()), coll);
555 coll->addAction(QStringLiteral("viewer_copy"), action);
557 action = KStandardAction::print(d->tabWidget, SLOT(slotPrint()), coll);
558 coll->addAction(QStringLiteral("viewer_print"), action);
560 action = KStandardAction::printPreview(d->tabWidget, SLOT(slotPrintPreview()), coll);
561 coll->addAction(QStringLiteral("viewer_printpreview"), action);
563 action = new QAction(i18n("Speak Text"), this);
564 action->setIcon(QIcon::fromTheme(QStringLiteral("preferences-desktop-text-to-speech")));
565 coll->addAction(QStringLiteral("speak_text"), action);
566 connect(action, &QAction::triggered, d->tabWidget, &TabWidget::slotTextToSpeech);
568 action = new QAction(QIcon::fromTheme(QStringLiteral("edit-find")), i18n("&Find in Message..."), this);
569 coll->addAction(QStringLiteral("find_in_messages"), action);
570 connect(action, &QAction::triggered, d->tabWidget, &TabWidget::slotFindTextInHtml);
571 coll->setDefaultShortcut(action, KStandardShortcut::find().first());
573 action = coll->addAction(QStringLiteral("tab_copylinkaddress"));
574 action->setText(i18n("Copy Link Address"));
575 connect(action, &QAction::triggered, d->tabWidget, &TabWidget::slotCopyLinkAddress);
577 action = coll->addAction(QStringLiteral("tab_remove"));
578 action->setIcon(QIcon::fromTheme(QStringLiteral("tab-close")));
579 action->setText(i18n("Close Tab"));
580 connect(action, &QAction::triggered, d->tabWidget, &TabWidget::slotCloseTab);
581 coll->setDefaultShortcuts(action, KStandardShortcut::close());
583 d->zoomActionMenu = new MessageViewer::ZoomActionMenu(this);
584 connect(d->zoomActionMenu, &MessageViewer::ZoomActionMenu::zoomChanged, d->tabWidget, &TabWidget::slotZoomChanged);
585 connect(d->zoomActionMenu, &MessageViewer::ZoomActionMenu::zoomTextOnlyChanged, d->tabWidget, &TabWidget::slotZoomTextOnlyChanged);
587 d->zoomActionMenu->setActionCollection(coll);
588 d->zoomActionMenu->createZoomActions();
590 QString actionname;
591 for (int i = 1; i < 10; ++i) {
592 actionname.sprintf("activate_tab_%02d", i);
593 action = new QAction(i18n("Activate Tab %1", i), this);
594 coll->addAction(actionname, action);
595 coll->setDefaultShortcut(action, QKeySequence(QStringLiteral("Alt+%1").arg(i)));
596 connect(action, &QAction::triggered, d->tabWidget, &TabWidget::slotActivateTab);
598 action = coll->addAction(QStringLiteral("savelinkas"));
599 action->setText(i18n("&Save Link As..."));
600 connect(action, &QAction::triggered, d->tabWidget, &TabWidget::slotSaveLinkAs);
602 action = coll->addAction(QStringLiteral("copylinkaddress"));
603 action->setText(i18n("Copy &Link Address"));
604 connect(action, &QAction::triggered, d->tabWidget, &TabWidget::slotCopyLinkAddress);
606 action = new QAction(i18n("Copy Image Location"), this);
607 action->setIcon(QIcon::fromTheme(QStringLiteral("view-media-visualization")));
608 coll->addAction(QStringLiteral("copy_image_location"), action);
609 coll->setShortcutsConfigurable(action, false);
610 connect(action, &QAction::triggered, d->tabWidget, &TabWidget::slotCopyImageLocation);
612 // save Image On Disk
613 action = new QAction(i18n("Save Image On Disk..."), this);
614 coll->addAction(QStringLiteral("saveas_imageurl"), action);
615 coll->setShortcutsConfigurable(action, false);
616 connect(action, &QAction::triggered, d->tabWidget, &TabWidget::slotSaveImageOnDisk);
618 action = new QAction(i18n("Block image"), this);
619 coll->addAction(QStringLiteral("adblock_image"), action);
620 coll->setShortcutsConfigurable(action, false);
621 connect(action, &QAction::triggered, d->tabWidget, &TabWidget::slotBlockImage);
623 action = new QAction(i18n("Expand Short URL"), this);
624 coll->addAction(QStringLiteral("expand_short_url"), action);
625 coll->setShortcutsConfigurable(action, false);
626 connect(action, &QAction::triggered, d->tabWidget, &TabWidget::slotExpandUrl);
629 QWidget *ActionManagerImpl::container(const QString &name)
631 if (d->part->factory()) {
632 return d->part->factory()->container(name, d->part);
633 } else {
634 return 0;
638 KActionCollection *ActionManagerImpl::actionCollection() const
640 return d->actionCollection;
643 QAction *ActionManagerImpl::action(const QString &name)
645 return d->actionCollection != 0 ? d->actionCollection->action(name) : 0;
648 void ActionManagerImpl::setArticleActionsEnabled(bool enabled)
650 #undef setActionEnabled
651 #define setActionEnabled(name) { QAction* const a = action( name ); if ( a ) a->setEnabled( enabled ); }
652 setActionEnabled(QStringLiteral("article_open"))
653 setActionEnabled(QStringLiteral("article_open_external"))
654 setActionEnabled(QStringLiteral("article_set_status_important"))
655 setActionEnabled(QStringLiteral("article_set_status"))
656 setActionEnabled(QStringLiteral("article_delete"))
657 setActionEnabled(QStringLiteral("file_sendlink"))
658 setActionEnabled(QStringLiteral("file_sendfile"))
659 setActionEnabled(QStringLiteral("article_open_in_background"))
660 setActionEnabled(QStringLiteral("share_serviceurl"))
661 #undef setActionEnabled
664 MessageViewer::ZoomActionMenu *ActionManagerImpl::zoomActionMenu() const
666 return d->zoomActionMenu;
669 QString ActionManagerImpl::quickSearchLineText() const
671 return d->quickSearchLineText();
674 QString ActionManagerImpl::ActionManagerImplPrivate::quickSearchLineText() const
676 return mQuickSearchAction->shortcut().toString();
679 } // namespace Akregator