• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdepim API Reference
  • KDE Home
  • Contact Us
 

akregator

  • sources
  • kde-4.14
  • kdepim
  • akregator
  • src
mainwidget.cpp
Go to the documentation of this file.
1 /*
2  This file is part of Akregator.
3 
4  Copyright (C) 2004 Stanislav Karchebny <Stanislav.Karchebny@kdemail.net>
5  2004 Sashmit Bhaduri <smt@vfemail.net>
6  2005 Frank Osterfeld <osterfeld@kde.org>
7 
8  This program is free software; you can redistribute it and/or modify
9  it under the terms of the GNU General Public License as published by
10  the Free Software Foundation; either version 2 of the License, or
11  (at your option) any later version.
12 
13  This program is distributed in the hope that it will be useful,
14  but WITHOUT ANY WARRANTY; without even the implied warranty of
15  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16  GNU General Public License for more details.
17 
18  You should have received a copy of the GNU General Public License
19  along with this program; if not, write to the Free Software
20  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
21 
22  As a special exception, permission is given to link this program
23  with any edition of Qt, and distribute the resulting executable,
24  without including the source code for Qt in the source distribution.
25 */
26 
27 #include "mainwidget.h"
28 #include "actionmanagerimpl.h"
29 #include "addfeeddialog.h"
30 #include "articlelistview.h"
31 #include "articleviewer.h"
32 #include "articlejobs.h"
33 #include "akregatorconfig.h"
34 #include "akregator_part.h"
35 #include "browserframe.h"
36 #include "createfeedcommand.h"
37 #include "createfoldercommand.h"
38 #include "deletesubscriptioncommand.h"
39 #include "editsubscriptioncommand.h"
40 #include "expireitemscommand.h"
41 #include "importfeedlistcommand.h"
42 #include "feed.h"
43 #include "feedlist.h"
44 #include "feedpropertiesdialog.h"
45 #include "fetchqueue.h"
46 #include "folder.h"
47 #include "framemanager.h"
48 #include "kernel.h"
49 #include "notificationmanager.h"
50 #include "openurlrequest.h"
51 #include "progressmanager.h"
52 #include "searchbar.h"
53 #include "selectioncontroller.h"
54 #include "speechclient.h"
55 #include "subscriptionlistjobs.h"
56 #include "subscriptionlistmodel.h"
57 #include "subscriptionlistview.h"
58 #include "tabwidget.h"
59 #include "treenode.h"
60 #include "treenodevisitor.h"
61 #include "types.h"
62 #include <solid/networking.h>
63 
64 #include <kaction.h>
65 #include <kdialog.h>
66 #include <KDebug>
67 #include <kfiledialog.h>
68 #include <kfileitem.h>
69 #include <kiconloader.h>
70 #include <kinputdialog.h>
71 #include <klocale.h>
72 #include <kmessagebox.h>
73 #include <krandom.h>
74 #include <kshell.h>
75 #include <kstandarddirs.h>
76 #include <ktoggleaction.h>
77 #include <ktoolinvocation.h>
78 #include <kurl.h>
79 
80 #include <QClipboard>
81 #include <QSplitter>
82 #include <QTextDocument>
83 #include <QDomDocument>
84 #include <QTimer>
85 
86 #include <algorithm>
87 #include <memory>
88 #include <cassert>
89 
90 using namespace boost;
91 using namespace Akregator;
92 using namespace Solid;
93 
94 Akregator::MainWidget::~MainWidget()
95 {
96  // if m_shuttingDown is false, slotOnShutdown was not called. That
97  // means that not the whole app is shutdown, only the part. So it
98  // should be no risk to do the cleanups now
99  if (!m_shuttingDown)
100  slotOnShutdown();
101 }
102 
103 Akregator::MainWidget::MainWidget( Part *part, QWidget *parent, ActionManagerImpl* actionManager, const char *name)
104  : QWidget(parent),
105  m_feedList(),
106  m_viewMode(NormalView),
107  m_actionManager(actionManager),
108  m_feedListManagementInterface( new FeedListManagementImpl )
109 {
110  setObjectName(name);
111 
112  FeedListManagementInterface::setInstance( m_feedListManagementInterface );
113 
114  m_actionManager->initMainWidget(this);
115  m_actionManager->initFrameManager(Kernel::self()->frameManager());
116  m_part = part;
117  m_shuttingDown = false;
118  m_displayingAboutPage = false;
119  setFocusPolicy(Qt::StrongFocus);
120 
121  QVBoxLayout *lt = new QVBoxLayout( this );
122  lt->setMargin(0);
123 
124  m_horizontalSplitter = new QSplitter(Qt::Horizontal, this);
125 
126  m_horizontalSplitter->setOpaqueResize(true);
127  lt->addWidget(m_horizontalSplitter);
128 
129  connect(Kernel::self()->fetchQueue(), SIGNAL(signalStarted()),
130  this, SLOT(slotFetchingStarted()));
131  connect(Kernel::self()->fetchQueue(), SIGNAL(signalStopped()),
132  this, SLOT(slotFetchingStopped()));
133 
134  m_feedListView = new SubscriptionListView( m_horizontalSplitter );
135  m_feedListView->setObjectName( "feedtree" );
136  m_actionManager->initSubscriptionListView( m_feedListView );
137 
138  connect( m_feedListView, SIGNAL(userActionTakingPlace()),
139  this, SLOT(ensureArticleTabVisible()) );
140 
141  // FIXME:
142  // connect(m_feedListView, SIGNAL(signalDropped (KUrl::List &, Akregator::TreeNode*,
143  // Akregator::Folder*)),
144  // this, SLOT(slotFeedUrlDropped (KUrl::List &,
145  // Akregator::TreeNode*, Akregator::Folder*)));
146 
147  m_tabWidget = new TabWidget(m_horizontalSplitter);
148  m_actionManager->initTabWidget(m_tabWidget);
149 
150  connect( m_part, SIGNAL(signalSettingsChanged()),
151  m_tabWidget, SLOT(slotSettingsChanged()));
152 
153  connect( m_tabWidget, SIGNAL(signalCurrentFrameChanged(int)),
154  Kernel::self()->frameManager(), SLOT(slotChangeFrame(int)));
155 
156  connect( m_tabWidget, SIGNAL(signalRemoveFrameRequest(int)),
157  Kernel::self()->frameManager(), SLOT(slotRemoveFrame(int)));
158 
159  connect( m_tabWidget, SIGNAL(signalOpenUrlRequest(Akregator::OpenUrlRequest&)),
160  Kernel::self()->frameManager(), SLOT(slotOpenUrlRequest(Akregator::OpenUrlRequest&)));
161 
162  connect( Kernel::self()->frameManager(), SIGNAL(signalFrameAdded(Akregator::Frame*)),
163  m_tabWidget, SLOT(slotAddFrame(Akregator::Frame*)));
164 
165  connect( Kernel::self()->frameManager(), SIGNAL(signalSelectFrame(int)),
166  m_tabWidget, SLOT(slotSelectFrame(int)) );
167 
168  connect( Kernel::self()->frameManager(), SIGNAL(signalFrameRemoved(int)),
169  m_tabWidget, SLOT(slotRemoveFrame(int)));
170 
171  connect( Kernel::self()->frameManager(), SIGNAL(signalRequestNewFrame(int&)),
172  this, SLOT(slotRequestNewFrame(int&)) );
173 
174  connect( Kernel::self()->frameManager(), SIGNAL(signalFrameAdded(Akregator::Frame*)),
175  this, SLOT(slotFramesChanged()));
176  connect( Kernel::self()->frameManager(), SIGNAL(signalFrameRemoved(int)),
177  this, SLOT(slotFramesChanged()));
178  connect( Solid::Networking::notifier(), SIGNAL(statusChanged(Solid::Networking::Status)),
179  this,SLOT(slotNetworkStatusChanged(Solid::Networking::Status)));
180 
181  m_tabWidget->setWhatsThis( i18n("You can view multiple articles in several open tabs."));
182 
183  m_mainTab = new QWidget(this);
184  m_mainTab->setObjectName("Article Tab");
185  m_mainTab->setWhatsThis( i18n("Articles list."));
186 
187  QVBoxLayout *mainTabLayout = new QVBoxLayout( m_mainTab);
188  mainTabLayout->setMargin(0);
189 
190  m_searchBar = new SearchBar(m_mainTab);
191  if ( !Settings::showQuickFilter() )
192  m_searchBar->hide();
193 
194  mainTabLayout->addWidget(m_searchBar);
195 
196  m_articleSplitter = new QSplitter(Qt::Vertical, m_mainTab);
197  m_articleSplitter->setObjectName("panner2");
198 
199  m_articleListView = new ArticleListView( m_articleSplitter );
200  connect( m_articleListView, SIGNAL(userActionTakingPlace()),
201  this, SLOT(ensureArticleTabVisible()) );
202 
203  m_selectionController = new SelectionController( this );
204  m_selectionController->setArticleLister( m_articleListView );
205  m_selectionController->setFeedSelector( m_feedListView );
206 
207  connect(m_searchBar, SIGNAL(signalSearch(std::vector<boost::shared_ptr<const Akregator::Filters::AbstractMatcher> >)),
208  m_selectionController, SLOT(setFilters(std::vector<boost::shared_ptr<const Akregator::Filters::AbstractMatcher> >)) );
209 
210  FolderExpansionHandler* expansionHandler = new FolderExpansionHandler( this );
211  connect( m_feedListView, SIGNAL(expanded(QModelIndex)), expansionHandler, SLOT(itemExpanded(QModelIndex)) );
212  connect( m_feedListView, SIGNAL(collapsed(QModelIndex)), expansionHandler, SLOT(itemCollapsed(QModelIndex)) );
213 
214  m_selectionController->setFolderExpansionHandler( expansionHandler );
215 
216  connect( m_selectionController, SIGNAL(currentSubscriptionChanged(Akregator::TreeNode*)),
217  this, SLOT(slotNodeSelected(Akregator::TreeNode*)) );
218 
219  connect( m_selectionController, SIGNAL(currentArticleChanged(Akregator::Article)),
220  this, SLOT(slotArticleSelected(Akregator::Article)) );
221 
222  connect( m_selectionController, SIGNAL(articleDoubleClicked(Akregator::Article)),
223  this, SLOT(slotOpenArticleInBrowser(Akregator::Article)) );
224 
225  m_actionManager->initArticleListView(m_articleListView);
226 
227  connect( m_articleListView, SIGNAL(signalMouseButtonPressed(int,KUrl)),
228  this, SLOT(slotMouseButtonPressed(int,KUrl)));
229 
230 /*
231  connect( m_part, SIGNAL(signalSettingsChanged()),
232  m_articleListView, SLOT(slotPaletteOrFontChanged()));
233 */
234 
235  m_articleViewer = new ArticleViewer(m_articleSplitter);
236  m_actionManager->initArticleViewer(m_articleViewer);
237  m_articleListView->setFocusProxy(m_articleViewer);
238  setFocusProxy( m_articleViewer );
239 
240  connect( m_articleViewer, SIGNAL(signalOpenUrlRequest(Akregator::OpenUrlRequest&)),
241  Kernel::self()->frameManager(), SLOT(slotOpenUrlRequest(Akregator::OpenUrlRequest&)) );
242  connect( m_articleViewer->part()->browserExtension(), SIGNAL(mouseOverInfo(KFileItem)),
243  this, SLOT(slotMouseOverInfo(KFileItem)) );
244  connect( m_part, SIGNAL(signalSettingsChanged()),
245  m_articleViewer, SLOT(slotPaletteOrFontChanged()));
246  connect(m_searchBar, SIGNAL(signalSearch(std::vector<boost::shared_ptr<const Akregator::Filters::AbstractMatcher> >)),
247  m_articleViewer, SLOT(setFilters(std::vector<boost::shared_ptr<const Akregator::Filters::AbstractMatcher> >)) );
248 
249  m_articleViewer->part()->widget()->setWhatsThis( i18n("Browsing area."));
250 
251  mainTabLayout->addWidget( m_articleSplitter );
252 
253  m_mainFrame = new MainFrame( this, m_part, m_mainTab );
254  m_mainFrame->slotSetTitle( i18n("Articles") );
255  Kernel::self()->frameManager()->slotAddFrame(m_mainFrame);
256 
257  const QList<int> sp1sizes = Settings::splitter1Sizes();
258  if ( sp1sizes.count() >= m_horizontalSplitter->count() )
259  m_horizontalSplitter->setSizes( sp1sizes );
260  const QList<int> sp2sizes = Settings::splitter2Sizes();
261  if ( sp2sizes.count() >= m_articleSplitter->count() )
262  m_articleSplitter->setSizes( sp2sizes );
263 
264  KConfigGroup conf(Settings::self()->config(), "General");
265  if(!conf.readEntry("Disable Introduction", false))
266  {
267  m_articleListView->hide();
268  m_searchBar->hide();
269  m_articleViewer->displayAboutPage();
270  m_mainFrame->slotSetTitle(i18n("About"));
271  m_displayingAboutPage = true;
272  }
273 
274  m_fetchTimer = new QTimer(this);
275  connect( m_fetchTimer, SIGNAL(timeout()),
276  this, SLOT(slotDoIntervalFetches()) );
277  m_fetchTimer->start(1000*60);
278 
279  // delete expired articles once per hour
280  m_expiryTimer = new QTimer(this);
281  connect(m_expiryTimer, SIGNAL(timeout()),
282  this, SLOT(slotDeleteExpiredArticles()) );
283  m_expiryTimer->start(3600*1000);
284 
285  m_markReadTimer = new QTimer(this);
286  m_markReadTimer->setSingleShot(true);
287  connect(m_markReadTimer, SIGNAL(timeout()), this, SLOT(slotSetCurrentArticleReadDelayed()) );
288 
289  setFeedList( shared_ptr<FeedList>( new FeedList( Kernel::self()->storage() ) ) );
290 
291  switch (Settings::viewMode())
292  {
293  case CombinedView:
294  slotCombinedView();
295  break;
296  case WidescreenView:
297  slotWidescreenView();
298  break;
299  default:
300  slotNormalView();
301  }
302 
303  if ( !Settings::resetQuickFilterOnNodeChange() )
304  {
305  m_searchBar->slotSetStatus( Settings::statusFilter() );
306  m_searchBar->slotSetText( Settings::textFilter() );
307  }
308 
309  //Check network status
310  if(Solid::Networking::status() == Solid::Networking::Connected || Solid::Networking::status() == Solid::Networking::Unknown)
311  this->m_networkAvailable=true;
312  else if(Solid::Networking::status() == Solid::Networking::Unconnected)
313  this->m_networkAvailable=false;
314 }
315 
316 void Akregator::MainWidget::slotOnShutdown()
317 {
318  m_shuttingDown = true;
319 
320  // close all pageviewers in a controlled way
321  // fixes bug 91660, at least when no part loading data
322  while ( m_tabWidget->count() > 1 ) { // remove frames until only the main frame remains
323  m_tabWidget->setCurrentIndex( m_tabWidget->count() - 1 ); // select last page
324  m_tabWidget->slotRemoveCurrentFrame();
325  }
326 
327  Kernel::self()->fetchQueue()->slotAbort();
328  setFeedList( shared_ptr<FeedList>() );
329 
330  delete m_feedListManagementInterface;
331  delete m_feedListView; // call delete here, so that the header settings will get saved
332  delete m_articleListView; // same for this one
333 
334  delete m_mainTab;
335  delete m_mainFrame;
336  m_mainFrame = 0;
337 
338  Settings::self()->writeConfig();
339 }
340 
341 
342 void Akregator::MainWidget::saveSettings()
343 {
344  const QList<int> spl1 = m_horizontalSplitter->sizes();
345  if ( std::count( spl1.begin(), spl1.end(), 0 ) == 0 )
346  Settings::setSplitter1Sizes( spl1 );
347  const QList<int> spl2 = m_articleSplitter->sizes();
348  if ( std::count( spl2.begin(), spl2.end(), 0 ) == 0 )
349  Settings::setSplitter2Sizes( spl2 );
350  Settings::setViewMode( m_viewMode );
351  Settings::self()->writeConfig();
352 }
353 
354 
355 void Akregator::MainWidget::slotRequestNewFrame(int& frameId)
356 {
357  BrowserFrame* frame = new BrowserFrame(m_tabWidget);
358 
359  connect( m_part, SIGNAL(signalSettingsChanged()), frame, SLOT(slotPaletteOrFontChanged()));
360  connect( m_tabWidget, SIGNAL(signalZoomInFrame(int)), frame, SLOT(slotZoomIn(int)));
361  connect( m_tabWidget, SIGNAL(signalZoomOutFrame(int)), frame, SLOT(slotZoomOut(int)));
362 
363  Kernel::self()->frameManager()->slotAddFrame(frame);
364 
365  frameId = frame->id();
366 }
367 
368 void Akregator::MainWidget::sendArticle(bool attach)
369 {
370  QByteArray text;
371  QString title;
372 
373  Frame* frame = Kernel::self()->frameManager()->currentFrame();
374 
375  if (frame && frame->id() > 0) { // are we in some other tab than the articlelist?
376  text = frame->url().prettyUrl().toLatin1();
377  title = frame->title();
378  }
379  else { // nah, we're in articlelist..
380  const Article article = m_selectionController->currentArticle();
381  if(!article.isNull()) {
382  text = article.link().prettyUrl().toLatin1();
383  title = article.title();
384  }
385  }
386 
387  if(text.isEmpty())
388  return;
389 
390  if(attach)
391  {
392  KToolInvocation::invokeMailer(QString(),
393  QString(),
394  QString(),
395  title,
396  QString(),
397  QString(),
398  QStringList(text),
399  text);
400  }
401  else
402  {
403  KToolInvocation::invokeMailer(QString(),
404  QString(),
405  QString(),
406  title,
407  text,
408  QString(),
409  QStringList(),
410  text);
411  }
412 }
413 
414 void MainWidget::importFeedList( const QDomDocument& doc )
415 {
416  std::auto_ptr<ImportFeedListCommand> cmd( new ImportFeedListCommand );
417  cmd->setParentWidget( this );
418  cmd->setFeedListDocument( doc );
419  cmd->setTargetList( m_feedList );
420  cmd.release()->start();
421 }
422 
423 void Akregator::MainWidget::setFeedList( const shared_ptr<FeedList>& list )
424 {
425  if ( list == m_feedList )
426  return;
427  const shared_ptr<FeedList> oldList = m_feedList;
428 
429  m_feedList = list;
430  if ( m_feedList ) {
431  connect( m_feedList.get(), SIGNAL(unreadCountChanged(int)),
432  this, SLOT(slotSetTotalUnread()) );
433  }
434 
435  slotSetTotalUnread();
436 
437  m_feedListManagementInterface->setFeedList( m_feedList );
438  Kernel::self()->setFeedList( m_feedList );
439  ProgressManager::self()->setFeedList( m_feedList );
440  m_selectionController->setFeedList( m_feedList );
441 
442  if ( oldList )
443  oldList->disconnect( this );
444 
445  slotDeleteExpiredArticles();
446 }
447 
448 void Akregator::MainWidget::deleteExpiredArticles( const shared_ptr<FeedList>& list )
449 {
450  if ( !list )
451  return;
452  ExpireItemsCommand* cmd = new ExpireItemsCommand( this );
453  cmd->setParentWidget( this );
454  cmd->setFeedList( list );
455  cmd->setFeeds( list->feedIds() );
456  cmd->start();
457 }
458 
459 void Akregator::MainWidget::slotDeleteExpiredArticles()
460 {
461  deleteExpiredArticles( m_feedList );
462 }
463 
464 QDomDocument Akregator::MainWidget::feedListToOPML()
465 {
466  QDomDocument dom;
467  if ( m_feedList ) {
468  dom = m_feedList->toOpml();
469  }
470  return dom;
471 }
472 
473 void Akregator::MainWidget::addFeedToGroup(const QString& url, const QString& groupName)
474 {
475  // Locate the group.
476  QList<TreeNode *> namedGroups = m_feedList->findByTitle( groupName );
477  Folder* group = 0;
478  foreach( TreeNode* const candidate, namedGroups ) {
479  if ( candidate->isGroup() ) {
480  group = static_cast<Folder*>( candidate );
481  break;
482  }
483  }
484 
485  if (!group)
486  {
487  Folder* g = new Folder( groupName );
488  m_feedList->allFeedsFolder()->appendChild(g);
489  group = g;
490  }
491 
492  // Invoke the Add Feed dialog with url filled in.
493  addFeed(url, 0, group, true);
494 }
495 
496 void Akregator::MainWidget::slotNormalView()
497 {
498  if (m_viewMode == NormalView)
499  return;
500 
501  if (m_viewMode == CombinedView)
502  {
503  m_articleListView->show();
504 
505  const Article article = m_selectionController->currentArticle();
506 
507  if (!article.isNull())
508  m_articleViewer->showArticle(article);
509  else
510  m_articleViewer->slotShowSummary( m_selectionController->selectedSubscription() );
511  }
512 
513  m_articleSplitter->setOrientation(Qt::Vertical);
514  m_viewMode = NormalView;
515 
516  Settings::setViewMode( m_viewMode );
517 }
518 
519 void Akregator::MainWidget::slotWidescreenView()
520 {
521  if (m_viewMode == WidescreenView)
522  return;
523 
524  if (m_viewMode == CombinedView)
525  {
526  m_articleListView->show();
527 
528  Article article = m_selectionController->currentArticle();
529 
530  if (!article.isNull())
531  m_articleViewer->showArticle(article);
532  else
533  m_articleViewer->slotShowSummary( m_selectionController->selectedSubscription() );
534  }
535 
536  m_articleSplitter->setOrientation(Qt::Horizontal);
537  m_viewMode = WidescreenView;
538 
539  Settings::setViewMode( m_viewMode );
540 }
541 
542 void Akregator::MainWidget::slotCombinedView()
543 {
544  if (m_viewMode == CombinedView)
545  return;
546 
547  m_articleListView->slotClear();
548  m_articleListView->hide();
549  m_viewMode = CombinedView;
550 
551  Settings::setViewMode( m_viewMode );
552 }
553 
554 void Akregator::MainWidget::slotMoveCurrentNodeUp()
555 {
556  TreeNode* current = m_selectionController->selectedSubscription();
557  if (!current)
558  return;
559  TreeNode* prev = current->prevSibling();
560  Folder* parent = current->parent();
561 
562  if (!prev || !parent)
563  return;
564 
565  parent->removeChild(prev);
566  parent->insertChild(prev, current);
567  m_feedListView->ensureNodeVisible(current);
568 }
569 
570 void Akregator::MainWidget::slotMoveCurrentNodeDown()
571 {
572  TreeNode* current = m_selectionController->selectedSubscription();
573  if (!current)
574  return;
575  TreeNode* next = current->nextSibling();
576  Folder* parent = current->parent();
577 
578  if (!next || !parent)
579  return;
580 
581  parent->removeChild(current);
582  parent->insertChild(current, next);
583  m_feedListView->ensureNodeVisible(current);
584 }
585 
586 void Akregator::MainWidget::slotMoveCurrentNodeLeft()
587 {
588  TreeNode* current = m_selectionController->selectedSubscription();
589  if (!current || !current->parent() || !current->parent()->parent())
590  return;
591 
592  Folder* parent = current->parent();
593  Folder* grandparent = current->parent()->parent();
594 
595  parent->removeChild(current);
596  grandparent->insertChild(current, parent);
597  m_feedListView->ensureNodeVisible(current);
598 }
599 
600 void Akregator::MainWidget::slotMoveCurrentNodeRight()
601 {
602  TreeNode* current = m_selectionController->selectedSubscription();
603  if (!current || !current->parent())
604  return;
605  TreeNode* prev = current->prevSibling();
606 
607  if ( prev && prev->isGroup() )
608  {
609  Folder* fg = static_cast<Folder*>(prev);
610  current->parent()->removeChild(current);
611  fg->appendChild(current);
612  m_feedListView->ensureNodeVisible(current);
613  }
614 }
615 
616 void Akregator::MainWidget::slotNodeSelected(TreeNode* node)
617 {
618  m_markReadTimer->stop();
619 
620  if (m_displayingAboutPage)
621  {
622  m_mainFrame->slotSetTitle(i18n("Articles"));
623  if (m_viewMode != CombinedView)
624  m_articleListView->show();
625  if (Settings::showQuickFilter())
626  m_searchBar->show();
627  m_displayingAboutPage = false;
628  }
629 
630  m_tabWidget->setCurrentWidget( m_mainFrame );
631  if ( Settings::resetQuickFilterOnNodeChange() )
632  m_searchBar->slotClearSearch();
633 
634  if (m_viewMode == CombinedView)
635  {
636  m_articleViewer->showNode(node);
637  }
638  else
639  {
640  m_articleViewer->slotShowSummary(node);
641  }
642 
643  if (node)
644  m_mainFrame->setWindowTitle(node->title());
645 
646  m_actionManager->slotNodeSelected(node);
647 }
648 
649 
650 void Akregator::MainWidget::slotFeedAdd()
651 {
652  Folder* group = 0;
653  if ( !m_selectionController->selectedSubscription() )
654  group = m_feedList->allFeedsFolder();
655  else
656  {
657  if ( m_selectionController->selectedSubscription()->isGroup())
658  group = static_cast<Folder*>( m_selectionController->selectedSubscription() );
659  else
660  group= m_selectionController->selectedSubscription()->parent();
661 
662  }
663 
664  TreeNode* const lastChild = !group->children().isEmpty() ? group->children().last() : 0;
665 
666  addFeed(QString::null, lastChild, group, false); //krazy:exclude=nullstrassign for old broken gcc
667 }
668 
669 void Akregator::MainWidget::addFeed(const QString& url, TreeNode *after, Folder* parent, bool autoExec)
670 {
671  CreateFeedCommand* cmd( new CreateFeedCommand( this ) );
672  cmd->setParentWidget( this );
673  cmd->setPosition( parent, after );
674  cmd->setRootFolder( m_feedList->allFeedsFolder() );
675  cmd->setAutoExecute( autoExec );
676  cmd->setUrl( url );
677  cmd->setSubscriptionListView( m_feedListView );
678  cmd->start();
679 }
680 
681 void Akregator::MainWidget::slotFeedAddGroup()
682 {
683  CreateFolderCommand* cmd = new CreateFolderCommand( this );
684  cmd->setParentWidget( this );
685  cmd->setSelectedSubscription( m_selectionController->selectedSubscription() );
686  cmd->setRootFolder( m_feedList->allFeedsFolder() );
687  cmd->setSubscriptionListView( m_feedListView );
688  cmd->start();
689 }
690 
691 void Akregator::MainWidget::slotFeedRemove()
692 {
693  TreeNode* selectedNode = m_selectionController->selectedSubscription();
694 
695  // don't delete root element! (safety valve)
696  if (!selectedNode || selectedNode == m_feedList->allFeedsFolder())
697  return;
698 
699  DeleteSubscriptionCommand* cmd = new DeleteSubscriptionCommand( this );
700  cmd->setParentWidget( this );
701  cmd->setSubscription( m_feedList, selectedNode->id() );
702  cmd->start();
703 }
704 
705 void Akregator::MainWidget::slotFeedModify()
706 {
707  TreeNode* const node = m_selectionController->selectedSubscription();
708  if ( !node )
709  return;
710  EditSubscriptionCommand* cmd = new EditSubscriptionCommand( this );
711  cmd->setParentWidget( this );
712  cmd->setSubscription( m_feedList, node->id() );
713  cmd->setSubscriptionListView( m_feedListView );
714  cmd->start();
715 }
716 
717 void Akregator::MainWidget::slotNextUnreadArticle()
718 {
719  ensureArticleTabVisible();
720  if (m_viewMode == CombinedView)
721  {
722  m_feedListView->slotNextUnreadFeed();
723  return;
724  }
725  TreeNode* sel = m_selectionController->selectedSubscription();
726  if (sel && sel->unread() > 0)
727  m_articleListView->slotNextUnreadArticle();
728  else
729  m_feedListView->slotNextUnreadFeed();
730 }
731 
732 void Akregator::MainWidget::slotPrevUnreadArticle()
733 {
734  ensureArticleTabVisible();
735  if (m_viewMode == CombinedView)
736  {
737  m_feedListView->slotPrevUnreadFeed();
738  return;
739  }
740  TreeNode* sel = m_selectionController->selectedSubscription();
741  if (sel && sel->unread() > 0)
742  m_articleListView->slotPreviousUnreadArticle();
743  else
744  m_feedListView->slotPrevUnreadFeed();
745 }
746 
747 void Akregator::MainWidget::slotMarkAllFeedsRead()
748 {
749  KJob* job = m_feedList->createMarkAsReadJob();
750  connect(job, SIGNAL(finished(KJob*)), m_selectionController, SLOT(forceFilterUpdate()) );
751  job->start();
752 }
753 
754 void Akregator::MainWidget::slotMarkAllRead()
755 {
756  if(!m_selectionController->selectedSubscription())
757  return;
758  KJob* job = m_selectionController->selectedSubscription()->createMarkAsReadJob();
759  connect(job, SIGNAL(finished(KJob*)), m_selectionController, SLOT(forceFilterUpdate()) );
760  job->start();
761 }
762 
763 void Akregator::MainWidget::slotSetTotalUnread()
764 {
765  emit signalUnreadCountChanged( m_feedList ? m_feedList->unread() : 0 );
766 }
767 
768 void Akregator::MainWidget::slotDoIntervalFetches()
769 {
770  if ( !m_feedList )
771  return;
772 #if 0
773  // the following solid check apparently doesn't work reliably and causes
774  // interval fetching not working although the user is actually online (but solid reports he's not
775  const Networking::Status status = Solid::Networking::status();
776  if ( status != Networking::Connected && status != Networking::Unknown )
777  return;
778 #endif
779  m_feedList->addToFetchQueue(Kernel::self()->fetchQueue(), true);
780 }
781 
782 void Akregator::MainWidget::slotFetchCurrentFeed()
783 {
784  if ( !m_selectionController->selectedSubscription())
785  return;
786  if(isNetworkAvailable())
787  m_selectionController->selectedSubscription()->slotAddToFetchQueue(Kernel::self()->fetchQueue());
788  else
789  m_mainFrame->slotSetStatusText(i18n("Networking is not available."));
790 }
791 
792 void Akregator::MainWidget::slotFetchAllFeeds()
793 {
794  if ( m_feedList && isNetworkAvailable() )
795  m_feedList->addToFetchQueue( Kernel::self()->fetchQueue() );
796  else if (m_feedList)
797  m_mainFrame->slotSetStatusText(i18n("Networking is not available."));
798 }
799 
800 void Akregator::MainWidget::slotFetchingStarted()
801 {
802  m_mainFrame->slotSetState(Frame::Started);
803  m_actionManager->action("feed_stop")->setEnabled(true);
804  m_mainFrame->slotSetStatusText(i18n("Fetching Feeds..."));
805 }
806 
807 void Akregator::MainWidget::slotFetchingStopped()
808 {
809  m_mainFrame->slotSetState(Frame::Completed);
810  m_actionManager->action("feed_stop")->setEnabled(false);
811  m_mainFrame->slotSetStatusText(QString());
812 }
813 
814 void Akregator::MainWidget::slotArticleSelected(const Akregator::Article& article)
815 {
816  if (m_viewMode == CombinedView)
817  return;
818 
819  m_markReadTimer->stop();
820 
821  assert( article.isNull() || article.feed() );
822 
823  QList<Article> articles = m_selectionController->selectedArticles();
824  emit signalArticlesSelected( articles );
825 
826  KToggleAction* const maai = qobject_cast<KToggleAction*>( m_actionManager->action( "article_set_status_important" ) );
827  assert( maai );
828  maai->setChecked( article.keep() );
829 
830  m_articleViewer->showArticle( article );
831  if (m_selectionController->selectedArticles().count() == 0) {
832  m_articleListView->setCurrentIndex(m_selectionController->currentArticleIndex());
833  }
834 
835  if ( article.isNull() || article.status() == Akregator::Read )
836  return;
837 
838  if ( !Settings::useMarkReadDelay() )
839  return;
840 
841  const int delay = Settings::markReadDelay();
842 
843  if ( delay > 0 )
844  {
845  m_markReadTimer->start( delay * 1000 );
846  }
847  else
848  {
849  Akregator::ArticleModifyJob* job = new Akregator::ArticleModifyJob;
850  const Akregator::ArticleId aid = { article.feed()->xmlUrl(), article.guid() };
851  job->setStatus( aid, Akregator::Read );
852  job->start();
853  }
854 }
855 
856 void Akregator::MainWidget::slotMouseButtonPressed(int button, const KUrl& url)
857 {
858  if (button != Qt::MidButton)
859  return;
860 
861  if (!url.isValid())
862  return;
863 
864  OpenUrlRequest req(url);
865 
866  switch (Settings::mMBBehaviour())
867  {
868  case Settings::EnumMMBBehaviour::OpenInExternalBrowser:
869  req.setOptions(OpenUrlRequest::ExternalBrowser);
870  break;
871  case Settings::EnumMMBBehaviour::OpenInBackground:
872  req.setOptions(OpenUrlRequest::NewTab);
873  req.setOpenInBackground(true);
874  break;
875  default:
876  req.setOptions(OpenUrlRequest::NewTab);
877  req.setOpenInBackground(false);
878  }
879 
880  Kernel::self()->frameManager()->slotOpenUrlRequest(req);
881 }
882 
883 void Akregator::MainWidget::slotOpenHomepage()
884 {
885  Feed* feed = dynamic_cast<Feed *>( m_selectionController->selectedSubscription() );
886 
887  if (!feed)
888  return;
889 
890  KUrl url(feed->htmlUrl());
891 
892  if (url.isValid())
893  {
894  OpenUrlRequest req(feed->htmlUrl());
895  req.setOptions(OpenUrlRequest::ExternalBrowser);
896  Kernel::self()->frameManager()->slotOpenUrlRequest(req);
897  }
898 }
899 
900 void Akregator::MainWidget::slotOpenSelectedArticlesInBrowser()
901 {
902  const QList<Article> articles = m_selectionController->selectedArticles();
903 
904  Q_FOREACH( const Akregator::Article& article, articles )
905  slotOpenArticleInBrowser( article );
906 }
907 
908 void Akregator::MainWidget::slotOpenArticleInBrowser(const Akregator::Article& article)
909 {
910  if (!article.isNull() && article.link().isValid())
911  {
912  OpenUrlRequest req(article.link());
913  req.setOptions(OpenUrlRequest::ExternalBrowser);
914  Kernel::self()->frameManager()->slotOpenUrlRequest(req);
915  }
916 }
917 
918 
919 void Akregator::MainWidget::openSelectedArticles( bool openInBackground )
920 {
921  const QList<Article> articles = m_selectionController->selectedArticles();
922 
923  Q_FOREACH( const Akregator::Article& article, articles )
924  {
925  const KUrl url = article.link();
926  if ( !url.isValid() )
927  continue;
928 
929  OpenUrlRequest req( url );
930  req.setOptions( OpenUrlRequest::NewTab );
931  if( openInBackground ) {
932  req.setOpenInBackground( true );
933  Kernel::self()->frameManager()->slotOpenUrlRequest( req, false /*don't use settings for open in background*/ );
934  } else {
935  Kernel::self()->frameManager()->slotOpenUrlRequest( req );
936  }
937  }
938 
939 }
940 
941 void Akregator::MainWidget::slotCopyLinkAddress()
942 {
943  const Article article = m_selectionController->currentArticle();
944 
945  if(article.isNull())
946  return;
947 
948  QString link;
949  if (article.link().isValid())
950  {
951  link = article.link().url();
952  QClipboard *cb = QApplication::clipboard();
953  cb->setText(link, QClipboard::Clipboard);
954  // don't set url to selection as it's a no-no according to a fd.o spec
955  //cb->setText(link, QClipboard::Selection);
956  }
957 }
958 
959 void Akregator::MainWidget::slotFeedUrlDropped(KUrl::List &urls, TreeNode* after, Folder* parent)
960 {
961  Q_FOREACH ( const KUrl& i, urls )
962  addFeed( i.prettyUrl(), after, parent, false );
963 }
964 
965 void Akregator::MainWidget::slotToggleShowQuickFilter()
966 {
967  if ( Settings::showQuickFilter() )
968  {
969  Settings::setShowQuickFilter(false);
970  m_searchBar->slotClearSearch();
971  m_searchBar->hide();
972  }
973  else
974  {
975  Settings::setShowQuickFilter(true);
976  if (!m_displayingAboutPage)
977  m_searchBar->show();
978  }
979 
980 }
981 
982 void Akregator::MainWidget::slotArticleDelete()
983 {
984 
985  if ( m_viewMode == CombinedView )
986  return;
987 
988  const QList<Article> articles = m_selectionController->selectedArticles();
989 
990  QString msg;
991  switch (articles.count())
992  {
993  case 0:
994  return;
995  case 1:
996  msg = i18n("<qt>Are you sure you want to delete article <b>%1</b>?</qt>", Qt::escape(articles.first().title()));
997  break;
998  default:
999  msg = i18np("<qt>Are you sure you want to delete the selected article?</qt>", "<qt>Are you sure you want to delete the %1 selected articles?</qt>", articles.count());
1000  }
1001 
1002  if ( KMessageBox::warningContinueCancel( this,
1003  msg, i18n( "Delete Article" ),
1004  KStandardGuiItem::del(),
1005  KStandardGuiItem::cancel(),
1006  "Disable delete article confirmation" ) != KMessageBox::Continue )
1007  return;
1008 
1009  TreeNode* const selected = m_selectionController->selectedSubscription();
1010 
1011  if ( selected )
1012  selected->setNotificationMode( false );
1013 
1014  Akregator::ArticleDeleteJob* job = new Akregator::ArticleDeleteJob;
1015  Q_FOREACH( const Akregator::Article& i, articles )
1016  {
1017  Feed* const feed = i.feed();
1018  if ( !feed )
1019  continue;
1020  const Akregator::ArticleId aid = { feed->xmlUrl(), i.guid() };
1021  job->appendArticleId( aid );
1022  }
1023 
1024  job->start();
1025 
1026  if ( selected )
1027  selected->setNotificationMode( true );
1028 }
1029 
1030 void Akregator::MainWidget::slotFramesChanged()
1031 {
1032  // We need to wait till the frame is fully loaded
1033  QMetaObject::invokeMethod( m_part, "slotAutoSave", Qt::QueuedConnection );
1034 }
1035 
1036 void Akregator::MainWidget::slotArticleToggleKeepFlag( bool )
1037 {
1038  const QList<Article> articles = m_selectionController->selectedArticles();
1039 
1040  if (articles.isEmpty())
1041  return;
1042 
1043  bool allFlagsSet = true;
1044  Q_FOREACH ( const Akregator::Article& i, articles )
1045  {
1046  allFlagsSet = allFlagsSet && i.keep();
1047  if ( !allFlagsSet )
1048  break;
1049  }
1050 
1051  Akregator::ArticleModifyJob* job = new Akregator::ArticleModifyJob;
1052  Q_FOREACH ( const Akregator::Article& i, articles )
1053  {
1054  const Akregator::ArticleId aid = { i.feed()->xmlUrl(), i.guid() };
1055  job->setKeep( aid, !allFlagsSet );
1056  }
1057  job->start();
1058 }
1059 
1060 namespace {
1061 
1062 void setSelectedArticleStatus( const Akregator::AbstractSelectionController* controller, int status )
1063 {
1064  const QList<Akregator::Article> articles = controller->selectedArticles();
1065 
1066  if (articles.isEmpty())
1067  return;
1068 
1069  Akregator::ArticleModifyJob* job = new Akregator::ArticleModifyJob;
1070  Q_FOREACH ( const Akregator::Article& i, articles )
1071  {
1072  const Akregator::ArticleId aid = { i.feed()->xmlUrl(), i.guid() };
1073  job->setStatus( aid, status );
1074  }
1075  job->start();
1076 }
1077 
1078 }
1079 
1080 void Akregator::MainWidget::slotSetSelectedArticleRead()
1081 {
1082  ::setSelectedArticleStatus( m_selectionController, Akregator::Read );
1083 }
1084 
1085 void Akregator::MainWidget::slotTextToSpeechRequest()
1086 {
1087 
1088  if (Kernel::self()->frameManager()->currentFrame() == m_mainFrame)
1089  {
1090  if (m_viewMode != CombinedView)
1091  {
1092  // in non-combined view, read selected articles
1093  SpeechClient::self()->slotSpeak(m_selectionController->selectedArticles());
1094  // TODO: if article viewer has a selection, read only the selected text?
1095  }
1096  else
1097  {
1098  if (m_selectionController->selectedSubscription())
1099  {
1100  //TODO: read articles in current node, respecting quick filter!
1101  }
1102  }
1103  }
1104  else
1105  {
1106  // TODO: read selected page viewer
1107  }
1108 }
1109 
1110 void Akregator::MainWidget::slotSetSelectedArticleUnread()
1111 {
1112  ::setSelectedArticleStatus( m_selectionController, Akregator::Unread );
1113 }
1114 
1115 void Akregator::MainWidget::slotSetSelectedArticleNew()
1116 {
1117  ::setSelectedArticleStatus( m_selectionController, Akregator::New );
1118 }
1119 
1120 void Akregator::MainWidget::slotSetCurrentArticleReadDelayed()
1121 {
1122  const Article article = m_selectionController->currentArticle();
1123 
1124  if (article.isNull())
1125  return;
1126 
1127  Akregator::ArticleModifyJob* const job = new Akregator::ArticleModifyJob;
1128  const Akregator::ArticleId aid = { article.feed()->xmlUrl(), article.guid() };
1129  job->setStatus( aid, Akregator::Read );
1130  job->start();
1131 }
1132 
1133 void Akregator::MainWidget::slotMouseOverInfo(const KFileItem& kifi)
1134 {
1135  m_mainFrame->slotSetStatusText( kifi.isNull() ? QString() : kifi.url().prettyUrl() );
1136 }
1137 
1138 void Akregator::MainWidget::readProperties(const KConfigGroup &config)
1139 {
1140  if ( !Settings::resetQuickFilterOnNodeChange() )
1141  {
1142  // read filter settings
1143  m_searchBar->slotSetText(config.readEntry("searchLine"));
1144  m_searchBar->slotSetStatus(config.readEntry("searchCombo").toInt());
1145  }
1146  // Reopen tabs
1147  QStringList childList = config.readEntry( QString::fromLatin1( "Children" ),
1148  QStringList() );
1149  Q_FOREACH( const QString& framePrefix, childList )
1150  {
1151  BrowserFrame* const frame = new BrowserFrame(m_tabWidget);
1152  frame->loadConfig( config, framePrefix + QLatin1Char( '_' ) );
1153 
1154  connect( m_part, SIGNAL(signalSettingsChanged()), frame, SLOT(slotPaletteOrFontChanged()));
1155  connect( m_tabWidget, SIGNAL(signalZoomInFrame(int)), frame, SLOT(slotZoomIn(int)));
1156  connect( m_tabWidget, SIGNAL(signalZoomOutFrame(int)), frame, SLOT(slotZoomOut(int)));
1157 
1158  Kernel::self()->frameManager()->slotAddFrame(frame);
1159 
1160  }
1161 }
1162 
1163 void Akregator::MainWidget::saveProperties(KConfigGroup & config)
1164 {
1165  // save filter settings
1166  config.writeEntry("searchLine", m_searchBar->text());
1167  config.writeEntry("searchCombo", m_searchBar->status());
1168 
1169  Kernel::self()->frameManager()->saveProperties(config);
1170 }
1171 
1172 void Akregator::MainWidget::ensureArticleTabVisible()
1173 {
1174  m_tabWidget->setCurrentWidget( m_mainFrame );
1175 }
1176 
1177 void MainWidget::slotReloadAllTabs()
1178 {
1179  this->m_tabWidget->slotReloadAllTabs();
1180 }
1181 
1182 
1183 bool MainWidget::isNetworkAvailable()
1184 {
1185  return m_networkAvailable;
1186 }
1187 
1188 void MainWidget::slotNetworkStatusChanged(Solid::Networking::Status status)
1189 {
1190  if(status==Solid::Networking::Connected || Solid::Networking::status() == Solid::Networking::Unknown)
1191  {
1192  m_networkAvailable=true;
1193  m_mainFrame->slotSetStatusText(i18n("Networking is available now."));
1194  this->slotFetchAllFeeds();
1195  }
1196  else if(Solid::Networking::Unconnected)
1197  {
1198  m_networkAvailable=false;
1199  m_mainFrame->slotSetStatusText(i18n("Networking is not available."));
1200  }
1201 }
1202 
1203 void Akregator::MainWidget::slotOpenSelectedArticles()
1204 {
1205  openSelectedArticles( false );
1206 }
1207 
1208 
1209 void Akregator::MainWidget::slotOpenSelectedArticlesInBackground()
1210 {
1211  openSelectedArticles( true );
1212 }
1213 
1214 
treenode.h
Akregator::DeleteSubscriptionCommand
Definition: deletesubscriptioncommand.h:39
Akregator::FrameManager::slotOpenUrlRequest
void slotOpenUrlRequest(Akregator::OpenUrlRequest &request, bool useOpenInBackgroundSetting=true)
Definition: framemanager.cpp:303
Akregator::Frame
Definition: frame.h:53
Akregator::ArticleModifyJob::setStatus
void setStatus(const ArticleId &id, int status)
Definition: articlejobs.cpp:98
Akregator::ArticleViewer
Definition: articleviewer.h:56
Akregator::BrowserFrame::loadConfig
void loadConfig(const KConfigGroup &config, const QString &prefix)
Load a frame from a config file for session management.
Definition: browserframe.cpp:434
QModelIndex
Akregator::ActionManagerImpl::initTabWidget
void initTabWidget(TabWidget *tabWidget)
Definition: actionmanagerimpl.cpp:526
QWidget
Akregator::ArticleModifyJob::start
void start()
Definition: articlejobs.cpp:108
Akregator::FeedListManagementInterface::setInstance
static void setInstance(FeedListManagementInterface *)
Definition: feedlistmanagementinterface.cpp:36
Akregator::MainWidget::saveProperties
void saveProperties(KConfigGroup &config)
Definition: mainwidget.cpp:1163
speechclient.h
types.h
Akregator::CreateFolderCommand::setRootFolder
void setRootFolder(Folder *rootFolder)
Definition: createfoldercommand.cpp:111
Akregator::SearchBar::slotSetStatus
void slotSetStatus(int status)
Definition: searchbar.cpp:149
Akregator::MainWidget::slotDoIntervalFetches
void slotDoIntervalFetches()
Definition: mainwidget.cpp:768
Akregator::MainWidget::slotFeedUrlDropped
void slotFeedUrlDropped(KUrl::List &urls, Akregator::TreeNode *after, Akregator::Folder *parent)
called when URLs are dropped into the tree view
Definition: mainwidget.cpp:959
openurlrequest.h
Akregator::MainWidget::saveSettings
void saveSettings()
saves settings.
Definition: mainwidget.cpp:342
QSplitter::setSizes
void setSizes(const QList< int > &list)
Akregator::MainWidget::ensureArticleTabVisible
void ensureArticleTabVisible()
Definition: mainwidget.cpp:1172
Akregator::OpenUrlRequest
Definition: openurlrequest.h:42
Akregator::Frame::url
virtual KUrl url() const =0
returns the URL of the embedded part
Akregator::MainWidget::addFeed
void addFeed(const QString &url, TreeNode *after, Folder *parent, bool autoExec=true)
Definition: mainwidget.cpp:669
Akregator::FetchQueue::slotAbort
void slotAbort()
aborts currently fetching feeds and empties the queue
Definition: fetchqueue.cpp:55
feedlist.h
Akregator::MainWidget::slotFeedAdd
void slotFeedAdd()
adds a new feed to the feed tree
Definition: mainwidget.cpp:650
Akregator::CreateFeedCommand::setAutoExecute
void setAutoExecute(bool autoexec)
Definition: createfeedcommand.cpp:175
Akregator::MainWidget::slotFeedModify
void slotFeedModify()
calls the properties dialog for feeds, starts renaming for feed groups
Definition: mainwidget.cpp:705
articlelistview.h
Akregator::MainWidget::slotFeedAddGroup
void slotFeedAddGroup()
adds a feed group to the feed tree
Definition: mainwidget.cpp:681
Akregator::MainWidget::slotCombinedView
void slotCombinedView()
switches view mode to combined view
Definition: mainwidget.cpp:542
QByteArray
Akregator::FeedListManagementImpl
Definition: feedlist.h:60
Akregator::CreateFolderCommand::setSubscriptionListView
void setSubscriptionListView(SubscriptionListView *view)
Definition: createfoldercommand.cpp:101
Akregator::ArticleViewer::displayAboutPage
void displayAboutPage()
Definition: articleviewer.cpp:670
Akregator::MainWidget::slotMoveCurrentNodeLeft
void slotMoveCurrentNodeLeft()
Definition: mainwidget.cpp:586
Akregator::CreateFeedCommand::setPosition
void setPosition(Folder *parent, TreeNode *after)
Definition: createfeedcommand.cpp:169
articleviewer.h
QWidget::setFocusPolicy
void setFocusPolicy(Qt::FocusPolicy policy)
Akregator::Article::link
KUrl link() const
Definition: article.cpp:447
kernel.h
Akregator::SelectionController
Definition: selectioncontroller.h:40
Akregator::MainWidget::~MainWidget
~MainWidget()
destructor.
Definition: mainwidget.cpp:94
Akregator::CreateFeedCommand::setSubscriptionListView
void setSubscriptionListView(SubscriptionListView *view)
Definition: createfeedcommand.cpp:154
Akregator::MainWidget::importFeedList
void importFeedList(const QDomDocument &doc)
Adds the feeds in doc to the "Imported Folder".
Definition: mainwidget.cpp:414
Akregator::MainWidget::setFeedList
void setFeedList(const boost::shared_ptr< FeedList > &feedList)
Definition: mainwidget.cpp:423
Akregator::TreeNode::title
QString title() const
Get title of node.
Definition: treenode.cpp:87
Akregator::ActionManagerImpl::initMainWidget
void initMainWidget(MainWidget *mainWidget)
Definition: actionmanagerimpl.cpp:198
articlejobs.h
Akregator::MainWidget::slotToggleShowQuickFilter
void slotToggleShowQuickFilter()
toggles the visibility of the filter bar
Definition: mainwidget.cpp:965
Akregator::OpenUrlRequest::setOpenInBackground
void setOpenInBackground(bool background)
Definition: openurlrequest.cpp:60
QByteArray::isEmpty
bool isEmpty() const
Akregator::SpeechClient::self
static SpeechClient * self()
Definition: speechclient.cpp:53
Akregator::MainWidget::slotCopyLinkAddress
void slotCopyLinkAddress()
copies the link of current article to clipboard
Definition: mainwidget.cpp:941
browserframe.h
Akregator::TreeNode::unread
virtual int unread() const =0
The unread count, returns the number of new/unread articles in the node (for groups: the accumulated ...
Akregator::MainWidget::slotMoveCurrentNodeDown
void slotMoveCurrentNodeDown()
Definition: mainwidget.cpp:570
Status
Status
Definition: akregatorstorageexporter.cpp:63
Akregator::MainWidget::slotSetSelectedArticleUnread
void slotSetSelectedArticleUnread()
marks the currently selected article as unread
Definition: mainwidget.cpp:1110
Akregator::Kernel::setFeedList
void setFeedList(const boost::shared_ptr< FeedList > &feedList)
Definition: kernel.cpp:87
Akregator::FolderExpansionHandler
Definition: subscriptionlistmodel.h:135
Akregator::CreateFolderCommand
Definition: createfoldercommand.h:36
Akregator::FrameManager::saveProperties
void saveProperties(KConfigGroup &config)
session management
Definition: framemanager.cpp:373
Akregator::MainWidget::slotSetCurrentArticleReadDelayed
void slotSetCurrentArticleReadDelayed()
marks the currenctly selected article as read after a user-set delay
Definition: mainwidget.cpp:1120
Akregator::MainWidget::slotOpenSelectedArticles
void slotOpenSelectedArticles()
opens current article in new tab, background/foreground depends on settings TODO: use selected instea...
Definition: mainwidget.cpp:1203
Akregator::AbstractSelectionController::selectedArticles
virtual QList< Akregator::Article > selectedArticles() const =0
Akregator::Kernel::frameManager
FrameManager * frameManager()
Definition: kernel.cpp:97
Akregator::Part
This is a RSS Aggregator "Part".
Definition: akregator_part.h:77
importfeedlistcommand.h
Akregator::MainWidget::sendArticle
void sendArticle(bool attach=false)
Definition: mainwidget.cpp:368
Akregator::Folder::removeChild
void removeChild(TreeNode *node)
remove node from children.
Definition: folder.cpp:249
Akregator::MainWidget::isNetworkAvailable
bool isNetworkAvailable()
Definition: mainwidget.cpp:1183
Akregator::ActionManagerImpl::initFrameManager
void initFrameManager(FrameManager *frameManager)
Definition: actionmanagerimpl.cpp:585
Akregator::MainWidget::slotMouseOverInfo
void slotMouseOverInfo(const KFileItem &kifi)
displays a URL in the status bar when the user moves the mouse over a link
Definition: mainwidget.cpp:1133
Akregator::CreateFolderCommand::setSelectedSubscription
void setSelectedSubscription(TreeNode *selected)
Definition: createfoldercommand.cpp:106
Akregator::AbstractSelectionController
Definition: abstractselectioncontroller.h:94
Akregator::MainWidget::slotMarkAllRead
void slotMarkAllRead()
marks all articles in the currently selected feed as read
Definition: mainwidget.cpp:754
Akregator::EditSubscriptionCommand
Definition: editsubscriptioncommand.h:39
Akregator::MainWidget::slotArticleToggleKeepFlag
void slotArticleToggleKeepFlag(bool enabled)
toggles the keep flag of the currently selected article
Definition: mainwidget.cpp:1036
Akregator::New
article was fetched in the last fetch of it's feed and not read yet.
Definition: types.h:33
Akregator::MainWidget::slotOpenHomepage
void slotOpenHomepage()
opens the homepage of the currently selected feed
Definition: mainwidget.cpp:883
feed.h
Akregator::ProgressManager::setFeedList
void setFeedList(const boost::shared_ptr< FeedList > &feedList)
sets the feed list to be managed
Definition: progressmanager.cpp:68
Akregator::SubscriptionListView
Definition: subscriptionlistview.h:37
createfeedcommand.h
Akregator::CreateFeedCommand::setUrl
void setUrl(const QString &url)
Definition: createfeedcommand.cpp:164
QSplitter::count
int count() const
Akregator::CreateFeedCommand
Definition: createfeedcommand.h:37
QClipboard
Akregator::TreeNode::parent
virtual const Folder * parent() const
Returns the parent node.
Definition: treenode.cpp:141
treenodevisitor.h
Akregator::FeedList
The model of a feed tree, represents an OPML document.
Definition: feedlist.h:78
Akregator::MainWidget::slotSetTotalUnread
void slotSetTotalUnread()
emits signalUnreadCountChanged(int)
Definition: mainwidget.cpp:763
Akregator::ArticleListView
Definition: articlelistview.h:88
Akregator::MainWidget::slotWidescreenView
void slotWidescreenView()
switches view mode to widescreen view
Definition: mainwidget.cpp:519
Akregator::EditSubscriptionCommand::setSubscriptionListView
void setSubscriptionListView(SubscriptionListView *view)
Definition: editsubscriptioncommand.cpp:133
Akregator::MainWidget::slotSetSelectedArticleRead
void slotSetSelectedArticleRead()
marks the currently selected article as read
Definition: mainwidget.cpp:1080
Akregator::Article::feed
Feed * feed() const
Definition: article.cpp:508
Akregator::MainWidget::slotTextToSpeechRequest
void slotTextToSpeechRequest()
reads the currently selected articles using KTTSD
Definition: mainwidget.cpp:1085
Akregator::EditSubscriptionCommand::setSubscription
void setSubscription(const boost::shared_ptr< FeedList > &feedList, int subId)
Definition: editsubscriptioncommand.cpp:112
Akregator::Article::isNull
bool isNull() const
Definition: article.cpp:253
Akregator::MainWidget::MainWidget
MainWidget(Akregator::Part *part, QWidget *parent, ActionManagerImpl *actionManager, const char *name)
constructor
Definition: mainwidget.cpp:103
QBoxLayout::addWidget
void addWidget(QWidget *widget, int stretch, QFlags< Qt::AlignmentFlag > alignment)
QList::count
int count(const T &value) const
Akregator::MainWidget::slotFetchingStopped
void slotFetchingStopped()
Definition: mainwidget.cpp:807
tabwidget.h
Akregator::Command::setParentWidget
void setParentWidget(QWidget *parentWidget)
Definition: command.cpp:59
Akregator::Frame::slotSetStatusText
void slotSetStatusText(const QString &)
Definition: frame.cpp:63
Akregator::Article::title
QString title() const
Definition: article.cpp:374
Akregator::MainWidget::slotReloadAllTabs
void slotReloadAllTabs()
reloads all open tabs
Definition: mainwidget.cpp:1177
Akregator::MainWidget::slotOpenSelectedArticlesInBackground
void slotOpenSelectedArticlesInBackground()
Definition: mainwidget.cpp:1209
QTimer
Akregator::ExpireItemsCommand::setFeedList
void setFeedList(const boost::weak_ptr< FeedList > &feedList)
Definition: expireitemscommand.cpp:114
QApplication::clipboard
QClipboard * clipboard()
Akregator::ActionManagerImpl
Akregator-specific implementation of the ActionManager interface.
Definition: actionmanagerimpl.h:50
Akregator::Frame::id
int id() const
Definition: frame.cpp:112
feedpropertiesdialog.h
akregator_part.h
Akregator::Frame::Started
Definition: frame.h:61
QList::isEmpty
bool isEmpty() const
Akregator::Kernel::self
static Kernel * self()
Definition: kernel.cpp:39
Akregator::MainWidget::slotOnShutdown
void slotOnShutdown()
Definition: mainwidget.cpp:316
QObject::setObjectName
void setObjectName(const QString &name)
Akregator::ActionManagerImpl::initArticleListView
void initArticleListView(ArticleListView *articleList)
Definition: actionmanagerimpl.cpp:447
QWidget::setFocusProxy
void setFocusProxy(QWidget *w)
progressmanager.h
Akregator::MainFrame
Definition: frame.h:174
Akregator::Folder::appendChild
void appendChild(TreeNode *node)
inserts node as last child
Definition: folder.cpp:215
Akregator::Article::keep
bool keep() const
if true, the article should be kept even when expired
Definition: article.cpp:495
Akregator::ArticleModifyJob
Definition: articlejobs.h:88
Akregator::Read
article is read
Definition: types.h:32
subscriptionlistview.h
fetchqueue.h
editsubscriptioncommand.h
Akregator::MainWidget::readProperties
void readProperties(const KConfigGroup &config)
session management
Definition: mainwidget.cpp:1138
QVBoxLayout
Akregator::Feed::xmlUrl
QString xmlUrl() const
returns the url of the actual feed source (rss/rdf/atom file)
Definition: feed.cpp:372
Akregator::MainWidget::slotDeleteExpiredArticles
void slotDeleteExpiredArticles()
Definition: mainwidget.cpp:459
Akregator::ArticleDeleteJob::start
void start()
Definition: articlejobs.cpp:58
Akregator::Folder::children
QList< const TreeNode * > children() const
returns the (direct) children of this node.
Definition: folder.cpp:124
Akregator::TabWidget
Definition: tabwidget.h:38
Akregator::Frame::slotSetTitle
void slotSetTitle(const QString &)
Definition: frame.cpp:42
Akregator::ImportFeedListCommand
Definition: importfeedlistcommand.h:40
Akregator::Frame::Completed
Definition: frame.h:61
QSplitter::setOpaqueResize
void setOpaqueResize(bool opaque)
QList::first
T & first()
Akregator::AbstractSelectionController::setFeedSelector
virtual void setFeedSelector(QAbstractItemView *feedSelector)=0
Akregator::MainWidget::slotOpenSelectedArticlesInBrowser
void slotOpenSelectedArticlesInBrowser()
opens the current article (currentItem) in external browser TODO: use selected instead of current...
Definition: mainwidget.cpp:900
QString
QList
Definition: article.h:41
QWidget::hide
void hide()
Akregator::MainWidget::slotFeedRemove
void slotFeedRemove()
removes the currently selected feed (ask for confirmation)
Definition: mainwidget.cpp:691
Akregator::MainWidget::slotFetchAllFeeds
void slotFetchAllFeeds()
starts fetching of all feeds in the tree
Definition: mainwidget.cpp:792
Akregator::MainWidget::CombinedView
Definition: mainwidget.h:121
QLayout::setMargin
void setMargin(int margin)
Akregator::Feed::htmlUrl
QString htmlUrl() const
returns the URL of the HTML page of this feed
Definition: feed.cpp:381
Akregator::TabWidget::slotReloadAllTabs
void slotReloadAllTabs()
Definition: tabwidget.cpp:418
Akregator::ArticleId
Definition: articlejobs.h:48
QStringList
Akregator::MainWidget::slotArticleDelete
void slotArticleDelete()
deletes the currently selected article
Definition: mainwidget.cpp:982
Akregator::MainWidget::slotFetchingStarted
void slotFetchingStarted()
Definition: mainwidget.cpp:800
Akregator::SearchBar::slotSetText
void slotSetText(const QString &text)
Definition: searchbar.cpp:155
Akregator::Article::guid
QString guid() const
Definition: article.cpp:463
Akregator::MainWidget::slotMoveCurrentNodeUp
void slotMoveCurrentNodeUp()
Definition: mainwidget.cpp:554
Akregator::OpenUrlRequest::ExternalBrowser
open in external browser
Definition: openurlrequest.h:54
Akregator::MainWidget::slotNetworkStatusChanged
void slotNetworkStatusChanged(Solid::Networking::Status status)
Definition: mainwidget.cpp:1188
QList::end
iterator end()
Akregator::OpenUrlRequest::setOptions
void setOptions(Options options)
Definition: openurlrequest.cpp:99
Akregator::Frame::title
QString title() const
Definition: frame.cpp:141
QLatin1Char
QDomDocument
Akregator::ExpireItemsCommand
Definition: expireitemscommand.h:40
selectioncontroller.h
Akregator::MainWidget::WidescreenView
Definition: mainwidget.h:120
Akregator::AbstractSelectionController::setArticleLister
virtual void setArticleLister(Akregator::ArticleLister *lister)=0
folder.h
QMetaObject::invokeMethod
bool invokeMethod(QObject *obj, const char *member, Qt::ConnectionType type, QGenericReturnArgument ret, QGenericArgument val0, QGenericArgument val1, QGenericArgument val2, QGenericArgument val3, QGenericArgument val4, QGenericArgument val5, QGenericArgument val6, QGenericArgument val7, QGenericArgument val8, QGenericArgument val9)
Akregator::MainWidget::addFeedToGroup
void addFeedToGroup(const QString &url, const QString &group)
Add a feed to a group.
Definition: mainwidget.cpp:473
mainwidget.h
Akregator::MainWidget::slotNormalView
void slotNormalView()
switches view mode to normal view
Definition: mainwidget.cpp:496
Akregator::MainWidget::slotArticleSelected
void slotArticleSelected(const Akregator::Article &)
the article selection has changed
Definition: mainwidget.cpp:814
QSplitter
Akregator::MainWidget::slotPrevUnreadArticle
void slotPrevUnreadArticle()
selects the previous unread article in the article list
Definition: mainwidget.cpp:732
QWidget::setWhatsThis
void setWhatsThis(const QString &)
Akregator::TreeNode::nextSibling
virtual const TreeNode * nextSibling() const
Get the next sibling.
Definition: treenode.cpp:112
Akregator::MainWidget::slotMoveCurrentNodeRight
void slotMoveCurrentNodeRight()
Definition: mainwidget.cpp:600
Akregator::MainWidget::slotMarkAllFeedsRead
void slotMarkAllFeedsRead()
marks all articles in all feeds in the tree as read
Definition: mainwidget.cpp:747
Akregator::MainWidget::slotFetchCurrentFeed
void slotFetchCurrentFeed()
fetches the currently selected feed
Definition: mainwidget.cpp:782
Akregator::CreateFeedCommand::setRootFolder
void setRootFolder(Folder *rootFolder)
Definition: createfeedcommand.cpp:159
Akregator::ArticleDeleteJob
Definition: articlejobs.h:69
Akregator::FrameManager::currentFrame
Frame * currentFrame() const
Definition: framemanager.cpp:69
Akregator::Unread
article wasn't read yet by the user
Definition: types.h:31
actionmanagerimpl.h
Akregator::TreeNode::isGroup
virtual bool isGroup() const =0
Helps the rest of the app to decide if node should be handled as group or not.
Akregator::MainWidget::feedListToOPML
QDomDocument feedListToOPML()
Definition: mainwidget.cpp:464
Qt::escape
QString escape(const QString &plain)
Akregator::ActionManagerImpl::initArticleViewer
void initArticleViewer(ArticleViewer *articleViewer)
Definition: actionmanagerimpl.cpp:427
Akregator::Feed
represents a feed
Definition: feed.h:53
searchbar.h
Akregator::Folder
Represents a folder (containing feeds and/or other folders)
Definition: folder.h:44
Akregator::ArticleDeleteJob::appendArticleId
void appendArticleId(const Akregator::ArticleId &id)
Definition: articlejobs.cpp:52
Akregator::MainWidget::slotSetSelectedArticleNew
void slotSetSelectedArticleNew()
marks the currently selected article as new
Definition: mainwidget.cpp:1115
QWidget::QWidget
QWidget(QWidget *parent, QFlags< Qt::WindowType > f)
Akregator::DeleteSubscriptionCommand::setSubscription
void setSubscription(const boost::weak_ptr< FeedList > &feedList, int subId)
Definition: deletesubscriptioncommand.cpp:148
Akregator::TreeNode::prevSibling
virtual const TreeNode * prevSibling() const
Get the previous sibling.
Definition: treenode.cpp:132
Akregator::ProgressManager::self
static ProgressManager * self()
Definition: progressmanager.cpp:50
Akregator::ExpireItemsCommand::setFeeds
void setFeeds(const QVector< int > &feeds)
Definition: expireitemscommand.cpp:124
Akregator::MainWidget::slotFramesChanged
void slotFramesChanged()
Definition: mainwidget.cpp:1030
Akregator::Article
A proxy class for Syndication::ItemPtr with some additional methods to assist sorting.
Definition: article.h:63
QString::fromLatin1
QString fromLatin1(const char *str, int size)
Akregator::Command::start
void start()
Definition: command.cpp:64
QTimer::start
void start(int msec)
Akregator::Article::status
int status() const
Definition: article.cpp:338
Akregator::FrameManager::slotAddFrame
void slotAddFrame(Frame *frame)
Definition: framemanager.cpp:74
subscriptionlistjobs.h
Akregator::OpenUrlRequest::NewTab
open in new tab
Definition: openurlrequest.h:53
QClipboard::setText
void setText(const QString &text, Mode mode)
notificationmanager.h
Akregator::ArticleViewer::part
KParts::ReadOnlyPart * part() const
Definition: articleviewer.cpp:159
Akregator::AbstractSelectionController::setFolderExpansionHandler
virtual void setFolderExpansionHandler(Akregator::FolderExpansionHandler *handler)=0
Akregator::MainWidget::slotMouseButtonPressed
void slotMouseButtonPressed(int button, const KUrl &)
special behaviour in article list view (TODO: move code there?)
Definition: mainwidget.cpp:856
Akregator::MainWidget::slotRequestNewFrame
void slotRequestNewFrame(int &frameId)
Definition: mainwidget.cpp:355
Akregator::BrowserFrame
Definition: browserframe.h:49
createfoldercommand.h
QObject::connect
bool connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
framemanager.h
Akregator::SearchBar
Definition: searchbar.h:45
subscriptionlistmodel.h
Akregator::TreeNode
Abstract base class for all kind of elements in the feed tree, like feeds and feed groups (and search...
Definition: treenode.h:58
Akregator::TreeNode::id
virtual uint id() const
returns the ID of this node.
Definition: treenode.cpp:198
Akregator::Folder::insertChild
void insertChild(TreeNode *node, TreeNode *after)
inserts node as child after child node after.
Definition: folder.cpp:180
Akregator::ActionManagerImpl::initSubscriptionListView
void initSubscriptionListView(SubscriptionListView *subscriptionListView)
Definition: actionmanagerimpl.cpp:464
addfeeddialog.h
KJob
QList::begin
iterator begin()
Akregator::ArticleModifyJob::setKeep
void setKeep(const ArticleId &id, bool keep)
Definition: articlejobs.cpp:103
Akregator::SpeechClient::slotSpeak
void slotSpeak(const QString &text, const QString &language)
Definition: speechclient.cpp:74
Akregator::TreeNode::setNotificationMode
virtual void setNotificationMode(bool doNotify)
Definition: treenode.cpp:178
expireitemscommand.h
Akregator::MainWidget::slotOpenArticleInBrowser
void slotOpenArticleInBrowser(const Akregator::Article &article)
opens the link of an article in the external browser
Definition: mainwidget.cpp:908
deletesubscriptioncommand.h
Akregator::MainWidget::slotNodeSelected
void slotNodeSelected(Akregator::TreeNode *node)
selected tree node has changed
Definition: mainwidget.cpp:616
QTimer::setSingleShot
void setSingleShot(bool singleShot)
Akregator::MainWidget::slotNextUnreadArticle
void slotNextUnreadArticle()
selects the next unread article in the article list
Definition: mainwidget.cpp:717
Akregator::Kernel::fetchQueue
FetchQueue * fetchQueue()
Definition: kernel.cpp:92
This file is part of the KDE documentation.
Documentation copyright © 1996-2020 The KDE developers.
Generated on Mon Jun 22 2020 13:34:00 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

akregator

Skip menu "akregator"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members

kdepim API Reference

Skip menu "kdepim API Reference"
  • akonadi_next
  • akregator
  • blogilo
  • calendarsupport
  • console
  •   kabcclient
  •   konsolekalendar
  • kaddressbook
  • kalarm
  •   lib
  • kdgantt2
  • kjots
  • kleopatra
  • kmail
  • knode
  • knotes
  • kontact
  • korgac
  • korganizer
  • ktimetracker
  • libkdepim
  • libkleo
  • libkpgp
  • mailcommon
  • messagelist
  • messageviewer
  • pimprint

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal