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

KDEUI

  • sources
  • kde-4.14
  • kdelibs
  • kdeui
  • paged
kpagewidgetmodel.cpp
Go to the documentation of this file.
1 /*
2  This file is part of the KDE Libraries
3 
4  Copyright (C) 2006 Tobias Koenig (tokoe@kde.org)
5 
6  This library is free software; you can redistribute it and/or
7  modify it under the terms of the GNU Library General Public
8  License as published by the Free Software Foundation; either
9  version 2 of the License, or (at your option) any later version.
10 
11  This library 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 GNU
14  Library General Public License for more details.
15 
16  You should have received a copy of the GNU Library General Public License
17  along with this library; see the file COPYING.LIB. If not, write to
18  the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
19  Boston, MA 02110-1301, USA.
20 */
21 
22 #include "kpagewidgetmodel.h"
23 #include "kpagewidgetmodel_p.h"
24 
25 #include <QPointer>
26 #include <QWidget>
27 
28 #include <kicon.h>
29 
30 class KPageWidgetItem::Private
31 {
32  public:
33  Private()
34  : checkable(false), checked(false), enabled(true)
35  {
36  }
37 
38  ~Private()
39  {
40  delete widget;
41  widget = 0;
42  }
43 
44  QString name;
45  QString header;
46  KIcon icon;
47  QPointer<QWidget> widget;
48  bool checkable : 1;
49  bool checked : 1;
50  bool enabled : 1;
51 };
52 
53 KPageWidgetItem::KPageWidgetItem( QWidget *widget )
54  : QObject( 0 ), d( new Private )
55 {
56  d->widget = widget;
57 
63  if ( d->widget )
64  d->widget->hide();
65 }
66 
67 KPageWidgetItem::KPageWidgetItem( QWidget *widget, const QString &name )
68  : QObject( 0 ), d( new Private )
69 {
70  d->widget = widget;
71  d->name = name;
72 
78  if ( d->widget )
79  d->widget->hide();
80 }
81 
82 KPageWidgetItem::~KPageWidgetItem()
83 {
84  delete d;
85 }
86 
87 void KPageWidgetItem::setEnabled(bool enabled)
88 {
89  d->enabled = enabled;
90  if (d->widget) {
91  d->widget->setEnabled(enabled);
92  }
93  emit changed();
94 }
95 
96 bool KPageWidgetItem::isEnabled() const
97 {
98  return d->enabled;
99 }
100 
101 QWidget* KPageWidgetItem::widget() const
102 {
103  return d->widget;
104 }
105 
106 void KPageWidgetItem::setName( const QString &name )
107 {
108  d->name = name;
109 
110  emit changed();
111 }
112 
113 QString KPageWidgetItem::name() const
114 {
115  return d->name;
116 }
117 
118 void KPageWidgetItem::setHeader( const QString &header )
119 {
120  d->header = header;
121 
122  emit changed();
123 }
124 
125 QString KPageWidgetItem::header() const
126 {
127  return d->header;
128 }
129 
130 void KPageWidgetItem::setIcon( const KIcon &icon )
131 {
132  d->icon = icon;
133 
134  emit changed();
135 }
136 
137 KIcon KPageWidgetItem::icon() const
138 {
139  return d->icon;
140 }
141 
142 void KPageWidgetItem::setCheckable( bool checkable )
143 {
144  d->checkable = checkable;
145 
146  emit changed();
147 }
148 
149 bool KPageWidgetItem::isCheckable() const
150 {
151  return d->checkable;
152 }
153 
154 void KPageWidgetItem::setChecked( bool checked )
155 {
156  d->checked = checked;
157 
158  emit toggled( checked );
159  emit changed();
160 }
161 
162 bool KPageWidgetItem::isChecked() const
163 {
164  return d->checked;
165 }
166 
167 PageItem::PageItem( KPageWidgetItem *pageWidgetItem, PageItem *parent )
168  : mPageWidgetItem( pageWidgetItem ), mParentItem( parent )
169 {
170 }
171 
172 PageItem::~PageItem()
173 {
174  delete mPageWidgetItem;
175  mPageWidgetItem = 0;
176 
177  qDeleteAll(mChildItems);
178 }
179 
180 void PageItem::appendChild( PageItem *item )
181 {
182  mChildItems.append( item );
183 }
184 
185 void PageItem::insertChild( int row, PageItem *item )
186 {
187  mChildItems.insert( row, item );
188 }
189 
190 void PageItem::removeChild( int row )
191 {
192  mChildItems.removeAt( row );
193 }
194 
195 PageItem *PageItem::child( int row )
196 {
197  return mChildItems.value( row );
198 }
199 
200 int PageItem::childCount() const
201 {
202  return mChildItems.count();
203 }
204 
205 int PageItem::columnCount() const
206 {
207  return 1;
208 }
209 
210 PageItem *PageItem::parent()
211 {
212  return mParentItem;
213 }
214 
215 int PageItem::row() const
216 {
217  if ( mParentItem )
218  return mParentItem->mChildItems.indexOf( const_cast<PageItem*>(this) );
219 
220  return 0;
221 }
222 
223 KPageWidgetItem* PageItem::pageWidgetItem() const
224 {
225  return mPageWidgetItem;
226 }
227 
228 PageItem *PageItem::findChild( const KPageWidgetItem *item )
229 {
230  if ( mPageWidgetItem == item )
231  return this;
232 
233  for ( int i = 0; i < mChildItems.count(); ++i ) {
234  PageItem *pageItem = mChildItems[ i ]->findChild( item );
235  if ( pageItem )
236  return pageItem;
237  }
238 
239  return 0;
240 }
241 
242 void PageItem::dump( int indent )
243 {
244  QString prefix;
245  for ( int i = 0; i < indent; ++i )
246  prefix.append( " " );
247 
248  const QString name = ( mPageWidgetItem ? mPageWidgetItem->name() : "root" );
249  qDebug( "%s (%p)", qPrintable( QString( "%1%2" ).arg( prefix, name ) ), (void*)this );
250  for ( int i = 0; i < mChildItems.count(); ++i )
251  mChildItems[ i ]->dump( indent + 2 );
252 }
253 
254 KPageWidgetModel::KPageWidgetModel( QObject *parent )
255  : KPageModel(*new KPageWidgetModelPrivate, parent)
256 {
257 }
258 
259 KPageWidgetModel::~KPageWidgetModel()
260 {
261 }
262 
263 int KPageWidgetModel::columnCount( const QModelIndex& ) const
264 {
265  return 1;
266 }
267 
268 QVariant KPageWidgetModel::data( const QModelIndex &index, int role ) const
269 {
270  if ( !index.isValid() )
271  return QVariant();
272 
273  PageItem *item = static_cast<PageItem*>( index.internalPointer() );
274 
275  if ( role == Qt::DisplayRole )
276  return QVariant( item->pageWidgetItem()->name() );
277  else if ( role == Qt::DecorationRole )
278  return QVariant( item->pageWidgetItem()->icon() );
279  else if ( role == HeaderRole )
280  return QVariant( item->pageWidgetItem()->header() );
281  else if ( role == WidgetRole )
282  return QVariant::fromValue( item->pageWidgetItem()->widget() );
283  else if ( role == Qt::CheckStateRole ) {
284  if ( item->pageWidgetItem()->isCheckable() ) {
285  return ( item->pageWidgetItem()->isChecked() ? Qt::Checked : Qt::Unchecked );
286  } else
287  return QVariant();
288  } else
289  return QVariant();
290 }
291 
292 bool KPageWidgetModel::setData( const QModelIndex &index, const QVariant &value, int role )
293 {
294  if ( !index.isValid() )
295  return false;
296 
297  if ( role != Qt::CheckStateRole )
298  return false;
299 
300  PageItem *item = static_cast<PageItem*>( index.internalPointer() );
301  if ( !item )
302  return false;
303 
304  if ( !item->pageWidgetItem()->isCheckable() )
305  return false;
306 
307  if ( value.toInt() == Qt::Checked )
308  item->pageWidgetItem()->setChecked( true );
309  else
310  item->pageWidgetItem()->setChecked( false );
311 
312  return true;
313 }
314 
315 Qt::ItemFlags KPageWidgetModel::flags( const QModelIndex &index ) const
316 {
317  if ( !index.isValid() )
318  return 0;
319 
320  Qt::ItemFlags flags = Qt::ItemIsSelectable;
321 
322  PageItem *item = static_cast<PageItem*>( index.internalPointer() );
323  if ( item->pageWidgetItem()->isCheckable() )
324  flags |= Qt::ItemIsUserCheckable;
325  if (item->pageWidgetItem()->isEnabled()) {
326  flags |= Qt::ItemIsEnabled;
327  }
328 
329  return flags;
330 }
331 
332 QModelIndex KPageWidgetModel::index( int row, int column, const QModelIndex &parent ) const
333 {
334  PageItem *parentItem;
335 
336  if ( parent.isValid() )
337  parentItem = static_cast<PageItem*>( parent.internalPointer() );
338  else
339  parentItem = d_func()->rootItem;
340 
341  PageItem *childItem = parentItem->child( row );
342  if ( childItem )
343  return createIndex( row, column, childItem );
344  else
345  return QModelIndex();
346 }
347 
348 QModelIndex KPageWidgetModel::parent( const QModelIndex &index ) const
349 {
350  if ( !index.isValid() )
351  return QModelIndex();
352 
353  PageItem *item = static_cast<PageItem*>( index.internalPointer() );
354  PageItem *parentItem = item->parent();
355 
356  if ( parentItem == d_func()->rootItem )
357  return QModelIndex();
358  else
359  return createIndex( parentItem->row(), 0, parentItem );
360 }
361 
362 int KPageWidgetModel::rowCount( const QModelIndex &parent ) const
363 {
364  PageItem *parentItem;
365 
366  if ( !parent.isValid() )
367  parentItem = d_func()->rootItem;
368  else
369  parentItem = static_cast<PageItem*>( parent.internalPointer() );
370 
371  return parentItem->childCount();
372 }
373 
374 KPageWidgetItem* KPageWidgetModel::addPage( QWidget *widget, const QString &name )
375 {
376  KPageWidgetItem *item = new KPageWidgetItem( widget, name );
377 
378  addPage( item );
379 
380  return item;
381 }
382 
383 void KPageWidgetModel::addPage( KPageWidgetItem *item )
384 {
385  emit layoutAboutToBeChanged();
386 
387  Q_D(KPageWidgetModel);
388  connect(item, SIGNAL(changed()), this, SLOT(_k_itemChanged()));
389  connect(item, SIGNAL(toggled(bool)), this, SLOT(_k_itemToggled(bool)));
390 
391  // The row to be inserted
392  int row = d->rootItem->childCount();
393 
394  beginInsertRows(QModelIndex(), row, row);
395 
396  PageItem *pageItem = new PageItem( item, d->rootItem );
397  d->rootItem->appendChild( pageItem );
398 
399  endInsertRows();
400 
401  emit layoutChanged();
402 }
403 
404 KPageWidgetItem* KPageWidgetModel::insertPage( KPageWidgetItem *before, QWidget *widget, const QString &name )
405 {
406  KPageWidgetItem *item = new KPageWidgetItem( widget, name );
407 
408  insertPage( before, item );
409 
410  return item;
411 }
412 
413 void KPageWidgetModel::insertPage( KPageWidgetItem *before, KPageWidgetItem *item )
414 {
415  PageItem *beforePageItem = d_func()->rootItem->findChild(before);
416  if ( !beforePageItem ) {
417  qDebug( "Invalid KPageWidgetItem passed!" );
418  return;
419  }
420 
421  emit layoutAboutToBeChanged();
422 
423  connect(item, SIGNAL(changed()), this, SLOT(_k_itemChanged()));
424  connect(item, SIGNAL(toggled(bool)), this, SLOT(_k_itemToggled(bool)));
425 
426  PageItem *parent = beforePageItem->parent();
427  // The row to be inserted
428  int row = beforePageItem->row();
429 
430  QModelIndex index;
431  if (parent != d_func()->rootItem) {
432  index = createIndex( parent->row(), 0, parent );
433  }
434 
435  beginInsertRows(index, row, row);
436 
437  PageItem *newPageItem = new PageItem( item, parent );
438  parent->insertChild( row, newPageItem );
439 
440  endInsertRows();
441 
442  emit layoutChanged();
443 }
444 
445 KPageWidgetItem* KPageWidgetModel::addSubPage( KPageWidgetItem *parent, QWidget *widget, const QString &name )
446 {
447  KPageWidgetItem *item = new KPageWidgetItem( widget, name );
448 
449  addSubPage( parent, item );
450 
451  return item;
452 }
453 
454 void KPageWidgetModel::addSubPage( KPageWidgetItem *parent, KPageWidgetItem *item )
455 {
456  PageItem *parentPageItem = d_func()->rootItem->findChild(parent);
457  if ( !parentPageItem ) {
458  qDebug( "Invalid KPageWidgetItem passed!" );
459  return;
460  }
461 
462  emit layoutAboutToBeChanged();
463 
464  connect(item, SIGNAL(changed()), this, SLOT(_k_itemChanged()));
465  connect(item, SIGNAL(toggled(bool)), this, SLOT(_k_itemToggled(bool)));
466 
467  // The row to be inserted
468  int row = parentPageItem->childCount();
469 
470  QModelIndex index;
471  if (parentPageItem != d_func()->rootItem) {
472  index = createIndex( parentPageItem->row(), 0, parentPageItem );
473  }
474 
475  beginInsertRows(index, row, row);
476 
477  PageItem *newPageItem = new PageItem( item, parentPageItem );
478  parentPageItem->appendChild( newPageItem );
479 
480  endInsertRows();
481 
482  emit layoutChanged();
483 }
484 
485 void KPageWidgetModel::removePage( KPageWidgetItem *item )
486 {
487  if ( !item )
488  return;
489 
490  Q_D(KPageWidgetModel);
491 
492  PageItem *pageItem = d->rootItem->findChild( item );
493  if ( !pageItem ) {
494  qDebug( "Invalid KPageWidgetItem passed!" );
495  return;
496  }
497 
498  emit layoutAboutToBeChanged();
499 
500  disconnect(item, SIGNAL(changed()), this, SLOT(_k_itemChanged()));
501  disconnect(item, SIGNAL(toggled(bool)), this, SLOT(_k_itemToggled(bool)));
502 
503  PageItem *parentPageItem = pageItem->parent();
504  int row = parentPageItem->row();
505 
506  QModelIndex index;
507  if ( parentPageItem != d->rootItem )
508  index = createIndex( row, 0, parentPageItem );
509 
510  beginRemoveRows(index, pageItem->row(), pageItem->row());
511 
512  parentPageItem->removeChild( pageItem->row() );
513  delete pageItem;
514 
515  endRemoveRows();
516 
517  emit layoutChanged();
518 }
519 
520 KPageWidgetItem *KPageWidgetModel::item(const QModelIndex &index) const
521 {
522  if ( !index.isValid() )
523  return 0;
524 
525  PageItem *item = static_cast<PageItem*>( index.internalPointer() );
526  if ( !item )
527  return 0;
528 
529  return item->pageWidgetItem();
530 }
531 
532 QModelIndex KPageWidgetModel::index( const KPageWidgetItem *item ) const
533 {
534  if ( !item )
535  return QModelIndex();
536 
537  const PageItem *pageItem = d_func()->rootItem->findChild(item);
538  if ( !pageItem ) {
539  return QModelIndex();
540  }
541 
542  return createIndex( pageItem->row(), 0, (void*)pageItem );
543 }
544 
545 #include "kpagewidgetmodel.moc"
QModelIndex
QWidget
KPageWidgetItem::header
QString header() const
Returns the header of the page widget item.
KPageWidgetModel::flags
virtual Qt::ItemFlags flags(const QModelIndex &index) const
Definition: kpagewidgetmodel.cpp:315
QString::append
QString & append(QChar ch)
KPageWidgetItem::changed
void changed()
This signal is emitted whenever the icon or header is changed.
QAbstractItemModel::layoutChanged
void layoutChanged()
KPageWidgetItem::setChecked
void setChecked(bool checked)
Sets whether the page widget item is checked.
Definition: kpagewidgetmodel.cpp:154
KPageWidgetItem::name
QString name() const
Returns the name of the page widget item.
KPageWidgetItem::KPageWidgetItem
KPageWidgetItem(QWidget *widget)
Creates a new page widget item.
Definition: kpagewidgetmodel.cpp:53
KPageModel
A base class for a model used by KPageView.
Definition: kpagemodel.h:56
kpagewidgetmodel.h
QPointer< QWidget >
KStandardAction::name
const char * name(StandardAction id)
This will return the internal name of a given standard action.
Definition: kstandardaction.cpp:223
KPageWidgetItem::icon
KIcon icon() const
Returns the icon of the page widget item.
KPageWidgetItem::~KPageWidgetItem
~KPageWidgetItem()
Destroys the page widget item.
Definition: kpagewidgetmodel.cpp:82
KPageWidgetModel::index
virtual QModelIndex index(int row, int column, const QModelIndex &parent=QModelIndex()) const
Definition: kpagewidgetmodel.cpp:332
KPageWidgetModel::rowCount
virtual int rowCount(const QModelIndex &parent=QModelIndex()) const
Definition: kpagewidgetmodel.cpp:362
QObject::disconnect
bool disconnect(const QObject *sender, const char *signal, const QObject *receiver, const char *method)
KPageWidgetItem::setEnabled
void setEnabled(bool)
Sets whether the page widget item is enabled.
Definition: kpagewidgetmodel.cpp:87
KPageWidgetModel
This page model is used by.
Definition: kpagewidgetmodel.h:188
prefix
QString prefix()
KPageWidgetItem::toggled
void toggled(bool checked)
This signal is emitted whenever the user checks or unchecks the item of.
KPageWidgetItem::setIcon
void setIcon(const KIcon &icon)
Sets the icon of the page widget item.
Definition: kpagewidgetmodel.cpp:130
QAbstractItemModel::layoutAboutToBeChanged
void layoutAboutToBeChanged()
QModelIndex::isValid
bool isValid() const
KPageWidgetItem::checked
bool checked
Definition: kpagewidgetmodel.h:57
QVariant::toInt
int toInt(bool *ok) const
QAbstractItemModel::endInsertRows
void endInsertRows()
QObject
KPageWidgetItem::enabled
bool enabled
This property holds whether the item is enabled.
Definition: kpagewidgetmodel.h:63
KPageWidgetItem::isEnabled
bool isEnabled() const
Returns whether the page widget item is enabled.
Definition: kpagewidgetmodel.cpp:96
KPageWidgetModel::setData
virtual bool setData(const QModelIndex &index, const QVariant &value, int role=Qt::EditRole)
Definition: kpagewidgetmodel.cpp:292
KPageWidgetModel::columnCount
virtual int columnCount(const QModelIndex &parent=QModelIndex()) const
These methods are reimplemented from QAbstractItemModel.
Definition: kpagewidgetmodel.cpp:263
QAbstractItemModel::beginRemoveRows
void beginRemoveRows(const QModelIndex &parent, int first, int last)
QModelIndex::row
int row() const
KIcon
A wrapper around QIcon that provides KDE icon features.
Definition: kicon.h:40
KPageWidgetModel::addSubPage
KPageWidgetItem * addSubPage(KPageWidgetItem *parent, QWidget *widget, const QString &name)
Inserts a new sub page in the model.
Definition: kpagewidgetmodel.cpp:445
QModelIndex::internalPointer
void * internalPointer() const
KPageWidgetItem::isChecked
bool isChecked() const
Returns whether the page widget item is checked.
Definition: kpagewidgetmodel.cpp:162
KPageModel::HeaderRole
A string to be rendered as page header.
Definition: kpagemodel.h:69
KPageWidgetModel::removePage
void removePage(KPageWidgetItem *item)
Removes the page associated with the given.
Definition: kpagewidgetmodel.cpp:485
QString
QAbstractItemModel::createIndex
QModelIndex createIndex(int row, int column, void *ptr) const
KPageWidgetItem::checkable
bool checkable
Definition: kpagewidgetmodel.h:56
KPageWidgetItem::widget
QWidget * widget() const
Returns the widget of the page widget item.
Definition: kpagewidgetmodel.cpp:101
KPageWidgetModel::KPageWidgetModel
KPageWidgetModel(QObject *parent=0)
Creates a new page widget model.
Definition: kpagewidgetmodel.cpp:254
QVariant::fromValue
QVariant fromValue(const T &value)
KPageWidgetModel::item
KPageWidgetItem * item(const QModelIndex &index) const
Returns the.
Definition: kpagewidgetmodel.cpp:520
KPageModel::WidgetRole
A pointer to the page widget.
Definition: kpagemodel.h:80
QModelIndex::child
QModelIndex child(int row, int column) const
QAbstractItemModel::beginInsertRows
void beginInsertRows(const QModelIndex &parent, int first, int last)
KPageWidgetItem::isCheckable
bool isCheckable() const
Returns whether the page widget item is checkable.
Definition: kpagewidgetmodel.cpp:149
KPageWidgetItem
KPageWidgetItem is used by KPageWidget and represents a page.
Definition: kpagewidgetmodel.h:50
KPageWidgetModel::toggled
void toggled(KPageWidgetItem *page, bool checked)
This signal is emitted whenever a checkable page changes its state.
KPageWidgetItem::setHeader
void setHeader(const QString &header)
Sets the header of the page widget item.
Definition: kpagewidgetmodel.cpp:118
KPageWidgetItem::setName
void setName(const QString &name)
Sets the name of the item as shown in the navigation view of the page widget.
Definition: kpagewidgetmodel.cpp:106
KPageWidgetModel::addPage
KPageWidgetItem * addPage(QWidget *widget, const QString &name)
Adds a new top level page to the model.
Definition: kpagewidgetmodel.cpp:374
KPageWidgetModel::data
virtual QVariant data(const QModelIndex &index, int role=Qt::DisplayRole) const
Definition: kpagewidgetmodel.cpp:268
QAbstractItemModel::endRemoveRows
void endRemoveRows()
kicon.h
QObject::connect
bool connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
QObject::parent
QObject * parent() const
KPageWidgetModel::~KPageWidgetModel
~KPageWidgetModel()
Destroys the page widget model.
Definition: kpagewidgetmodel.cpp:259
KPageWidgetItem::setCheckable
void setCheckable(bool checkable)
Sets whether the page widget item is checkable in the view.
Definition: kpagewidgetmodel.cpp:142
KPageWidgetModel::insertPage
KPageWidgetItem * insertPage(KPageWidgetItem *before, QWidget *widget, const QString &name)
Inserts a new page in the model.
Definition: kpagewidgetmodel.cpp:404
QVariant
Qt::ItemFlags
typedef ItemFlags
QObject::findChild
T findChild(const QString &name) const
This file is part of the KDE documentation.
Documentation copyright © 1996-2020 The KDE developers.
Generated on Mon Jun 22 2020 13:24:00 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

KDEUI

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

kdelibs API Reference

Skip menu "kdelibs API Reference"
  • DNSSD
  • Interfaces
  •   KHexEdit
  •   KMediaPlayer
  •   KSpeech
  •   KTextEditor
  • kconf_update
  • KDE3Support
  •   KUnitTest
  • KDECore
  • KDED
  • KDEsu
  • KDEUI
  • KDEWebKit
  • KDocTools
  • KFile
  • KHTML
  • KImgIO
  • KInit
  • kio
  • KIOSlave
  • KJS
  •   KJS-API
  •   WTF
  • kjsembed
  • KNewStuff
  • KParts
  • KPty
  • Kross
  • KUnitConversion
  • KUtils
  • Nepomuk
  • Plasma
  • Solid
  • Sonnet
  • ThreadWeaver

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