summaryrefslogtreecommitdiff
Side-by-side diff
Diffstat (more/less context) (show whitespace changes)
-rw-r--r--noncore/styles/liquid/liquid.cpp5
1 files changed, 4 insertions, 1 deletions
diff --git a/noncore/styles/liquid/liquid.cpp b/noncore/styles/liquid/liquid.cpp
index e6d8310..4a65952 100644
--- a/noncore/styles/liquid/liquid.cpp
+++ b/noncore/styles/liquid/liquid.cpp
@@ -1,171 +1,173 @@
/*-
* Copyright (C)QPL 2001 Daniel M. Duley. All rights reserved.
*/
//
// (c) 2002 Robert 'sandman' Griebl
//
#ifndef INCLUDE_MENUITEM_DEF
#define INCLUDE_MENUITEM_DEF
#endif
#include <qmenudata.h>
#include "liquid.h"
//#include "liquiddeco.h"
#include <qapplication.h>
#include <qpe/config.h>
#include "effects.h"
#include <qpalette.h>
#include <qbitmap.h>
#include <qtabbar.h>
#include <qpopupmenu.h>
#include <qobjectlist.h>
#include <qimage.h>
#include <qtimer.h>
#include <qpixmapcache.h>
#include <qradiobutton.h>
#include <qcombobox.h>
#include <qdrawutil.h>
#include <qwidgetlist.h>
#include <qtoolbutton.h>
#include <qheader.h>
#include <unistd.h>
#include <qmenubar.h>
#include <qprogressbar.h>
#include <qlineedit.h>
+#include <qlistbox.h>
#include <stdio.h>
#include "htmlmasks.h"
#include "embeddata.h"
+
typedef void (QStyle::*QDrawMenuBarItemImpl) (QPainter *, int, int, int, int, QMenuItem *,
QColorGroup &, bool, bool);
QDrawMenuBarItemImpl qt_set_draw_menu_bar_impl(QDrawMenuBarItemImpl impl);
void TransMenuHandler::stripePixmap(QPixmap &pix, const QColor &color)
{
QImage img(pix.convertToImage());
QImageEffect::fade(img, 0.9, color);
int x, y;
int r, g, b;
for(y=0; y < img.height(); y+=3){
unsigned int *data = (unsigned int *) img.scanLine(y);
for(x=0; x < img.width(); ++x){
r = qRed(data[x]);
g = qGreen(data[x]);
b = qBlue(data[x]);
if(r-10)
r-=10;
if(g-10)
g-=10;
if(b-10)
b-=10;
data[x] = qRgb(r, g, b);
}
}
pix.convertFromImage(img);
}
TransMenuHandler::TransMenuHandler(QObject *parent)
: QObject(parent)
{
pixDict.setAutoDelete(true);
reloadSettings();
}
void TransMenuHandler::reloadSettings()
{
pixDict.clear();
Config config ( "qpe" );
config. setGroup ( "Liquid-Style" );
type = config. readNumEntry("Type", TransStippleBg);
color = QColor ( config. readEntry("Color", QApplication::palette().active().button().name()));
fgColor = QColor ( config. readEntry("TextColor", QApplication::palette().active().text().name()));
opacity = config. readNumEntry("Opacity", 10);
if ( opacity < -20 )
opacity = 20;
else if ( opacity > 20 )
opacity = 20;
shadowText = config. readBoolEntry("ShadowText", true);
}
bool TransMenuHandler::eventFilter(QObject *obj, QEvent *ev)
{
QWidget *p = (QWidget *)obj;
if(ev->type() == QEvent::Show){
if(type == TransStippleBg || type == TransStippleBtn ||
type == Custom){
QApplication::syncX();
QPixmap *pix = new QPixmap;
if(p->testWFlags(Qt::WType_Popup)){
QRect r(p->x(), p->y(), p->width(), p->height());
QRect deskR = QApplication::desktop()->rect();
if(r.right() > deskR.right() || r.bottom() > deskR.bottom()){
r.setBottom(deskR.bottom());
r.setRight(deskR.right());
}
*pix = QPixmap::grabWindow(QApplication::desktop()-> winId(), r.x(), r.y(),
r.width(), r.height());
}
else{ // tear off menu
pix->resize(p->width(), p->height());
pix->fill(Qt::black.rgb());
}
if(type == TransStippleBg){
stripePixmap(*pix, p->colorGroup().background());
}
else if(type == TransStippleBtn){
stripePixmap(*pix, p->colorGroup().button());
}
else{
QPixmapEffect::fade(*pix, (((float)opacity)+80)*0.01, color);
}
pixDict.insert(p->winId(), pix);
if ( !p->inherits("QPopupMenu"))
p->setBackgroundPixmap(*pix);
QObjectList *ol = p-> queryList("QWidget");
for ( QObjectListIt it( *ol ); it. current ( ); ++it ) {
QWidget *wid = (QWidget *) it.current ( );
wid-> setBackgroundPixmap(*pix);
wid-> setBackgroundOrigin(QWidget::ParentOrigin);
}
delete ol;
}
}
else if(ev->type() == QEvent::Hide){
if(type == TransStippleBg || type == TransStippleBtn ||
type == Custom){
// qWarning("Deleting menu pixmap, width %d", pixDict.find(p->winId())->width());
pixDict.remove(p->winId());
if ( !p->inherits("QPopupMenu"))
p->setBackgroundMode(QWidget::PaletteBackground);
QObjectList *ol = p-> queryList("QWidget");
for ( QObjectListIt it( *ol ); it. current ( ); ++it ) {
QWidget *wid = (QWidget *) it.current ( );
wid-> setBackgroundMode( QWidget::PaletteBackground );
}
delete ol;
}
}
return(false);
}
static int qt_version ( )
{
const char *qver = qVersion ( );
@@ -1283,257 +1285,258 @@ void LiquidStyle::drawPushButton(QPushButton *btn, QPainter *p)
drawRoundButton(p, newColor, g.background(),
r.x(), r.y(), r.width(), r.height(), !btn->autoMask(),
sunken, btn->isDefault() || btn->autoDefault() || btn->hasFocus(),
btn->autoMask());
}
void LiquidStyle::drawPushButtonLabel(QPushButton *btn, QPainter *p)
{
int x1, y1, x2, y2, w, h;
btn->rect().coords(&x1, &y1, &x2, &y2);
w = btn->width();
h = btn->height();
bool act = btn->isOn() || btn->isDown();
if(act){
++x1, ++y1;
}
// Draw iconset first, if any
if ( btn->iconSet() && !btn->iconSet()->isNull() )
{
QIconSet::Mode mode = btn->isEnabled()
? QIconSet::Normal : QIconSet::Disabled;
if ( mode == QIconSet::Normal && btn->hasFocus() )
mode = QIconSet::Active;
QPixmap pixmap = btn->iconSet()->pixmap( QIconSet::Small, mode );
int pixw = pixmap.width();
int pixh = pixmap.height();
p->drawPixmap( x1+6, y1+h/2-pixh/2, pixmap );
x1 += pixw + 8;
w -= pixw + 8;
}
if(act){
QFont font = btn->font();
font.setBold(true);
p->setFont(font);
QColor shadow(btn->colorGroup().button().dark(130));
drawItem( p, x1+1, y1+1, w, h,
AlignCenter | ShowPrefix, btn->colorGroup(), btn->isEnabled(),
btn->pixmap(), btn->text(), -1,
&shadow);
drawItem( p, x1, y1, w, h,
AlignCenter | ShowPrefix, btn->colorGroup(), btn->isEnabled(),
btn->pixmap(), btn->text(), -1, &btn->colorGroup().light());
}
else{
/* Too blurry
drawItem( p, x1+1, y1+1, w, h,
AlignCenter | ShowPrefix, btn->colorGroup(), btn->isEnabled(),
btn->pixmap(), btn->text(), -1,
&btn->colorGroup().button().dark(115));
*/
drawItem( p, x1, y1, w, h,
AlignCenter | ShowPrefix,
btn->colorGroup(), btn->isEnabled(),
btn->pixmap(), btn->text(), -1,
&btn->colorGroup().buttonText());
}
}
void LiquidStyle::drawButtonMask(QPainter *p, int x, int y, int w, int h)
{
int x2 = x+w-1;
int y2 = y+h-1;
p->setPen(Qt::color1);
p->fillRect(x, y, w, h, Qt::color0);
if(w < 21 || h < 21){
// outer rect
p->drawLine(x, y+2, x, y2-2); // l
p->drawLine(x2, y+2, x2, y2-2); // r
p->drawLine(x+2, y, x2-2, y); // t
p->drawLine(x+2, y2, x2-2, y2); // b
p->drawLine(x+1, y+1, x2-1, y+1); // top second line
p->drawLine(x+1, y2-1, x2-1, y2-1); // bottom second line
p->fillRect(x+1, y+2, w-2, h-4, Qt::color1);
}
else{
int x2 = x+w-1;
int y2 = y+h-1;
int bx2 = htmlBtnMaskBmp.width()-1;
int by2 = htmlBtnMaskBmp.height()-1;
p->drawPixmap(0, 0, htmlBtnMaskBmp, 0, 0, 10, 10); // tl
p->drawPixmap(x2-9, 0, htmlBtnMaskBmp, bx2-9, 0, 10, 10); // tr
p->drawPixmap(0, y2-9, htmlBtnMaskBmp, 0, by2-9, 10, 10); // bl
p->drawPixmap(x2-9, y2-9, htmlBtnMaskBmp, bx2-9, by2-9, 10, 10); // br
// fills
p->fillRect(10, 0, w-20, 10, Qt::color1); // top
p->fillRect(10, y2-9, w-20, 10, Qt::color1); // bottom
p->fillRect(0, 10, w, h-20, Qt::color1); // middle
}
}
void LiquidStyle::drawBevelButton(QPainter *p, int x, int y, int w, int h,
const QColorGroup &g, bool sunken,
const QBrush */*fill*/)
{
if(currentHeader && p->device() == currentHeader){
int id = currentHeader->sectionAt(x);
bool isHeaderHover = id != -1 && id == headerHoverID;
drawClearBevel(p, x, y, w, h, sunken ?
g.button() : isHeaderHover ? g.button().light(110) :
g.background(), g.background());
}
else
drawClearBevel(p, x, y, w, h, sunken ? g.button() : g.background(),
g.background());
}
QRect LiquidStyle::buttonRect(int x, int y, int w, int h)
{
return(QRect(x+5, y+5, w-10, h-10));
}
void LiquidStyle::drawComboButton(QPainter *painter, int x, int y, int w, int h,
const QColorGroup &g, bool sunken,
bool edit, bool, const QBrush *)
{
bool isActive = false;
if (( painter->device()->devType() == QInternal::Widget ) &&
(
( qApp-> focusWidget ( ) == painter-> device ( )) ||
(
edit &&
((QWidget *) painter-> device ( ))-> inherits ( "QComboBox" ) &&
- ( qApp-> focusWidget ( ) == ((QComboBox *) painter->device())->lineEdit ( ))
+ ( qApp-> focusWidget ( ) == ((QComboBox *) painter->device())->lineEdit ( ) ||
+ qApp-> focusWidget ( ) == ((QComboBox *) painter->device())->listBox ( ))
)
)
) {
isActive = true;
}
bool isMasked = false;
if(painter->device()->devType() == QInternal::Widget)
isMasked = ((QWidget*)painter->device())->autoMask();
// TODO: Do custom code, don't just call drawRoundButton into a pixmap
QPixmap tmpPix(w, h);
QPainter p(&tmpPix);
drawRoundButton(&p, g.button(), g.background(), 0, 0, w, h, false,
sunken, false, isMasked);
if(!isActive){
p.setClipRect(0, 0, w-17, h);
drawRoundButton(&p, g.background(), g.background(), 0, 0, w, h, false,
sunken, false, isMasked);
}
p.end();
int x2 = x+w-1;
int y2 = y+h-1;
int bx2 = btnMaskBmp.width()-1;
int by2 = btnMaskBmp.height()-1;
QBitmap btnMask(w, h);
QBitmap *mask = isMasked ? &htmlBtnMaskBmp : &btnMaskBmp;
p.begin(&btnMask);
p.fillRect(0, 0, w, h, Qt::color0);
p.drawPixmap(0, 0, *mask, 0, 0, 10, 10); // tl
p.drawPixmap(x2-9, 0, *mask, bx2-9, 0, 10, 10); // tr
p.drawPixmap(0, y2-9, *mask, 0, by2-9, 10, 10); // bl
p.drawPixmap(x2-9, y2-9, *mask, bx2-9, by2-9, 10, 10); // br
// fills
p.fillRect(10, 0, w-20, 10, Qt::color1); // top
p.fillRect(10, y2-9, w-20, 10, Qt::color1); // bottom
p.fillRect(0, 10, w, h-20, Qt::color1); // middle
p.end();
tmpPix.setMask(btnMask);
painter->drawPixmap(x, y, tmpPix);
painter->setPen(g.button().dark(120));
painter->drawLine(x2-16, y+1, x2-16, y2-1);
if(edit){
painter->setPen(g.mid());
painter->drawRect(x+8, y+2, w-25, h-4);
}
int arrow_h = h / 3;
int arrow_w = arrow_h;
int arrow_x = w - arrow_w - 6;
int arrow_y = (h - arrow_h) / 2;
drawArrow(painter, DownArrow, false, arrow_x, arrow_y, arrow_w, arrow_h, g, true);
}
void LiquidStyle::drawComboButtonMask(QPainter *p, int x, int y, int w, int h)
{
drawButtonMask(p, x, y, w, h);
}
QRect LiquidStyle::comboButtonRect(int x, int y, int w, int h)
{
//return(QRect(x+3, y+3, w - (h / 3) - 13, h-6));
return(QRect(x+9, y+3, w - (h / 3) - 20, h-6));
}
QRect LiquidStyle::comboButtonFocusRect(int /*x*/, int /*y*/, int /*w*/, int /*h*/)
{
return QRect ( );
// return(QRect(x+5, y+3, w-(h/3)-13, h-5));
}
void LiquidStyle::drawScrollBarControls(QPainter *p, const QScrollBar *sb,
int sliderStart, uint controls,
uint activeControl)
{
int sliderMin, sliderMax, sliderLength, buttonDim;
scrollBarMetrics( sb, sliderMin, sliderMax, sliderLength, buttonDim );
if (sliderStart > sliderMax)
sliderStart = sliderMax;
bool horiz = sb->orientation() == QScrollBar::Horizontal;
QColorGroup g = sb->colorGroup();
QRect addB, subHC, subB;
QRect addPageR, subPageR, sliderR;
int addX, addY, subX, subY;
int len = horiz ? sb->width() : sb->height();
int extent = horiz ? sb->height() : sb->width();
// a few apps (ie: KSpread), are broken and use a hardcoded scrollbar
// extent of 16. Luckily, most apps (ie: Kate), seem fixed by now.
bool brokenApp;
if(extent == 16)
brokenApp = true;
else
brokenApp = false;
if (horiz) {
subY = addY = ( extent - buttonDim ) / 2;
subX = 0;
addX = len - buttonDim;
if(sbBuffer.size() != sb->size())
sbBuffer.resize(sb->size());
}
else {
subX = addX = ( extent - buttonDim ) / 2;
subY = 0;
addY = len - buttonDim;
if(sbBuffer.size() != sb->size())
sbBuffer.resize(sb->size());
}
subB.setRect( subX,subY,0,0); // buttonDim,buttonDim );
addB.setRect( addX,addY,buttonDim,buttonDim );
if(horiz)
subHC.setRect(addX-buttonDim,addY,buttonDim,buttonDim );
else
subHC.setRect(addX,addY-buttonDim,buttonDim,buttonDim );
int sliderEnd = sliderStart + sliderLength;
int sliderW = extent;
if (horiz) {
subPageR.setRect( subB.right() + 1, 0,
sliderStart - subB.right() - 1 , sliderW );
addPageR.setRect( sliderEnd, 0, addX - sliderEnd - buttonDim, sliderW );