You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
141 lines
3.4 KiB
141 lines
3.4 KiB
// kwidgetliaster.cpp |
|
// A class to show multiple widgets in rows |
|
// and allowing to add and remove them at/from the end. |
|
// Author: Marc Mutz <Marc@Mutz.com> |
|
|
|
#include "kwidgetlister.h" |
|
|
|
#include <klocale.h> |
|
#include <kdebug.h> |
|
|
|
#include <qpushbutton.h> |
|
#include <qlayout.h> |
|
#include <qhbox.h> |
|
|
|
#include <assert.h> |
|
|
|
KWidgetLister::KWidgetLister( int minWidgets, int maxWidgets, QWidget *parent, const char* name ) |
|
: QWidget( parent, name ) |
|
{ |
|
mWidgetList.setAutoDelete(TRUE); |
|
|
|
mMinWidgets = QMAX( minWidgets, 1 ); |
|
mMaxWidgets = QMAX( maxWidgets, mMinWidgets + 1 ); |
|
|
|
//--------- the button box |
|
mLayout = new QVBoxLayout(this, 0, 4); |
|
mButtonBox = new QHBox(this); |
|
mLayout->addWidget( mButtonBox ); |
|
|
|
mBtnMore = new QPushButton( i18n("more widgets","More"), mButtonBox ); |
|
mButtonBox->setStretchFactor( mBtnMore, 0 ); |
|
|
|
mBtnFewer = new QPushButton( i18n("fewer widgets","Fewer"), mButtonBox ); |
|
mButtonBox->setStretchFactor( mBtnFewer, 0 ); |
|
|
|
QWidget *spacer = new QWidget( mButtonBox ); |
|
mButtonBox->setStretchFactor( spacer, 1 ); |
|
|
|
mBtnClear = new QPushButton( i18n("clear widgets","Clear"), mButtonBox ); |
|
mButtonBox->setStretchFactor( mBtnClear, 0 ); |
|
|
|
//---------- connect everything |
|
connect( mBtnMore, SIGNAL(clicked()), |
|
this, SLOT(slotMore()) ); |
|
connect( mBtnFewer, SIGNAL(clicked()), |
|
this, SLOT(slotFewer()) ); |
|
connect( mBtnClear, SIGNAL(clicked()), |
|
this, SLOT(slotClear()) ); |
|
|
|
enableControls(); |
|
} |
|
|
|
KWidgetLister::~KWidgetLister() |
|
{ |
|
} |
|
|
|
void KWidgetLister::slotMore() |
|
{ |
|
// the class should make certain that slotMore can't |
|
// be called when mMaxWidgets are on screen. |
|
assert( (int)mWidgetList.count() < mMaxWidgets ); |
|
|
|
addWidgetAtEnd(); |
|
// adjustSize(); |
|
enableControls(); |
|
} |
|
|
|
void KWidgetLister::slotFewer() |
|
{ |
|
// the class should make certain that slotFewer can't |
|
// be called when mMinWidgets are on screen. |
|
assert( (int)mWidgetList.count() > mMinWidgets ); |
|
|
|
removeLastWidget(); |
|
// adjustSize(); |
|
enableControls(); |
|
} |
|
|
|
void KWidgetLister::slotClear() |
|
{ |
|
setNumberOfShownWidgetsTo( mMinWidgets ); |
|
|
|
// clear remaining widgets |
|
QListIterator<QWidget> it( mWidgetList ); |
|
for ( it.toFirst() ; it.current() ; ++it ) |
|
clearWidget( (*it) ); |
|
|
|
// adjustSize(); |
|
enableControls(); |
|
} |
|
|
|
void KWidgetLister::addWidgetAtEnd() |
|
{ |
|
QWidget *w = this->createWidget(this); |
|
|
|
mLayout->insertWidget( mLayout->findWidget( mButtonBox ), w ); |
|
mWidgetList.append( w ); |
|
w->show(); |
|
} |
|
|
|
void KWidgetLister::removeLastWidget() |
|
{ |
|
// The layout will take care that the |
|
// widget is removed from screen, too. |
|
mWidgetList.removeLast(); |
|
} |
|
|
|
void KWidgetLister::clearWidget( QWidget* /*aWidget*/ ) |
|
{ |
|
} |
|
|
|
QWidget* KWidgetLister::createWidget( QWidget* parent ) |
|
{ |
|
return new QWidget( parent ); |
|
} |
|
|
|
void KWidgetLister::setNumberOfShownWidgetsTo( int aNum ) |
|
{ |
|
int superfluousWidgets = QMAX( (int)mWidgetList.count() - aNum, 0 ); |
|
int missingWidgets = QMAX( aNum - (int)mWidgetList.count(), 0 ); |
|
|
|
// remove superfluous widgets |
|
for ( ; superfluousWidgets ; superfluousWidgets-- ) |
|
removeLastWidget(); |
|
|
|
// add missing widgets |
|
for ( ; missingWidgets ; missingWidgets-- ) |
|
addWidgetAtEnd(); |
|
} |
|
|
|
void KWidgetLister::enableControls() |
|
{ |
|
int count = mWidgetList.count(); |
|
bool isMaxWidgets = ( count >= mMaxWidgets ); |
|
bool isMinWidgets = ( count <= mMinWidgets ); |
|
|
|
mBtnMore->setEnabled( !isMaxWidgets ); |
|
mBtnFewer->setEnabled( !isMinWidgets ); |
|
} |
|
|
|
#include "kwidgetlister.moc"
|
|
|