00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
#include <koKoolBar.h>
00021
#include <kiconloader.h>
00022
00023
#include <qpainter.h>
00024
#include <qpushbutton.h>
00025
00026
static int g_koKoolBarId = 0;
00027
00028 KoKoolBar::KoKoolBar(
QWidget *_parent,
const char *_name ) :
00029
QWidget( _parent, _name ), m_iActiveGroup( -1 )
00030 {
00031 m_mapGroups.setAutoDelete(
true );
00032 m_pBox =
new KoKoolBarBox(
this );
00033 }
00034
00035
int KoKoolBar::insertGroup(
const QString& _text )
00036 {
00037 KoKoolBarGroup *p =
new KoKoolBarGroup(
this, _text );
00038 m_mapGroups.insert( p->id(), p );
00039
00040
if ( m_iActiveGroup == -1 )
00041 setActiveGroup( p->id() );
00042
else
00043 resizeEvent( 0L );
00044
return p->id();
00045 }
00046
00047
int KoKoolBar::insertItem(
int _grp,
const QPixmap& _pix,
const QString& _text,
00048
QObject *_obj,
const char *_slot )
00049 {
00050 KoKoolBarGroup* g = m_mapGroups[ _grp ];
00051
if ( !g )
00052
return -1;
00053 KoKoolBarItem *item =
new KoKoolBarItem( g, _pix, _text );
00054
00055
if ( _obj != 0L && _slot != 0L )
00056 connect( item, SIGNAL( pressed(
int,
int ) ), _obj, _slot );
00057 g->append( item );
00058
00059
if ( g->id() == m_iActiveGroup )
00060 m_pBox->update();
00061
00062
return item->id();
00063 }
00064
00065
void KoKoolBar::removeGroup(
int _grp )
00066 {
00067 KoKoolBarGroup* g = m_mapGroups[ _grp ];
00068
if ( !g )
00069
return;
00070
00071 m_mapGroups.remove( _grp );
00072
00073
if ( _grp == m_iActiveGroup )
00074 {
00075
if ( m_mapGroups.count() == 0 )
00076 {
00077 m_iActiveGroup = -1;
00078 m_pBox->setActiveGroup( 0L );
00079 }
00080
else
00081 {
00082
QIntDictIterator<KoKoolBarGroup> it( m_mapGroups );
00083 g = it.current();
00084 m_iActiveGroup = g->id();
00085 m_pBox->setActiveGroup( g );
00086 }
00087 }
00088
00089 resizeEvent( 0L );
00090 }
00091
00092
void KoKoolBar::removeItem(
int _grp,
int _id )
00093 {
00094 KoKoolBarGroup* g = m_mapGroups[ _grp ];
00095
if ( !g )
00096
return;
00097
00098 g->remove( _id );
00099
00100
if ( g->id() == m_iActiveGroup )
00101 m_pBox->update();
00102 }
00103
00104
void KoKoolBar::renameItem(
int _grp,
int _id,
const QString & _text )
00105 {
00106 KoKoolBarGroup* g = m_mapGroups[ _grp ];
00107
if ( !g )
00108
return;
00109
00110 KoKoolBarItem * item = g->item( _id );
00111
if ( !item )
00112
return;
00113
00114 item->setText( _text );
00115
00116
if ( g->id() == m_iActiveGroup )
00117 m_pBox->update();
00118 }
00119
00120
void KoKoolBar::setActiveGroup(
int _grp )
00121 {
00122 KoKoolBarGroup* g = m_mapGroups[ _grp ];
00123
if ( !g )
00124
return;
00125
00126 m_iActiveGroup = g->id();
00127 m_pBox->setActiveGroup( g );
00128
00129 resizeEvent( 0L );
00130 }
00131
00132
void KoKoolBar::resizeEvent(
QResizeEvent * ev )
00133 {
00134
if ( m_iActiveGroup == -1 )
00135
return;
00136
00137
int buttonheight = fontMetrics().height() + 4;
00138
00139 KoKoolBarGroup *g = m_mapGroups[ m_iActiveGroup ];
00140
if ( !g )
00141
return;
00142
00143
00144
QIntDictIterator<KoKoolBarGroup> it( m_mapGroups );
00145
while( it.current() != g )
00146 ++it;
00147
00148
QIntDictIterator<KoKoolBarGroup> pos = it;
00149 ++it;
00150
00151
00152
int result = 0;
00153
QIntDictIterator<KoKoolBarGroup> i = it;
00154
while( i.current() )
00155 {
00156 ++result;
00157 ++i;
00158 }
00159
00160
int y = height() - buttonheight * result;
00161
for( ; it.current(); ++it )
00162 {
00163 it.current()->button()->setGeometry( 0, y, width(), buttonheight );
00164 it.current()->button()->show();
00165 y += buttonheight;
00166 }
00167
00168
int y2 = 0;
00169 it.toFirst();
00170 ++pos;
00171
while( it.current() != pos.current() )
00172 {
00173 it.current()->button()->setGeometry( 0, y2, width(), buttonheight );
00174 it.current()->button()->show();
00175 ++it;
00176 y2 += buttonheight;
00177 }
00178
00179
if ( height() - y2 - result * buttonheight >= 0 )
00180 {
00181 m_pBox->show();
00182 m_pBox->setGeometry( 0, y2, width(), height() - y2 - result * buttonheight );
00183
if ( !ev )
00184 m_pBox->sizeChanged();
00185 }
00186
else
00187 m_pBox->hide();
00188
00189 }
00190
00191
void KoKoolBar::enableItem(
int _grp,
int _id,
bool _enable )
00192 {
00193 KoKoolBarGroup* g = m_mapGroups[ _grp ];
00194
if ( !g )
00195
return;
00196 KoKoolBarItem *item = g->item( _id );
00197
if ( !item )
00198
return;
00199 item->setEnabled( _enable );
00200 }
00201
00202
void KoKoolBar::enableGroup(
int _grp,
bool _enable )
00203 {
00204 KoKoolBarGroup* g = m_mapGroups[ _grp ];
00205
if ( !g )
00206
return;
00207 g->setEnabled( _enable );
00208 }
00209
00210 KoKoolBarBox::KoKoolBarBox( KoKoolBar *_bar ) :
00211
QFrame( _bar ), m_pBar( _bar ),
00212 m_pButtonUp( 0L ), m_pButtonDown( 0L )
00213 {
00214 m_iYOffset = 0;
00215 m_iYIcon = 0;
00216 m_pGroup = 0L;
00217
00218 setFrameShape( StyledPanel );
00219 setFrameShadow( Sunken );
00220
00221 setBackgroundColor( colorGroup().background() );
00222 }
00223
00224
void KoKoolBarBox::setActiveGroup( KoKoolBarGroup *_grp )
00225 {
00226 m_pGroup = _grp;
00227 m_iYOffset = 0;
00228 m_iYIcon = 0;
00229 update();
00230 }
00231
00232
bool KoKoolBarBox::needsScrolling()
const
00233
{
00234
if ( m_pGroup == 0L )
00235
return false;
00236
00237
return ( maxHeight() > height() );
00238 }
00239
00240
void KoKoolBarBox::resizeEvent(
QResizeEvent * )
00241 {
00242
if ( needsScrolling() )
00243 {
00244
if ( m_pButtonUp == 0L )
00245 {
00246 m_pButtonUp =
new QPushButton(
this );
00247 m_pButtonUp->setPixmap(
QPixmap( UserIcon(
"koKoolBarUp" ) ) );
00248 connect( m_pButtonUp, SIGNAL( clicked() ),
this, SLOT( scrollUp() ) );
00249 }
00250
if ( m_pButtonDown == 0L )
00251 {
00252 m_pButtonDown =
new QPushButton(
this );
00253 m_pButtonDown->setPixmap(
QPixmap( UserIcon(
"koKoolBarDown" ) ) );
00254 connect( m_pButtonDown, SIGNAL( clicked() ),
this, SLOT( scrollDown() ) );
00255 }
00256 m_pButtonUp->show();
00257 m_pButtonUp->raise();
00258 m_pButtonDown->show();
00259 m_pButtonDown->raise();
00260 updateScrollButtons();
00261 }
00262
else
00263 {
00264
if ( m_pButtonUp )
00265 m_pButtonUp->hide();
00266
if ( m_pButtonDown )
00267 m_pButtonDown->hide();
00268 }
00269 }
00270
00271 KoKoolBarItem* KoKoolBarBox::findByPos(
int _abs_y )
const
00272
{
00273
if ( m_pGroup == 0L )
00274
return 0L;
00275
00276
int y = 0;
00277
00278
QIntDictIterator<KoKoolBarItem> it = m_pGroup->iterator();
00279
for ( ; it.current(); ++it )
00280 {
00281
int dy = it.current()->height();
00282
if ( y <= _abs_y && _abs_y <= y + dy )
00283
return it.current();
00284 y += dy;
00285 }
00286
00287
return 0L;
00288 }
00289
00290
int KoKoolBarBox::maxHeight()
const
00291
{
00292
int y = 0;
00293
00294
QIntDictIterator<KoKoolBarItem> it = m_pGroup->iterator();
00295
for ( ; it.current(); ++it )
00296 y += it.current()->height();
00297
00298
return y;
00299 }
00300
00301
bool KoKoolBarBox::isAtTop()
const
00302
{
00303
return ( m_iYIcon == 0 );
00304 }
00305
00306
bool KoKoolBarBox::isAtBottom()
const
00307
{
00308
if ( m_pGroup->items() == 0 )
00309
return true;
00310
int h = maxHeight();
00311
if ( height() + m_iYOffset >= h )
00312
return true;
00313
if ( m_pGroup->items() - 1 == m_iYIcon )
00314
return true;
00315
return false;
00316 }
00317
00318
void KoKoolBarBox::scrollUp()
00319 {
00320
if ( isAtTop() )
00321
return;
00322
00323
int y = 0;
00324
int i = 0;
00325 m_iYIcon--;
00326
00327
QIntDictIterator<KoKoolBarItem> it = m_pGroup->iterator();
00328
for ( ; i < m_iYIcon && it.current(); ++it )
00329 {
00330 y += it.current()->height();
00331 ++i;
00332 }
00333
00334
int old = m_iYOffset;
00335 m_iYOffset = y;
00336
00337 QWidget::scroll( 0, old - m_iYOffset, contentsRect() );
00338 updateScrollButtons();
00339 }
00340
00341
void KoKoolBarBox::scrollDown()
00342 {
00343
if ( isAtBottom() )
00344
return;
00345
00346
int y = 0;
00347
int i = 0;
00348 m_iYIcon++;
00349
00350
QIntDictIterator<KoKoolBarItem> it = m_pGroup->iterator();
00351
for ( ; i < m_iYIcon && it.current(); ++it )
00352 {
00353 y += it.current()->height();
00354 i++;
00355 }
00356
int h = maxHeight();
00357
if ( y + height() > h )
00358 y = h - height();
00359
00360
int old = m_iYOffset;
00361 m_iYOffset = y;
00362
00363 QWidget::scroll( 0, old - m_iYOffset, contentsRect() );
00364 updateScrollButtons();
00365 }
00366
00367
void KoKoolBarBox::updateScrollButtons()
00368 {
00369
if ( isAtTop() )
00370 m_pButtonUp->setEnabled(
false );
00371
else
00372 m_pButtonUp->setEnabled(
true );
00373
00374
if ( isAtBottom() )
00375 m_pButtonDown->setEnabled(
false );
00376
else
00377 m_pButtonDown->setEnabled(
true );
00378
00379
const int bs = 14;
00380 m_pButtonUp->setGeometry( width() - bs, height() - 2 * bs, bs, bs );
00381 m_pButtonDown->setGeometry( width() - bs, height() - bs, bs, bs );
00382 }
00383
00384
void KoKoolBarBox::drawContents(
QPainter * painter )
00385 {
00386
if ( m_pGroup == 0L )
00387
return;
00388
00389
int y = -m_iYOffset;
00390
00391
QIntDictIterator<KoKoolBarItem> it = m_pGroup->iterator();
00392
for ( ; it.current(); ++it )
00393 {
00394
if ( y + it.current()->height() >= 0 && y <= height() )
00395 {
00396 painter->drawPixmap( ( width() - it.current()->pixmap().width() ) / 2, y, it.current()->pixmap() );
00397
if ( !it.current()->text().isEmpty() )
00398 {
00399
int y2 = y + it.current()->pixmap().height() + 2;
00400 painter->drawText( ( width() - painter->fontMetrics().width( it.current()->text() ) ) / 2,
00401 y2 + painter->fontMetrics().ascent(), it.current()->text() );
00402 }
00403 }
00404
00405 y += it.current()->height();
00406 }
00407 }
00408
00409 KoKoolBarGroup::KoKoolBarGroup( KoKoolBar *_bar,
const QString& _text ) :
00410 m_pBar( _bar )
00411 {
00412 m_mapItems.setAutoDelete(
true );
00413
00414 m_pButton =
new QPushButton( _text, _bar );
00415
00416 m_bEnabled =
true;
00417
00418 connect( m_pButton, SIGNAL( clicked() ),
this, SLOT( pressed() ) );
00419 m_id = g_koKoolBarId++;
00420 }
00421
00422 KoKoolBarGroup::~KoKoolBarGroup()
00423 {
00424
delete m_pButton;
00425 }
00426
00427
void KoKoolBarGroup::remove(
int _id )
00428 {
00429 m_mapItems.remove( _id );
00430 }
00431
00432
void KoKoolBarGroup::pressed()
00433 {
00434 m_pBar->setActiveGroup( m_id );
00435 }
00436
00437 KoKoolBarItem::KoKoolBarItem( KoKoolBarGroup *_grp,
const QPixmap& _pix,
const QString&_text )
00438 : m_pGroup( _grp )
00439 {
00440 m_pixmap = _pix;
00441 m_strText = _text;
00442 m_bEnabled =
true;
00443 m_id = g_koKoolBarId++;
00444 calc( _grp->bar() );
00445 }
00446
00447
void KoKoolBarItem::calc(
QWidget *_widget )
00448 {
00449 m_iHeight = pixmap().height() + 8;
00450
00451
if ( !m_strText.isEmpty() )
00452 m_iHeight += _widget->fontMetrics().height() + 2;
00453 }
00454
00455
void KoKoolBarItem::press()
00456 {
00457 emit pressed();
00458 emit pressed( m_pGroup->id(), m_id );
00459 }
00460
00461
00462
00463
00464
00465
00466
00467
00468
00469
00470
00471
00472
00473
00474
00475
00476
00477
00478
00479
00480
00481
00482
00483
00484
00485
00486
00487
00488
00489
#include <koKoolBar.moc>