KDEUI
kpagewidgetmodel.cpp
Go to the documentation of this file.
00001 /* 00002 This file is part of the KDE Libraries 00003 00004 Copyright (C) 2006 Tobias Koenig (tokoe@kde.org) 00005 00006 This library is free software; you can redistribute it and/or 00007 modify it under the terms of the GNU Library General Public 00008 License as published by the Free Software Foundation; either 00009 version 2 of the License, or (at your option) any later version. 00010 00011 This library is distributed in the hope that it will be useful, 00012 but WITHOUT ANY WARRANTY; without even the implied warranty of 00013 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00014 Library General Public License for more details. 00015 00016 You should have received a copy of the GNU Library General Public License 00017 along with this library; see the file COPYING.LIB. If not, write to 00018 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 00019 Boston, MA 02110-1301, USA. 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 // The row to be inserted 00392 int row = d->rootItem->childCount(); 00393 00394 beginInsertRows(QModelIndex(), row, row); 00395 00396 PageItem *pageItem = new PageItem( item, d->rootItem ); 00397 d->rootItem->appendChild( pageItem ); 00398 00399 endInsertRows(); 00400 00401 emit layoutChanged(); 00402 } 00403 00404 KPageWidgetItem* KPageWidgetModel::insertPage( KPageWidgetItem *before, QWidget *widget, const QString &name ) 00405 { 00406 KPageWidgetItem *item = new KPageWidgetItem( widget, name ); 00407 00408 insertPage( before, item ); 00409 00410 return item; 00411 } 00412 00413 void KPageWidgetModel::insertPage( KPageWidgetItem *before, KPageWidgetItem *item ) 00414 { 00415 PageItem *beforePageItem = d_func()->rootItem->findChild(before); 00416 if ( !beforePageItem ) { 00417 qDebug( "Invalid KPageWidgetItem passed!" ); 00418 return; 00419 } 00420 00421 emit layoutAboutToBeChanged(); 00422 00423 connect(item, SIGNAL(changed()), this, SLOT(_k_itemChanged())); 00424 connect(item, SIGNAL(toggled(bool)), this, SLOT(_k_itemToggled(bool))); 00425 00426 PageItem *parent = beforePageItem->parent(); 00427 // The row to be inserted 00428 int row = beforePageItem->row(); 00429 00430 QModelIndex index; 00431 if (parent != d_func()->rootItem) { 00432 index = createIndex( parent->row(), 0, parent ); 00433 } 00434 00435 beginInsertRows(index, row, row); 00436 00437 PageItem *newPageItem = new PageItem( item, parent ); 00438 parent->insertChild( row, newPageItem ); 00439 00440 endInsertRows(); 00441 00442 emit layoutChanged(); 00443 } 00444 00445 KPageWidgetItem* KPageWidgetModel::addSubPage( KPageWidgetItem *parent, QWidget *widget, const QString &name ) 00446 { 00447 KPageWidgetItem *item = new KPageWidgetItem( widget, name ); 00448 00449 addSubPage( parent, item ); 00450 00451 return item; 00452 } 00453 00454 void KPageWidgetModel::addSubPage( KPageWidgetItem *parent, KPageWidgetItem *item ) 00455 { 00456 PageItem *parentPageItem = d_func()->rootItem->findChild(parent); 00457 if ( !parentPageItem ) { 00458 qDebug( "Invalid KPageWidgetItem passed!" ); 00459 return; 00460 } 00461 00462 emit layoutAboutToBeChanged(); 00463 00464 connect(item, SIGNAL(changed()), this, SLOT(_k_itemChanged())); 00465 connect(item, SIGNAL(toggled(bool)), this, SLOT(_k_itemToggled(bool))); 00466 00467 // The row to be inserted 00468 int row = parentPageItem->childCount(); 00469 00470 QModelIndex index; 00471 if (parentPageItem != d_func()->rootItem) { 00472 index = createIndex( parentPageItem->row(), 0, parentPageItem ); 00473 } 00474 00475 beginInsertRows(index, row, row); 00476 00477 PageItem *newPageItem = new PageItem( item, parentPageItem ); 00478 parentPageItem->appendChild( newPageItem ); 00479 00480 endInsertRows(); 00481 00482 emit layoutChanged(); 00483 } 00484 00485 void KPageWidgetModel::removePage( KPageWidgetItem *item ) 00486 { 00487 if ( !item ) 00488 return; 00489 00490 Q_D(KPageWidgetModel); 00491 00492 PageItem *pageItem = d->rootItem->findChild( item ); 00493 if ( !pageItem ) { 00494 qDebug( "Invalid KPageWidgetItem passed!" ); 00495 return; 00496 } 00497 00498 emit layoutAboutToBeChanged(); 00499 00500 disconnect(item, SIGNAL(changed()), this, SLOT(_k_itemChanged())); 00501 disconnect(item, SIGNAL(toggled(bool)), this, SLOT(_k_itemToggled(bool))); 00502 00503 PageItem *parentPageItem = pageItem->parent(); 00504 int row = parentPageItem->row(); 00505 00506 QModelIndex index; 00507 if ( parentPageItem != d->rootItem ) 00508 index = createIndex( row, 0, parentPageItem ); 00509 00510 beginRemoveRows(index, pageItem->row(), pageItem->row()); 00511 00512 parentPageItem->removeChild( pageItem->row() ); 00513 delete pageItem; 00514 00515 endRemoveRows(); 00516 00517 emit layoutChanged(); 00518 } 00519 00520 KPageWidgetItem *KPageWidgetModel::item(const QModelIndex &index) const 00521 { 00522 if ( !index.isValid() ) 00523 return 0; 00524 00525 PageItem *item = static_cast<PageItem*>( index.internalPointer() ); 00526 if ( !item ) 00527 return 0; 00528 00529 return item->pageWidgetItem(); 00530 } 00531 00532 QModelIndex KPageWidgetModel::index( const KPageWidgetItem *item ) const 00533 { 00534 if ( !item ) 00535 return QModelIndex(); 00536 00537 const PageItem *pageItem = d_func()->rootItem->findChild(item); 00538 if ( !pageItem ) { 00539 return QModelIndex(); 00540 } 00541 00542 return createIndex( pageItem->row(), 0, (void*)pageItem ); 00543 } 00544 00545 #include "kpagewidgetmodel.moc"
KDE 4.6 API Reference