• Skip to content
  • Skip to link menu
KDE 4.2 API Reference
  • KDE API Reference
  • kdelibs
  • Sitemap
  • 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   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"

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
  • KDocTools
  • KFile
  • KHTML
  • KImgIO
  • KInit
  • kio
  • KIOSlave
  • KJS
  •   KJS-API
  •   WTF
  • kjsembed
  • KNewStuff
  • KParts
  • Kross
  • KUtils
  • Nepomuk
  • Plasma
  • Solid
  • Sonnet
  • ThreadWeaver
Generated for kdelibs by doxygen 1.5.7
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