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

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"

KDEUI

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

kdelibs

Skip menu "kdelibs"
  • DNSSD
  • Interfaces
  •   KHexEdit
  •   KMediaPlayer
  •   KSpeech
  •   KTextEditor
  • Kate
  • 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
Generated for kdelibs by doxygen 1.7.3
This website is maintained by Adriaan de Groot and Allen Winter.
KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal