26#include "kmultitabbar_p.h"
27#include "kmultitabbar.moc"
28#include "kmultitabbar_p.moc"
30#include <QtGui/QActionEvent>
31#include <QtGui/QLayout>
32#include <QtGui/QPainter>
33#include <QtGui/QFontMetrics>
34#include <QtGui/QStyle>
35#include <QStyleOptionButton>
39#include <QtGui/QApplication>
49class KMultiTabBarPrivate
52 class KMultiTabBarInternal *m_internal;
64 mainLayout=
new QVBoxLayout(
this);
66 mainLayout=
new QHBoxLayout(
this);
67 mainLayout->setMargin(0);
68 mainLayout->setSpacing(0);
69 mainLayout->addStretch();
70 setFrameStyle(NoFrame);
71 setBackgroundRole(QPalette::Background);
74KMultiTabBarInternal::~KMultiTabBarInternal()
83 for (
int i=0;i<m_tabs.count();i++)
84 m_tabs.at(i)->setStyle(m_style);
89void KMultiTabBarInternal::contentsMousePressEvent(QMouseEvent *ev)
94void KMultiTabBarInternal::mousePressEvent(QMouseEvent *ev)
101 QListIterator<KMultiTabBarTab*> it(m_tabs);
102 while (it.hasNext()) {
104 if (tab->
id()==
id)
return tab;
109int KMultiTabBarInternal::appendTab(
const QPixmap &pic,
int id,
const QString& text)
112 m_tabs.append(tab=
new KMultiTabBarTab(pic,text,
id,
this,m_position,m_style));
115 mainLayout->insertWidget(m_tabs.size()-1, tab);
120void KMultiTabBarInternal::removeTab(
int id)
122 for (
int pos=0;pos<m_tabs.count();pos++)
124 if (m_tabs.at(pos)->id()==
id)
127 delete m_tabs.takeAt(pos);
136 for (
int i=0;i<m_tabs.count();i++)
146 :
QPushButton(QIcon(pic), text, parent), m_id(id), d(0)
153 setFocusPolicy(Qt::NoFocus);
162 QPushButton::setText(text);
177 QPushButton::hideEvent(he);
183 QPushButton::showEvent(he);
189 QStyleOptionButton opt;
192 opt.iconSize = iconSize();
194 opt.features = QStyleOptionButton::Flat;
195 QPainter painter(
this);
196 style()->drawControl(QStyle::CE_PushButton, &opt, &painter,
this);
202KMultiTabBarTab::KMultiTabBarTab(
const QPixmap& pic,
const QString& text,
211 setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
231QPixmap KMultiTabBarTab::iconPixmap()
const
233 int iconSize = style()->pixelMetric(QStyle::PM_SmallIconSize, 0,
this);
234 return icon().pixmap(iconSize);
237void KMultiTabBarTab::initStyleOption(QStyleOptionToolButton* opt)
const
242 if (!icon().isNull()) {
243 opt->iconSize = iconPixmap().size();
248 if (shouldDrawText())
251 opt->state |= QStyle::State_AutoRaise;
253 opt->state |= QStyle::State_MouseOver | QStyle::State_Raised;
256 opt->state |= QStyle::State_Sunken | QStyle::State_On;
259 opt->toolButtonStyle = shouldDrawText() ? Qt::ToolButtonTextBesideIcon : Qt::ToolButtonIconOnly;
260 opt->subControls = QStyle::SC_ToolButton;
265 return computeSizeHint(shouldDrawText());
270 return computeSizeHint(
false);
273void KMultiTabBarTab::computeMargins(
int* hMargin,
int* vMargin)
const
277 QStyleOptionToolButton opt;
278 initStyleOption(&opt);
280 QPixmap iconPix = iconPixmap();
281 QSize trialSize = iconPix.size();
282 QSize expandSize = style()->sizeFromContents(QStyle::CT_ToolButton, &opt, trialSize,
this);
284 *hMargin = (expandSize.width() - trialSize.width())/2;
285 *vMargin = (expandSize.height() - trialSize.height())/2;
288QSize KMultiTabBarTab::computeSizeHint(
bool withText)
const
291 QStyleOptionToolButton opt;
292 initStyleOption(&opt);
294 int hMargin, vMargin;
295 computeMargins(&hMargin, &vMargin);
298 QPixmap iconPix = iconPixmap();
299 QSize size = iconPix.size();
303 QSize textSize = fontMetrics().size(0, text());
304 size.setHeight(qMax(size.height(), textSize.height()));
307 int majorMargin = isVertical() ? vMargin : hMargin;
308 int minorMargin = isVertical() ? hMargin : vMargin;
310 size.setWidth (size.width() + 2*majorMargin);
311 size.setHeight(size.height() + 2*minorMargin);
315 size.setWidth(size.width() + textSize.width() + majorMargin);
319 return QSize(size.height(), size.width());
326 setChecked(newState);
338 QPushButton::setIcon(icon);
341bool KMultiTabBarTab::shouldDrawText()
const
346bool KMultiTabBarTab::isVertical()
const
352 QPainter painter(
this);
354 QStyleOptionToolButton opt;
355 initStyleOption(&opt);
358 if (underMouse() || isChecked()) {
361 style()->drawComplexControl(QStyle::CC_ToolButton, &opt, &painter,
this);
364 int hMargin, vMargin;
365 computeMargins(&hMargin, &vMargin);
370 QPixmap icon = iconPixmap();
375 if (shouldDrawText()) {
377 iconRoom = icon.height() + 2*vMargin;
378 textRoom = height() - iconRoom - vMargin;
380 iconRoom = icon.width() + 2*hMargin;
381 textRoom = width() - iconRoom - hMargin;
384 t = painter.fontMetrics().elidedText(text(), Qt::ElideRight, textRoom);
388 if (t == QLatin1String(
"...") || t == QChar(0x2026))
395 if (!shouldDrawText()) {
396 style()->drawItemPixmap(&painter, rect(), Qt::AlignCenter | Qt::AlignVCenter, icon);
404 bool bottomIcon =
false;
405 bool rtl = layoutDirection() == Qt::RightToLeft;
416 labelArea = QRect(0, vMargin, width(), textRoom);
417 iconArea = QRect(0, vMargin + textRoom, width(), iconRoom);
419 labelArea = QRect(0, iconRoom, width(), textRoom);
420 iconArea = QRect(0, 0, width(), iconRoom);
425 labelArea = QRect(hMargin, 0, textRoom, height());
426 iconArea = QRect(hMargin + textRoom, 0, iconRoom, height());
428 labelArea = QRect(iconRoom, 0, textRoom, height());
429 iconArea = QRect(0, 0, iconRoom, height());
433 style()->drawItemPixmap(&painter, iconArea, Qt::AlignCenter | Qt::AlignVCenter, icon);
438 QRect labelPaintArea = labelArea;
443 labelPaintArea = QRect(0, 0, labelArea.height(), labelArea.width());
448 tr.translate(labelArea.x(), labelPaintArea.width() + labelArea.y());
451 tr.translate(labelPaintArea.height() + labelArea.x(), labelArea.y());
454 painter.setTransform(tr);
457 style()->drawItemText(&painter, labelPaintArea, Qt::AlignLeading | Qt::AlignVCenter,
458 palette(),
true, t, QPalette::ButtonText);
466 d(new KMultiTabBarPrivate)
470 d->m_l=
new QVBoxLayout(
this);
471 setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Expanding);
475 d->m_l=
new QHBoxLayout(
this);
476 setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
478 d->m_l->setMargin(0);
479 d->m_l->setSpacing(0);
481 d->m_internal=
new KMultiTabBarInternal(
this, pos);
484 d->m_l->insertWidget(0,d->m_internal);
485 d->m_l->insertWidget(0,d->m_btnTabSep=
new QFrame(
this));
486 d->m_btnTabSep->setFixedHeight(4);
487 d->m_btnTabSep->setFrameStyle(QFrame::Panel | QFrame::Sunken);
488 d->m_btnTabSep->setLineWidth(2);
489 d->m_btnTabSep->hide();
496 qDeleteAll( d->m_buttons );
497 d->m_buttons.clear();
505 btn->setFixedWidth(btn->height());
507 d->m_buttons.append(btn);
508 d->m_l->insertWidget(0,btn);
510 d->m_btnTabSep->show();
516 QListIterator<KMultiTabBarButton*> it(d->m_buttons);
517 while (it.hasNext()){
518 if (it.next()->isVisibleTo(
this)) {
524 d->m_btnTabSep->hide();
526 d->m_btnTabSep->show();
531 d->m_internal->appendTab(pic,
id,text);
537 QListIterator<KMultiTabBarButton*> it(d->m_buttons);
538 while ( it.hasNext() ) {
540 if ( button->
id() ==
id )
549 return d->m_internal->tab(
id);
554 for (
int pos=0;pos<d->m_buttons.count();pos++)
556 if (d->m_buttons.at(pos)->id()==
id)
558 d->m_buttons.takeAt(pos)->deleteLater();
563 if (d->m_buttons.count()==0)
564 d->m_btnTabSep->hide();
569 d->m_internal->removeTab(
id);
583 return ttab->isChecked();
590 d->m_internal->setStyle(style);
595 return d->m_internal->m_style;
601 d->m_internal->setPosition(pos);
606 return d->m_position;
Use KMultiTabBar::appendTab to append a tab, which creates a KMultiTabBarTab instance.
virtual void paintEvent(QPaintEvent *)
void setIcon(const QString &)
virtual QSize sizeHint() const
void setStyle(KMultiTabBar::KMultiTabBarStyle)
this is used internaly, but can be used by the user, if (s)he wants to It the according call of KMult...
void setState(bool state)
set the active state of the tab
virtual ~KMultiTabBarTab()
virtual QSize minimumSizeHint() const
void setPosition(KMultiTabBar::KMultiTabBarPosition)
this is used internaly, but can be used by the user, if (s)he wants to It the according call of KMult...
A Widget for horizontal and vertical tabs.
void setStyle(KMultiTabBarStyle style)
set the display style of the tabs
KMultiTabBarPosition position
KMultiTabBarStyle
The list of available styles for KMultiTabBar.
void removeTab(int id)
remove a tab with a given ID
KMultiTabBar(KMultiTabBarPosition pos, QWidget *parent=0)
int appendTab(const QPixmap &pic, int id=-1, const QString &text=QString())
append a new tab to the tab area.
void removeButton(int id)
remove a button with the given ID
void setTab(int id, bool state)
set a tab to "raised"
int appendButton(const QPixmap &pic, int id=-1, QMenu *popup=0, const QString ¬_used_yet=QString())
append a new button to the button area.
class KMultiTabBarButton * button(int id) const
get a pointer to a button within the button area identified by its ID
class KMultiTabBarTab * tab(int id) const
get a pointer to a tab within the tab area, identiifed by its ID
virtual void fontChange(const QFont &)
bool isTabRaised(int id) const
return the state of a tab, identified by its ID
KMultiTabBarStyle tabStyle
void setPosition(KMultiTabBarPosition pos)
set the real position of the widget.
QPixmap SmallIcon(const QString &name, int force_size, int state, const QStringList &overlays)