00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "kpagewidgetmodel.h"
00023 #include "kpagewidgetmodel_p.h"
00024
00025 #include <QPointer>
00026 #include <QWidget>
00027
00028 #include <kicon.h>
00029
00030 class KPageWidgetItem::Private
00031 {
00032 public:
00033 Private()
00034 : checkable(false), checked(false), enabled(true)
00035 {
00036 }
00037
00038 ~Private()
00039 {
00040 delete widget;
00041 widget = 0;
00042 }
00043
00044 QString name;
00045 QString header;
00046 KIcon icon;
00047 QPointer<QWidget> widget;
00048 bool checkable : 1;
00049 bool checked : 1;
00050 bool enabled : 1;
00051 };
00052
00053 KPageWidgetItem::KPageWidgetItem( QWidget *widget )
00054 : QObject( 0 ), d( new Private )
00055 {
00056 d->widget = widget;
00057
00063 if ( d->widget )
00064 d->widget->hide();
00065 }
00066
00067 KPageWidgetItem::KPageWidgetItem( QWidget *widget, const QString &name )
00068 : QObject( 0 ), d( new Private )
00069 {
00070 d->widget = widget;
00071 d->name = name;
00072
00078 if ( d->widget )
00079 d->widget->hide();
00080 }
00081
00082 KPageWidgetItem::~KPageWidgetItem()
00083 {
00084 delete d;
00085 }
00086
00087 void KPageWidgetItem::setEnabled(bool enabled)
00088 {
00089 d->enabled = enabled;
00090 if (d->widget) {
00091 d->widget->setEnabled(enabled);
00092 }
00093 emit changed();
00094 }
00095
00096 bool KPageWidgetItem::isEnabled() const
00097 {
00098 return d->enabled;
00099 }
00100
00101 QWidget* KPageWidgetItem::widget() const
00102 {
00103 return d->widget;
00104 }
00105
00106 void KPageWidgetItem::setName( const QString &name )
00107 {
00108 d->name = name;
00109
00110 emit changed();
00111 }
00112
00113 QString KPageWidgetItem::name() const
00114 {
00115 return d->name;
00116 }
00117
00118 void KPageWidgetItem::setHeader( const QString &header )
00119 {
00120 d->header = header;
00121
00122 emit changed();
00123 }
00124
00125 QString KPageWidgetItem::header() const
00126 {
00127 return d->header;
00128 }
00129
00130 void KPageWidgetItem::setIcon( const KIcon &icon )
00131 {
00132 d->icon = icon;
00133
00134 emit changed();
00135 }
00136
00137 KIcon KPageWidgetItem::icon() const
00138 {
00139 return d->icon;
00140 }
00141
00142 void KPageWidgetItem::setCheckable( bool checkable )
00143 {
00144 d->checkable = checkable;
00145
00146 emit changed();
00147 }
00148
00149 bool KPageWidgetItem::isCheckable() const
00150 {
00151 return d->checkable;
00152 }
00153
00154 void KPageWidgetItem::setChecked( bool checked )
00155 {
00156 d->checked = checked;
00157
00158 emit toggled( checked );
00159 emit changed();
00160 }
00161
00162 bool KPageWidgetItem::isChecked() const
00163 {
00164 return d->checked;
00165 }
00166
00167 PageItem::PageItem( KPageWidgetItem *pageWidgetItem, PageItem *parent )
00168 : mPageWidgetItem( pageWidgetItem ), mParentItem( parent )
00169 {
00170 }
00171
00172 PageItem::~PageItem()
00173 {
00174 delete mPageWidgetItem;
00175 mPageWidgetItem = 0;
00176
00177 qDeleteAll(mChildItems);
00178 }
00179
00180 void PageItem::appendChild( PageItem *item )
00181 {
00182 mChildItems.append( item );
00183 }
00184
00185 void PageItem::insertChild( int row, PageItem *item )
00186 {
00187 mChildItems.insert( row, item );
00188 }
00189
00190 void PageItem::removeChild( int row )
00191 {
00192 mChildItems.removeAt( row );
00193 }
00194
00195 PageItem *PageItem::child( int row )
00196 {
00197 return mChildItems.value( row );
00198 }
00199
00200 int PageItem::childCount() const
00201 {
00202 return mChildItems.count();
00203 }
00204
00205 int PageItem::columnCount() const
00206 {
00207 return 1;
00208 }
00209
00210 PageItem *PageItem::parent()
00211 {
00212 return mParentItem;
00213 }
00214
00215 int PageItem::row() const
00216 {
00217 if ( mParentItem )
00218 return mParentItem->mChildItems.indexOf( const_cast<PageItem*>(this) );
00219
00220 return 0;
00221 }
00222
00223 KPageWidgetItem* PageItem::pageWidgetItem() const
00224 {
00225 return mPageWidgetItem;
00226 }
00227
00228 PageItem *PageItem::findChild( const KPageWidgetItem *item )
00229 {
00230 if ( mPageWidgetItem == item )
00231 return this;
00232
00233 for ( int i = 0; i < mChildItems.count(); ++i ) {
00234 PageItem *pageItem = mChildItems[ i ]->findChild( item );
00235 if ( pageItem )
00236 return pageItem;
00237 }
00238
00239 return 0;
00240 }
00241
00242 void PageItem::dump( int indent )
00243 {
00244 QString prefix;
00245 for ( int i = 0; i < indent; ++i )
00246 prefix.append( " " );
00247
00248 const QString name = ( mPageWidgetItem ? mPageWidgetItem->name() : "root" );
00249 qDebug( "%s (%p)", qPrintable( QString( "%1%2" ).arg( prefix, name ) ), (void*)this );
00250 for ( int i = 0; i < mChildItems.count(); ++i )
00251 mChildItems[ i ]->dump( indent + 2 );
00252 }
00253
00254 KPageWidgetModel::KPageWidgetModel( QObject *parent )
00255 : KPageModel(*new KPageWidgetModelPrivate, parent)
00256 {
00257 }
00258
00259 KPageWidgetModel::~KPageWidgetModel()
00260 {
00261 }
00262
00263 int KPageWidgetModel::columnCount( const QModelIndex& ) const
00264 {
00265 return 1;
00266 }
00267
00268 QVariant KPageWidgetModel::data( const QModelIndex &index, int role ) const
00269 {
00270 if ( !index.isValid() )
00271 return QVariant();
00272
00273 PageItem *item = static_cast<PageItem*>( index.internalPointer() );
00274
00275 if ( role == Qt::DisplayRole )
00276 return QVariant( item->pageWidgetItem()->name() );
00277 else if ( role == Qt::DecorationRole )
00278 return QVariant( item->pageWidgetItem()->icon() );
00279 else if ( role == HeaderRole )
00280 return QVariant( item->pageWidgetItem()->header() );
00281 else if ( role == WidgetRole )
00282 return QVariant::fromValue( item->pageWidgetItem()->widget() );
00283 else if ( role == Qt::CheckStateRole ) {
00284 if ( item->pageWidgetItem()->isCheckable() ) {
00285 return ( item->pageWidgetItem()->isChecked() ? Qt::Checked : Qt::Unchecked );
00286 } else
00287 return QVariant();
00288 } else
00289 return QVariant();
00290 }
00291
00292 bool KPageWidgetModel::setData( const QModelIndex &index, const QVariant &value, int role )
00293 {
00294 if ( !index.isValid() )
00295 return false;
00296
00297 if ( role != Qt::CheckStateRole )
00298 return false;
00299
00300 PageItem *item = static_cast<PageItem*>( index.internalPointer() );
00301 if ( !item )
00302 return false;
00303
00304 if ( !item->pageWidgetItem()->isCheckable() )
00305 return false;
00306
00307 if ( value.toInt() == Qt::Checked )
00308 item->pageWidgetItem()->setChecked( true );
00309 else
00310 item->pageWidgetItem()->setChecked( false );
00311
00312 return true;
00313 }
00314
00315 Qt::ItemFlags KPageWidgetModel::flags( const QModelIndex &index ) const
00316 {
00317 if ( !index.isValid() )
00318 return 0;
00319
00320 Qt::ItemFlags flags = Qt::ItemIsSelectable;
00321
00322 PageItem *item = static_cast<PageItem*>( index.internalPointer() );
00323 if ( item->pageWidgetItem()->isCheckable() )
00324 flags |= Qt::ItemIsUserCheckable;
00325 if (item->pageWidgetItem()->isEnabled()) {
00326 flags |= Qt::ItemIsEnabled;
00327 }
00328
00329 return flags;
00330 }
00331
00332 QModelIndex KPageWidgetModel::index( int row, int column, const QModelIndex &parent ) const
00333 {
00334 PageItem *parentItem;
00335
00336 if ( parent.isValid() )
00337 parentItem = static_cast<PageItem*>( parent.internalPointer() );
00338 else
00339 parentItem = d_func()->rootItem;
00340
00341 PageItem *childItem = parentItem->child( row );
00342 if ( childItem )
00343 return createIndex( row, column, childItem );
00344 else
00345 return QModelIndex();
00346 }
00347
00348 QModelIndex KPageWidgetModel::parent( const QModelIndex &index ) const
00349 {
00350 if ( !index.isValid() )
00351 return QModelIndex();
00352
00353 PageItem *item = static_cast<PageItem*>( index.internalPointer() );
00354 PageItem *parentItem = item->parent();
00355
00356 if ( parentItem == d_func()->rootItem )
00357 return QModelIndex();
00358 else
00359 return createIndex( parentItem->row(), 0, parentItem );
00360 }
00361
00362 int KPageWidgetModel::rowCount( const QModelIndex &parent ) const
00363 {
00364 PageItem *parentItem;
00365
00366 if ( !parent.isValid() )
00367 parentItem = d_func()->rootItem;
00368 else
00369 parentItem = static_cast<PageItem*>( parent.internalPointer() );
00370
00371 return parentItem->childCount();
00372 }
00373
00374 KPageWidgetItem* KPageWidgetModel::addPage( QWidget *widget, const QString &name )
00375 {
00376 KPageWidgetItem *item = new KPageWidgetItem( widget, name );
00377
00378 addPage( item );
00379
00380 return item;
00381 }
00382
00383 void KPageWidgetModel::addPage( KPageWidgetItem *item )
00384 {
00385 emit layoutAboutToBeChanged();
00386
00387 Q_D(KPageWidgetModel);
00388 connect(item, SIGNAL(changed()), this, SLOT(_k_itemChanged()));
00389 connect(item, SIGNAL(toggled(bool)), this, SLOT(_k_itemToggled(bool)));
00390
00391 PageItem *pageItem = new PageItem( item, d->rootItem );
00392 d->rootItem->appendChild( pageItem );
00393
00394 emit layoutChanged();
00395 }
00396
00397 KPageWidgetItem* KPageWidgetModel::insertPage( KPageWidgetItem *before, QWidget *widget, const QString &name )
00398 {
00399 KPageWidgetItem *item = new KPageWidgetItem( widget, name );
00400
00401 insertPage( before, item );
00402
00403 return item;
00404 }
00405
00406 void KPageWidgetModel::insertPage( KPageWidgetItem *before, KPageWidgetItem *item )
00407 {
00408 PageItem *beforePageItem = d_func()->rootItem->findChild(before);
00409 if ( !beforePageItem ) {
00410 qDebug( "Invalid KPageWidgetItem passed!" );
00411 return;
00412 }
00413
00414 emit layoutAboutToBeChanged();
00415
00416 connect(item, SIGNAL(changed()), this, SLOT(_k_itemChanged()));
00417 connect(item, SIGNAL(toggled(bool)), this, SLOT(_k_itemToggled(bool)));
00418
00419 PageItem *parent = beforePageItem->parent();
00420
00421 PageItem *newPageItem = new PageItem( item, parent );
00422 parent->insertChild( beforePageItem->row(), newPageItem );
00423
00424 emit layoutChanged();
00425 }
00426
00427 KPageWidgetItem* KPageWidgetModel::addSubPage( KPageWidgetItem *parent, QWidget *widget, const QString &name )
00428 {
00429 KPageWidgetItem *item = new KPageWidgetItem( widget, name );
00430
00431 addSubPage( parent, item );
00432
00433 return item;
00434 }
00435
00436 void KPageWidgetModel::addSubPage( KPageWidgetItem *parent, KPageWidgetItem *item )
00437 {
00438 PageItem *parentPageItem = d_func()->rootItem->findChild(parent);
00439 if ( !parentPageItem ) {
00440 qDebug( "Invalid KPageWidgetItem passed!" );
00441 return;
00442 }
00443
00444 emit layoutAboutToBeChanged();
00445
00446 connect(item, SIGNAL(changed()), this, SLOT(_k_itemChanged()));
00447 connect(item, SIGNAL(toggled(bool)), this, SLOT(_k_itemToggled(bool)));
00448
00449 PageItem *newPageItem = new PageItem( item, parentPageItem );
00450 parentPageItem->appendChild( newPageItem );
00451
00452 emit layoutChanged();
00453 }
00454
00455 void KPageWidgetModel::removePage( KPageWidgetItem *item )
00456 {
00457 if ( !item )
00458 return;
00459
00460 Q_D(KPageWidgetModel);
00461
00462 PageItem *pageItem = d->rootItem->findChild( item );
00463 if ( !pageItem ) {
00464 qDebug( "Invalid KPageWidgetItem passed!" );
00465 return;
00466 }
00467
00468 disconnect(item, SIGNAL(changed()), this, SLOT(_k_itemChanged()));
00469 disconnect(item, SIGNAL(toggled(bool)), this, SLOT(_k_itemToggled(bool)));
00470
00471 PageItem *parentPageItem = pageItem->parent();
00472 int row = parentPageItem->row();
00473
00474 QModelIndex index;
00475 if ( parentPageItem != d->rootItem )
00476 index = createIndex( row, 0, parentPageItem );
00477
00478 beginRemoveRows(index, pageItem->row(), pageItem->row());
00479
00480 parentPageItem->removeChild( pageItem->row() );
00481 delete pageItem;
00482
00483 endRemoveRows();
00484 }
00485
00486 KPageWidgetItem *KPageWidgetModel::item(const QModelIndex &index) const
00487 {
00488 if ( !index.isValid() )
00489 return 0;
00490
00491 PageItem *item = static_cast<PageItem*>( index.internalPointer() );
00492 if ( !item )
00493 return 0;
00494
00495 return item->pageWidgetItem();
00496 }
00497
00498 QModelIndex KPageWidgetModel::index( const KPageWidgetItem *item ) const
00499 {
00500 if ( !item )
00501 return QModelIndex();
00502
00503 const PageItem *pageItem = d_func()->rootItem->findChild(item);
00504 if ( !pageItem ) {
00505 return QModelIndex();
00506 }
00507
00508 return createIndex( pageItem->row(), 0, (void*)pageItem );
00509 }
00510
00511 #include "kpagewidgetmodel.moc"