• Skip to content
  • Skip to link menu
  • KDE API Reference
  • kdepimlibs-4.13.3 API Reference
  • KDE Home
  • Contact Us
 

akonadi

  • akonadi
subscriptiondialog.cpp
1 /*
2  Copyright (c) 2007 Volker Krause <vkrause@kde.org>
3 
4  This library is free software; you can redistribute it and/or modify it
5  under the terms of the GNU Library General Public License as published by
6  the Free Software Foundation; either version 2 of the License, or (at your
7  option) any later version.
8 
9  This library is distributed in the hope that it will be useful, but WITHOUT
10  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11  FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
12  License for more details.
13 
14  You should have received a copy of the GNU Library General Public License
15  along with this library; see the file COPYING.LIB. If not, write to the
16  Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
17  02110-1301, USA.
18 */
19 
20 #include "subscriptiondialog_p.h"
21 
22 #include "control.h"
23 #include "recursivecollectionfilterproxymodel.h"
24 #include "subscriptionjob_p.h"
25 #include "subscriptionmodel_p.h"
26 
27 #include <kdebug.h>
28 #include <kglobal.h>
29 #include <ksharedconfig.h>
30 
31 
32 #include <klocalizedstring.h>
33 
34 #include <QVBoxLayout>
35 #include <QHBoxLayout>
36 
37 
38 #ifndef KDEPIM_MOBILE_UI
39 #include <klineedit.h>
40 #include <KPushButton>
41 #include <krecursivefilterproxymodel.h>
42 #include <QHeaderView>
43 #include <QLabel>
44 #include <QTreeView>
45 #include <QCheckBox>
46 #else
47 #include <kdescendantsproxymodel.h>
48 #include <QListView>
49 #include <QSortFilterProxyModel>
50 
51 class CheckableFilterProxyModel : public QSortFilterProxyModel
52 {
53 public:
54  CheckableFilterProxyModel( QObject *parent = 0 )
55  : QSortFilterProxyModel( parent ) { }
56 
57 protected:
58  /*reimp*/ bool filterAcceptsRow( int sourceRow, const QModelIndex &sourceParent ) const
59  {
60  QModelIndex sourceIndex = sourceModel()->index( sourceRow, 0, sourceParent );
61  return sourceModel()->flags( sourceIndex ) & Qt::ItemIsUserCheckable;
62  }
63 };
64 #endif
65 
66 using namespace Akonadi;
67 
71 class SubscriptionDialog::Private
72 {
73  public:
74  Private( SubscriptionDialog *parent ) : q( parent ) {}
75 
76  void done()
77  {
78  SubscriptionJob *job = new SubscriptionJob( q );
79  job->subscribe( model->subscribed() );
80  job->unsubscribe( model->unsubscribed() );
81  connect( job, SIGNAL(result(KJob*)), q, SLOT(subscriptionResult(KJob*)) );
82  }
83 
84  void subscriptionResult( KJob *job )
85  {
86  if ( job->error() ) {
87  // TODO
88  kWarning() << job->errorString();
89  }
90  q->deleteLater();
91  }
92 
93  void modelLoaded()
94  {
95  collectionView->setEnabled( true );
96 #ifndef KDEPIM_MOBILE_UI
97  collectionView->expandAll();
98 #endif
99  q->enableButtonOk( true );
100  }
101  void slotSetPattern(const QString &text)
102  {
103  filterRecursiveCollectionFilter->setSearchPattern( text );
104 #ifndef KDEPIM_MOBILE_UI
105  collectionView->expandAll();
106 #endif
107  }
108  void slotSetIncludeCheckedOnly(bool checked)
109  {
110  filterRecursiveCollectionFilter->setIncludeCheckedOnly( checked );
111  }
112 
113  void writeConfig()
114  {
115  KConfigGroup group( KGlobal::config(), "SubscriptionDialog" );
116  group.writeEntry( "Size", q->size() );
117  }
118 
119  void readConfig()
120  {
121  KConfigGroup group( KGlobal::config(), "SubscriptionDialog" );
122  const QSize sizeDialog = group.readEntry( "Size", QSize(300,200) );
123  if ( sizeDialog.isValid() ) {
124  q->resize( sizeDialog );
125  }
126  }
127 
128  void slotUnSubscribe();
129  void slotSubscribe();
130 
131  SubscriptionDialog* q;
132 #ifndef KDEPIM_MOBILE_UI
133  QTreeView *collectionView;
134  KPushButton *subscribe;
135  KPushButton *unSubscribe;
136 #else
137  QListView *collectionView;
138 #endif
139  SubscriptionModel* model;
140  RecursiveCollectionFilterProxyModel *filterRecursiveCollectionFilter;
141 
142 };
143 
144 void SubscriptionDialog::Private::slotSubscribe()
145 {
146 #ifndef KDEPIM_MOBILE_UI
147  QModelIndexList list = collectionView->selectionModel()->selectedIndexes();
148  foreach (const QModelIndex& index, list) {
149  model->setData(index, Qt::Checked, Qt::CheckStateRole);
150  }
151  collectionView->setFocus();
152 #endif
153 }
154 
155 void SubscriptionDialog::Private::slotUnSubscribe()
156 {
157 #ifndef KDEPIM_MOBILE_UI
158  QModelIndexList list = collectionView->selectionModel()->selectedIndexes();
159  foreach (const QModelIndex& index, list) {
160  model->setData(index, Qt::Unchecked, Qt::CheckStateRole);
161  }
162  collectionView->setFocus();
163 #endif
164 }
165 
166 SubscriptionDialog::SubscriptionDialog(QWidget * parent) :
167  KDialog( parent ),
168  d( new Private( this ) )
169 {
170  init( QStringList() );
171 }
172 
173 SubscriptionDialog::SubscriptionDialog(const QStringList& mimetypes, QWidget * parent) :
174  KDialog( parent ),
175  d( new Private( this ) )
176 {
177  init( mimetypes );
178 }
179 
180 void SubscriptionDialog::showHiddenCollection(bool showHidden)
181 {
182  d->model->showHiddenCollection(showHidden);
183 }
184 
185 void SubscriptionDialog::init( const QStringList &mimetypes )
186 {
187  enableButtonOk( false );
188  setCaption( i18n( "Local Subscriptions" ) );
189  QWidget *mainWidget = new QWidget( this );
190  QVBoxLayout *mainLayout = new QVBoxLayout;
191  mainWidget->setLayout( mainLayout );
192  setMainWidget( mainWidget );
193 
194  d->model = new SubscriptionModel( this );
195 
196 #ifndef KDEPIM_MOBILE_UI
197  d->filterRecursiveCollectionFilter
198  = new Akonadi::RecursiveCollectionFilterProxyModel( this );
199  d->filterRecursiveCollectionFilter->setDynamicSortFilter( true );
200  d->filterRecursiveCollectionFilter->setSourceModel( d->model );
201  d->filterRecursiveCollectionFilter->setFilterCaseSensitivity( Qt::CaseInsensitive );
202  if ( !mimetypes.isEmpty() ) {
203  d->filterRecursiveCollectionFilter->addContentMimeTypeInclusionFilters( mimetypes );
204  }
205 
206  d->collectionView = new QTreeView( mainWidget );
207  d->collectionView->setEditTriggers( QAbstractItemView::NoEditTriggers );
208  d->collectionView->header()->hide();
209  d->collectionView->setModel( d->filterRecursiveCollectionFilter );
210  d->collectionView->setSelectionMode(QAbstractItemView::ExtendedSelection);
211 
212  QHBoxLayout *filterBarLayout = new QHBoxLayout;
213 
214  filterBarLayout->addWidget( new QLabel( i18n( "Search:" ) ) );
215 
216  KLineEdit *lineEdit = new KLineEdit( mainWidget );
217  lineEdit->setClearButtonShown(true);
218  lineEdit->setFocus();
219  connect( lineEdit, SIGNAL(textChanged(QString)),
220  this, SLOT(slotSetPattern(QString)) );
221  filterBarLayout->addWidget( lineEdit );
222  QCheckBox *checkBox = new QCheckBox( i18n("Subscribed only"), mainWidget );
223  connect( checkBox, SIGNAL(clicked(bool)),
224  this, SLOT(slotSetIncludeCheckedOnly(bool)) );
225  filterBarLayout->addWidget( checkBox );
226 
227  QHBoxLayout *hboxLayout = new QHBoxLayout;
228  hboxLayout->addWidget( d->collectionView );
229 
230  QVBoxLayout *subscribeButtonLayout = new QVBoxLayout;
231  d->subscribe = new KPushButton(i18n("Subscribe"));
232  subscribeButtonLayout->addWidget(d->subscribe);
233  connect(d->subscribe,SIGNAL(clicked()),this,SLOT(slotSubscribe()));
234 
235  d->unSubscribe = new KPushButton(i18n("Unsubscribe"));
236  subscribeButtonLayout->addWidget(d->unSubscribe);
237  connect(d->unSubscribe,SIGNAL(clicked()),this,SLOT(slotUnSubscribe()));
238  subscribeButtonLayout->addItem( new QSpacerItem( 5, 5, QSizePolicy::Minimum, QSizePolicy::Expanding ) );
239 
240  hboxLayout->addLayout(subscribeButtonLayout);
241 
242  mainLayout->addLayout(filterBarLayout);
243  mainLayout->addLayout(hboxLayout);
244 
245 #else
246 
247  d->filterRecursiveCollectionFilter
248  = new Akonadi::RecursiveCollectionFilterProxyModel( this );
249  if ( !mimetypes.isEmpty() )
250  d->filterRecursiveCollectionFilter->addContentMimeTypeInclusionFilters( mimetypes );
251 
252  d->filterRecursiveCollectionFilter->setSourceModel( d->model );
253 
254  KDescendantsProxyModel *flatModel = new KDescendantsProxyModel( this );
255  flatModel->setDisplayAncestorData( true );
256  flatModel->setAncestorSeparator( QLatin1String( "/" ) );
257  flatModel->setSourceModel( d->filterRecursiveCollectionFilter );
258 
259  CheckableFilterProxyModel *checkableModel = new CheckableFilterProxyModel( this );
260  checkableModel->setSourceModel( flatModel );
261 
262  d->collectionView = new QListView( mainWidget );
263 
264  d->collectionView->setModel( checkableModel );
265  mainLayout->addWidget( d->collectionView );
266 #endif
267 
268  connect( d->model, SIGNAL(loaded()), SLOT(modelLoaded()) );
269  connect( this, SIGNAL(okClicked()), SLOT(done()) );
270  connect( this, SIGNAL(cancelClicked()), SLOT(deleteLater()) );
271  Control::widgetNeedsAkonadi( mainWidget );
272  d->readConfig();
273 }
274 
275 SubscriptionDialog::~SubscriptionDialog()
276 {
277  d->writeConfig();
278  delete d;
279 }
280 
281 #include "moc_subscriptiondialog_p.cpp"
Akonadi::SubscriptionJob::subscribe
void subscribe(const Collection::List &collections)
Subscribes to the given list of collections.
Definition: subscriptionjob.cpp:76
Akonadi::SubscriptionDialog
Definition: subscriptiondialog_p.h:34
Akonadi::SubscriptionDialog::~SubscriptionDialog
~SubscriptionDialog()
Destroys the subscription dialog.
Definition: subscriptiondialog.cpp:275
Akonadi::SubscriptionDialog::showHiddenCollection
void showHiddenCollection(bool showHidden)
Definition: subscriptiondialog.cpp:180
Akonadi::Control::widgetNeedsAkonadi
static void widgetNeedsAkonadi(QWidget *widget)
Disable the given widget when Akonadi is not operational and show an error overlay (given enough spac...
Definition: control.cpp:259
Akonadi::RecursiveCollectionFilterProxyModel
A model to filter out collections of non-matching content types.
Definition: recursivecollectionfilterproxymodel.h:39
Akonadi::SubscriptionDialog::SubscriptionDialog
SubscriptionDialog(QWidget *parent=0)
Creates a new subscription dialog.
Definition: subscriptiondialog.cpp:166
Akonadi::SubscriptionJob
Job to manipulate the local subscription state of a set of collections.
Definition: subscriptionjob_p.h:35
Akonadi::SubscriptionJob::unsubscribe
void unsubscribe(const Collection::List &collections)
Unsubscribes from the given list of collections.
Definition: subscriptionjob.cpp:83
Akonadi::SubscriptionModel
Definition: subscriptionmodel_p.h:34
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Mon Jul 21 2014 08:03:56 by doxygen 1.8.6 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

akonadi

Skip menu "akonadi"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • Modules
  • Related Pages

kdepimlibs-4.13.3 API Reference

Skip menu "kdepimlibs-4.13.3 API Reference"
  • akonadi
  •   contact
  •   kmime
  •   socialutils
  • kabc
  • kalarmcal
  • kblog
  • kcal
  • kcalcore
  • kcalutils
  • kholidays
  • kimap
  • kioslave
  •   imap4
  •   mbox
  •   nntp
  • kldap
  • kmbox
  • kmime
  • kontactinterface
  • kpimidentities
  • kpimtextedit
  • kpimutils
  • kresources
  • ktnef
  • kxmlrpcclient
  • mailtransport
  • microblog
  • qgpgme
  • syndication
  •   atom
  •   rdf
  •   rss2
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