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

knotes

  • sources
  • kde-4.14
  • kdepim
  • knotes
  • configdialog
knotecollectionconfigwidget.cpp
Go to the documentation of this file.
1 /*
2  Copyright (C) 2013-2015 Laurent Montel <montel@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 "knotecollectionconfigwidget.h"
21 #include "noteshared/attributes/showfoldernotesattribute.h"
22 #include <Akonadi/Notes/NoteUtils>
23 #include "notesharedglobalconfig.h"
24 #include "pimcommon/widgets/manageaccountwidget.h"
25 
26 #include <Akonadi/CollectionModifyJob>
27 #include <Akonadi/CollectionFilterProxyModel>
28 #include <KRecursiveFilterProxyModel>
29 #include <KInputDialog>
30 
31 #include <Akonadi/EntityTreeView>
32 #include <Akonadi/CollectionRequester>
33 #include <Akonadi/ChangeRecorder>
34 #include <Akonadi/EntityTreeModel>
35 #include <Akonadi/Collection>
36 #include <Akonadi/EntityDisplayAttribute>
37 #include <Akonadi/CollectionModifyJob>
38 #include <KMime/Message>
39 
40 #include <KCheckableProxyModel>
41 
42 #include <KLocalizedString>
43 #include <KPushButton>
44 #include <KLineEdit>
45 #include <KDebug>
46 #include <KMessageBox>
47 
48 #include <QVBoxLayout>
49 #include <QHBoxLayout>
50 #include <QTreeView>
51 #include <QLabel>
52 #include <QTimer>
53 
54 KNoteCollectionConfigWidget::KNoteCollectionConfigWidget(QWidget *parent)
55  : QWidget(parent),
56  mCanUpdateStatus(false)
57 {
58  QHBoxLayout *mainLayout = new QHBoxLayout;
59  setLayout(mainLayout);
60 
61  QTabWidget *tabWidget = new QTabWidget;
62  mainLayout->addWidget(tabWidget);
63 
64  QWidget *collectionWidget = new QWidget;
65  QVBoxLayout *vbox = new QVBoxLayout;
66  collectionWidget->setLayout(vbox);
67  tabWidget->addTab(collectionWidget, i18n("Folders"));
68 
69  QLabel *label = new QLabel(i18n("Select which KNotes folders to show:"));
70  vbox->addWidget(label);
71 
72  // Create a new change recorder.
73  mChangeRecorder = new Akonadi::ChangeRecorder( this );
74  mChangeRecorder->setMimeTypeMonitored( Akonadi::NoteUtils::noteMimeType() );
75  mChangeRecorder->fetchCollection( true );
76  mChangeRecorder->setAllMonitored( true );
77 
78  mModel = new Akonadi::EntityTreeModel( mChangeRecorder, this );
79  // Set the model to show only collections, not items.
80  mModel->setItemPopulationStrategy( Akonadi::EntityTreeModel::NoItemPopulation );
81 
82  Akonadi::CollectionFilterProxyModel *mimeTypeProxy = new Akonadi::CollectionFilterProxyModel( this );
83  mimeTypeProxy->setExcludeVirtualCollections( true );
84  mimeTypeProxy->addMimeTypeFilters( QStringList() << Akonadi::NoteUtils::noteMimeType() );
85  mimeTypeProxy->setSourceModel( mModel );
86 
87  // Create the Check proxy model.
88  mSelectionModel = new QItemSelectionModel( mimeTypeProxy );
89  mCheckProxy = new KCheckableProxyModel( this );
90  mCheckProxy->setSelectionModel( mSelectionModel );
91  mCheckProxy->setSourceModel( mimeTypeProxy );
92 
93  connect(mModel, SIGNAL(rowsInserted(QModelIndex,int,int)),
94  this, SLOT(slotCollectionsInserted(QModelIndex,int,int)));
95 
96  connect(mCheckProxy, SIGNAL(dataChanged(QModelIndex,QModelIndex)), SLOT(slotDataChanged()));
97  mCollectionFilter = new KRecursiveFilterProxyModel(this);
98  mCollectionFilter->setSourceModel(mCheckProxy);
99  mCollectionFilter->setDynamicSortFilter(true);
100  mCollectionFilter->setFilterCaseSensitivity(Qt::CaseInsensitive);
101 
102 
103  KLineEdit *searchLine = new KLineEdit(this);
104  searchLine->setPlaceholderText(i18n("Search..."));
105  searchLine->setClearButtonShown(true);
106  connect(searchLine, SIGNAL(textChanged(QString)),
107  this, SLOT(slotSetCollectionFilter(QString)));
108 
109  vbox->addWidget(searchLine);
110 
111  mFolderView = new Akonadi::EntityTreeView(this);
112  mFolderView->setDragEnabled(false);
113  mFolderView->setEditTriggers(QAbstractItemView::NoEditTriggers);
114  mFolderView->setAlternatingRowColors(true);
115  vbox->addWidget(mFolderView);
116 
117  mFolderView->setModel( mCollectionFilter );
118  connect(mFolderView->selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)), SLOT(slotUpdateButtons()));
119 
120  QHBoxLayout *hbox = new QHBoxLayout;
121  vbox->addLayout(hbox);
122 
123  KPushButton *button = new KPushButton(i18n("&Select All"), this);
124  connect(button, SIGNAL(clicked(bool)), this, SLOT(slotSelectAllCollections()));
125  hbox->addWidget(button);
126 
127  button = new KPushButton(i18n("&Unselect All"), this);
128  connect(button, SIGNAL(clicked(bool)), this, SLOT(slotUnselectAllCollections()));
129  hbox->addWidget(button);
130  hbox->addStretch(1);
131 
132  mRenameCollection = new KPushButton(i18n("Rename notes..."), this);
133  connect(mRenameCollection, SIGNAL(clicked(bool)), this, SLOT(slotRenameCollection()));
134  hbox->addWidget(mRenameCollection);
135 
136 
137  vbox->addWidget(new QLabel(i18nc( "@info", "Select the folder where the note will be saved:" )));
138  mDefaultSaveFolder = new Akonadi::CollectionRequester(Akonadi::Collection(NoteShared::NoteSharedGlobalConfig::self()->defaultFolder()));
139  mDefaultSaveFolder->setMimeTypeFilter(QStringList() << Akonadi::NoteUtils::noteMimeType());
140  mDefaultSaveFolder->setContentMimeTypes(QStringList() << QLatin1String("application/x-vnd.akonadi.note")
141  << QLatin1String("text/x-vnd.akonadi.note")
142  << QLatin1String("inode/directory"));
143  Akonadi::CollectionDialog::CollectionDialogOptions options;
144  options |= Akonadi::CollectionDialog::AllowToCreateNewChildCollection;
145  options |= Akonadi::CollectionDialog::KeepTreeExpanded;
146  mDefaultSaveFolder->changeCollectionDialogOptions(options);
147  connect(mDefaultSaveFolder, SIGNAL(collectionChanged(Akonadi::Collection)), this, SLOT(slotDataChanged()));
148 
149  vbox->addWidget(mDefaultSaveFolder);
150 
151 
152  QWidget *accountWidget = new QWidget;
153  QVBoxLayout *vboxAccountWidget = new QVBoxLayout;
154  accountWidget->setLayout(vboxAccountWidget);
155 
156  PimCommon::ManageAccountWidget *manageAccountWidget = new PimCommon::ManageAccountWidget(this);
157  vboxAccountWidget->addWidget(manageAccountWidget);
158 
159  manageAccountWidget->setMimeTypeFilter(QStringList() << Akonadi::NoteUtils::noteMimeType());
160  manageAccountWidget->setCapabilityFilter(QStringList() << QLatin1String("Resource") ); // show only resources, no agents
161  tabWidget->addTab(accountWidget, i18n("Accounts"));
162 
163  QTimer::singleShot(1000, this, SLOT(slotUpdateCollectionStatus()));
164  slotUpdateButtons();
165 }
166 
167 KNoteCollectionConfigWidget::~KNoteCollectionConfigWidget()
168 {
169 
170 }
171 
172 void KNoteCollectionConfigWidget::slotUpdateButtons()
173 {
174  mRenameCollection->setEnabled(mFolderView->selectionModel()->hasSelection());
175 }
176 
177 void KNoteCollectionConfigWidget::slotRenameCollection()
178 {
179  const QModelIndexList rows = mFolderView->selectionModel()->selectedRows();
180 
181  if ( rows.size() != 1 )
182  return;
183 
184  QModelIndex idx = rows.at( 0 );
185 
186  QString title = idx.data().toString();
187 
188  Akonadi::Collection col = idx.data( Akonadi::EntityTreeModel::CollectionRole ).value<Akonadi::Collection>();
189  Q_ASSERT( col.isValid() );
190  if (!col.isValid())
191  return;
192 
193  bool ok;
194  const QString name = KInputDialog::getText( i18n( "Rename Notes" ),
195  i18n( "Name:" ), title, &ok, this );
196 
197  if ( ok ) {
198  if ( col.hasAttribute<Akonadi::EntityDisplayAttribute>() &&
199  !col.attribute<Akonadi::EntityDisplayAttribute>()->displayName().isEmpty() ) {
200  col.attribute<Akonadi::EntityDisplayAttribute>()->setDisplayName( name );
201  } else if ( !name.isEmpty() ) {
202  col.setName( name );
203  }
204 
205  Akonadi::CollectionModifyJob *job = new Akonadi::CollectionModifyJob(col, this);
206  connect( job, SIGNAL(result(KJob*)), SLOT(slotCollectionModifyFinished(KJob*)) );
207  job->start();
208  }
209 }
210 
211 void KNoteCollectionConfigWidget::slotCollectionModifyFinished(KJob *job)
212 {
213  if (job->error()) {
214  KMessageBox::error(this, i18n("An error was occurred during renaming: %1", job->errorString()), i18n("Rename note"));
215  }
216 }
217 
218 void KNoteCollectionConfigWidget::slotDataChanged()
219 {
220  Q_EMIT emitChanged(true);
221 }
222 
223 void KNoteCollectionConfigWidget::slotSetCollectionFilter(const QString &filter)
224 {
225  mCollectionFilter->setFilterWildcard(filter);
226  mFolderView->expandAll();
227 }
228 
229 void KNoteCollectionConfigWidget::slotUpdateCollectionStatus()
230 {
231  mCanUpdateStatus = true;
232  updateStatus(QModelIndex());
233 }
234 
235 void KNoteCollectionConfigWidget::slotSelectAllCollections()
236 {
237  forceStatus(QModelIndex(), true);
238  Q_EMIT emitChanged(true);
239 }
240 
241 void KNoteCollectionConfigWidget::slotUnselectAllCollections()
242 {
243  forceStatus(QModelIndex(), false);
244  Q_EMIT emitChanged(true);
245 }
246 
247 void KNoteCollectionConfigWidget::updateStatus(const QModelIndex &parent)
248 {
249  if (!mCanUpdateStatus)
250  return;
251 
252  const int nbCol = mCheckProxy->rowCount( parent );
253  for ( int i = 0; i < nbCol; ++i ) {
254  const QModelIndex child = mCheckProxy->index( i, 0, parent );
255 
256  const Akonadi::Collection collection =
257  mCheckProxy->data( child, Akonadi::EntityTreeModel::CollectionRole ).value<Akonadi::Collection>();
258 
259  NoteShared::ShowFolderNotesAttribute *attr = collection.attribute<NoteShared::ShowFolderNotesAttribute>();
260  if (attr) {
261  mCheckProxy->setData( child, Qt::Checked, Qt::CheckStateRole );
262  }
263  updateStatus( child );
264  }
265 }
266 
267 void KNoteCollectionConfigWidget::forceStatus(const QModelIndex &parent, bool status)
268 {
269  const int nbCol = mCheckProxy->rowCount( parent );
270  for ( int i = 0; i < nbCol; ++i ) {
271  const QModelIndex child = mCheckProxy->index( i, 0, parent );
272  mCheckProxy->setData( child, status ? Qt::Checked : Qt::Unchecked, Qt::CheckStateRole );
273  forceStatus( child, status );
274  }
275 }
276 
277 void KNoteCollectionConfigWidget::slotCollectionsInserted(const QModelIndex &, int, int)
278 {
279  mFolderView->expandAll();
280 }
281 
282 void KNoteCollectionConfigWidget::save()
283 {
284  updateCollectionsRecursive(QModelIndex());
285  Akonadi::Collection col = mDefaultSaveFolder->collection();
286  if (col.isValid()) {
287  NoteShared::NoteSharedGlobalConfig::self()->setDefaultFolder(col.id());
288  NoteShared::NoteSharedGlobalConfig::self()->writeConfig();
289  }
290 }
291 
292 void KNoteCollectionConfigWidget::updateCollectionsRecursive(const QModelIndex &parent)
293 {
294  const int nbCol = mCheckProxy->rowCount( parent );
295  for ( int i = 0; i < nbCol; ++i ) {
296  const QModelIndex child = mCheckProxy->index( i, 0, parent );
297 
298  Akonadi::Collection collection =
299  mCheckProxy->data( child, Akonadi::EntityTreeModel::CollectionRole ).value<Akonadi::Collection>();
300 
301  NoteShared::ShowFolderNotesAttribute *attr = collection.attribute<NoteShared::ShowFolderNotesAttribute>();
302  Akonadi::CollectionModifyJob *modifyJob = 0;
303  const bool selected = (mCheckProxy->data( child, Qt::CheckStateRole ).value<int>() != 0);
304  if (selected && !attr) {
305  attr = collection.attribute<NoteShared::ShowFolderNotesAttribute>(Akonadi::Entity::AddIfMissing);
306  modifyJob = new Akonadi::CollectionModifyJob(collection);
307  modifyJob->setProperty("AttributeAdded", true);
308  } else if (!selected && attr) {
309  collection.removeAttribute<NoteShared::ShowFolderNotesAttribute>();
310  modifyJob = new Akonadi::CollectionModifyJob(collection);
311  modifyJob->setProperty("AttributeAdded", false);
312  }
313 
314  if (modifyJob) {
315  connect(modifyJob, SIGNAL(finished(KJob*)), SLOT(slotModifyJobDone(KJob*)));
316  }
317  updateCollectionsRecursive(child);
318  }
319 }
320 
321 void KNoteCollectionConfigWidget::slotModifyJobDone(KJob* job)
322 {
323  Akonadi::CollectionModifyJob *modifyJob = qobject_cast<Akonadi::CollectionModifyJob*>(job);
324  if (modifyJob && job->error()) {
325  if (job->property("AttributeAdded").toBool()) {
326  kWarning() << "Failed to append ShowFolderNotesAttribute to collection"
327  << modifyJob->collection().id() << ":"
328  << job->errorString();
329  } else {
330  kWarning() << "Failed to remove ShowFolderNotesAttribute from collection"
331  << modifyJob->collection().id() << ":"
332  << job->errorString();
333  }
334  }
335 }
336 
337 
KNoteCollectionConfigWidget::~KNoteCollectionConfigWidget
~KNoteCollectionConfigWidget()
Definition: knotecollectionconfigwidget.cpp:167
QObject::child
QObject * child(const char *objName, const char *inheritsClass, bool recursiveSearch) const
QModelIndex
QWidget
KNoteCollectionConfigWidget::KNoteCollectionConfigWidget
KNoteCollectionConfigWidget(QWidget *parent=0)
Definition: knotecollectionconfigwidget.cpp:54
knotecollectionconfigwidget.h
KNoteCollectionConfigWidget::save
void save()
Definition: knotecollectionconfigwidget.cpp:282
KNoteCollectionConfigWidget::updateCollectionsRecursive
void updateCollectionsRecursive(const QModelIndex &parent)
Definition: knotecollectionconfigwidget.cpp:292
QHBoxLayout
QVariant::value
T value() const
QTabWidget
QObject::name
const char * name() const
QBoxLayout::addWidget
void addWidget(QWidget *widget, int stretch, QFlags< Qt::AlignmentFlag > alignment)
QWidget::setLayout
void setLayout(QLayout *layout)
QString::isEmpty
bool isEmpty() const
QTabWidget::addTab
int addTab(QWidget *page, const QString &label)
QVBoxLayout
QString
QStringList
QItemSelection
QModelIndex::data
QVariant data(int role) const
QLatin1String
QWidget::QWidget
QWidget(QWidget *parent, QFlags< Qt::WindowType > f)
QItemSelectionModel
QObject::connect
bool connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
QLabel
QVariant::toString
QString toString() const
KNoteCollectionConfigWidget::emitChanged
void emitChanged(bool)
QBoxLayout::addLayout
void addLayout(QLayout *layout, int stretch)
QTimer::singleShot
singleShot
This file is part of the KDE documentation.
Documentation copyright © 1996-2020 The KDE developers.
Generated on Mon Jun 22 2020 13:32:28 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

knotes

Skip menu "knotes"
  • 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