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

akregator

  • sources
  • kde-4.12
  • kdepim
  • akregator
  • src
articlelistview.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  2005-2008 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.
10 
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.
15 
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.
19 
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.
23 */
24 
25 #include "articlelistview.h"
26 #include "actionmanager.h"
27 #include "akregatorconfig.h"
28 #include "article.h"
29 #include "articlemodel.h"
30 #include "kernel.h"
31 #include "types.h"
32 
33 #include <utils/filtercolumnsproxymodel.h>
34 
35 #include <KDateTime>
36 #include <KGlobal>
37 #include <KIcon>
38 #include <KLocale>
39 #include <KUrl>
40 #include <KMenu>
41 #include <KColorScheme>
42 
43 #include <QApplication>
44 #include <QContextMenuEvent>
45 #include <QHeaderView>
46 #include <QKeyEvent>
47 #include <QList>
48 #include <QMenu>
49 #include <QPaintEvent>
50 #include <QPalette>
51 #include <QScrollBar>
52 
53 #include <cassert>
54 
55 using namespace boost;
56 using namespace Akregator;
57 
58 
59 FilterDeletedProxyModel::FilterDeletedProxyModel( QObject* parent ) : QSortFilterProxyModel( parent )
60 {
61  setDynamicSortFilter( true );
62 }
63 
64 bool FilterDeletedProxyModel::filterAcceptsRow( int source_row, const QModelIndex& source_parent ) const
65 {
66  return !sourceModel()->index( source_row, 0, source_parent ).data( ArticleModel::IsDeletedRole ).toBool();
67 }
68 
69 SortColorizeProxyModel::SortColorizeProxyModel( QObject* parent ) : QSortFilterProxyModel( parent ), m_keepFlagIcon( KIcon( "mail-mark-important" ) )
70 {
71  m_unreadColor = KColorScheme( QPalette::Normal, KColorScheme::View ).foreground( KColorScheme::PositiveText ).color();
72  m_newColor = KColorScheme( QPalette::Normal, KColorScheme::View ).foreground( KColorScheme::NegativeText ).color();
73 }
74 
75 bool SortColorizeProxyModel::filterAcceptsRow ( int source_row, const QModelIndex& source_parent ) const
76 {
77  if ( source_parent.isValid() )
78  return false;
79 
80  for ( uint i = 0; i < m_matchers.size(); ++i )
81  {
82  if ( !static_cast<ArticleModel*>( sourceModel() )->rowMatches( source_row, m_matchers[i] ) )
83  return false;
84  }
85 
86  return true;
87 }
88 
89 void SortColorizeProxyModel::setFilters( const std::vector<shared_ptr<const Filters::AbstractMatcher> >& matchers )
90 {
91  if ( m_matchers == matchers )
92  return;
93  m_matchers = matchers;
94  invalidateFilter();
95 }
96 
97 QVariant SortColorizeProxyModel::data( const QModelIndex& idx, int role ) const
98 {
99  if ( !idx.isValid() || !sourceModel() )
100  return QVariant();
101 
102  const QModelIndex sourceIdx = mapToSource( idx );
103 
104  switch ( role )
105  {
106  case Qt::ForegroundRole:
107  {
108  switch ( static_cast<ArticleStatus>( sourceIdx.data( ArticleModel::StatusRole ).toInt() ) )
109  {
110  case Unread:
111  {
112  return Settings::useCustomColors() ?
113  Settings::colorUnreadArticles() : m_unreadColor;
114  }
115  case New:
116  {
117  return Settings::useCustomColors() ?
118  Settings::colorNewArticles() : m_newColor;
119  }
120  case Read:
121  {
122  return QApplication::palette().color( QPalette::Text );
123  }
124  }
125  }
126  break;
127  case Qt::DecorationRole:
128  {
129  if ( sourceIdx.column() == ArticleModel::ItemTitleColumn )
130  {
131  return sourceIdx.data( ArticleModel::IsImportantRole ).toBool() ? m_keepFlagIcon : QVariant();
132  }
133  }
134  break;
135  }
136  return sourceIdx.data( role );
137 }
138 
139 namespace {
140 
141  static bool isRead( const QModelIndex& idx )
142  {
143  if ( !idx.isValid() )
144  return false;
145 
146  return static_cast<ArticleStatus>( idx.data( ArticleModel::StatusRole ).toInt() ) == Read;
147  }
148 }
149 
150 void ArticleListView::setArticleModel( ArticleModel* model )
151 {
152  if ( !model ) {
153  setModel( model );
154  return;
155  }
156 
157  m_proxy = new SortColorizeProxyModel( model );
158  m_proxy->setSourceModel( model );
159  m_proxy->setSortRole( ArticleModel::SortRole );
160  m_proxy->setFilters( m_matchers );
161  FilterDeletedProxyModel* const proxy2 = new FilterDeletedProxyModel( model );
162  proxy2->setSortRole( ArticleModel::SortRole );
163  proxy2->setSourceModel( m_proxy );
164 
165  connect( model, SIGNAL(rowsInserted(QModelIndex,int,int)),
166  m_proxy, SLOT(invalidate()) );
167 
168  FilterColumnsProxyModel* const columnsProxy = new FilterColumnsProxyModel( model );
169  columnsProxy->setSortRole( ArticleModel::SortRole );
170  columnsProxy->setSourceModel( proxy2 );
171  columnsProxy->setColumnEnabled( ArticleModel::ItemTitleColumn );
172  columnsProxy->setColumnEnabled( ArticleModel::FeedTitleColumn );
173  columnsProxy->setColumnEnabled( ArticleModel::DateColumn );
174  columnsProxy->setColumnEnabled( ArticleModel::AuthorColumn );
175 
176  setModel( columnsProxy );
177  header()->setContextMenuPolicy( Qt::CustomContextMenu );
178  header()->setResizeMode( QHeaderView::Interactive );
179 }
180 
181 void ArticleListView::showHeaderMenu(const QPoint& pos)
182 {
183  if ( !model() )
184  return;
185 
186  QPointer<KMenu> menu = new KMenu( this );
187  menu->addTitle( i18n( "Columns" ) );
188  menu->setAttribute( Qt::WA_DeleteOnClose );
189 
190  const int colCount = model()->columnCount();
191  int visibleColumns = 0; // number of column currently shown
192  QAction *visibleColumnsAction = 0;
193  for ( int i = 0; i < colCount; ++i )
194  {
195  QAction* act = menu->addAction( model()->headerData( i, Qt::Horizontal ).toString() );
196  act->setCheckable( true );
197  act->setData( i );
198  bool sectionVisible = !header()->isSectionHidden( i );
199  act->setChecked( sectionVisible );
200  if ( sectionVisible ) {
201  ++visibleColumns;
202  visibleColumnsAction = act;
203  }
204  }
205 
206  // Avoid that the last shown column is also hidden
207  if ( visibleColumns == 1 ) {
208  visibleColumnsAction->setEnabled( false );
209  }
210 
211 
212  QPointer<QObject> that( this );
213  QAction * const action = menu->exec( header()->mapToGlobal( pos ) );
214  if ( that && action ) {
215  const int col = action->data().toInt();
216  if ( action->isChecked() )
217  header()->showSection( col );
218  else
219  header()->hideSection( col );
220  }
221  delete menu;
222 }
223 
224 void ArticleListView::saveHeaderSettings()
225 {
226  if ( model() ) {
227  const QByteArray state = header()->saveState();
228  if ( m_columnMode == FeedMode )
229  m_feedHeaderState = state;
230  else
231  m_groupHeaderState = state;
232  }
233 
234  KConfigGroup conf( Settings::self()->config(), "General" );
235  conf.writeEntry( "ArticleListFeedHeaders", m_feedHeaderState.toBase64() );
236  conf.writeEntry( "ArticleListGroupHeaders", m_groupHeaderState.toBase64() );
237 }
238 
239 void ArticleListView::loadHeaderSettings()
240 {
241  KConfigGroup conf( Settings::self()->config(), "General" );
242  m_feedHeaderState = QByteArray::fromBase64( conf.readEntry( "ArticleListFeedHeaders" ).toLatin1() );
243  m_groupHeaderState = QByteArray::fromBase64( conf.readEntry( "ArticleListGroupHeaders" ).toLatin1() );
244 }
245 
246 QItemSelectionModel* ArticleListView::articleSelectionModel() const
247 {
248  return selectionModel();
249 }
250 
251 const QAbstractItemView* ArticleListView::itemView() const
252 {
253  return this;
254 }
255 
256 QAbstractItemView* ArticleListView::itemView()
257 {
258  return this;
259 }
260 
261 QPoint ArticleListView::scrollBarPositions() const
262 {
263  return QPoint( horizontalScrollBar()->value(), verticalScrollBar()->value() );
264 }
265 
266 void ArticleListView::setScrollBarPositions( const QPoint& p )
267 {
268  horizontalScrollBar()->setValue( p.x() );
269  verticalScrollBar()->setValue( p.y() );
270 }
271 
272 
273 void ArticleListView::setGroupMode()
274 {
275  if ( m_columnMode == GroupMode )
276  return;
277 
278  if ( model() )
279  m_feedHeaderState = header()->saveState();
280  m_columnMode = GroupMode;
281  restoreHeaderState();
282 }
283 
284 void ArticleListView::setFeedMode()
285 {
286  if ( m_columnMode == FeedMode )
287  return;
288 
289  if ( model() )
290  m_groupHeaderState = header()->saveState();
291  m_columnMode = FeedMode;
292  restoreHeaderState();
293 }
294 
295 static int maxDateColumnWidth( const QFontMetrics &fm )
296 {
297  int width = 0;
298  KDateTime date( KDateTime::currentLocalDate(), QTime(23, 59) );
299  for (int x=0; x<10; x++, date = date.addDays( -1 ) ) {
300  QString txt = ' ' + KGlobal::locale()->formatDateTime(date, KLocale::FancyShortDate ) + ' ';
301  width = qMax( width, fm.width( txt ) );
302  }
303  return width;
304 }
305 
306 void ArticleListView::restoreHeaderState()
307 {
308  QByteArray state = m_columnMode == GroupMode ? m_groupHeaderState : m_feedHeaderState;
309  header()->restoreState( state );
310  if ( state.isEmpty() )
311  {
312  // No state, set a default config:
313  // - hide the feed column in feed mode (no need to see the same feed title over and over)
314  // - set the date column wide enough to fit all possible dates
315  header()->setSectionHidden( ArticleModel::FeedTitleColumn, m_columnMode == FeedMode );
316  header()->setStretchLastSection( false );
317  header()->resizeSection( ArticleModel::DateColumn, maxDateColumnWidth(fontMetrics()) );
318  if ( model() ) {
319  startResizingTitleColumn();
320  }
321  }
322 
323  if ( header()->sectionSize( ArticleModel::DateColumn ) == 1 )
324  header()->resizeSection( ArticleModel::DateColumn, maxDateColumnWidth(fontMetrics()) );
325 }
326 
327 void ArticleListView::startResizingTitleColumn()
328 {
329  // set the title column to Stretch resize mode so that it adapts to the
330  // content. finishResizingTitleColumn() will turn the resize mode back to
331  // Interactive so that the user can still resize the column himself if he
332  // wants to
333  header()->setResizeMode( ArticleModel::ItemTitleColumn, QHeaderView::Stretch );
334  QMetaObject::invokeMethod( this, "finishResizingTitleColumn", Qt::QueuedConnection );
335 }
336 
337 void ArticleListView::finishResizingTitleColumn()
338 {
339  if ( QApplication::mouseButtons() != Qt::NoButton )
340  {
341  // Come back later: user is still resizing the widget
342  QMetaObject::invokeMethod( this, "finishResizingTitleColumn", Qt::QueuedConnection );
343  return;
344  }
345  header()->setResizeMode( QHeaderView::Interactive );
346 }
347 
348 ArticleListView::~ArticleListView()
349 {
350  saveHeaderSettings();
351 }
352 
353 void ArticleListView::setIsAggregation( bool aggregation )
354 {
355  if ( aggregation )
356  setGroupMode();
357  else
358  setFeedMode();
359 }
360 
361 ArticleListView::ArticleListView( QWidget* parent )
362  : QTreeView(parent),
363  m_columnMode( FeedMode )
364 {
365  setSortingEnabled( true );
366  setAlternatingRowColors( true );
367  setSelectionMode( QAbstractItemView::ExtendedSelection );
368  setUniformRowHeights( true );
369  setRootIsDecorated( false );
370  setAllColumnsShowFocus( true );
371  setDragDropMode( QAbstractItemView::DragOnly );
372 
373  setMinimumSize( 250, 150 );
374  setWhatsThis( i18n("<h2>Article list</h2>"
375  "Here you can browse articles from the currently selected feed. "
376  "You can also manage articles, as marking them as persistent (\"Mark as Important\") or delete them, using the right mouse button menu. "
377  "To view the web page of the article, you can open the article internally in a tab or in an external browser window."));
378 
379  //connect exactly once
380  disconnect( header(), SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(showHeaderMenu(QPoint)) );
381  connect( header(), SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(showHeaderMenu(QPoint)) );
382  loadHeaderSettings();
383 }
384 
385 void ArticleListView::mousePressEvent( QMouseEvent *ev )
386 {
387  // let's push the event, so we can use currentIndex() to get the newly selected article..
388  QTreeView::mousePressEvent( ev );
389 
390  if( ev->button() == Qt::MidButton ) {
391  QModelIndex idx( currentIndex() );
392  const KUrl url = currentIndex().data( ArticleModel::LinkRole ).value<KUrl>();
393 
394  emit signalMouseButtonPressed( ev->button(), url );
395  }
396 }
397 
398 
399 #if 0 // unused
400 namespace {
401  static QString itemIdForIndex( const QModelIndex& index )
402  {
403  return index.isValid() ? index.data( ArticleModel::ItemIdRole ).toString() : QString();
404  }
405 
406  static QStringList itemIdsForIndexes( const QModelIndexList& indexes )
407  {
408  QStringList articles;
409  Q_FOREACH ( const QModelIndex i, indexes )
410  {
411  articles.append( itemIdForIndex( i ) );
412  }
413 
414  return articles;
415  }
416 }
417 #endif
418 
419 void ArticleListView::contextMenuEvent( QContextMenuEvent* event )
420 {
421  QWidget* w = ActionManager::getInstance()->container( "article_popup" );
422  QMenu* popup = qobject_cast<QMenu*>( w );
423  if ( popup )
424  popup->exec( event->globalPos() );
425 }
426 
427 void ArticleListView::paintEvent( QPaintEvent* e )
428 {
429  QTreeView::paintEvent( e );
430 
431 #ifdef __GNUC__
432 #warning The distinction between empty node and 0 items after filtering is hard to port to interview
433 #endif
434 #if 0
435  QString message;
436 
437  if ( !model() || model()->rowCount() > 0 ) // article list is not empty
438  {
439  if (visibleArticles() == 0)
440  {
441  message = i18n("<div align=center>"
442  "<h3>No matches</h3>"
443  "Filter does not match any articles, "
444  "please change your criteria and try again."
445  "</div>");
446  }
447  }
448  else if ( !model() ) // article list is empty
449  {
450  if (!d->node) // no node selected
451  {
452  message = i18n("<div align=center>"
453  "<h3>No feed selected</h3>"
454  "This area is article list. "
455  "Select a feed from the feed list "
456  "and you will see its articles here."
457  "</div>");
458  }
459  }
460 
461  if (!message.isNull())
462  paintInfoBox( message, viewport(), palette() );
463 #endif
464 }
465 
466 
467 void ArticleListView::setModel( QAbstractItemModel* m )
468 {
469  const bool groupMode = m_columnMode == GroupMode;
470 
471  QAbstractItemModel* const oldModel = model();
472  if ( oldModel ) {
473  const QByteArray state = header()->saveState();
474  if ( groupMode )
475  m_groupHeaderState = state;
476  else
477  m_feedHeaderState = state;
478  }
479 
480  QTreeView::setModel( m );
481 
482  if ( m )
483  {
484  sortByColumn( ArticleModel::DateColumn, Qt::DescendingOrder );
485  restoreHeaderState();
486 
487  // Ensure at least one column is visible
488  if ( header()->hiddenSectionCount() == header()->count() ) {
489  header()->showSection( ArticleModel::ItemTitleColumn );
490  }
491  }
492 }
493 
494 void ArticleListView::slotClear()
495 {
496  setModel( 0L );
497 }
498 
499 void ArticleListView::slotPreviousArticle()
500 {
501  if ( !model() )
502  return;
503  emit userActionTakingPlace();
504  const QModelIndex idx = currentIndex();
505  const int newRow = qMax( 0, ( idx.isValid() ? idx.row() : model()->rowCount() ) - 1 );
506  const QModelIndex newIdx = idx.isValid() ? idx.sibling( newRow, 0 ) : model()->index( newRow, 0 );
507  selectIndex( newIdx );
508 }
509 
510 void ArticleListView::slotNextArticle()
511 {
512  if ( !model() )
513  return;
514 
515  emit userActionTakingPlace();
516  const QModelIndex idx = currentIndex();
517  const int newRow = idx.isValid() ? ( idx.row() + 1 ) : 0;
518  const QModelIndex newIdx = model()->index( qMin( newRow, model()->rowCount() - 1 ), 0 );
519  selectIndex( newIdx );
520 }
521 
522 void ArticleListView::slotNextUnreadArticle()
523 {
524  if (!model())
525  return;
526 
527  const int rowCount = model()->rowCount();
528  const int startRow = qMin( rowCount - 1, ( currentIndex().isValid() ? currentIndex().row() + 1 : 0 ) );
529 
530  int i = startRow;
531  bool foundUnread = false;
532 
533  do
534  {
535  if ( !::isRead( model()->index( i, 0 ) ) )
536  foundUnread = true;
537  else
538  i = (i + 1) % rowCount;
539  }
540  while ( !foundUnread && i != startRow );
541 
542  if ( foundUnread )
543  {
544  selectIndex( model()->index( i, 0 ) );
545  }
546 }
547 
548 void ArticleListView::selectIndex( const QModelIndex& idx )
549 {
550  if ( !idx.isValid() )
551  return;
552  setCurrentIndex( idx );
553  clearSelection();
554  Q_ASSERT( selectionModel() );
555  selectionModel()->select( idx, QItemSelectionModel::Select | QItemSelectionModel::Rows );
556  scrollTo( idx, PositionAtCenter );
557 }
558 
559 void ArticleListView::slotPreviousUnreadArticle()
560 {
561  if ( !model() )
562  return;
563 
564  const int rowCount = model()->rowCount();
565  const int startRow = qMax( 0, ( currentIndex().isValid() ? currentIndex().row() : rowCount ) - 1 );
566 
567  int i = startRow;
568  bool foundUnread = false;
569 
570  do
571  {
572  if ( !::isRead( model()->index( i, 0 ) ) )
573  foundUnread = true;
574  else
575  i = i > 0 ? i - 1 : rowCount - 1;
576  }
577  while ( !foundUnread && i != startRow );
578 
579  if ( foundUnread )
580  {
581  selectIndex( model()->index( i, 0 ) );
582  }
583 }
584 
585 
586 void ArticleListView::forceFilterUpdate()
587 {
588  if ( m_proxy )
589  m_proxy->invalidate();
590 }
591 
592 void ArticleListView::setFilters( const std::vector<shared_ptr<const Filters::AbstractMatcher> >& matchers )
593 {
594  if ( m_matchers == matchers )
595  return;
596  m_matchers = matchers;
597  if ( m_proxy )
598  m_proxy->setFilters( matchers );
599 }
600 
601 #include "articlelistview.moc"
Akregator::SortColorizeProxyModel::SortColorizeProxyModel
SortColorizeProxyModel(QObject *parent=0)
Definition: articlelistview.cpp:69
maxDateColumnWidth
static int maxDateColumnWidth(const QFontMetrics &fm)
Definition: articlelistview.cpp:295
Akregator::ArticleListView::setIsAggregation
void setIsAggregation(bool isAggregation)
Definition: articlelistview.cpp:353
types.h
Akregator::ArticleListView::setModel
void setModel(QAbstractItemModel *model)
Definition: articlelistview.cpp:467
articlelistview.h
Akregator::SortColorizeProxyModel::data
QVariant data(const QModelIndex &index, int role=Qt::DisplayRole) const
Definition: articlelistview.cpp:97
Akregator::ArticleListView::setFilters
void setFilters(const std::vector< boost::shared_ptr< const Akregator::Filters::AbstractMatcher > > &)
Definition: articlelistview.cpp:592
kernel.h
Akregator::ArticleListView::setArticleModel
void setArticleModel(Akregator::ArticleModel *model)
Definition: articlelistview.cpp:150
Akregator::ArticleListView::forceFilterUpdate
void forceFilterUpdate()
Definition: articlelistview.cpp:586
QWidget
Akregator::ArticleListView::articleSelectionModel
QItemSelectionModel * articleSelectionModel() const
Definition: articlelistview.cpp:246
uint
unsigned int uint
Definition: article.h:39
Akregator::ArticleListView::slotClear
void slotClear()
Definition: articlelistview.cpp:494
Akregator::ArticleListView::mousePressEvent
void mousePressEvent(QMouseEvent *ev)
Definition: articlelistview.cpp:385
Akregator::ArticleListView::signalMouseButtonPressed
void signalMouseButtonPressed(int, const KUrl)
actionmanager.h
Akregator::Settings::useCustomColors
static bool useCustomColors()
Get UseCustomColors.
Definition: akregatorconfig.h:239
Akregator::ArticleListView::slotNextArticle
void slotNextArticle()
Definition: articlelistview.cpp:510
QObject
Akregator::ArticleModel::IsDeletedRole
Definition: articlemodel.h:68
Akregator::New
article was fetched in the last fetch of it's feed and not read yet.
Definition: types.h:33
Akregator::ArticleModel::IsImportantRole
Definition: articlemodel.h:67
Akregator::ArticleModel::AuthorColumn
Definition: articlemodel.h:53
Akregator::ArticleModel::ItemTitleColumn
Definition: articlemodel.h:51
akregatorconfig.h
Akregator::ArticleListView::~ArticleListView
~ArticleListView()
Definition: articlelistview.cpp:348
QTreeView
Akregator::ArticleListView::slotPreviousArticle
void slotPreviousArticle()
Definition: articlelistview.cpp:499
Akregator::SortColorizeProxyModel
Definition: articlelistview.h:66
Akregator::Read
article is read
Definition: types.h:32
Akregator::ArticleListView::itemView
const QAbstractItemView * itemView() const
Definition: articlelistview.cpp:251
Akregator::ArticleStatus
ArticleStatus
(un)read status of the article
Definition: types.h:30
Akregator::ActionManager::container
virtual QWidget * container(const char *name)=0
article.h
Akregator::FilterDeletedProxyModel
Definition: articlelistview.h:55
QAbstractItemModel
Akregator::ArticleModel::StatusRole
Definition: articlemodel.h:66
Akregator::ArticleModel::LinkRole
Definition: articlemodel.h:62
QSortFilterProxyModel
Akregator::FilterColumnsProxyModel
Definition: filtercolumnsproxymodel.h:33
Akregator::ArticleListView::slotNextUnreadArticle
void slotNextUnreadArticle()
Definition: articlelistview.cpp:522
Akregator::Unread
article wasn't read yet by the user
Definition: types.h:31
Akregator::ActionManager::getInstance
static ActionManager * getInstance()
Definition: actionmanager.cpp:35
Akregator::ArticleListView::ArticleListView
ArticleListView(QWidget *parent=0)
Definition: articlelistview.cpp:361
Akregator::Settings::colorNewArticles
static QColor colorNewArticles()
Get ColorNewArticles.
Definition: akregatorconfig.h:277
Akregator::FilterColumnsProxyModel::setColumnEnabled
void setColumnEnabled(int col, bool enabled=true)
Definition: filtercolumnsproxymodel.cpp:42
articlemodel.h
Akregator::ArticleModel::SortRole
Definition: articlemodel.h:61
Akregator::ArticleModel::FeedTitleColumn
Definition: articlemodel.h:52
Akregator::SortColorizeProxyModel::setFilters
void setFilters(const std::vector< boost::shared_ptr< const Akregator::Filters::AbstractMatcher > > &)
Definition: articlelistview.cpp:89
Akregator::ArticleListView::scrollBarPositions
QPoint scrollBarPositions() const
Definition: articlelistview.cpp:261
Akregator::ArticleListView::userActionTakingPlace
void userActionTakingPlace()
Akregator::ArticleModel::ItemIdRole
Definition: articlemodel.h:64
Akregator::ArticleModel::DateColumn
Definition: articlemodel.h:54
Akregator::ArticleListView::setScrollBarPositions
void setScrollBarPositions(const QPoint &p)
Definition: articlelistview.cpp:266
Akregator::Settings::self
static Settings * self()
Definition: akregatorconfig.cpp:23
Akregator::Settings::colorUnreadArticles
static QColor colorUnreadArticles()
Get ColorUnreadArticles.
Definition: akregatorconfig.h:258
filtercolumnsproxymodel.h
Akregator::ArticleListView::slotPreviousUnreadArticle
void slotPreviousUnreadArticle()
Definition: articlelistview.cpp:559
QAction
Akregator::ArticleModel
Definition: articlemodel.h:44
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Tue Oct 14 2014 22:58:14 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

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