style the tabbar scroll buttons with plasma colors

svn path=/trunk/KDE/kdebase/workspace/libs/plasma/; revision=868202
This commit is contained in:
Marco Martin 2008-10-05 17:53:37 +00:00
parent 06e71be8c3
commit 0dc100928d
2 changed files with 103 additions and 38 deletions

View File

@ -30,6 +30,8 @@
#include <QMouseEvent>
#include <QPainter>
#include <QApplication>
#include <QStyleOption>
#include <QToolButton>
#include <QGradient>
#include <QLinearGradient>
@ -38,6 +40,9 @@
#include "plasma/theme.h"
#include "plasma/animator.h"
#include "plasma/panelsvg.h"
#include "plasma/paintutils.h"
#include "private/style.h"
namespace Plasma
@ -265,6 +270,44 @@ void NativeTabBar::paintEvent(QPaintEvent *event)
painter.drawText(textRect, Qt::AlignCenter | Qt::TextHideMnemonic, tabText(i));
}
QRect scrollButtonsRect;
foreach (QObject *child, children()) {
QToolButton *childWidget = qobject_cast<QToolButton *>(child);
if (childWidget) {
if (!childWidget->isVisible()) {
continue;
}
if (scrollButtonsRect.isValid()) {
scrollButtonsRect = scrollButtonsRect.united(childWidget->geometry());
} else {
scrollButtonsRect = childWidget->geometry();
}
}
}
if (scrollButtonsRect.isValid()) {
scrollButtonsRect.adjust(2, 4, -2, -4);
painter.save();
QColor background(Plasma::Theme::defaultTheme()->color(Theme::BackgroundColor));
background.setAlphaF(0.75);
painter.setRenderHint(QPainter::Antialiasing);
painter.fillPath(PaintUtils::roundedRectangle(scrollButtonsRect, 5), background);
painter.restore();
QStyleOption so;
so.initFrom(this);
so.palette.setColor(QPalette::ButtonText, Plasma::Theme::defaultTheme()->color(Theme::TextColor));
so.rect = scrollButtonsRect.adjusted(0, 0, -scrollButtonsRect.width()/2, 0);
style()->drawPrimitive(QStyle::PE_IndicatorArrowLeft, &so, &painter, this);
so.rect = scrollButtonsRect.adjusted(scrollButtonsRect.width()/2, 0, 0, 0);
style()->drawPrimitive(QStyle::PE_IndicatorArrowRight, &so, &painter, this);
}
}
void NativeTabBar::resizeEvent(QResizeEvent* event)

View File

@ -26,6 +26,8 @@
#include <QGraphicsProxyWidget>
#include <QGraphicsSceneWheelEvent>
#include <QIcon>
#include <QStyleOption>
#include <QPainter>
#include <KDebug>
#include <plasma/animator.h>
@ -35,12 +37,37 @@
namespace Plasma
{
class TabBarProxy : public QGraphicsProxyWidget
{
public:
TabBarProxy(QGraphicsWidget *parent)
: QGraphicsProxyWidget(parent)
{
native = new NativeTabBar();
native->setAttribute(Qt::WA_NoSystemBackground);
setWidget(native);
setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
}
void paint(QPainter *painter,
const QStyleOptionGraphicsItem *option,
QWidget *widget)
{
Q_UNUSED(option)
Q_UNUSED(widget)
//Don't paint the child widgets
static_cast<NativeTabBar *>(QGraphicsProxyWidget::widget())->render(painter, QPoint(0,0), QRegion(), 0);
}
NativeTabBar *native;
};
class TabBarPrivate
{
public:
TabBarPrivate(TabBar *parent)
: q(parent),
tabBar(0),
tabProxy(0),
currentIndex(0),
oldPage(0),
newPage(0),
@ -58,8 +85,7 @@ public:
void shapeChanged(const QTabBar::Shape shape);
TabBar *q;
NativeTabBar *tabBar;
QGraphicsProxyWidget *tabProxy;
TabBarProxy *tabProxy;
QGraphicsWidget *leftSpacer;
QGraphicsWidget *rightSpacer;
QList<QGraphicsWidget *> pages;
@ -142,7 +168,7 @@ void TabBarPrivate::shapeChanged(const QTabBar::Shape shape)
mainLayout->itemAt(1)->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
tabProxy->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
}
tabProxy->setPreferredSize(tabBar->sizeHint());
tabProxy->setPreferredSize(tabProxy->native->sizeHint());
}
@ -150,8 +176,7 @@ TabBar::TabBar(QGraphicsWidget *parent)
: QGraphicsWidget(parent),
d(new TabBarPrivate(this))
{
d->tabBar = new NativeTabBar();
d->tabBar->setAttribute(Qt::WA_NoSystemBackground);
d->tabProxy = new TabBarProxy(this);
d->mainLayout = new QGraphicsLinearLayout(Qt::Vertical);
d->tabBarLayout = new QGraphicsLinearLayout(Qt::Horizontal);
@ -159,9 +184,6 @@ TabBar::TabBar(QGraphicsWidget *parent)
d->mainLayout->addItem(d->tabBarLayout);
d->tabProxy = new QGraphicsProxyWidget(this);
d->tabProxy->setWidget(d->tabBar);
d->tabProxy->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
//tabBar is centered, so a stretch at begin one at the end
//FIXME: doesn't seem to be possible to remove stretches from a layout
@ -174,8 +196,8 @@ TabBar::TabBar(QGraphicsWidget *parent)
d->tabBarLayout->addItem(d->rightSpacer);
//d->tabBarLayout->setStretchFactor(d->tabProxy, 2);
connect(d->tabBar, SIGNAL(currentChanged(int)), this, SLOT(setCurrentIndex(int)));
connect(d->tabBar, SIGNAL(shapeChanged(QTabBar::Shape)), this, SLOT(shapeChanged(QTabBar::Shape)));
connect(d->tabProxy->native, SIGNAL(currentChanged(int)), this, SLOT(setCurrentIndex(int)));
connect(d->tabProxy->native, SIGNAL(shapeChanged(QTabBar::Shape)), this, SLOT(shapeChanged(QTabBar::Shape)));
connect(Plasma::Animator::self(), SIGNAL(movementFinished(QGraphicsItem*)), this, SLOT(slidingCompleted(QGraphicsItem*)));
}
@ -208,11 +230,11 @@ int TabBar::insertTab(int index, const QIcon &icon, const QString &label, QGraph
page->setEnabled(false);
}
d->tabProxy->setPreferredSize(d->tabBar->sizeHint());
d->tabProxy->setPreferredSize(d->tabProxy->native->sizeHint());
d->updateTabWidgetMode();
int actualIndex = d->tabBar->insertTab(index, icon, label);
d->tabProxy->setPreferredSize(d->tabBar->sizeHint());
int actualIndex = d->tabProxy->native->insertTab(index, icon, label);
d->tabProxy->setPreferredSize(d->tabProxy->native->sizeHint());
d->updateTabWidgetMode();
return actualIndex;
}
@ -234,17 +256,17 @@ int TabBar::addTab(const QString &label, QGraphicsLayoutItem *content)
int TabBar::currentIndex() const
{
return d->tabBar->currentIndex();
return d->tabProxy->native->currentIndex();
}
void TabBar::setCurrentIndex(int index)
{
if (index > d->tabBar->count() || d->tabBar->count() <= 1) {
if (index > d->tabProxy->native->count() || d->tabProxy->native->count() <= 1) {
return;
}
if (d->currentIndex != index) {
d->tabBar->setCurrentIndex(index);
d->tabProxy->native->setCurrentIndex(index);
}
d->mainLayout->removeAt(1);
@ -312,9 +334,9 @@ void TabBar::removeTab(int index)
return;
}
int currentIndex = d->tabBar->currentIndex();
int currentIndex = d->tabProxy->native->currentIndex();
d->tabBar->removeTab(index);
d->tabProxy->native->removeTab(index);
QGraphicsWidget *page = d->pages.takeAt(index);
if (index == currentIndex) {
@ -325,7 +347,7 @@ void TabBar::removeTab(int index)
page->deleteLater();
d->updateTabWidgetMode();
d->tabProxy->setPreferredSize(d->tabBar->sizeHint());
d->tabProxy->setPreferredSize(d->tabProxy->native->sizeHint());
}
void TabBar::setTabText(int index, const QString &label)
@ -334,66 +356,66 @@ void TabBar::setTabText(int index, const QString &label)
return;
}
d->tabBar->setTabText(index, label);
d->tabProxy->native->setTabText(index, label);
}
QString TabBar::tabText(int index) const
{
return d->tabBar->tabText(index);
return d->tabProxy->native->tabText(index);
}
void TabBar::setTabIcon(int index, const QIcon &icon)
{
d->tabBar->setTabIcon(index, icon);
d->tabProxy->native->setTabIcon(index, icon);
}
QIcon TabBar::tabIcon(int index) const
{
return d->tabBar->tabIcon(index);
return d->tabProxy->native->tabIcon(index);
}
void TabBar::setStyleSheet(const QString &stylesheet)
{
d->tabBar->setStyleSheet(stylesheet);
d->tabProxy->native->setStyleSheet(stylesheet);
}
QString TabBar::styleSheet() const
{
return d->tabBar->styleSheet();
return d->tabProxy->native->styleSheet();
}
QTabBar *TabBar::nativeWidget() const
{
return d->tabBar;
return d->tabProxy->native;
}
void TabBar::wheelEvent(QGraphicsSceneWheelEvent * event)
{
//FIXME: probably this would make more sense in NativeTabBar, but it works only here
if (d->tabBar->underMouse()) {
if (d->tabProxy->native->underMouse()) {
//Cycle tabs with the circular array tecnique
if (event->delta() < 0) {
int index = d->tabBar->currentIndex();
int index = d->tabProxy->native->currentIndex();
//search for an enabled tab
for (int i = 0; i < d->tabBar->count()-1; ++i) {
index = (index + 1) % d->tabBar->count();
if (d->tabBar->isTabEnabled(index)) {
for (int i = 0; i < d->tabProxy->native->count()-1; ++i) {
index = (index + 1) % d->tabProxy->native->count();
if (d->tabProxy->native->isTabEnabled(index)) {
break;
}
}
d->tabBar->setCurrentIndex(index);
d->tabProxy->native->setCurrentIndex(index);
} else {
int index = d->tabBar->currentIndex();
for (int i = 0; i < d->tabBar->count()-1; ++i) {
index = (d->tabBar->count() + index -1) % d->tabBar->count();
if (d->tabBar->isTabEnabled(index)) {
int index = d->tabProxy->native->currentIndex();
for (int i = 0; i < d->tabProxy->native->count()-1; ++i) {
index = (d->tabProxy->native->count() + index -1) % d->tabProxy->native->count();
if (d->tabProxy->native->isTabEnabled(index)) {
break;
}
}
d->tabBar->setCurrentIndex(index);
d->tabProxy->native->setCurrentIndex(index);
}
} else {
QGraphicsWidget::wheelEvent(event);