00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
#include "kmultitabbar.h"
00026
#include "kmultitabbar.moc"
00027
#include "kmultitabbar_p.h"
00028
#include "kmultitabbar_p.moc"
00029
#include <qbutton.h>
00030
#include <qpopupmenu.h>
00031
#include <qlayout.h>
00032
#include <qpainter.h>
00033
#include <qtooltip.h>
00034
#include <qfontmetrics.h>
00035
#include <qstyle.h>
00036
00037
#include <kiconloader.h>
00038
#include <kdebug.h>
00039
#include <qapplication.h>
00040
#include <math.h>
00041
00042
#define NEARBYINT(i) ((int(float(i) + 0.5)))
00043
00044
class KMultiTabBarTabPrivate {
00045
public:
00046
QPixmap pix;
00047 };
00048
00049
00050 KMultiTabBarInternal::KMultiTabBarInternal(
QWidget *parent, KMultiTabBar::KMultiTabBarMode bm):
QScrollView(parent)
00051 {
00052 m_expandedTabSize=-1;
00053 m_showActiveTabTexts=
false;
00054 m_tabs.setAutoDelete(
true);
00055 m_barMode=bm;
00056 setHScrollBarMode(AlwaysOff);
00057 setVScrollBarMode(AlwaysOff);
00058
if (bm==KMultiTabBar::Vertical)
00059 {
00060 box=
new QWidget(viewport());
00061 mainLayout=
new QVBoxLayout(box);
00062 mainLayout->setAutoAdd(
true);
00063 box->setFixedWidth(24);
00064 setFixedWidth(24);
00065 }
00066
else
00067 {
00068 box=
new QWidget(viewport());
00069 mainLayout=
new QHBoxLayout(box);
00070 mainLayout->setAutoAdd(
true);
00071 box->setFixedHeight(24);
00072 setFixedHeight(24);
00073 }
00074 addChild(box);
00075 setFrameStyle(NoFrame);
00076 viewport()->setBackgroundMode(Qt::PaletteBackground);
00077
00078
00079 }
00080
00081
void KMultiTabBarInternal::setStyle(
enum KMultiTabBar::KMultiTabBarStyle style)
00082 {
00083 m_style=style;
00084
for (uint i=0;i<m_tabs.count();i++)
00085 m_tabs.at(i)->setStyle(m_style);
00086
00087
if ( (m_style==KMultiTabBar::KDEV3) ||
00088 (m_style==KMultiTabBar::KDEV3ICON ) ) {
00089
delete mainLayout;
00090 mainLayout=0;
00091 resizeEvent(0);
00092 }
else if (mainLayout==0) {
00093
if (m_barMode==KMultiTabBar::Vertical)
00094 {
00095 box=
new QWidget(viewport());
00096 mainLayout=
new QVBoxLayout(box);
00097 box->setFixedWidth(24);
00098 setFixedWidth(24);
00099 }
00100
else
00101 {
00102 box=
new QWidget(viewport());
00103 mainLayout=
new QHBoxLayout(box);
00104 box->setFixedHeight(24);
00105 setFixedHeight(24);
00106 }
00107 addChild(box);
00108
for (uint i=0;i<m_tabs.count();i++)
00109 mainLayout->add(m_tabs.at(i));
00110 mainLayout->setAutoAdd(
true);
00111
00112 }
00113 viewport()->repaint();
00114 }
00115
00116
void KMultiTabBarInternal::drawContents (
QPainter * paint,
int clipx,
int clipy,
int clipw,
int cliph )
00117 {
00118
QScrollView::drawContents (paint , clipx, clipy, clipw, cliph );
00119
00120
if (m_position==KMultiTabBar::Right)
00121 {
00122
00123 paint->
setPen(colorGroup().shadow());
00124 paint->
drawLine(0,0,0,viewport()->height());
00125 paint->
setPen(colorGroup().background().dark(120));
00126 paint->
drawLine(1,0,1,viewport()->height());
00127
00128
00129 }
00130
else
00131
if (m_position==KMultiTabBar::Left)
00132 {
00133 paint->
setPen(colorGroup().light());
00134 paint->
drawLine(23,0,23,viewport()->height());
00135 paint->
drawLine(22,0,22,viewport()->height());
00136
00137 paint->
setPen(colorGroup().shadow());
00138 paint->
drawLine(0,0,0,viewport()->height());
00139 }
00140
else
00141
if (m_position==KMultiTabBar::Bottom)
00142 {
00143 paint->
setPen(colorGroup().shadow());
00144 paint->
drawLine(0,0,viewport()->width(),0);
00145 paint->
setPen(colorGroup().background().dark(120));
00146 paint->
drawLine(0,1,viewport()->width(),1);
00147 }
00148
else
00149 {
00150 paint->
setPen(colorGroup().light());
00151 paint->
drawLine(0,23,viewport()->width(),23);
00152 paint->
drawLine(0,22,viewport()->width(),22);
00153
00154
00155
00156
00157 }
00158
00159
00160 }
00161
00162
void KMultiTabBarInternal::contentsMousePressEvent(
QMouseEvent *ev)
00163 {
00164 ev->
ignore();
00165 }
00166
00167
void KMultiTabBarInternal::mousePressEvent(
QMouseEvent *ev)
00168 {
00169 ev->
ignore();
00170 }
00171
00172
00173
#define CALCDIFF(m_tabs,diff,i) if (m_lines>(int)lines) {\
00174
\
00175 uint ulen=0;\
00176 diff=0; \
00177 for (uint i2=i;i2<tabCount;i2++) {\
00178 uint l1=m_tabs.at(i2)->neededSize();\
00179 if ((ulen+l1)>space){\
00180 if (ulen==0) diff=0;\
00181 else diff=((float)(space-ulen))/(i2-i);\
00182 break;\
00183 }\
00184 ulen+=l1;\
00185 }\
00186 } else {diff=0; }
00187
00188
00189
void KMultiTabBarInternal::resizeEvent(
QResizeEvent *ev) {
00190
00191
00192
00193
if (ev) QScrollView::resizeEvent(ev);
00194
00195
if ( (m_style==KMultiTabBar::KDEV3) ||
00196 (m_style==KMultiTabBar::KDEV3ICON) ){
00197 box->setGeometry(0,0,width(),height());
00198
int lines=1;
00199 uint space;
00200
float tmp=0;
00201
if ((m_position==KMultiTabBar::Bottom) || (m_position==KMultiTabBar::Top))
00202 space=width();
00203
else
00204 space=height();
00205
00206
int cnt=0;
00207
00208
const uint tabCount=m_tabs.count();
00209
for (uint i=0;i<tabCount;i++) {
00210 cnt++;
00211 tmp+=m_tabs.at(i)->neededSize();
00212
if (tmp>space) {
00213
if (cnt>1)i--;
00214
else if (i==(tabCount-1))
break;
00215 cnt=0;
00216 tmp=0;
00217 lines++;
00218 }
00219 }
00220
00221
float diff=0;
00222 cnt=0;
00223
00224
if ((m_position==KMultiTabBar::Bottom) || (m_position==KMultiTabBar::Top)) {
00225
00226 setFixedHeight(lines*24);
00227 box->setFixedHeight(lines*24);
00228 m_lines=height()/24-1;
00229 lines=0;
00230 CALCDIFF(m_tabs,diff,0)
00231 tmp=-diff;
00232
00233
00234 for (uint i=0;i<tabCount;i++) {
00235
KMultiTabBarTab *tab=m_tabs.at(i);
00236 cnt++;
00237 tmp+=tab->
neededSize()+diff;
00238
if (tmp>space) {
00239
00240
if (cnt>1) {
00241 CALCDIFF(m_tabs,diff,i)
00242 i--;
00243 }
00244 else {
00245
00246
kdDebug()<<
"diff="<<diff<<
endl;
00247 tab->removeEventFilter(
this);
00248 tab->move(NEARBYINT(tmp-tab->
neededSize()),lines*24);
00249
00250 tab->setFixedWidth(NEARBYINT(tmp+diff)-tab->x());;
00251 tab->installEventFilter(
this);
00252 CALCDIFF(m_tabs,diff,(i+1))
00253
00254 }
00255 tmp=-diff;
00256 cnt=0;
00257 lines++;
00258
00259
00260 }
else {
00261
00262
00263 tab->removeEventFilter(
this);
00264 tab->move(NEARBYINT(tmp-tab->
neededSize()),lines*24);
00265 tab->setFixedWidth(NEARBYINT(tmp+diff)-tab->x());;
00266
00267
00268 tab->installEventFilter(
this);
00269
00270 }
00271 }
00272 }
00273
else {
00274 setFixedWidth(lines*24);
00275 box->setFixedWidth(lines*24);
00276 m_lines=lines=width()/24;
00277 lines=0;
00278 CALCDIFF(m_tabs,diff,0)
00279 tmp=-diff;
00280
00281 for (uint i=0;i<tabCount;i++) {
00282
KMultiTabBarTab *tab=m_tabs.at(i);
00283 cnt++;
00284 tmp+=tab->
neededSize()+diff;
00285
if (tmp>space) {
00286
if (cnt>1) {
00287 CALCDIFF(m_tabs,diff,i);
00288 tmp=-diff;
00289 i--;
00290 }
00291
else {
00292 tab->removeEventFilter(
this);
00293 tab->move(lines*24,NEARBYINT(tmp-tab->
neededSize()));
00294 tab->setFixedHeight(NEARBYINT(tmp+diff)-tab->y());;
00295 tab->installEventFilter(
this);
00296 }
00297 cnt=0;
00298 tmp=-diff;
00299 lines++;
00300 }
else {
00301 tab->removeEventFilter(
this);
00302 tab->move(lines*24,NEARBYINT(tmp-tab->
neededSize()));
00303 tab->setFixedHeight(NEARBYINT(tmp+diff)-tab->y());;
00304 tab->installEventFilter(
this);
00305 }
00306 }
00307 }
00308
00309
00310
00311 }
else {
00312
int size=0;
00313
for (
int i=0;i<(
int)m_tabs.count();i++)
00314 size+=(m_barMode==KMultiTabBar::Vertical?m_tabs.at(i)->height():m_tabs.at(i)->width());
00315
if ((m_position==KMultiTabBar::Bottom) || (m_position==KMultiTabBar::Top))
00316 box->setGeometry(0,0,size,height());
00317
else box->setGeometry(0,0,width(),size);
00318
00319 }
00320 }
00321
00322
00323
void KMultiTabBarInternal::showActiveTabTexts(
bool show)
00324 {
00325 m_showActiveTabTexts=show;
00326 }
00327
00328
00329
KMultiTabBarTab* KMultiTabBarInternal::tab(
int id)
const
00330
{
00331
for (
QPtrListIterator<KMultiTabBarTab> it(m_tabs);it.
current();++it){
00332
if (it.
current()->id()==
id)
return it.
current();
00333 }
00334
return 0;
00335 }
00336
00337
bool KMultiTabBarInternal::eventFilter(
QObject *,
QEvent *e) {
00338
if (e->
type()==QEvent::Resize) resizeEvent(0);
00339
return false;
00340 }
00341
00342
int KMultiTabBarInternal::appendTab(
const QPixmap &pic ,
int id,
const QString& text)
00343 {
00344
KMultiTabBarTab *tab;
00345 m_tabs.append(tab=
new KMultiTabBarTab(pic,text,
id,box,m_position,m_style));
00346 tab->installEventFilter(
this);
00347 tab->
showActiveTabText(m_showActiveTabTexts);
00348
00349
if (m_style==KMultiTabBar::KONQSBC)
00350 {
00351
if (m_expandedTabSize<tab->
neededSize()) {
00352 m_expandedTabSize=tab->
neededSize();
00353
for (uint i=0;i<m_tabs.count();i++)
00354 m_tabs.at(i)->setSize(m_expandedTabSize);
00355
00356 }
else tab->
setSize(m_expandedTabSize);
00357 }
else tab->
updateState();
00358 tab->show();
00359 resizeEvent(0);
00360
return 0;
00361 }
00362
00363
void KMultiTabBarInternal::removeTab(
int id)
00364 {
00365
for (uint pos=0;pos<m_tabs.count();pos++)
00366 {
00367
if (m_tabs.at(pos)->id()==
id)
00368 {
00369 m_tabs.remove(pos);
00370 resizeEvent(0);
00371
break;
00372 }
00373 }
00374 }
00375
00376
void KMultiTabBarInternal::setPosition(
enum KMultiTabBar::KMultiTabBarPosition pos)
00377 {
00378 m_position=pos;
00379
for (uint i=0;i<m_tabs.count();i++)
00380 m_tabs.at(i)->setTabsPosition(m_position);
00381 viewport()->repaint();
00382 }
00383
00384
00385 KMultiTabBarButton::KMultiTabBarButton(
const QPixmap& pic,
const QString& text,
QPopupMenu *popup,
00386
int id,QWidget *parent,KMultiTabBar::KMultiTabBarPosition pos,KMultiTabBar::KMultiTabBarStyle style)
00387 :
QPushButton(
QIconSet(),text,parent),m_style(style)
00388 {
00389 setIconSet(pic);
00390 setText(text);
00391 m_position=pos;
00392
if (popup) setPopup(popup);
00393 setFlat(
true);
00394 setFixedHeight(24);
00395 setFixedWidth(24);
00396 m_id=
id;
00397
QToolTip::add(
this,text);
00398 connect(
this,SIGNAL(clicked()),
this,SLOT(slotClicked()));
00399 }
00400
00401 KMultiTabBarButton::KMultiTabBarButton(
const QString& text,
QPopupMenu *popup,
00402
int id,QWidget *parent,KMultiTabBar::KMultiTabBarPosition pos,KMultiTabBar::KMultiTabBarStyle style)
00403 :
QPushButton(
QIconSet(),text,parent),m_style(style)
00404 {
00405 setText(text);
00406 m_position=pos;
00407
if (popup) setPopup(popup);
00408 setFlat(
true);
00409 setFixedHeight(24);
00410 setFixedWidth(24);
00411 m_id=
id;
00412
QToolTip::add(
this,text);
00413 connect(
this,SIGNAL(clicked()),
this,SLOT(slotClicked()));
00414 }
00415
00416 KMultiTabBarButton::~KMultiTabBarButton() {
00417 }
00418
00419
int KMultiTabBarButton::id()
const{
00420
return m_id;
00421 }
00422
00423 void KMultiTabBarButton::setText(
const QString& text)
00424 {
00425 QPushButton::setText(text);
00426 m_text=text;
00427 QToolTip::add(
this,text);
00428 }
00429
00430
void KMultiTabBarButton::slotClicked()
00431 {
00432 emit
clicked(m_id);
00433 }
00434
00435 void KMultiTabBarButton::setPosition(KMultiTabBar::KMultiTabBarPosition pos)
00436 {
00437 m_position=pos;
00438 repaint();
00439 }
00440
00441 void KMultiTabBarButton::setStyle(KMultiTabBar::KMultiTabBarStyle style)
00442 {
00443 m_style=style;
00444 repaint();
00445 }
00446
00447
void KMultiTabBarButton::hideEvent(
QHideEvent* he) {
00448 QPushButton::hideEvent(he);
00449
KMultiTabBar *tb=dynamic_cast<KMultiTabBar*>(parentWidget());
00450
if (tb) tb->
updateSeparator();
00451 }
00452
00453
void KMultiTabBarButton::showEvent(
QShowEvent* he) {
00454 QPushButton::showEvent(he);
00455
KMultiTabBar *tb=dynamic_cast<KMultiTabBar*>(parentWidget());
00456
if (tb) tb->
updateSeparator();
00457 }
00458
00459
00460
QSize KMultiTabBarButton::sizeHint()
const
00461
{
00462 constPolish();
00463
00464
int w = 0, h = 0;
00465
00466
00467
#ifndef QT_NO_ICONSET
00468
if (
iconSet() && !
iconSet()->isNull() ) {
00469
int iw =
iconSet()->pixmap( QIconSet::Small, QIconSet::Normal ).width() + 4;
00470
int ih =
iconSet()->pixmap( QIconSet::Small, QIconSet::Normal ).height();
00471 w += iw;
00472 h = QMAX( h, ih );
00473 }
00474
#endif
00475
if ( isMenuButton() )
00476 w += style().pixelMetric(QStyle::PM_MenuButtonIndicator,
this);
00477
00478
if (
pixmap() ) {
00479
QPixmap *pm = (
QPixmap *)
pixmap();
00480 w += pm->
width();
00481 h += pm->
height();
00482 }
else {
00483
QString s(
text() );
00484
bool empty = s.
isEmpty();
00485
if ( empty )
00486 s =
QString::fromLatin1(
"XXXX");
00487
QFontMetrics fm = fontMetrics();
00488
QSize sz = fm.
size( ShowPrefix, s );
00489
if(!empty || !w)
00490 w += sz.
width();
00491
if(!empty || !h)
00492 h = QMAX(h, sz.
height());
00493 }
00494
00495
return (style().sizeFromContents(QStyle::CT_ToolButton,
this,
QSize(w, h)).
00496 expandedTo(QApplication::globalStrut()));
00497 }
00498
00499
00500 KMultiTabBarTab::KMultiTabBarTab(
const QPixmap& pic,
const QString& text,
00501
int id,QWidget *parent,KMultiTabBar::KMultiTabBarPosition pos,
00502 KMultiTabBar::KMultiTabBarStyle style)
00503 :
KMultiTabBarButton(text,0,id,parent,pos,style),
00504 m_showActiveTabText(false)
00505 {
00506 d=
new KMultiTabBarTabPrivate();
00507 setIcon(pic);
00508 m_expandedSize=24;
00509
setToggleButton(
true);
00510 }
00511
00512 KMultiTabBarTab::~KMultiTabBarTab() {
00513
delete d;
00514 }
00515
00516
00517
void KMultiTabBarTab::setTabsPosition(KMultiTabBar::KMultiTabBarPosition pos)
00518 {
00519
if ((pos!=m_position) && ((pos==KMultiTabBar::Left) || (pos==KMultiTabBar::Right))) {
00520
if (!d->pix.isNull()) {
00521
QWMatrix temp;
00522 temp.
rotate(180);
00523 d->pix=d->pix.xForm(temp);
00524
setIconSet(d->pix);
00525 }
00526 }
00527
00528
setPosition(pos);
00529
00530 }
00531
00532
void KMultiTabBarTab::setIcon(
const QString& icon)
00533 {
00534
QPixmap pic=SmallIcon(icon);
00535 setIcon(pic);
00536 }
00537
00538
void KMultiTabBarTab::setIcon(
const QPixmap& icon)
00539 {
00540
00541
if (m_style!=KMultiTabBar::KDEV3) {
00542
if ((m_position==KMultiTabBar::Left) || (m_position==KMultiTabBar::Right)) {
00543
QWMatrix rotateMatrix;
00544
if (m_position==KMultiTabBar::Left)
00545 rotateMatrix.
rotate(90);
00546
else
00547 rotateMatrix.
rotate(-90);
00548
QPixmap pic=icon.
xForm(rotateMatrix);
00549 d->pix=pic;
00550
setIconSet(pic);
00551 }
else setIconSet(icon);
00552 }
00553 }
00554
00555
void KMultiTabBarTab::slotClicked()
00556 {
00557 updateState();
00558 KMultiTabBarButton::slotClicked();
00559 }
00560
00561 void KMultiTabBarTab::setState(
bool b)
00562 {
00563 setOn(b);
00564 updateState();
00565 }
00566
00567
void KMultiTabBarTab::updateState()
00568 {
00569
00570
if (m_style!=KMultiTabBar::KONQSBC) {
00571
if ((m_style==KMultiTabBar::KDEV3) || (m_style==KMultiTabBar::KDEV3ICON) || (
isOn())) {
00572 QPushButton::setText(m_text);
00573 }
else {
00574
kdDebug()<<
"KMultiTabBarTab::updateState(): setting text to an empty QString***************"<<
endl;
00575
QPushButton::setText(QString::null);
00576 }
00577
00578
if ((m_position==KMultiTabBar::Right || m_position==KMultiTabBar::Left)) {
00579 setFixedWidth(24);
00580
if ((m_style==KMultiTabBar::KDEV3) || (m_style==KMultiTabBar::KDEV3ICON) || (
isOn())) {
00581 setFixedHeight(KMultiTabBarButton::sizeHint().width());
00582 }
else setFixedHeight(36);
00583 }
else {
00584 setFixedHeight(24);
00585
if ((m_style==KMultiTabBar::KDEV3) || (m_style==KMultiTabBar::KDEV3ICON) || (
isOn())) {
00586 setFixedWidth(KMultiTabBarButton::sizeHint().width());
00587 }
else setFixedWidth(36);
00588 }
00589 }
else {
00590
if ((!
isOn()) || (!m_showActiveTabText))
00591 {
00592 setFixedWidth(24);
00593 setFixedHeight(24);
00594
return;
00595 }
00596
if ((m_position==KMultiTabBar::Right || m_position==KMultiTabBar::Left))
00597 setFixedHeight(m_expandedSize);
00598
else
00599 setFixedWidth(m_expandedSize);
00600 }
00601
QApplication::sendPostedEvents(0,QEvent::Paint | QEvent::Move | QEvent::Resize | QEvent::LayoutHint);
00602
QApplication::flush();
00603 }
00604
00605
int KMultiTabBarTab::neededSize()
00606 {
00607
return (((m_style!=KMultiTabBar::KDEV3)?24:0)+
QFontMetrics(
QFont()).width(m_text)+6);
00608 }
00609
00610
void KMultiTabBarTab::setSize(
int size)
00611 {
00612 m_expandedSize=size;
00613 updateState();
00614 }
00615
00616 void KMultiTabBarTab::showActiveTabText(
bool show)
00617 {
00618 m_showActiveTabText=show;
00619 }
00620
00621
void KMultiTabBarTab::drawButtonLabel(
QPainter *p) {
00622 drawButton(p);
00623 }
00624
void KMultiTabBarTab::drawButton(
QPainter *paint)
00625 {
00626
if (m_style!=KMultiTabBar::KONQSBC)
drawButtonStyled(paint);
00627
else drawButtonClassic(paint);
00628 }
00629
00630 void KMultiTabBarTab::drawButtonStyled(
QPainter *paint) {
00631
00632
QSize sh;
00633
const int width = 36;
00634
const int height = 24;
00635
if ((m_style==KMultiTabBar::KDEV3) || (m_style==KMultiTabBar::KDEV3ICON) || (
isOn())) {
00636
if ((m_position==KMultiTabBar::Left) || (m_position==KMultiTabBar::Right))
00637 sh=
QSize(this->height(),this->width());
00638
else sh=QSize(this->width(),this->height());
00639 }
00640
else
00641 sh=
QSize(width,height);
00642
00643
QPixmap pixmap( sh.
width(),height);
00644 pixmap.
fill(eraseColor());
00645
QPainter painter(&pixmap);
00646
00647
00648 QStyle::SFlags st=QStyle::Style_Default;
00649
00650 st|=QStyle::Style_Enabled;
00651
00652
if (
isOn()) st|=QStyle::Style_On;
00653
00654 style().drawControl(QStyle::CE_PushButton,&painter,
this,
QRect(0,0,pixmap.
width(),pixmap.
height()), colorGroup(),st);
00655 style().drawControl(QStyle::CE_PushButtonLabel,&painter,
this,
QRect(0,0,pixmap.
width(),pixmap.
height()), colorGroup(),st);
00656
00657
switch (m_position) {
00658
case KMultiTabBar::Left:
00659 paint->
rotate(-90);
00660 paint->
drawPixmap(1-pixmap.
width(),0,pixmap);
00661
break;
00662
case KMultiTabBar::Right:
00663 paint->
rotate(90);
00664 paint->
drawPixmap(0,1-pixmap.
height(),pixmap);
00665
break;
00666
00667
default:
00668 paint->
drawPixmap(0,0,pixmap);
00669
break;
00670 }
00671
00672
00673
00674
00675 }
00676
00677
void KMultiTabBarTab::drawButtonClassic(
QPainter *paint)
00678 {
00679
QPixmap pixmap;
00680
if (
iconSet())
00681 pixmap =
iconSet()->pixmap( QIconSet::Small, QIconSet::Normal );
00682 paint->
fillRect(0, 0, 24, 24, colorGroup().background());
00683
00684
if (!
isOn())
00685 {
00686
00687
if (m_position==KMultiTabBar::Right)
00688 {
00689 paint->
fillRect(0,0,21,21,
QBrush(colorGroup().background()));
00690
00691 paint->
setPen(colorGroup().background().dark(150));
00692 paint->
drawLine(0,22,23,22);
00693
00694 paint->
drawPixmap(12-pixmap.
width()/2,12-pixmap.
height()/2,pixmap);
00695
00696 paint->
setPen(colorGroup().shadow());
00697 paint->
drawLine(0,0,0,23);
00698 paint->
setPen(colorGroup().background().dark(120));
00699 paint->
drawLine(1,0,1,23);
00700
00701 }
00702
else
00703
if ((m_position==KMultiTabBar::Bottom) || (m_position==KMultiTabBar::Top))
00704 {
00705 paint->
fillRect(0,1,23,22,
QBrush(colorGroup().background()));
00706
00707 paint->
drawPixmap(12-pixmap.
width()/2,12-pixmap.
height()/2,pixmap);
00708
00709 paint->
setPen(colorGroup().background().dark(120));
00710 paint->
drawLine(23,0,23,23);
00711
00712
00713 paint->
setPen(colorGroup().light());
00714 paint->
drawLine(0,22,23,22);
00715 paint->
drawLine(0,23,23,23);
00716 paint->
setPen(colorGroup().shadow());
00717 paint->
drawLine(0,0,23,0);
00718 paint->
setPen(colorGroup().background().dark(120));
00719 paint->
drawLine(0,1,23,1);
00720
00721 }
00722
else
00723 {
00724 paint->
setPen(colorGroup().background().dark(120));
00725 paint->
drawLine(0,23,23,23);
00726 paint->
fillRect(0,0,23,21,
QBrush(colorGroup().background()));
00727 paint->
drawPixmap(12-pixmap.
width()/2,12-pixmap.
height()/2,pixmap);
00728
00729 paint->
setPen(colorGroup().light());
00730 paint->
drawLine(23,0,23,23);
00731 paint->
drawLine(22,0,22,23);
00732
00733 paint->
setPen(colorGroup().shadow());
00734 paint->
drawLine(0,0,0,23);
00735
00736 }
00737
00738
00739 }
00740
else
00741 {
00742
if (m_position==KMultiTabBar::Right)
00743 {
00744 paint->
setPen(colorGroup().shadow());
00745 paint->
drawLine(0,height()-1,23,height()-1);
00746 paint->
drawLine(0,height()-2,23,height()-2);
00747 paint->
drawLine(23,0,23,height()-1);
00748 paint->
drawLine(22,0,22,height()-1);
00749 paint->
fillRect(0,0,21,height()-3,
QBrush(colorGroup().light()));
00750 paint->
drawPixmap(10-pixmap.
width()/2,10-pixmap.
height()/2,pixmap);
00751
00752
if (m_showActiveTabText)
00753 {
00754
if (height()<25+4)
return;
00755
00756
QPixmap tpixmap(height()-25-3, width()-2);
00757
QPainter painter(&tpixmap);
00758
00759 painter.
fillRect(0,0,tpixmap.
width(),tpixmap.
height(),
QBrush(colorGroup().light()));
00760
00761 painter.
setPen(colorGroup().
text());
00762 painter.
drawText(0,+width()/2+
QFontMetrics(
QFont()).height()/2,m_text);
00763
00764 paint->
rotate(90);
00765
kdDebug()<<
"tpixmap.width:"<<tpixmap.
width()<<
endl;
00766 paint->
drawPixmap(25,-tpixmap.
height()+1,tpixmap);
00767 }
00768
00769 }
00770
else
00771
if (m_position==KMultiTabBar::Top)
00772 {
00773 paint->
fillRect(0,0,width()-1,23,
QBrush(colorGroup().light()));
00774 paint->
drawPixmap(10-pixmap.
width()/2,10-pixmap.
height()/2,pixmap);
00775
if (m_showActiveTabText)
00776 {
00777 paint->
setPen(colorGroup().
text());
00778 paint->
drawText(25,height()/2+
QFontMetrics(
QFont()).height()/2,m_text);
00779 }
00780 }
00781
else
00782
if (m_position==KMultiTabBar::Bottom)
00783 {
00784 paint->
setPen(colorGroup().shadow());
00785 paint->
drawLine(0,23,width()-1,23);
00786 paint->
drawLine(0,22,width()-1,22);
00787 paint->
fillRect(0,0,width()-1,21,
QBrush(colorGroup().light()));
00788 paint->
drawPixmap(10-pixmap.
width()/2,10-pixmap.
height()/2,pixmap);
00789
if (m_showActiveTabText)
00790 {
00791 paint->
setPen(colorGroup().
text());
00792 paint->
drawText(25,height()/2+
QFontMetrics(
QFont()).height()/2,m_text);
00793 }
00794
00795 }
00796
else
00797 {
00798
00799
00800 paint->
setPen(colorGroup().shadow());
00801 paint->
drawLine(0,height()-1,23,height()-1);
00802 paint->
drawLine(0,height()-2,23,height()-2);
00803 paint->
fillRect(0,0,23,height()-3,
QBrush(colorGroup().light()));
00804 paint->
drawPixmap(10-pixmap.
width()/2,10-pixmap.
height()/2,pixmap);
00805
if (m_showActiveTabText)
00806 {
00807
00808
if (height()<25+4)
return;
00809
00810
QPixmap tpixmap(height()-25-3, width()-2);
00811
QPainter painter(&tpixmap);
00812
00813 painter.
fillRect(0,0,tpixmap.
width(),tpixmap.
height(),
QBrush(colorGroup().light()));
00814
00815 painter.
setPen(colorGroup().
text());
00816 painter.
drawText(tpixmap.
width()-
QFontMetrics(
QFont()).width(m_text),+width()/2+
QFontMetrics(
QFont()).height()/2,m_text);
00817
00818 paint->
rotate(-90);
00819
kdDebug()<<
"tpixmap.width:"<<tpixmap.
width()<<
endl;
00820
00821 paint->
drawPixmap(-24-tpixmap.
width(),2,tpixmap);
00822
00823 }
00824
00825 }
00826
00827 }
00828 }
00829
00830
00831
00832
00833
00834
00835
00836 KMultiTabBar::KMultiTabBar(KMultiTabBarMode bm, QWidget *parent,
const char *name):QWidget(parent,
name)
00837 {
00838 m_buttons.setAutoDelete(
false);
00839
if (bm==Vertical)
00840 {
00841 m_l=
new QVBoxLayout(
this);
00842 setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Expanding,
true);
00843
00844 }
00845
else
00846 {
00847 m_l=
new QHBoxLayout(
this);
00848 setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed,
true);
00849
00850 }
00851 m_l->setMargin(0);
00852 m_l->setAutoAdd(
false);
00853
00854 m_internal=
new KMultiTabBarInternal(
this,bm);
00855
setPosition((bm==KMultiTabBar::Vertical)?KMultiTabBar::Right:KMultiTabBar::Bottom);
00856
setStyle(VSNET);
00857
00858
00859 m_l->insertWidget(0,m_internal);
00860 m_l->insertWidget(0,m_btnTabSep=
new QFrame(
this));
00861 m_btnTabSep->setFixedHeight(4);
00862 m_btnTabSep->setFrameStyle(QFrame::Panel | QFrame::Sunken);
00863 m_btnTabSep->setLineWidth(2);
00864 m_btnTabSep->hide();
00865
00866 updateGeometry();
00867 }
00868
00869 KMultiTabBar::~KMultiTabBar() {
00870 }
00871
00872
00873
00874
00875
00876
00877
00878 int KMultiTabBar::appendButton(
const QPixmap &pic ,
int id,
QPopupMenu *popup,
const QString&)
00879 {
00880
KMultiTabBarButton *btn;
00881 m_buttons.
append(btn=
new KMultiTabBarButton(pic,QString::null,
00882 popup,
id,
this,m_position,m_internal->m_style));
00883 m_l->
insertWidget(0,btn);
00884 btn->show();
00885 m_btnTabSep->show();
00886
return 0;
00887 }
00888
00889
void KMultiTabBar::updateSeparator() {
00890
bool hideSep=
true;
00891
for (
QPtrListIterator<KMultiTabBarButton> it(m_buttons);it.
current();++it){
00892
if (it.
current()->isVisibleTo(
this)) {
00893 hideSep=
false;
00894
break;
00895 }
00896 }
00897
if (hideSep) m_btnTabSep->hide();
00898
else m_btnTabSep->show();
00899
00900 }
00901
00902 int KMultiTabBar::appendTab(
const QPixmap &pic ,
int id ,
const QString& text)
00903 {
00904 m_internal->appendTab(pic,
id,text);
00905
return 0;
00906 }
00907
00908 KMultiTabBarButton*
KMultiTabBar::button(
int id)
const
00909
{
00910
for (
QPtrListIterator<KMultiTabBarButton> it(m_buttons);it.
current();++it){
00911
if (it.
current()->id()==
id)
return it.
current();
00912 }
00913
return 0;
00914 }
00915
00916 KMultiTabBarTab*
KMultiTabBar::tab(
int id)
const
00917
{
00918
return m_internal->tab(
id);
00919 }
00920
00921
00922
00923 void KMultiTabBar::removeButton(
int id)
00924 {
00925
for (uint pos=0;pos<m_buttons.
count();pos++)
00926 {
00927
if (m_buttons.
at(pos)->id()==
id)
00928 {
00929 m_buttons.
take(pos)->deleteLater();
00930
break;
00931 }
00932 }
00933
if (m_buttons.
count()==0) m_btnTabSep->hide();
00934 }
00935
00936 void KMultiTabBar::removeTab(
int id)
00937 {
00938 m_internal->removeTab(
id);
00939 }
00940
00941 void KMultiTabBar::setTab(
int id,
bool state)
00942 {
00943
KMultiTabBarTab *ttab=tab(
id);
00944
if (ttab)
00945 {
00946 ttab->
setState(state);
00947 }
00948 }
00949
00950 bool KMultiTabBar::isTabRaised(
int id)
const
00951
{
00952
KMultiTabBarTab *ttab=tab(
id);
00953
if (ttab)
00954 {
00955
return ttab->
isOn();
00956 }
00957
00958
return false;
00959 }
00960
00961
00962 void KMultiTabBar::showActiveTabTexts(
bool show)
00963 {
00964 m_internal->showActiveTabTexts(show);
00965 }
00966
00967 void KMultiTabBar::setStyle(KMultiTabBarStyle style)
00968 {
00969 m_internal->setStyle(style);
00970 }
00971
00972 void KMultiTabBar::setPosition(KMultiTabBarPosition pos)
00973 {
00974 m_position=pos;
00975 m_internal->setPosition(pos);
00976
for (uint i=0;i<m_buttons.
count();i++)
00977 m_buttons.
at(i)->setPosition(pos);
00978 }
00979
void KMultiTabBar::fontChange(
const QFont& )
00980 {
00981
for (uint i=0;i<
tabs()->count();i++)
00982
tabs()->at(i)->resize();
00983
repaint();
00984 }
00985
00986 QPtrList<KMultiTabBarTab>*
KMultiTabBar::tabs() {
return m_internal->tabs();}
00987 QPtrList<KMultiTabBarButton>*
KMultiTabBar::buttons() {
return &m_buttons;}
00988