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.
1691 lines
29 KiB
1691 lines
29 KiB
/*
|
|
* Copyright (C) 2001 Rik Hemsley (rikkus) <rik@kde.org>
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Library General Public
|
|
* License as published by the Free Software Foundation; either
|
|
* version 2 of the License, or (at your option) any later version.
|
|
*
|
|
* This library is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* Library General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Library General Public License
|
|
* along with this library; see the file COPYING.LIB. If not, write to
|
|
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
|
* Boston, MA 02110-1301, USA.
|
|
*/
|
|
|
|
#ifndef INCLUDE_MENUITEM_DEF
|
|
#define INCLUDE_MENUITEM_DEF
|
|
#endif
|
|
|
|
#include <tqmenudata.h>
|
|
#include <tqpalette.h>
|
|
#include <tqbitmap.h>
|
|
#include <tqtabbar.h>
|
|
#include <tqpointarray.h>
|
|
#include <tqscrollbar.h>
|
|
#include <tqframe.h>
|
|
#include <tqpushbutton.h>
|
|
#include <tqdrawutil.h>
|
|
#include <tqpainter.h>
|
|
|
|
#include <kapplication.h>
|
|
#include <kdrawutil.h>
|
|
#include <klocale.h>
|
|
#include <kiconloader.h>
|
|
#include <kdebug.h>
|
|
|
|
#include "webstyle.h"
|
|
|
|
static const int _indicatorSize = 13;
|
|
static TQButton * _highlightedButton = 0;
|
|
static const int _scrollBarExtent = 14;
|
|
|
|
static TQFrame * _currentFrame = 0;
|
|
static int _savedFrameLineWidth;
|
|
static int _savedFrameMidLineWidth;
|
|
static ulong _savedFrameStyle;
|
|
|
|
static TQColor contrastingForeground(const TQColor & fg, const TQColor & bg)
|
|
{
|
|
int h, s, vbg, vfg;
|
|
|
|
bg.hsv(&h, &s, &vbg);
|
|
fg.hsv(&h, &s, &vfg);
|
|
|
|
int diff(vbg - vfg);
|
|
|
|
if ((diff > -72) && (diff < 72))
|
|
{
|
|
return (vbg < 128) ? Qt::white : Qt::black;
|
|
}
|
|
else
|
|
{
|
|
return fg;
|
|
}
|
|
}
|
|
|
|
// Gotta keep it separated.
|
|
|
|
static void
|
|
scrollBarControlsMetrics
|
|
(
|
|
const TQScrollBar * sb,
|
|
int sliderStart,
|
|
int /* sliderMin */,
|
|
int sliderMax,
|
|
int sliderLength,
|
|
int buttonDim,
|
|
TQRect & rSub,
|
|
TQRect & rAdd,
|
|
TQRect & rSubPage,
|
|
TQRect & rAddPage,
|
|
TQRect & rSlider
|
|
)
|
|
{
|
|
bool horizontal = sb->orientation() == TQScrollBar::Horizontal;
|
|
|
|
int len = horizontal ? sb->width() : sb->height();
|
|
|
|
int extent = horizontal ? sb->height() : sb->width();
|
|
|
|
TQColorGroup g = sb->tqcolorGroup();
|
|
|
|
if (sliderStart > sliderMax)
|
|
sliderStart = sliderMax;
|
|
|
|
int sliderEnd = sliderStart + sliderLength;
|
|
|
|
int addX, addY;
|
|
int subX, subY;
|
|
int subPageX, subPageY, subPageW, subPageH;
|
|
int addPageX, addPageY, addPageW, addPageH;
|
|
int sliderX, sliderY, sliderW, sliderH;
|
|
|
|
if (horizontal)
|
|
{
|
|
subY = 0;
|
|
addY = 0;
|
|
subX = 0;
|
|
addX = buttonDim;
|
|
|
|
subPageX = buttonDim * 2;
|
|
subPageY = 0;
|
|
subPageW = sliderStart - 1;
|
|
subPageH = extent;
|
|
|
|
addPageX = sliderEnd;
|
|
addPageY = 0;
|
|
addPageW = len - sliderEnd;
|
|
addPageH = extent;
|
|
|
|
sliderX = sliderStart;
|
|
sliderY = 0;
|
|
sliderW = sliderLength;
|
|
sliderH = extent;
|
|
}
|
|
else
|
|
{
|
|
subX = 0;
|
|
addX = 0;
|
|
subY = len - buttonDim * 2;
|
|
addY = len - buttonDim;
|
|
|
|
subPageX = 0;
|
|
subPageY = 0;
|
|
subPageW = extent;
|
|
subPageH = sliderStart;
|
|
|
|
addPageX = 0;
|
|
addPageY = sliderEnd;
|
|
addPageW = extent;
|
|
addPageH = subY - sliderEnd;
|
|
|
|
sliderX = 0;
|
|
sliderY = sliderStart;
|
|
sliderW = extent;
|
|
sliderH = sliderLength;
|
|
}
|
|
|
|
rSub .setRect( subX, subY, buttonDim, buttonDim);
|
|
rAdd .setRect( addX, addY, buttonDim, buttonDim);
|
|
rSubPage .setRect(subPageX, subPageY, subPageW, subPageH);
|
|
rAddPage .setRect(addPageX, addPageY, addPageW, addPageH);
|
|
rSlider .setRect( sliderX, sliderY, sliderW, sliderH);
|
|
}
|
|
|
|
// Rounded rects my way.
|
|
|
|
static void
|
|
drawFunkyRect
|
|
(
|
|
TQPainter * p,
|
|
int x,
|
|
int y,
|
|
int w,
|
|
int h,
|
|
bool small
|
|
)
|
|
{
|
|
p->translate(x, y);
|
|
|
|
if (small)
|
|
{
|
|
p->drawLine( 2, 0, w - 3, 0 );
|
|
p->drawLine( w - 1, 2, w - 1, h - 3 );
|
|
p->drawLine( w - 3, h - 1, 2, h - 1 );
|
|
p->drawLine( 0, h - 3, 0, 2 );
|
|
|
|
// Use an array of points so that there's only one round-trip with the
|
|
// X server.
|
|
|
|
QCOORD pointList[] =
|
|
{
|
|
1, 1,
|
|
w - 2, 1,
|
|
w - 2, h - 2,
|
|
1, h - 2
|
|
};
|
|
|
|
p->drawPoints(TQPointArray(4, pointList));
|
|
}
|
|
else
|
|
{
|
|
p->drawLine( 3, 0, w - 4, 0 );
|
|
p->drawLine( w - 1, 3, w - 1, h - 4 );
|
|
p->drawLine( w - 4, h - 1, 3, h - 1 );
|
|
p->drawLine( 0, h - 4, 0, 3 );
|
|
|
|
QCOORD pointList[] =
|
|
{
|
|
1, 2,
|
|
2, 1,
|
|
w - 3, 1,
|
|
w - 2, 2,
|
|
w - 2, h - 3,
|
|
w - 3, h - 2,
|
|
2, h - 2,
|
|
1, h - 3
|
|
};
|
|
|
|
p->drawPoints(TQPointArray(8, pointList));
|
|
}
|
|
|
|
p->translate(-x, -y);
|
|
}
|
|
|
|
WebStyle::WebStyle()
|
|
: KStyle()
|
|
{
|
|
setButtonDefaultIndicatorWidth(6);
|
|
setScrollBarExtent(_scrollBarExtent, _scrollBarExtent);
|
|
}
|
|
|
|
WebStyle::~WebStyle()
|
|
{
|
|
// Empty.
|
|
}
|
|
|
|
void
|
|
WebStyle::polish(TQApplication *)
|
|
{
|
|
// Empty.
|
|
}
|
|
|
|
void
|
|
WebStyle::polish(TQPalette &)
|
|
{
|
|
// Empty.
|
|
}
|
|
|
|
void
|
|
WebStyle::unPolish(TQApplication *)
|
|
{
|
|
// Empty.
|
|
}
|
|
|
|
void
|
|
WebStyle::polish(TQWidget * w)
|
|
{
|
|
if (w->inherits(TQPUSHBUTTON_OBJECT_NAME_STRING))
|
|
w->installEventFilter(this);
|
|
|
|
else if (w->inherits(TQGROUPBOX_OBJECT_NAME_STRING) || w->inherits(TQFRAME_OBJECT_NAME_STRING))
|
|
{
|
|
TQFrame * f(static_cast<TQFrame *>(w));
|
|
|
|
if (f->frameStyle() != TQFrame::NoFrame)
|
|
{
|
|
_currentFrame = f;
|
|
|
|
_savedFrameLineWidth = f->lineWidth();
|
|
_savedFrameMidLineWidth = f->midLineWidth();
|
|
_savedFrameStyle = f->frameStyle();
|
|
|
|
if (f->frameShape() == TQFrame::HLine || f->frameShape() == TQFrame::VLine)
|
|
{
|
|
f->setMidLineWidth(1);
|
|
f->setFrameStyle(f->frameShape() | TQFrame::Plain);
|
|
}
|
|
else
|
|
{
|
|
f->setLineWidth(1);
|
|
f->setFrameStyle(TQFrame::Box | TQFrame::Plain);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void
|
|
WebStyle::unPolish(TQWidget * w)
|
|
{
|
|
if (w->inherits(TQPUSHBUTTON_OBJECT_NAME_STRING))
|
|
w->removeEventFilter(this);
|
|
|
|
else if (w == _currentFrame)
|
|
{
|
|
TQFrame * f(static_cast<TQFrame *>(w));
|
|
|
|
f->setLineWidth(_savedFrameLineWidth);
|
|
f->setMidLineWidth(_savedFrameMidLineWidth);
|
|
f->setFrameStyle(_savedFrameStyle);
|
|
}
|
|
}
|
|
|
|
bool
|
|
WebStyle::eventFilter(TQObject * o, TQEvent * e)
|
|
{
|
|
TQPushButton * pb(static_cast<TQPushButton *>(o));
|
|
|
|
if (e->type() == TQEvent::Enter)
|
|
{
|
|
_highlightedButton = pb;
|
|
pb->tqrepaint(false);
|
|
}
|
|
else if (e->type() == TQEvent::Leave)
|
|
{
|
|
_highlightedButton = 0;
|
|
pb->tqrepaint(false);
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
void
|
|
WebStyle::drawButton
|
|
(
|
|
TQPainter * p,
|
|
int x,
|
|
int y,
|
|
int w,
|
|
int h,
|
|
const TQColorGroup & g,
|
|
bool sunken,
|
|
const TQBrush * fill
|
|
)
|
|
{
|
|
p->save();
|
|
|
|
if (sunken)
|
|
p->setPen(contrastingForeground(g.light(), g.button()));
|
|
else
|
|
p->setPen(contrastingForeground(g.mid(), g.button()));
|
|
|
|
p->setBrush(0 == fill ? NoBrush : *fill);
|
|
|
|
drawFunkyRect(p, x, y, w, h, true);
|
|
|
|
p->restore();
|
|
}
|
|
|
|
QRect
|
|
WebStyle::buttonRect(int x, int y, int w, int h)
|
|
{
|
|
return TQRect(x + 2, y + 2, w - 4, h - 4);
|
|
}
|
|
|
|
void
|
|
WebStyle::drawBevelButton
|
|
(
|
|
TQPainter * p,
|
|
int x,
|
|
int y,
|
|
int w,
|
|
int h,
|
|
const TQColorGroup & g,
|
|
bool sunken,
|
|
const TQBrush * fill
|
|
)
|
|
{
|
|
drawButton(p, x, y, w, h, g, sunken, fill);
|
|
}
|
|
|
|
void
|
|
WebStyle::drawPushButton(TQPushButton * b, TQPainter * p)
|
|
{
|
|
// Note: painter is already translated for us.
|
|
|
|
bool sunken(b->isDown() || b->isOn());
|
|
bool hl(_highlightedButton == b);
|
|
|
|
TQColor bg(b->tqcolorGroup().button());
|
|
|
|
p->save();
|
|
p->fillRect(b->rect(), b->tqcolorGroup().brush(TQColorGroup::Background));
|
|
|
|
if (b->isDefault())
|
|
{
|
|
TQColor c(hl ? b->tqcolorGroup().highlight() : b->tqcolorGroup().mid());
|
|
|
|
p->setPen(contrastingForeground(c, bg));
|
|
|
|
drawFunkyRect(p, 0, 0, b->width(), b->height(), false);
|
|
}
|
|
|
|
p->fillRect
|
|
(
|
|
4,
|
|
4,
|
|
b->width() - 8,
|
|
b->height() - 8,
|
|
b->tqcolorGroup().brush(TQColorGroup::Button)
|
|
);
|
|
|
|
if (b->isEnabled())
|
|
{
|
|
if (sunken)
|
|
{
|
|
p->setPen(contrastingForeground(b->tqcolorGroup().light(), bg));
|
|
}
|
|
else
|
|
{
|
|
if (hl)
|
|
p->setPen(contrastingForeground(b->tqcolorGroup().highlight(), bg));
|
|
else
|
|
p->setPen(contrastingForeground(b->tqcolorGroup().mid(), bg));
|
|
}
|
|
}
|
|
else
|
|
{
|
|
p->setPen(b->tqcolorGroup().button());
|
|
}
|
|
|
|
drawFunkyRect(p, 3, 3, b->width() - 6, b->height() - 6, true);
|
|
|
|
p->restore();
|
|
}
|
|
|
|
void
|
|
WebStyle::drawPushButtonLabel(TQPushButton * b, TQPainter * p)
|
|
{
|
|
// This is complicated stuff and we don't really want to mess with it.
|
|
|
|
KStyle::drawPushButtonLabel(b, p);
|
|
}
|
|
|
|
void
|
|
WebStyle::drawScrollBarControls
|
|
(
|
|
TQPainter * p,
|
|
const TQScrollBar * sb,
|
|
int sliderStart,
|
|
uint controls,
|
|
uint activeControl
|
|
)
|
|
{
|
|
p->save();
|
|
|
|
int sliderMin, sliderMax, sliderLength, buttonDim;
|
|
|
|
scrollBarMetrics(sb, sliderMin, sliderMax, sliderLength, buttonDim);
|
|
|
|
TQRect rSub, rAdd, rSubPage, rAddPage, rSlider;
|
|
|
|
scrollBarControlsMetrics
|
|
(
|
|
sb,
|
|
sliderStart,
|
|
sliderMin,
|
|
sliderMax,
|
|
sliderLength,
|
|
buttonDim,
|
|
rSub,
|
|
rAdd,
|
|
rSubPage,
|
|
rAddPage,
|
|
rSlider
|
|
);
|
|
|
|
TQColorGroup g(sb->tqcolorGroup());
|
|
|
|
if (controls & AddLine && rAdd.isValid())
|
|
{
|
|
bool active(activeControl & AddLine);
|
|
|
|
TQColor c(active ? g.highlight() : g.dark());
|
|
|
|
p->setPen(c);
|
|
p->setBrush(g.button());
|
|
p->drawRect(rAdd);
|
|
|
|
Qt::ArrowType t =
|
|
sb->orientation() == Horizontal ? Qt::RightArrow : Qt::DownArrow;
|
|
|
|
// Is it me or is KStyle::drawArrow broken ?
|
|
|
|
drawArrow
|
|
(
|
|
p,
|
|
t,
|
|
true, // FIXME - down ?
|
|
rAdd.x(),
|
|
rAdd.y(),
|
|
rAdd.width(),
|
|
rAdd.height(),
|
|
g,
|
|
true // FIXME - enabled ?
|
|
);
|
|
}
|
|
|
|
if (controls & SubLine && rSub.isValid())
|
|
{
|
|
bool active(activeControl & SubLine);
|
|
|
|
TQColor c(active ? g.highlight() : g.dark());
|
|
|
|
p->setPen(c);
|
|
p->setBrush(g.button());
|
|
p->drawRect(rSub);
|
|
|
|
Qt::ArrowType t =
|
|
sb->orientation() == Horizontal ? Qt::LeftArrow : Qt::UpArrow;
|
|
|
|
drawArrow
|
|
(
|
|
p,
|
|
t,
|
|
true, // FIXME - down ?
|
|
rSub.x(),
|
|
rSub.y(),
|
|
rSub.width(),
|
|
rSub.height(),
|
|
g,
|
|
true // FIXME - enabled ?
|
|
);
|
|
}
|
|
|
|
if (controls & SubPage && rSubPage.isValid())
|
|
{
|
|
p->setPen(g.mid());
|
|
p->setBrush(g.base());
|
|
p->drawRect(rSubPage);
|
|
}
|
|
|
|
if (controls & AddPage && rAddPage.isValid())
|
|
{
|
|
p->setPen(g.mid());
|
|
p->setBrush(g.base());
|
|
p->drawRect(rAddPage);
|
|
}
|
|
|
|
if (controls & Slider && rSlider.isValid())
|
|
{
|
|
p->setPen(activeControl & Slider ? g.highlight() : g.dark());
|
|
|
|
p->setBrush(g.button());
|
|
p->drawRect(rSlider);
|
|
|
|
p->setBrush(g.light());
|
|
p->setPen(g.dark());
|
|
|
|
if (sliderLength > _scrollBarExtent * 2)
|
|
{
|
|
int ellipseSize =
|
|
Horizontal == sb->orientation()
|
|
?
|
|
rSlider.height() - 4
|
|
:
|
|
rSlider.width() - 4
|
|
;
|
|
|
|
TQPoint center(rSlider.center());
|
|
|
|
if (Horizontal == sb->orientation())
|
|
{
|
|
p->drawEllipse
|
|
(
|
|
center.x() - ellipseSize / 2, rSlider.y() + 2,
|
|
ellipseSize, ellipseSize
|
|
);
|
|
}
|
|
else
|
|
{
|
|
p->drawEllipse
|
|
(
|
|
rSlider.x() + 2, center.y() - ellipseSize / 2,
|
|
ellipseSize, ellipseSize
|
|
);
|
|
}
|
|
}
|
|
}
|
|
|
|
p->restore();
|
|
}
|
|
|
|
TQStyle::ScrollControl
|
|
WebStyle::scrollBarPointOver
|
|
(
|
|
const TQScrollBar * sb,
|
|
int sliderStart,
|
|
const TQPoint & point
|
|
)
|
|
{
|
|
if (!sb->rect().contains(point))
|
|
return NoScroll;
|
|
|
|
int sliderMin, sliderMax, sliderLength, buttonDim;
|
|
|
|
scrollBarMetrics(sb, sliderMin, sliderMax, sliderLength, buttonDim);
|
|
|
|
if (sb->orientation() == TQScrollBar::Horizontal)
|
|
{
|
|
int x = point.x();
|
|
|
|
if (x <= buttonDim)
|
|
return SubLine;
|
|
|
|
else if (x <= buttonDim * 2)
|
|
return AddLine;
|
|
|
|
else if (x < sliderStart)
|
|
return SubPage;
|
|
|
|
else if (x < sliderStart+sliderLength)
|
|
return Slider;
|
|
|
|
return AddPage;
|
|
}
|
|
else
|
|
{
|
|
int y = point.y();
|
|
|
|
if (y < sliderStart)
|
|
return SubPage;
|
|
|
|
else if (y < sliderStart + sliderLength)
|
|
return Slider;
|
|
|
|
else if (y < sliderMax + sliderLength)
|
|
return AddPage;
|
|
|
|
else if (y < sliderMax + sliderLength + buttonDim)
|
|
return SubLine;
|
|
|
|
return AddLine;
|
|
}
|
|
}
|
|
|
|
void
|
|
WebStyle::scrollBarMetrics
|
|
(
|
|
const TQScrollBar * sb,
|
|
int & sliderMin,
|
|
int & sliderMax,
|
|
int & sliderLength,
|
|
int & buttonDim
|
|
)
|
|
{
|
|
int maxlen;
|
|
|
|
bool horizontal = sb->orientation() == TQScrollBar::Horizontal;
|
|
|
|
int len = (horizontal) ? sb->width() : sb->height();
|
|
|
|
int extent = (horizontal) ? sb->height() : sb->width();
|
|
|
|
if (len > (extent - 1) * 2)
|
|
buttonDim = extent;
|
|
else
|
|
buttonDim = len / 2 - 1;
|
|
|
|
if (horizontal)
|
|
sliderMin = buttonDim * 2;
|
|
else
|
|
sliderMin = 1;
|
|
|
|
maxlen = len - buttonDim * 2 - 1;
|
|
|
|
sliderLength =
|
|
(sb->pageStep() * maxlen) /
|
|
(sb->maxValue() - sb->minValue() + sb->pageStep());
|
|
|
|
if (sliderLength < _scrollBarExtent)
|
|
sliderLength = _scrollBarExtent;
|
|
|
|
if (sliderLength > maxlen)
|
|
sliderLength = maxlen;
|
|
|
|
sliderMax = sliderMin + maxlen - sliderLength;
|
|
}
|
|
|
|
QSize
|
|
WebStyle::indicatorSize() const
|
|
{
|
|
return TQSize(_indicatorSize, _indicatorSize);
|
|
}
|
|
|
|
void
|
|
WebStyle::drawIndicator
|
|
(
|
|
TQPainter * p,
|
|
int x,
|
|
int y,
|
|
int w,
|
|
int h,
|
|
const TQColorGroup & g,
|
|
int state,
|
|
bool down,
|
|
bool enabled
|
|
)
|
|
{
|
|
p->save();
|
|
|
|
p->fillRect(x, y, w, h, g.background());
|
|
|
|
if (enabled)
|
|
{
|
|
p->setPen(down ? g.highlight() : contrastingForeground(g.dark(), g.background()));
|
|
}
|
|
else
|
|
{
|
|
g.mid();
|
|
}
|
|
|
|
p->drawRect(x, y, w, h);
|
|
|
|
if (state != TQButton::Off)
|
|
{
|
|
p->fillRect(x + 2, y + 2, w - 4, h - 4, enabled ? g.highlight() : g.mid());
|
|
|
|
if (state == TQButton::NoChange)
|
|
{
|
|
p->fillRect(x + 4, y + 4, w - 8, h - 8, g.background());
|
|
}
|
|
}
|
|
|
|
p->restore();
|
|
}
|
|
|
|
QSize
|
|
WebStyle::exclusiveIndicatorSize() const
|
|
{
|
|
return TQSize(_indicatorSize, _indicatorSize);
|
|
}
|
|
|
|
void
|
|
WebStyle::drawExclusiveIndicator
|
|
(
|
|
TQPainter * p,
|
|
int x,
|
|
int y,
|
|
int w,
|
|
int h,
|
|
const TQColorGroup & g,
|
|
bool on,
|
|
bool down,
|
|
bool enabled
|
|
)
|
|
{
|
|
p->save();
|
|
|
|
p->fillRect(x, y, w, h, g.background());
|
|
|
|
if (enabled)
|
|
{
|
|
p->setPen(down ? g.highlight() : contrastingForeground(g.dark(), g.background()));
|
|
}
|
|
else
|
|
{
|
|
p->setPen(g.mid());
|
|
}
|
|
|
|
p->setBrush(g.brush(TQColorGroup::Background));
|
|
|
|
// Avoid mistqshapen ellipses. Qt or X bug ? Who knows...
|
|
|
|
if (0 == w % 2)
|
|
--w;
|
|
|
|
if (0 == h % 2)
|
|
--h;
|
|
|
|
p->drawEllipse(x, y, w, h);
|
|
|
|
if (on)
|
|
{
|
|
p->setPen(enabled ? g.highlight() : g.mid());
|
|
p->setBrush(enabled ? g.highlight() : g.mid());
|
|
p->drawEllipse(x + 3, y + 3, w - 6, h - 6);
|
|
}
|
|
|
|
p->restore();
|
|
}
|
|
|
|
void
|
|
WebStyle::drawIndicatorMask
|
|
(
|
|
TQPainter * p,
|
|
int x,
|
|
int y,
|
|
int w,
|
|
int h,
|
|
int /* state */
|
|
)
|
|
{
|
|
p->fillRect(x, y, w, h, Qt::color1);
|
|
}
|
|
|
|
void
|
|
WebStyle::drawExclusiveIndicatorMask
|
|
(
|
|
TQPainter * p,
|
|
int x,
|
|
int y,
|
|
int w,
|
|
int h,
|
|
bool /* on */
|
|
)
|
|
{
|
|
if (0 == w % 2)
|
|
--w;
|
|
|
|
if (0 == h % 2)
|
|
--h;
|
|
|
|
p->setPen(Qt::color1);
|
|
p->setBrush(Qt::color1);
|
|
p->drawEllipse(x, y, w, h);
|
|
}
|
|
|
|
void
|
|
WebStyle::drawComboButton
|
|
(
|
|
TQPainter * p,
|
|
int x,
|
|
int y,
|
|
int w,
|
|
int h,
|
|
const TQColorGroup & g,
|
|
bool sunken,
|
|
bool editable,
|
|
bool enabled,
|
|
const TQBrush * fill
|
|
)
|
|
{
|
|
p->save();
|
|
|
|
p->setPen(NoPen);
|
|
p->setBrush(0 == fill ? g.brush(TQColorGroup::Background) : *fill);
|
|
p->drawRect(x, y, w, h);
|
|
|
|
if (enabled)
|
|
{
|
|
if (sunken)
|
|
p->setPen(contrastingForeground(g.highlight(), g.background()));
|
|
else
|
|
p->setPen(contrastingForeground(g.mid(), g.background()));
|
|
}
|
|
else
|
|
{
|
|
p->setPen(contrastingForeground(g.mid(), g.background()));
|
|
}
|
|
|
|
drawFunkyRect(p, x, y, w, h, true);
|
|
|
|
p->drawPoint(w - 10, h - 6);
|
|
p->drawPoint(w - 9, h - 6);
|
|
p->drawPoint(w - 8, h - 6);
|
|
p->drawPoint(w - 7, h - 6);
|
|
p->drawPoint(w - 6, h - 6);
|
|
|
|
p->drawPoint(w - 9, h - 7);
|
|
p->drawPoint(w - 8, h - 7);
|
|
p->drawPoint(w - 7, h - 7);
|
|
p->drawPoint(w - 6, h - 7);
|
|
|
|
p->drawPoint(w - 8, h - 8);
|
|
p->drawPoint(w - 7, h - 8);
|
|
p->drawPoint(w - 6, h - 8);
|
|
|
|
p->drawPoint(w - 7, h - 9);
|
|
p->drawPoint(w - 6, h - 9);
|
|
|
|
p->drawPoint(w - 6, h - 10);
|
|
|
|
if (editable)
|
|
p->fillRect(comboButtonFocusRect(x, y, w, h), Qt::red);
|
|
|
|
p->restore();
|
|
}
|
|
|
|
QRect
|
|
WebStyle::comboButtonRect(int x, int y, int w, int h)
|
|
{
|
|
return TQRect(x + 2, y + 2, w - 20, h - 4);
|
|
}
|
|
|
|
QRect
|
|
WebStyle::comboButtonFocusRect(int x, int y, int w, int h)
|
|
{
|
|
return TQRect(x + 2, y + 2, w - 20, h - 4);
|
|
}
|
|
|
|
int
|
|
WebStyle::sliderLength() const
|
|
{
|
|
return 13;
|
|
}
|
|
|
|
void
|
|
WebStyle::drawSliderGroove
|
|
(
|
|
TQPainter * p,
|
|
int x,
|
|
int y,
|
|
int w,
|
|
int h,
|
|
const TQColorGroup & g,
|
|
QCOORD /* c */,
|
|
Orientation o
|
|
)
|
|
{
|
|
p->save();
|
|
|
|
p->setPen(TQPen(g.dark(), 0, Qt::DotLine));
|
|
|
|
if( o == Qt::Horizontal )
|
|
p->drawLine(x, y + h / 2, w, y + h / 2);
|
|
else
|
|
if( o == Qt::Vertical )
|
|
p->drawLine(x + w / 2, y, x + w / 2, h);
|
|
|
|
p->restore();
|
|
}
|
|
|
|
void
|
|
WebStyle::drawArrow
|
|
(
|
|
TQPainter * p,
|
|
Qt::ArrowType type,
|
|
bool down,
|
|
int x,
|
|
int y,
|
|
int w,
|
|
int h,
|
|
const TQColorGroup & g,
|
|
bool enabled,
|
|
const TQBrush * fill
|
|
)
|
|
{
|
|
KStyle::drawArrow(p, type, down, x, y, w, h, g, enabled, fill);
|
|
}
|
|
|
|
void
|
|
WebStyle::drawSlider
|
|
(
|
|
TQPainter * p,
|
|
int x,
|
|
int y,
|
|
int w,
|
|
int h,
|
|
const TQColorGroup & g,
|
|
Orientation o,
|
|
bool /* tickAbove */,
|
|
bool /* tickBelow */
|
|
)
|
|
{
|
|
p->save();
|
|
|
|
p->fillRect(x + 1, y + 1, w - 2, h - 2, g.background());
|
|
p->setPen(g.dark());
|
|
p->setBrush(g.light());
|
|
|
|
int sl = sliderLength();
|
|
|
|
if( o == Qt::Horizontal )
|
|
p->drawEllipse(x, y + h / 2 - sl / 2, sl, sl);
|
|
else
|
|
if( o == Qt::Vertical )
|
|
p->drawEllipse(x + w / 2 - sl / 2, y, sl, sl);
|
|
|
|
p->restore();
|
|
}
|
|
|
|
void
|
|
WebStyle::drawKToolBar
|
|
(
|
|
TQPainter * p,
|
|
int x,
|
|
int y,
|
|
int w,
|
|
int h,
|
|
const TQColorGroup & g,
|
|
KToolBarPos /* pos */,
|
|
TQBrush * /* fill */
|
|
)
|
|
{
|
|
p->save();
|
|
p->setPen(g.background());
|
|
p->setBrush(g.background());
|
|
p->drawRect(x, y, w, h);
|
|
p->restore();
|
|
}
|
|
|
|
void
|
|
WebStyle::drawKBarHandle
|
|
(
|
|
TQPainter * p,
|
|
int x,
|
|
int y,
|
|
int w,
|
|
int h,
|
|
const TQColorGroup & g,
|
|
KToolBarPos /* pos */,
|
|
TQBrush * /* fill */
|
|
)
|
|
{
|
|
p->save();
|
|
p->setPen(g.mid());
|
|
p->setBrush(g.background());
|
|
p->drawRect(x + 1, y + 1, w - 2, h - 2);
|
|
p->restore();
|
|
}
|
|
|
|
void
|
|
WebStyle::drawKMenuBar
|
|
(
|
|
TQPainter * p,
|
|
int x,
|
|
int y,
|
|
int w,
|
|
int h,
|
|
const TQColorGroup & g,
|
|
bool /* macMode */,
|
|
TQBrush * /* fill */
|
|
)
|
|
{
|
|
p->save();
|
|
p->setPen(g.mid());
|
|
p->setBrush(g.background());
|
|
p->drawRect(x, y, w, h);
|
|
p->restore();
|
|
}
|
|
|
|
void
|
|
WebStyle::drawKToolBarButton
|
|
(
|
|
TQPainter * p,
|
|
int x,
|
|
int y,
|
|
int w,
|
|
int h,
|
|
const TQColorGroup & g,
|
|
bool sunken,
|
|
bool raised,
|
|
bool enabled,
|
|
bool popup,
|
|
KToolButtonType type,
|
|
const TQString & btext,
|
|
const TQPixmap * pixmap,
|
|
TQFont * font,
|
|
TQWidget * button
|
|
)
|
|
{
|
|
bool toggleAndOn = false;
|
|
|
|
if (button->inherits(TQBUTTON_OBJECT_NAME_STRING))
|
|
{
|
|
TQButton * b = static_cast<TQButton *>(button);
|
|
toggleAndOn = b->isToggleButton() && b->isOn();
|
|
}
|
|
|
|
p->save();
|
|
|
|
TQColor borderColour;
|
|
TQColor textColour;
|
|
TQColor fillColour;
|
|
|
|
if (!enabled)
|
|
{
|
|
borderColour = g.background();
|
|
fillColour = g.background();
|
|
textColour = g.text();
|
|
}
|
|
else
|
|
{
|
|
if (toggleAndOn)
|
|
{
|
|
borderColour = g.dark();
|
|
fillColour = g.button();
|
|
textColour = g.buttonText();
|
|
}
|
|
else if (sunken)
|
|
{
|
|
borderColour = g.light();
|
|
fillColour = g.button();
|
|
textColour = g.buttonText();
|
|
}
|
|
else if (raised)
|
|
{
|
|
borderColour = g.highlight();
|
|
fillColour = g.background();
|
|
textColour = g.text();
|
|
}
|
|
else
|
|
{
|
|
borderColour = g.background();
|
|
fillColour = g.background();
|
|
textColour = g.text();
|
|
}
|
|
}
|
|
|
|
p->setPen(borderColour);
|
|
p->setBrush(fillColour);
|
|
|
|
p->drawRect(x, y, w, h);
|
|
|
|
p->setPen(g.background());
|
|
|
|
p->drawPoint(x, y);
|
|
p->drawPoint(x + w, y);
|
|
p->drawPoint(x, y + h);
|
|
p->drawPoint(x + w, y + h);
|
|
|
|
switch (type)
|
|
{
|
|
case Icon:
|
|
|
|
if (0 != pixmap)
|
|
p->drawPixmap
|
|
(
|
|
x + (w - pixmap->width()) / 2,
|
|
y + (h - pixmap->height()) / 2,
|
|
*pixmap
|
|
);
|
|
break;
|
|
|
|
case Text:
|
|
|
|
if (!btext.isNull())
|
|
{
|
|
if (0 != font)
|
|
p->setFont(*font);
|
|
|
|
p->setPen(textColour);
|
|
|
|
p->drawText
|
|
(
|
|
x,
|
|
y,
|
|
w,
|
|
h,
|
|
AlignCenter,
|
|
btext
|
|
);
|
|
}
|
|
|
|
break;
|
|
|
|
case IconTextRight:
|
|
|
|
if (0 != pixmap)
|
|
p->drawPixmap
|
|
(
|
|
x + 2,
|
|
y + (h - pixmap->height()) / 2,
|
|
*pixmap
|
|
);
|
|
|
|
if (!btext.isNull())
|
|
{
|
|
if (0 != font)
|
|
p->setFont(*font);
|
|
|
|
p->setPen(textColour);
|
|
|
|
if (0 != pixmap)
|
|
{
|
|
int textLeft = pixmap->width() + 4;
|
|
|
|
p->drawText
|
|
(
|
|
x + textLeft,
|
|
y,
|
|
w - textLeft,
|
|
h,
|
|
AlignVCenter | AlignLeft,
|
|
btext
|
|
);
|
|
}
|
|
else
|
|
{
|
|
p->drawText
|
|
(
|
|
x,
|
|
y,
|
|
w,
|
|
h,
|
|
AlignVCenter | AlignLeft,
|
|
btext
|
|
);
|
|
}
|
|
}
|
|
break;
|
|
|
|
case IconTextBottom:
|
|
|
|
if (0 != pixmap)
|
|
p->drawPixmap
|
|
(
|
|
x + (w - pixmap->width()) / 2,
|
|
y + 2,
|
|
*pixmap
|
|
);
|
|
|
|
if (!btext.isNull())
|
|
{
|
|
if (0 != font)
|
|
p->setFont(*font);
|
|
|
|
p->setPen(textColour);
|
|
|
|
if (0 != pixmap)
|
|
{
|
|
int textTop = y + pixmap->height() + 4;
|
|
|
|
p->drawText
|
|
(
|
|
x + 2,
|
|
textTop,
|
|
w - 4,
|
|
h - x - textTop,
|
|
AlignCenter,
|
|
btext
|
|
);
|
|
}
|
|
else
|
|
{
|
|
p->drawText
|
|
(
|
|
x,
|
|
y,
|
|
w,
|
|
h,
|
|
AlignCenter,
|
|
btext
|
|
);
|
|
}
|
|
}
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
if (popup)
|
|
{
|
|
p->setPen(g.dark());
|
|
for (int px = 0; px < 5; ++px)
|
|
for (int py = 0; py < 5 - px; ++py)
|
|
p->drawPoint(w - 6 - px, h - 6 - py);
|
|
}
|
|
|
|
p->restore();
|
|
}
|
|
|
|
void
|
|
WebStyle::drawKMenuItem
|
|
(
|
|
TQPainter * p,
|
|
int x,
|
|
int y,
|
|
int w,
|
|
int h,
|
|
const TQColorGroup & g,
|
|
bool active,
|
|
TQMenuItem * mi,
|
|
TQBrush * /* fill */
|
|
)
|
|
{
|
|
p->save();
|
|
|
|
TQColor bg(active ? g.highlight() : g.background());
|
|
|
|
p->fillRect(x, y, w, h, bg);
|
|
|
|
TQColor textColour =
|
|
active ?
|
|
contrastingForeground(g.highlightedText(), bg) :
|
|
contrastingForeground(g.text(), bg);
|
|
|
|
TQApplication::style().drawItem
|
|
(
|
|
p,
|
|
x,
|
|
y,
|
|
w,
|
|
h,
|
|
AlignCenter | ShowPrefix | DontClip | SingleLine,
|
|
g,
|
|
mi->isEnabled(),
|
|
mi->pixmap(),
|
|
mi->text(),
|
|
-1,
|
|
&textColour
|
|
);
|
|
|
|
p->restore();
|
|
}
|
|
|
|
void
|
|
WebStyle::drawPopupMenuItem
|
|
(
|
|
TQPainter * p,
|
|
bool checkable,
|
|
int maxpmw,
|
|
int tab,
|
|
TQMenuItem * mi,
|
|
const TQPalette & pal,
|
|
bool act,
|
|
bool enabled,
|
|
int x,
|
|
int y,
|
|
int w,
|
|
int h
|
|
)
|
|
{
|
|
// TODO
|
|
KStyle::drawPopupMenuItem(p, checkable, maxpmw, tab, mi, pal, act, enabled, x, y, w, h);
|
|
}
|
|
|
|
void
|
|
WebStyle::drawKProgressBlock
|
|
(
|
|
TQPainter * p,
|
|
int x,
|
|
int y,
|
|
int w,
|
|
int h,
|
|
const TQColorGroup & g,
|
|
TQBrush * fill
|
|
)
|
|
{
|
|
p->save();
|
|
|
|
p->setBrush(0 == fill ? NoBrush : *fill);
|
|
|
|
p->fillRect(x, y, w, h, g.highlight());
|
|
|
|
p->restore();
|
|
}
|
|
|
|
void
|
|
WebStyle::drawFocusRect
|
|
(
|
|
TQPainter * p,
|
|
const TQRect & r,
|
|
const TQColorGroup & g,
|
|
const TQColor * pen,
|
|
bool atBorder
|
|
)
|
|
{
|
|
p->save();
|
|
|
|
if (0 != pen)
|
|
p->setPen(0 == pen ? g.foreground() : *pen);
|
|
p->setBrush(NoBrush);
|
|
|
|
if (atBorder)
|
|
{
|
|
p->drawRect(TQRect(r.x() + 1, r.y() + 1, r.width() - 2, r.height() - 2));
|
|
}
|
|
else
|
|
{
|
|
p->drawRect(r);
|
|
}
|
|
|
|
p->restore();
|
|
}
|
|
|
|
void
|
|
WebStyle::drawPanel
|
|
(
|
|
TQPainter * p,
|
|
int x,
|
|
int y,
|
|
int w,
|
|
int h,
|
|
const TQColorGroup & g,
|
|
bool /* sunken */,
|
|
int /* lineWidth */,
|
|
const TQBrush * fill
|
|
)
|
|
{
|
|
p->save();
|
|
|
|
p->setPen(g.dark());
|
|
|
|
p->setBrush(0 == fill ? NoBrush : *fill);
|
|
|
|
p->drawRect(x, y, w, h);
|
|
|
|
p->restore();
|
|
}
|
|
|
|
void
|
|
WebStyle::drawPopupPanel
|
|
(
|
|
TQPainter * p,
|
|
int x,
|
|
int y,
|
|
int w,
|
|
int h,
|
|
const TQColorGroup & g,
|
|
int /* lineWidth */,
|
|
const TQBrush * fill
|
|
)
|
|
{
|
|
p->save();
|
|
|
|
p->setPen(g.dark());
|
|
|
|
p->setBrush(0 == fill ? NoBrush : *fill);
|
|
|
|
p->drawRect(x, y, w, h);
|
|
|
|
p->restore();
|
|
}
|
|
|
|
void
|
|
WebStyle::drawSeparator
|
|
(
|
|
TQPainter * p,
|
|
int x,
|
|
int y,
|
|
int w,
|
|
int h,
|
|
const TQColorGroup & g,
|
|
bool /* sunken */,
|
|
int /* lineWidth */,
|
|
int /* midLineWidth */
|
|
)
|
|
{
|
|
p->save();
|
|
|
|
p->setPen(g.dark());
|
|
|
|
if (w > h)
|
|
{
|
|
p->drawLine(x, y + h / 2, x + w, y + h / 2);
|
|
}
|
|
else
|
|
{
|
|
p->drawLine(x + w / 2, y, x + w / 2, y + h);
|
|
}
|
|
|
|
p->restore();
|
|
}
|
|
|
|
void
|
|
WebStyle::drawTab
|
|
(
|
|
TQPainter * p,
|
|
const TQTabBar * tabBar,
|
|
TQTab * tab,
|
|
bool selected
|
|
)
|
|
{
|
|
TQRect r(tab->rect());
|
|
|
|
TQColorGroup g(tabBar->tqcolorGroup());
|
|
|
|
p->save();
|
|
|
|
p->setPen(selected ? g.dark() : g.mid());
|
|
p->fillRect(r, g.brush(TQColorGroup::Background));
|
|
|
|
switch (tabBar->tqshape())
|
|
{
|
|
case TQTabBar::RoundedAbove:
|
|
case TQTabBar::TriangularAbove:
|
|
p->drawLine(r.left(), r.top(), r.left(), r.bottom());
|
|
p->drawLine(r.left(), r.top(), r.right(), r.top());
|
|
p->drawLine(r.right(), r.top(), r.right(), r.bottom());
|
|
if (!selected)
|
|
{
|
|
p->setPen(g.dark());
|
|
p->drawLine(r.left(), r.bottom(), r.right(), r.bottom());
|
|
}
|
|
break;
|
|
case TQTabBar::RoundedBelow:
|
|
case TQTabBar::TriangularBelow:
|
|
if (!selected)
|
|
{
|
|
p->setPen(g.dark());
|
|
p->drawLine(r.left(), r.top(), r.right(), r.top());
|
|
}
|
|
p->drawLine(r.left(), r.top(), r.left(), r.bottom());
|
|
p->drawLine(r.left(), r.bottom(), r.right(), r.bottom());
|
|
p->drawLine(r.right(), r.top(), r.right(), r.bottom());
|
|
break;
|
|
}
|
|
|
|
p->restore();
|
|
}
|
|
|
|
void
|
|
WebStyle::drawTabMask
|
|
(
|
|
TQPainter * p,
|
|
const TQTabBar *,
|
|
TQTab * tab,
|
|
bool
|
|
)
|
|
{
|
|
p->fillRect(tab->rect(), Qt::color1);
|
|
}
|
|
|
|
void
|
|
WebStyle::drawKickerHandle
|
|
(
|
|
TQPainter * p,
|
|
int x,
|
|
int y,
|
|
int w,
|
|
int h,
|
|
const TQColorGroup & g,
|
|
TQBrush * fill
|
|
)
|
|
{
|
|
p->save();
|
|
|
|
p->setPen(g.mid());
|
|
|
|
p->setBrush(0 == fill ? NoBrush : *fill);
|
|
|
|
p->drawRect(x, y, w, h);
|
|
|
|
p->restore();
|
|
}
|
|
|
|
void
|
|
WebStyle::drawKickerAppletHandle
|
|
(
|
|
TQPainter * p,
|
|
int x,
|
|
int y,
|
|
int w,
|
|
int h,
|
|
const TQColorGroup & g,
|
|
TQBrush * fill
|
|
)
|
|
{
|
|
p->save();
|
|
|
|
p->setPen(g.mid());
|
|
|
|
p->setBrush(0 == fill ? NoBrush : *fill);
|
|
|
|
p->drawRect(x, y, w, h);
|
|
|
|
p->restore();
|
|
}
|
|
|
|
void
|
|
WebStyle::drawKickerTaskButton
|
|
(
|
|
TQPainter * p,
|
|
int x,
|
|
int y,
|
|
int w,
|
|
int h,
|
|
const TQColorGroup & g,
|
|
const TQString & text,
|
|
bool active,
|
|
TQPixmap * icon,
|
|
TQBrush * /* fill */
|
|
)
|
|
{
|
|
p->save();
|
|
|
|
TQColor bg;
|
|
|
|
if (active)
|
|
{
|
|
p->setPen(g.light());
|
|
bg = g.highlight();
|
|
}
|
|
else
|
|
{
|
|
p->setPen(g.mid());
|
|
bg = g.button();
|
|
}
|
|
|
|
p->setBrush(bg);
|
|
|
|
p->drawRect(x, y, w, h);
|
|
|
|
if (text.isEmpty() && 0 == icon)
|
|
{
|
|
p->restore();
|
|
return;
|
|
}
|
|
|
|
const int pxWidth = 20;
|
|
|
|
int textPos = pxWidth;
|
|
|
|
TQRect br(buttonRect(x, y, w, h));
|
|
|
|
if ((0 != icon) && !icon->isNull())
|
|
{
|
|
int dx = (pxWidth - icon->width()) / 2;
|
|
int dy = (h - icon->height()) / 2;
|
|
|
|
p->drawPixmap(br.x() + dx, dy, *icon);
|
|
}
|
|
|
|
TQString s(text);
|
|
|
|
static TQString modStr =
|
|
TQString::fromUtf8("[") + i18n("modified") + TQString::fromUtf8("]");
|
|
|
|
int modStrPos = s.find(modStr);
|
|
|
|
if (-1 != modStrPos)
|
|
{
|
|
// +1 because we include a space after the closing brace.
|
|
s.remove(modStrPos, modStr.length() + 1);
|
|
|
|
TQPixmap modPixmap = SmallIcon("modified");
|
|
|
|
int dx = (pxWidth - modPixmap.width()) / 2;
|
|
int dy = (h - modPixmap.height()) / 2;
|
|
|
|
p->drawPixmap(br.x() + textPos + dx, dy, modPixmap);
|
|
|
|
textPos += pxWidth;
|
|
}
|
|
|
|
if (!s.isEmpty())
|
|
{
|
|
if (p->fontMetrics().width(s) > br.width() - textPos)
|
|
{
|
|
int maxLen = br.width() - textPos - p->fontMetrics().width("...");
|
|
|
|
while ((!s.isEmpty()) && (p->fontMetrics().width(s) > maxLen))
|
|
s.truncate(s.length() - 1);
|
|
|
|
s.append("...");
|
|
}
|
|
|
|
if (active)
|
|
{
|
|
p->setPen(contrastingForeground(g.buttonText(), bg));
|
|
}
|
|
else
|
|
{
|
|
p->setPen(contrastingForeground(g.text(), bg));
|
|
}
|
|
|
|
p->setPen(Qt::white);
|
|
|
|
p->drawText
|
|
(
|
|
br.x() + textPos,
|
|
-1,
|
|
w - textPos,
|
|
h,
|
|
AlignLeft | AlignVCenter,
|
|
s
|
|
);
|
|
}
|
|
|
|
p->restore();
|
|
p->setPen(Qt::white);
|
|
}
|
|
|
|
int
|
|
WebStyle::popupMenuItemHeight(bool, TQMenuItem * i, const TQFontMetrics & fm)
|
|
{
|
|
if (i->isSeparator())
|
|
return 1;
|
|
|
|
int h = 0;
|
|
|
|
if (0 != i->pixmap())
|
|
{
|
|
h = i->pixmap()->height();
|
|
}
|
|
|
|
if (0 != i->iconSet())
|
|
{
|
|
h = QMAX
|
|
(
|
|
i->iconSet()->pixmap(TQIconSet::Small, TQIconSet::Normal).height(),
|
|
h
|
|
);
|
|
}
|
|
|
|
h = QMAX(fm.height() + 4, h);
|
|
|
|
h = QMAX(18, h);
|
|
|
|
return h;
|
|
|
|
}
|
|
|