summaryrefslogtreecommitdiff
path: root/library/lightstyle.cpp
Side-by-side diff
Diffstat (limited to 'library/lightstyle.cpp') (more/less context) (show whitespace changes)
-rw-r--r--library/lightstyle.cpp8
1 files changed, 6 insertions, 2 deletions
diff --git a/library/lightstyle.cpp b/library/lightstyle.cpp
index 3bd1623..c5073ca 100644
--- a/library/lightstyle.cpp
+++ b/library/lightstyle.cpp
@@ -747,538 +747,542 @@ void LightStyle::drawTab(QPainter *p, const QTabBar *tabbar, QTab *tab,
p->setPen(g.mid());
if (selected)
p->drawLine(fr.right() - 1, fr.top() + 1, fr.right() - 1, fr.bottom() - 1);
else
p->drawLine(fr.left(), fr.top() - 1, fr.right() + 3, fr.top() - 1);
p->setPen(g.light());
p->drawLine(fr.left() + 1, fr.top() + (selected ? -1 : 2),
fr.left() + 1, fr.bottom() - 1);
} else {
// triangular drawing code
QCommonStyle::drawTab(p, tabbar, tab, selected);
}
p->restore();
}
#endif
void LightStyle::drawSlider(QPainter *p, int x, int y, int w, int h,
const QColorGroup &g, Qt::Orientation orientation,
bool above, bool below)
{
drawButton(p, x, y, w, h, g, FALSE, &g.brush(QColorGroup::Button));
if (orientation == Horizontal) {
if (above && below) {
drawArrow(p, Qt::UpArrow, FALSE, x + 1, y + 1, w, h / 2, g, TRUE);
drawArrow(p, Qt::DownArrow, FALSE, x + 1, y + (h / 2) - 1,
w, h / 2, g, TRUE);
} else
drawArrow(p, (above) ? Qt::UpArrow : Qt::DownArrow,
FALSE, x + 1, y, w, h, g, TRUE);
} else {
if (above && below) {
drawArrow(p, Qt::LeftArrow, FALSE, x + 1, y, w / 2, h, g, TRUE);
drawArrow(p, Qt::RightArrow, FALSE, x + (w / 2) - 2, y, w / 2, h, g, TRUE);
} else
drawArrow(p, (above) ? Qt::LeftArrow : Qt::RightArrow,
FALSE, x, y, w, h, g, TRUE);
}
}
void LightStyle::drawSliderGroove(QPainter *p, int x, int y, int w, int h,
const QColorGroup& g, QCOORD c,
Qt::Orientation orientation)
{
if (orientation == Horizontal)
drawButton(p, x, y+c - 3, w, 6, g, TRUE, &g.brush(QColorGroup::Mid));
else
drawButton(p, x+c - 3, y, 6, h, g, TRUE, &g.brush(QColorGroup::Mid));
}
void LightStyle::scrollBarMetrics(const QScrollBar *scrollbar,
int &sliderMin, int &sliderMax,
int &sliderLength, int &buttonDim) const
{
int maxLength;
int length = ((scrollbar->orientation() == Horizontal) ?
scrollbar->width() : scrollbar->height());
int extent = ((scrollbar->orientation() == Horizontal) ?
scrollbar->height() : scrollbar->width());
extent--;
if (length > (extent + defaultFrameWidth() - 1) * 2 + defaultFrameWidth())
buttonDim = extent - defaultFrameWidth();
else
buttonDim = (length - defaultFrameWidth()) / 2 - 1;
sliderMin = buttonDim;
maxLength = length - buttonDim * 3;
if (scrollbar->maxValue() != scrollbar->minValue()) {
uint range = scrollbar->maxValue() - scrollbar->minValue();
sliderLength = (scrollbar->pageStep() * maxLength) /
(range + scrollbar->pageStep());
if (sliderLength < buttonDim || range > INT_MAX / 2)
sliderLength = buttonDim;
if (sliderLength > maxLength)
sliderLength = maxLength;
} else
sliderLength = maxLength;
sliderMax = sliderMin + maxLength - sliderLength;
}
QStyle::ScrollControl LightStyle::scrollBarPointOver(const QScrollBar *scrollbar,
int sliderStart, const QPoint &p)
{
if (! scrollbar->rect().contains(p))
return NoScroll;
int sliderMin, sliderMax, sliderLength, buttonDim, pos;
scrollBarMetrics( scrollbar, sliderMin, sliderMax, sliderLength, buttonDim );
if (scrollbar->orientation() == Horizontal)
pos = p.x();
else
pos = p.y();
if (pos < buttonDim)
return SubLine;
if (pos < sliderStart)
return SubPage;
if (pos < sliderStart + sliderLength)
return Slider;
if (pos < sliderMax + sliderLength)
return AddPage;
if (pos < sliderMax + sliderLength + buttonDim)
return SubLine;
return AddLine;
}
void LightStyle::drawScrollBarControls( QPainter* p, const QScrollBar* scrollbar,
int sliderStart, uint controls,
uint activeControl )
{
QColorGroup g = scrollbar->colorGroup();
int sliderMin, sliderMax, sliderLength, buttonDim;
scrollBarMetrics( scrollbar, sliderMin, sliderMax, sliderLength, buttonDim );
if (sliderStart > sliderMax) { // sanity check
sliderStart = sliderMax;
}
QRect addR, subR, subR2, addPageR, subPageR, sliderR;
int length = ((scrollbar->orientation() == Horizontal) ?
scrollbar->width() : scrollbar->height());
int extent = ((scrollbar->orientation() == Horizontal) ?
scrollbar->height() : scrollbar->width());
int fudge = 3; //####disgusting hack
if (scrollbar->orientation() == Horizontal) {
subR.setRect(0, defaultFrameWidth(),
buttonDim + fudge, buttonDim);
subR2.setRect(length - (buttonDim * 2), defaultFrameWidth() ,
buttonDim, buttonDim);
addR.setRect(length - buttonDim, defaultFrameWidth(),
buttonDim, buttonDim);
} else {
subR.setRect(defaultFrameWidth() + 1, 0,
buttonDim, buttonDim + fudge);
subR2.setRect(defaultFrameWidth() + 1, length - (buttonDim * 2),
buttonDim, buttonDim);
addR.setRect(defaultFrameWidth() + 1, length - buttonDim,
buttonDim, buttonDim);
}
int sliderEnd = sliderStart + sliderLength;
int sliderW = extent - defaultFrameWidth() - 1;
if (scrollbar->orientation() == Horizontal) {
subPageR.setRect( subR.right() + 1, defaultFrameWidth(),
sliderStart - subR.right() - 1 , sliderW );
addPageR.setRect( sliderEnd, defaultFrameWidth(),
subR2.left() - sliderEnd, sliderW );
sliderR.setRect( sliderStart, defaultFrameWidth(), sliderLength, sliderW );
} else {
subPageR.setRect( defaultFrameWidth(), subR.bottom() + 1,
sliderW, sliderStart - subR.bottom() - 1 );
addPageR.setRect( defaultFrameWidth(), sliderEnd,
sliderW, subR2.top() - sliderEnd );
sliderR .setRect( defaultFrameWidth(), sliderStart,
sliderW, sliderLength );
}
if ( controls == ( AddLine | SubLine | AddPage | SubPage |
Slider | First | Last ) ) {
if (scrollbar->orientation() == Horizontal)
qDrawShadePanel(p, 0, 0, length, 2, g, TRUE, 1,
&g.brush(QColorGroup::Background));
else
qDrawShadePanel(p, 0, 0, 2, length, g, TRUE, 1,
&g.brush(QColorGroup::Background));
}
if ( controls & AddLine )
drawArrow( p, (scrollbar->orientation() == Vertical) ? DownArrow : RightArrow,
FALSE, addR.x(), addR.y(),
addR.width(), addR.height(),
(( activeControl == AddLine ) ?
singleton->hoverPalette.active() : g),
TRUE, &g.brush(QColorGroup::Background));
if ( controls & SubLine ) {
drawArrow( p, (scrollbar->orientation() == Vertical) ? UpArrow : LeftArrow,
FALSE, subR.x(), subR.y(),
subR.width(), subR.height(),
(( activeControl == SubLine ) ?
singleton->hoverPalette.active() : g),
TRUE, &g.brush(QColorGroup::Background));
drawArrow( p, (scrollbar->orientation() == Vertical) ? UpArrow : LeftArrow,
FALSE, subR2.x(), subR2.y(),
subR2.width(), subR2.height(),
(( activeControl == SubLine ) ?
singleton->hoverPalette.active() : g),
TRUE, &g.brush(QColorGroup::Background));
}
if ( controls & SubPage )
p->fillRect( subPageR,
((activeControl == SubPage) ?
g.brush( QColorGroup::Dark ) :
g.brush( QColorGroup::Mid )));
if ( controls & AddPage )
p->fillRect( addPageR,
((activeControl == AddPage) ?
g.brush( QColorGroup::Dark ) :
g.brush( QColorGroup::Mid )));
if ( controls & Slider ) {
QPoint bo = p->brushOrigin();
p->setBrushOrigin(sliderR.topLeft());
if ( sliderR.isValid() ) {
p->fillRect( sliderR.x(), sliderR.y(), 2, 2,
g.brush( QColorGroup::Mid ));
p->fillRect( sliderR.x() + sliderR.width() - 2,
sliderR.y(), 2, 2,
g.brush( QColorGroup::Mid ));
p->fillRect( sliderR.x() + sliderR.width() - 2,
sliderR.y() + sliderR.height() - 2, 2, 2,
g.brush( QColorGroup::Mid ));
p->fillRect( sliderR.x(),
sliderR.y() + sliderR.height() - 2, 2, 2,
g.brush( QColorGroup::Mid ));
QColorGroup cg( g );
cg.setBrush( QColorGroup::Background, g.brush( QColorGroup::Mid ) );
drawBevelButton( p, sliderR.x(), sliderR.y(),
sliderR.width(), sliderR.height(),
cg, FALSE, &g.brush( QColorGroup::Button ) );
}
p->setBrushOrigin(bo);
}
}
void LightStyle::drawToolBarHandle(QPainter *p, const QRect &rect,
Qt::Orientation orientation,
bool, const QColorGroup &g, bool)
{
p->save();
p->setPen(g.mid());
p->setBrush(g.brush(QColorGroup::Mid));
if (orientation == Qt::Horizontal) {
QRect l, r;
l.setRect(rect.x() + 1, rect.y() + 1, rect.width() - 5, rect.height() - 2);
r.setRect(l.right() + 1, l.y(), 3, l.height());
p->drawRect(l);
qDrawShadePanel(p, r, g, FALSE);
} else {
QRect t, b;
t.setRect(rect.x() + 1, rect.y() + 1, rect.width() - 2, rect.height() - 5);
b.setRect(t.x(), t.bottom() + 1, t.width(), 3);
p->drawRect(t);
qDrawShadePanel(p, b, g, FALSE);
}
p->restore();
}
bool LightStyle::eventFilter(QObject *object, QEvent *event)
{
switch(event->type()) {
case QEvent::Enter:
{
if (! object->isWidgetType() ||
! object->inherits("QPushButton"))
break;
singleton->hoverWidget = (QWidget *) object;
if (! singleton->hoverWidget->isEnabled()) {
singleton->hoverWidget = 0;
break;
}
QPalette pal = singleton->hoverWidget->palette();
if (singleton->hoverWidget->ownPalette())
singleton->savePalette = new QPalette(pal);
singleton->hoverWidget->setPalette(singleton->hoverPalette);
break;
}
case QEvent::Leave:
{
if (object != singleton->hoverWidget)
break;
if (singleton->savePalette) {
singleton->hoverWidget->setPalette(*(singleton->savePalette));
delete singleton->savePalette;
singleton->savePalette = 0;
} else
singleton->hoverWidget->unsetPalette();
singleton->hoverWidget = 0;
break;
}
default:
{
;
}
}
return QWindowsStyle::eventFilter(object, event);
}
static const int motifItemFrame = 1; // menu item frame width
static const int motifSepHeight = 2; // separator item height
static const int motifItemHMargin = 1; // menu item hor text margin
static const int motifItemVMargin = 2; // menu item ver text margin
static const int motifArrowHMargin = 0; // arrow horizontal margin
static const int motifTabSpacing = 12; // space between text and tab
static const int motifCheckMarkHMargin = 1; // horiz. margins of check mark
static const int windowsRightBorder = 8; // right border on windows
static const int windowsCheckMarkWidth = 2; // checkmarks width on windows
/*! \reimp
*/
int LightStyle::extraPopupMenuItemWidth( bool checkable, int maxpmw, QMenuItem* mi, const QFontMetrics& /*fm*/ )
{
#ifndef QT_NO_MENUDATA
int w = 2*motifItemHMargin + 2*motifItemFrame; // a little bit of border can never harm
if ( mi->isSeparator() )
return 10; // arbitrary
else if ( mi->pixmap() )
w += mi->pixmap()->width(); // pixmap only
if ( !mi->text().isNull() ) {
if ( mi->text().find('\t') >= 0 ) // string contains tab
w += motifTabSpacing;
}
if ( maxpmw ) { // we have iconsets
w += maxpmw;
w += 6; // add a little extra border around the iconset
}
if ( checkable && maxpmw < windowsCheckMarkWidth ) {
w += windowsCheckMarkWidth - maxpmw; // space for the checkmarks
}
if ( maxpmw > 0 || checkable ) // we have a check-column ( iconsets or checkmarks)
w += motifCheckMarkHMargin; // add space to separate the columns
w += windowsRightBorder; // windows has a strange wide border on the right side
return w;
#endif
}
/*! \reimp
*/
int LightStyle::popupMenuItemHeight( bool /*checkable*/, QMenuItem* mi, const QFontMetrics& fm )
{
#ifndef QT_NO_MENUDATA
int h = 0;
if ( mi->isSeparator() ) // separator height
h = motifSepHeight;
else if ( mi->pixmap() ) // pixmap height
h = mi->pixmap()->height() + 2*motifItemFrame;
else // text height
h = fm.height() + 2*motifItemVMargin + 2*motifItemFrame;
if ( !mi->isSeparator() && mi->iconSet() != 0 ) {
- h = QMAX( h, mi->iconSet()->pixmap( QIconSet::Small, QIconSet::Normal ).height() + 2*motifItemFrame );
+ h = QMAX( h, mi->iconSet()->pixmap().height() + 2*motifItemFrame );
}
if ( mi->custom() )
h = QMAX( h, mi->custom()->sizeHint().height() + 2*motifItemVMargin + 2*motifItemFrame ) - 1;
return h;
#endif
}
void LightStyle::drawPopupMenuItem( QPainter* p, bool checkable, int maxpmw, int tab, QMenuItem* mi,
const QPalette& pal,
bool act, bool enabled, int x, int y, int w, int h)
{
#ifndef QT_NO_MENUDATA
const QColorGroup & g = pal.active();
bool dis = !enabled;
QColorGroup itemg = dis ? pal.disabled() : pal.active();
if ( checkable )
maxpmw = QMAX( maxpmw, 8 ); // space for the checkmarks
int checkcol = maxpmw;
if ( mi && mi->isSeparator() ) { // draw separator
p->setPen( g.dark() );
p->drawLine( x, y, x+w, y );
p->setPen( g.light() );
p->drawLine( x, y+1, x+w, y+1 );
return;
}
QBrush fill = act? g.brush( QColorGroup::Highlight ) :
g.brush( QColorGroup::Button );
p->fillRect( x, y, w, h, fill);
if ( !mi )
return;
if ( mi->isChecked() ) {
if ( act && !dis ) {
qDrawShadePanel( p, x, y, checkcol, h,
g, TRUE, 1, &g.brush( QColorGroup::Button ) );
} else {
qDrawShadePanel( p, x, y, checkcol, h,
g, TRUE, 1, &g.brush( QColorGroup::Midlight ) );
}
} else if ( !act ) {
p->fillRect(x, y, checkcol , h,
g.brush( QColorGroup::Button ));
}
if ( mi->iconSet() ) { // draw iconset
QIconSet::Mode mode = dis ? QIconSet::Disabled : QIconSet::Normal;
if (act && !dis )
mode = QIconSet::Active;
- QPixmap pixmap = mi->iconSet()->pixmap( QIconSet::Small, mode );
+ QPixmap pixmap;
+ if ( mode == QIconSet::Disabled )
+ pixmap = mi->iconSet()->pixmap( QIconSet::Automatic, mode );
+ else
+ pixmap = mi->iconSet()->pixmap();
int pixw = pixmap.width();
int pixh = pixmap.height();
if ( act && !dis ) {
if ( !mi->isChecked() )
qDrawShadePanel( p, x, y, checkcol, h, g, FALSE, 1, &g.brush( QColorGroup::Button ) );
}
QRect cr( x, y, checkcol, h );
QRect pmr( 0, 0, pixw, pixh );
pmr.moveCenter( cr.center() );
p->setPen( itemg.text() );
p->drawPixmap( pmr.topLeft(), pixmap );
QBrush fill = act? g.brush( QColorGroup::Highlight ) :
g.brush( QColorGroup::Button );
p->fillRect( x+checkcol + 1, y, w - checkcol - 1, h, fill);
} else if ( checkable ) { // just "checking"...
int mw = checkcol + motifItemFrame;
int mh = h - 2*motifItemFrame;
if ( mi->isChecked() ) {
drawCheckMark( p, x + motifItemFrame + 2,
y+motifItemFrame, mw, mh, itemg, act, dis );
}
}
p->setPen( act ? g.highlightedText() : g.buttonText() );
QColor discol;
if ( dis ) {
discol = itemg.text();
p->setPen( discol );
}
int xm = motifItemFrame + checkcol + motifItemHMargin;
if ( mi->custom() ) {
int m = motifItemVMargin;
p->save();
if ( dis && !act ) {
p->setPen( g.light() );
mi->custom()->paint( p, itemg, act, enabled,
x+xm+1, y+m+1, w-xm-tab+1, h-2*m );
p->setPen( discol );
}
mi->custom()->paint( p, itemg, act, enabled,
x+xm, y+m, w-xm-tab+1, h-2*m );
p->restore();
}
QString s = mi->text();
if ( !s.isNull() ) { // draw text
int t = s.find( '\t' );
int m = motifItemVMargin;
const int text_flags = AlignVCenter|ShowPrefix | DontClip | SingleLine;
if ( t >= 0 ) { // draw tab text
if ( dis && !act ) {
p->setPen( g.light() );
p->drawText( x+w-tab-windowsRightBorder-motifItemHMargin-motifItemFrame+1,
y+m+1, tab, h-2*m, text_flags, s.mid( t+1 ));
p->setPen( discol );
}
p->drawText( x+w-tab-windowsRightBorder-motifItemHMargin-motifItemFrame,
y+m, tab, h-2*m, text_flags, s.mid( t+1 ) );
}
if ( dis && !act ) {
p->setPen( g.light() );
p->drawText( x+xm+1, y+m+1, w-xm+1, h-2*m, text_flags, s, t );
p->setPen( discol );
}
p->drawText( x+xm, y+m, w-xm-tab+1, h-2*m, text_flags, s, t );
} else if ( mi->pixmap() ) { // draw pixmap
QPixmap *pixmap = mi->pixmap();
if ( pixmap->depth() == 1 )
p->setBackgroundMode( OpaqueMode );
p->drawPixmap( x+xm, y+motifItemFrame, *pixmap );
if ( pixmap->depth() == 1 )
p->setBackgroundMode( TransparentMode );
}
if ( mi->popup() ) { // draw sub menu arrow
int dim = (h-2*motifItemFrame) / 2;
if ( act ) {
if ( !dis )
discol = white;
QColorGroup g2( discol, g.highlight(),
white, white,
dis ? discol : white,
discol, white );
drawArrow( p, RightArrow, FALSE,
x+w - motifArrowHMargin - motifItemFrame - dim, y+h/2-dim/2,
dim, dim, g2, TRUE );
} else {
drawArrow( p, RightArrow,
FALSE,
x+w - motifArrowHMargin - motifItemFrame - dim, y+h/2-dim/2,
dim, dim, g, mi->isEnabled() );
}
}
#endif
}
#endif