32 #include <tqapplication.h>
34 #include <tqmetaobject.h>
35 #include <tqcleanuphandler.h>
38 #include <tqlistview.h>
39 #include <tqmenubar.h>
40 #include <tqpainter.h>
42 #include <tqpopupmenu.h>
43 #include <tqprogressbar.h>
44 #include <tqscrollbar.h>
45 #include <tqsettings.h>
47 #include <tqstylefactory.h>
49 #include <tqtoolbar.h>
53 #include <kpixmapeffect.h>
54 #include <kimageeffect.h>
57 # include <X11/Xlib.h>
59 # include <X11/extensions/Xrender.h>
60 extern bool tqt_use_xrender;
66 #ifdef HAVE_XCOMPOSITE
67 #include <X11/extensions/Xrender.h>
68 #include <X11/extensions/Xcomposite.h>
77 enum TransparencyEngine {
85 struct ShadowElements {
89 typedef TQMap<const TQWidget*,ShadowElements> ShadowMap;
90 static ShadowMap *_shadowMap = 0;
91 TQSingleCleanupHandler<ShadowMap> cleanupShadowMap;
92 ShadowMap &shadowMap() {
94 _shadowMap =
new ShadowMap;
95 cleanupShadowMap.set( &_shadowMap );
103 const double top_right_corner[16] =
104 { 0.949, 0.965, 0.980, 0.992,
105 0.851, 0.890, 0.945, 0.980,
106 0.706, 0.780, 0.890, 0.960,
107 0.608, 0.706, 0.851, 0.949 };
109 const double bottom_right_corner[16] =
110 { 0.608, 0.706, 0.851, 0.949,
111 0.706, 0.780, 0.890, 0.960,
112 0.851, 0.890, 0.945, 0.980,
113 0.949, 0.965, 0.980, 0.992 };
115 const double bottom_left_corner[16] =
116 { 0.949, 0.851, 0.706, 0.608,
117 0.965, 0.890, 0.780, 0.706,
118 0.980, 0.945, 0.890, 0.851,
119 0.992, 0.980, 0.960, 0.949 };
121 const double shadow_strip[4] =
122 { 0.565, 0.675, 0.835, 0.945 };
124 static bool useDropShadow(TQWidget* w)
126 return w && w->metaObject() &&
127 w->metaObject()->findProperty(
"TDEStyleMenuDropShadow") != -1;
133 class TransparencyHandler :
public TQObject
136 TransparencyHandler(
TDEStyle* style, TransparencyEngine tEngine,
137 float menuOpacity,
bool useDropShadow);
138 ~TransparencyHandler();
139 bool eventFilter(TQObject*
object, TQEvent* event);
142 void blendToColor(
const TQColor &col);
143 void blendToPixmap(
const TQColorGroup &cg,
const TQWidget* p);
145 void XRenderBlendToPixmap(
const TQWidget* p);
147 bool haveX11RGBASupport();
148 TQImage handleRealAlpha(TQImage);
149 void createShadowWindows(
const TQWidget* p);
150 void removeShadowWindows(
const TQWidget* p);
151 void rightShadow(TQImage& dst);
152 void bottomShadow(TQImage& dst);
158 TransparencyEngine te;
162 struct TDEStylePrivate
165 bool useFilledFrameWorkaround : 1;
166 bool etchDisabledText : 1;
167 bool scrollablePopupmenus : 1;
168 bool autoHideAccelerators : 1;
169 bool menuAltKeyNavigation : 1;
170 bool menuDropShadow : 1;
171 bool sloppySubMenus : 1;
172 bool semiTransparentRubberband : 1;
176 TransparencyEngine transparencyEngine;
178 TransparencyHandler* menuHandler;
182 TQBitmap *verticalLine;
183 TQBitmap *horizontalLine;
190 : TQCommonStyle(), d(new TDEStylePrivate)
195 d->scrollbarType = sbtype;
196 d->highcolor = TQPixmap::defaultDepth() > 8;
200 d->popupMenuDelay = settings.readNumEntry (
"/TDEStyle/Settings/PopupMenuDelay", 250);
201 d->sloppySubMenus = settings.readBoolEntry(
"/TDEStyle/Settings/SloppySubMenus",
false);
202 d->etchDisabledText = settings.readBoolEntry(
"/TDEStyle/Settings/EtchDisabledText",
true);
203 d->menuAltKeyNavigation = settings.readBoolEntry(
"/TDEStyle/Settings/MenuAltKeyNavigation",
true);
204 d->scrollablePopupmenus = settings.readBoolEntry(
"/TDEStyle/Settings/ScrollablePopupMenus",
false);
205 d->autoHideAccelerators = settings.readBoolEntry(
"/TDEStyle/Settings/AutoHideAccelerators",
false);
206 d->menuDropShadow = settings.readBoolEntry(
"/TDEStyle/Settings/MenuDropShadow",
false);
207 d->semiTransparentRubberband = settings.readBoolEntry(
"/TDEStyle/Settings/SemiTransparentRubberband",
false);
208 d->menuHandler = NULL;
210 if (useMenuTransparency) {
211 TQString effectEngine = settings.readEntry(
"/TDEStyle/Settings/MenuTransparencyEngine",
"Disabled");
214 if (effectEngine ==
"XRender")
215 d->transparencyEngine = XRender;
217 if (effectEngine ==
"XRender")
218 d->transparencyEngine = SoftwareBlend;
220 else if (effectEngine ==
"SoftwareBlend")
221 d->transparencyEngine = SoftwareBlend;
222 else if (effectEngine ==
"SoftwareTint")
223 d->transparencyEngine = SoftwareTint;
225 d->transparencyEngine = Disabled;
227 if (d->transparencyEngine != Disabled) {
229 d->menuOpacity = settings.readDoubleEntry(
"/TDEStyle/Settings/MenuOpacity", 0.90);
230 d->menuHandler =
new TransparencyHandler(
this, d->transparencyEngine,
231 d->menuOpacity, d->menuDropShadow);
236 d->horizontalLine = 0;
239 if (!d->menuHandler && d->menuDropShadow)
240 d->menuHandler =
new TransparencyHandler(
this, Disabled, 1.0, d->menuDropShadow);
246 delete d->verticalLine;
247 delete d->horizontalLine;
249 delete d->menuHandler;
251 d->menuHandler = NULL;
258 if (TQPixmap::defaultDepth() > 8)
259 return TQString(
"plastik");
261 return TQString(
"light, 3rd revision");
264 void TDEStyle::polish(
const TQStyleControlElementData &ceData, ControlElementFlags elementFlags,
void *ptr )
266 if (ceData.widgetObjectTypes.contains(TQWIDGET_OBJECT_NAME_STRING)) {
267 TQWidget* widget =
reinterpret_cast<TQWidget*
>(ptr);
268 if ( d->useFilledFrameWorkaround )
270 if ( TQFrame *frame = ::tqqt_cast< TQFrame* >( widget ) ) {
271 TQFrame::Shape shape = frame->frameShape();
272 if (shape == TQFrame::ToolBarPanel || shape == TQFrame::MenuBarPanel)
273 widget->installEventFilter(
this);
276 if (widget->isTopLevel())
278 if (!d->menuHandler && useDropShadow(widget))
279 d->menuHandler =
new TransparencyHandler(
this, Disabled, 1.0,
false);
281 if (d->menuHandler && useDropShadow(widget))
282 widget->installEventFilter(d->menuHandler);
288 void TDEStyle::unPolish(
const TQStyleControlElementData &ceData, ControlElementFlags elementFlags,
void *ptr )
290 if (ceData.widgetObjectTypes.contains(TQWIDGET_OBJECT_NAME_STRING)) {
291 TQWidget* widget =
reinterpret_cast<TQWidget*
>(ptr);
292 if ( d->useFilledFrameWorkaround )
294 if ( TQFrame *frame = ::tqqt_cast< TQFrame* >( widget ) ) {
295 TQFrame::Shape shape = frame->frameShape();
296 if (shape == TQFrame::ToolBarPanel || shape == TQFrame::MenuBarPanel)
297 widget->removeEventFilter(
this);
300 if (widget->isTopLevel() && d->menuHandler && useDropShadow(widget))
301 widget->removeEventFilter(d->menuHandler);
307 void TDEStyle::polishPopupMenu(
const TQStyleControlElementData &ceData, ControlElementFlags elementFlags,
void *ptr )
309 if ( !(ceData.windowState & WState_Polished ) ) {
310 widgetActionRequest(ceData, elementFlags, ptr, WAR_SetCheckable);
313 if (ceData.widgetObjectTypes.contains(TQWIDGET_OBJECT_NAME_STRING)) {
314 TQWidget* widget =
reinterpret_cast<TQWidget*
>(ptr);
315 TQPopupMenu *p =
dynamic_cast<TQPopupMenu*
>(widget);
318 if ( d->menuHandler && (strcmp(p->name(),
"tear off menu") != 0)) {
319 p->installEventFilter(d->menuHandler);
332 d->scrollbarType = sbtype;
341 const TQPopupMenu* )
const
343 pix.fill(cg.button());
346 void TDEStyle::drawTDEStylePrimitive( TDEStylePrimitive kpe,
348 const TQWidget* widget,
350 const TQColorGroup &cg,
352 const TQStyleOption &opt )
const
354 const TQStyleControlElementData &ceData = populateControlElementDataFromWidget(widget, TQStyleOption());
355 drawTDEStylePrimitive(kpe, p, ceData, getControlElementFlagsForObject(widget, TQStyleOption()), r, cg, flags, opt);
360 const TQStyleControlElementData &ceData,
361 ControlElementFlags elementFlags,
363 const TQColorGroup &cg,
365 const TQStyleOption&,
366 const TQWidget* widget )
const
373 case KPE_DockWindowHandle: {
376 TQWidget* wid =
const_cast<TQWidget*
>(widget);
377 bool horizontal = flags & Style_Horizontal;
380 r.rect( &x, &y, &w, &h );
381 if ((w <= 2) || (h <= 2)) {
382 p->fillRect(r, cg.highlight());
391 fnt = TQApplication::font(wid);
392 fnt.setPointSize( fnt.pointSize()-2 );
399 pix.resize( h-2, w-2 );
401 pix.resize( w-2, h-2 );
403 TQString title = wid->parentWidget()->caption();
406 p2.fillRect(pix.rect(), cg.brush(TQColorGroup::Highlight));
407 p2.setPen(cg.highlightedText());
409 p2.drawText(pix.rect(), AlignCenter, title);
413 p->setPen(cg.dark());
414 p->drawLine(x, y, x2, y);
415 p->drawLine(x, y, x, y2);
416 p->setPen(cg.light());
417 p->drawLine(x+1, y2, x2, y2);
418 p->drawLine(x2, y+1, x2, y2);
423 TQPixmap vpix = pix.xForm(m);
424 bitBlt(wid, r.x()+1, r.y()+1, &vpix);
426 bitBlt(wid, r.x()+1, r.y()+1, &pix);
438 case KPE_ListViewExpander: {
440 int radius = (r.width() - 4) / 2;
441 int centerx = r.x() + r.width()/2;
442 int centery = r.y() + r.height()/2;
445 p->setPen( cg.mid() );
449 p->setPen( cg.text() );
450 p->drawLine( centerx - radius, centery, centerx + radius, centery );
451 if ( flags & Style_On )
452 p->drawLine( centerx, centery - radius, centerx, centery + radius );
456 case KPE_ListViewBranch: {
460 if ( !d->verticalLine )
464 d->verticalLine =
new TQBitmap( 1, 129,
true );
465 d->horizontalLine =
new TQBitmap( 128, 1,
true );
466 TQPointArray a( 64 );
468 p2.begin( d->verticalLine );
471 for( i=0; i < 64; i++ )
472 a.setPoint( i, 0, i*2+1 );
476 TQApplication::flushX();
477 d->verticalLine->setMask( *d->verticalLine );
479 p2.begin( d->horizontalLine );
480 for( i=0; i < 64; i++ )
481 a.setPoint( i, i*2+1, 0 );
485 TQApplication::flushX();
486 d->horizontalLine->setMask( *d->horizontalLine );
489 p->setPen( cg.text() );
491 if (flags & Style_Horizontal)
495 int end = r.x()+r.width();
496 int thickness = r.height();
503 p->drawPixmap( point, other, *d->horizontalLine, 0, 0, i, thickness );
510 int end = r.y()+r.height();
511 int thickness = r.width();
512 int pixmapoffset = (flags & Style_NoChange) ? 0 : 1;
519 p->drawPixmap( other, point, *d->verticalLine, 0, pixmapoffset, thickness, i );
529 case KPE_ToolBarHandle:
530 case KPE_GeneralHandle:
531 case KPE_SliderHandle:
532 p->fillRect(r, cg.light());
535 case KPE_SliderGroove:
536 p->fillRect(r, cg.dark());
540 p->fillRect(r, Qt::yellow);
546 int TDEStyle::kPixelMetric( TDEStylePixelMetric kpm,
const TQStyleControlElementData &ceData, ControlElementFlags elementFlags,
const TQWidget* )
const
551 case KPM_ListViewBranchThickness:
555 case KPM_MenuItemSeparatorHeight:
556 case KPM_MenuItemHMargin:
557 case KPM_MenuItemVMargin:
558 case KPM_MenuItemHFrame:
559 case KPM_MenuItemVFrame:
560 case KPM_MenuItemCheckMarkHMargin:
561 case KPM_MenuItemArrowHMargin:
562 case KPM_MenuItemTabSpacing:
594 void TDEStyle::drawPrimitive( TQ_PrimitiveElement pe,
596 const TQStyleControlElementData &ceData,
597 ControlElementFlags elementFlags,
599 const TQColorGroup &cg,
601 const TQStyleOption& opt )
const
605 if (pe == PE_DockWindowHandle)
608 TQWidget *widget, *parent;
610 if (p && p->device()->devType() == TQInternal::Widget) {
611 widget =
static_cast<TQWidget*
>(p->device());
612 parent = widget->parentWidget();
618 (parent->inherits(TQTOOLBAR_OBJECT_NAME_STRING) ||
619 (parent->inherits(TQMAINWINDOW_OBJECT_NAME_STRING)) ))
622 drawTDEStylePrimitive( KPE_ToolBarHandle, p, ceData, elementFlags, r, cg, flags, opt, widget );
624 else if (ceData.widgetObjectTypes.contains(TQDOCKWINDOWHANDLE_OBJECT_NAME_STRING))
627 drawTDEStylePrimitive( KPE_DockWindowHandle, p, ceData, elementFlags, r, cg, flags, opt, widget );
631 drawTDEStylePrimitive( KPE_GeneralHandle, p, ceData, elementFlags, r, cg, flags, opt, widget );
632 #if TQT_VERSION >= 0x030300
634 }
else if ( d->semiTransparentRubberband && pe == TQStyle::PE_RubberBand ) {
635 TQRect rect = r.normalize();
637 point = p->xForm( point );
639 static XRenderColor clr = { 0, 0, 0, 0 };
640 static unsigned long fillColor = 0;
641 if ( fillColor != cg.highlight().rgb() ) {
642 fillColor = cg.highlight().rgb();
644 unsigned long color = fillColor << 8 | 0x40;
646 int red = (color >> 24) & 0xff;
647 int green = (color >> 16) & 0xff;
648 int blue = (color >> 8) & 0xff;
649 int alpha = (color >> 0) & 0xff;
651 red = red * alpha / 255;
652 green = green * alpha / 255;
653 blue = blue * alpha / 255;
655 clr.red = (red << 8) + red;
656 clr.green = (green << 8) + green;
657 clr.blue = (blue << 8) + blue;
658 clr.alpha = (alpha << 8) + alpha;
661 XRenderFillRectangle(
662 p->device()->x11Display(),
664 p->device()->x11RenderHandle(),
666 rect.x() + point.x(),
667 rect.y() + point.y(),
672 p->setRasterOp( TQt::CopyROP );
673 p->setPen( TQPen( cg.highlight().dark( 160 ), 1 ) );
674 p->setBrush( NoBrush );
676 rect.x() + point.x(),
677 rect.y() + point.y(),
684 TQCommonStyle::drawPrimitive( pe, p, ceData, elementFlags, r, cg, flags, opt );
689 void TDEStyle::drawControl( TQ_ControlElement element,
691 const TQStyleControlElementData &ceData,
692 ControlElementFlags elementFlags,
694 const TQColorGroup &cg,
696 const TQStyleOption &opt,
697 const TQWidget* widget )
const
704 TQTabBar::Shape tbs = ceData.tabBarData.shape;
705 bool selected = flags & Style_Selected;
706 int x = r.x(), y=r.y(), bottom=r.bottom(), right=r.right();
710 case TQTabBar::RoundedAbove: {
713 p->setPen(selected ? cg.light() : cg.shadow());
714 p->drawLine(x, y+4, x, bottom);
715 p->drawLine(x, y+4, x+4, y);
716 p->drawLine(x+4, y, right-1, y);
718 p->setPen(cg.shadow());
719 p->drawLine(right, y+1, right, bottom);
721 p->setPen(cg.midlight());
722 p->drawLine(x+1, y+4, x+1, bottom);
723 p->drawLine(x+1, y+4, x+4, y+1);
724 p->drawLine(x+5, y+1, right-2, y+1);
728 p->drawLine(right-1, y+1, right-1, bottom);
731 p->drawPoint(right-1, y+1);
732 p->drawLine(x+4, y+2, right-1, y+2);
733 p->drawLine(x+3, y+3, right-1, y+3);
734 p->fillRect(x+2, y+4, r.width()-3, r.height()-6, cg.mid());
736 p->setPen(cg.light());
737 p->drawLine(x, bottom-1, right, bottom-1);
743 case TQTabBar::RoundedBelow: {
746 p->setPen(selected ? cg.light() : cg.shadow());
747 p->drawLine(x, bottom-4, x, y);
750 p->drawLine(x, bottom-4, x+4, bottom);
752 p->setPen(cg.shadow());
753 p->drawLine(x+4, bottom, right-1, bottom);
754 p->drawLine(right, bottom-1, right, y);
756 p->setPen(cg.midlight());
757 p->drawLine(x+1, bottom-4, x+1, y);
758 p->drawLine(x+1, bottom-4, x+4, bottom-1);
759 p->drawLine(x+5, bottom-1, right-2, bottom-1);
763 p->drawLine(right-1, y, right-1, bottom-1);
766 p->drawPoint(right-1, bottom-1);
767 p->drawLine(x+4, bottom-2, right-1, bottom-2);
768 p->drawLine(x+3, bottom-3, right-1, bottom-3);
769 p->fillRect(x+2, y+2, r.width()-3, r.height()-6, cg.mid());
771 p->setPen(cg.dark());
772 p->drawLine(x, y, right, y);
777 case TQTabBar::TriangularAbove: {
780 p->setPen(selected ? cg.light() : cg.shadow());
781 p->drawLine(x, bottom, x, y+6);
782 p->drawLine(x, y+6, x+6, y);
783 p->drawLine(x+6, y, right-6, y);
786 p->drawLine(right-5, y+1, right-1, y+5);
787 p->setPen(cg.shadow());
788 p->drawLine(right, y+6, right, bottom);
790 p->setPen(cg.midlight());
791 p->drawLine(x+1, bottom, x+1, y+6);
792 p->drawLine(x+1, y+6, x+6, y+1);
793 p->drawLine(x+6, y+1, right-6, y+1);
794 p->drawLine(right-5, y+2, right-2, y+5);
796 p->drawLine(right-1, y+6, right-1, bottom);
799 a.setPoint(0, x+2, bottom);
800 a.setPoint(1, x+2, y+7);
801 a.setPoint(2, x+7, y+2);
802 a.setPoint(3, right-7, y+2);
803 a.setPoint(4, right-2, y+7);
804 a.setPoint(5, right-2, bottom);
805 p->setPen (selected ? cg.background() : cg.mid());
806 p->setBrush(selected ? cg.background() : cg.mid());
808 p->setBrush(NoBrush);
811 p->setPen(cg.light());
812 p->drawLine(x, bottom, right, bottom);
820 p->setPen(selected ? cg.light() : cg.shadow());
821 p->drawLine(x, y, x, bottom-6);
824 p->drawLine(x, bottom-6, x+6, bottom);
826 p->setPen(cg.shadow());
827 p->drawLine(x+6, bottom, right-6, bottom);
828 p->drawLine(right-5, bottom-1, right-1, bottom-5);
830 p->setPen(cg.shadow());
831 p->drawLine(right, bottom-6, right, y);
833 p->setPen(cg.midlight());
834 p->drawLine(x+1, y, x+1, bottom-6);
835 p->drawLine(x+1, bottom-6, x+6, bottom-1);
836 p->drawLine(x+6, bottom-1, right-6, bottom-1);
837 p->drawLine(right-5, bottom-2, right-2, bottom-5);
839 p->drawLine(right-1, bottom-6, right-1, y);
842 a.setPoint(0, x+2, y);
843 a.setPoint(1, x+2, bottom-7);
844 a.setPoint(2, x+7, bottom-2);
845 a.setPoint(3, right-7, bottom-2);
846 a.setPoint(4, right-2, bottom-7);
847 a.setPoint(5, right-2, y);
848 p->setPen (selected ? cg.background() : cg.mid());
849 p->setBrush(selected ? cg.background() : cg.mid());
851 p->setBrush(NoBrush);
854 p->setPen(cg.dark());
855 p->drawLine(x, y, right, y);
866 case CE_PopupMenuScroller: {
867 p->fillRect(r, cg.background());
868 drawPrimitive(PE_ButtonTool, p, ceData, elementFlags, r, cg, Style_Enabled);
869 drawPrimitive((flags & Style_Up) ? PE_ArrowUp : PE_ArrowDown, p, ceData, elementFlags, r, cg, Style_Enabled);
876 case CE_ProgressBarGroove: {
877 TQRect fr = subRect(SR_ProgressBarGroove, ceData, elementFlags, widget);
878 drawPrimitive(PE_Panel, p, ceData, elementFlags, fr, cg, Style_Sunken, TQStyleOption::SO_Default);
882 case CE_ProgressBarContents: {
884 TQRect cr = subRect(SR_ProgressBarContents, ceData, elementFlags, widget);
885 double progress = ceData.currentStep;
886 bool reverse = TQApplication::reverseLayout();
887 int steps = ceData.totalSteps;
893 if (progress > 0 || steps == 0) {
894 double pg = (steps == 0) ? 0.1 : progress / steps;
895 int width = TQMIN(cr.width(), (
int)(pg * cr.width()));
898 if (width < 1) width = 1;
900 int remWidth = cr.width() - width;
901 if (remWidth <= 0) remWidth = 1;
903 int pstep = int(progress) % ( 2 * remWidth );
905 if ( pstep > remWidth ) {
908 pstep = - (pstep - 2 * remWidth );
912 p->fillRect(cr.x() + cr.width() - width - pstep, cr.y(), width, cr.height(),
913 cg.brush(TQColorGroup::Highlight));
915 p->fillRect(cr.x() + pstep, cr.y(), width, cr.height(),
916 cg.brush(TQColorGroup::Highlight));
924 TQColor c(cg.highlight());
926 pix.resize(cr.width(), cr.height());
928 reverse ? c.dark(150) : c.light(150),
929 KPixmapEffect::HorizontalGradient);
931 p->drawPixmap(cr.x()+(cr.width()-width), cr.y(), pix,
932 cr.width()-width, 0, width, cr.height());
934 p->drawPixmap(cr.x(), cr.y(), pix, 0, 0, width, cr.height());
937 p->fillRect(cr.x()+(cr.width()-width), cr.y(), width, cr.height(),
938 cg.brush(TQColorGroup::Highlight));
940 p->fillRect(cr.x(), cr.y(), width, cr.height(),
941 cg.brush(TQColorGroup::Highlight));
946 case CE_ProgressBarLabel: {
947 TQRect cr = subRect(SR_ProgressBarContents, ceData, elementFlags, widget);
948 double progress = ceData.currentStep;
949 bool reverse = TQApplication::reverseLayout();
950 int steps = ceData.totalSteps;
955 TQFont font = p->font();
960 if (progress > 0 || steps == 0) {
961 double pg = (steps == 0) ? 1.0 : progress / steps;
962 int width = TQMIN(cr.width(), (
int)(pg * cr.width()));
965 crect.setRect(cr.x()+(cr.width()-width), cr.y(), cr.width(), cr.height());
967 crect.setRect(cr.x()+width, cr.y(), cr.width(), cr.height());
970 p->setPen((elementFlags & CEF_IsEnabled) ? (reverse ? cg.text() : cg.highlightedText()) : cg.text());
971 p->drawText(r, AlignCenter, ceData.progressText);
972 p->setClipRect(crect);
973 p->setPen(reverse ? cg.highlightedText() : cg.text());
974 p->drawText(r, AlignCenter, ceData.progressText);
978 p->setPen(cg.text());
979 p->drawText(r, AlignCenter, ceData.progressText);
986 TQCommonStyle::drawControl(element, p, ceData, elementFlags, r, cg, flags, opt, widget);
991 TQRect TDEStyle::subRect(SubRect r,
const TQStyleControlElementData &ceData,
const ControlElementFlags elementFlags,
const TQWidget* widget)
const
997 case SR_ProgressBarGroove:
1000 case SR_ProgressBarContents:
1001 case SR_ProgressBarLabel: {
1003 TQRect rt = ceData.rect;
1004 return TQRect(rt.x()+2, rt.y()+2, rt.width()-4, rt.height()-4);
1008 return TQCommonStyle::subRect(r, ceData, elementFlags, widget);
1013 int TDEStyle::pixelMetric(PixelMetric m,
const TQStyleControlElementData &ceData, ControlElementFlags elementFlags,
const TQWidget* widget)
const
1019 case PM_ButtonShiftHorizontal:
1020 case PM_ButtonShiftVertical:
1023 case PM_DockWindowHandleExtent:
1028 && !(ceData.parentWidgetData.widgetObjectTypes.contains(TQTOOLBAR_OBJECT_NAME_STRING))
1029 && !(ceData.parentWidgetData.widgetObjectTypes.contains(TQMAINWINDOW_OBJECT_NAME_STRING))
1030 && (ceData.widgetObjectTypes.contains(TQDOCKWINDOWHANDLE_OBJECT_NAME_STRING)) )
1031 return widget->fontMetrics().lineSpacing();
1033 return TQCommonStyle::pixelMetric(m, ceData, elementFlags, widget);
1038 case PM_TabBarTabHSpace:
1041 case PM_TabBarTabVSpace: {
1042 if ( ceData.tabBarData.shape == TQTabBar::RoundedAbove ||
1043 ceData.tabBarData.shape == TQTabBar::RoundedBelow )
1049 case PM_TabBarTabOverlap: {
1050 TQTabBar::Shape tbs = ceData.tabBarData.shape;
1052 if ( (tbs == TQTabBar::RoundedAbove) ||
1053 (tbs == TQTabBar::RoundedBelow) )
1061 case PM_SliderLength:
1064 case PM_SliderThickness:
1069 case PM_SliderControlThickness: {
1070 TQSlider::TickSetting ts = (TQSlider::TickSetting)ceData.tickMarkSetting;
1071 int thickness = (ceData.orientation == TQt::Horizontal) ?
1072 ceData.rect.height() : ceData.rect.width();
1074 case TQSlider::NoMarks:
1076 case TQSlider::Both:
1077 thickness = (thickness/2) + 3;
1080 thickness = ((thickness*2)/3) + 3;
1088 case PM_SplitterWidth:
1089 if (ceData.widgetObjectTypes.contains(TQDOCKWINDOWRESIZEHANDLE_OBJECT_NAME_STRING))
1096 case PM_MenuBarFrameWidth:
1099 case PM_DockWindowFrameWidth:
1104 case PM_MaximumDragDistance:
1107 case PM_MenuBarItemSpacing:
1110 case PM_ToolBarItemSpacing:
1113 case PM_PopupMenuScrollerHeight:
1114 return pixelMetric( PM_ScrollBarExtent, ceData, elementFlags, 0);
1117 return TQCommonStyle::pixelMetric( m, ceData, elementFlags, widget );
1122 static TQListViewItem* nextVisibleSibling(TQListViewItem* item)
1124 TQListViewItem* sibling = item;
1127 sibling = sibling->nextSibling();
1129 while (sibling && !sibling->isVisible());
1134 void TDEStyle::drawComplexControl( TQ_ComplexControl control,
1136 const TQStyleControlElementData &ceData,
1137 ControlElementFlags elementFlags,
1139 const TQColorGroup &cg,
1143 const TQStyleOption &opt,
1144 const TQWidget* widget )
const
1150 case CC_ScrollBar: {
1154 bool maxedOut = (ceData.minSteps == ceData.maxSteps);
1155 bool horizontal = (ceData.orientation == TQt::Horizontal);
1156 SFlags sflags = ((horizontal ? Style_Horizontal : Style_Default) |
1157 (maxedOut ? Style_Default : Style_Enabled));
1159 TQRect addline, subline, subline2, addpage, subpage, slider, first, last;
1160 subline = querySubControlMetrics(control, ceData, elementFlags, SC_ScrollBarSubLine, opt, widget);
1161 addline = querySubControlMetrics(control, ceData, elementFlags, SC_ScrollBarAddLine, opt, widget);
1162 subpage = querySubControlMetrics(control, ceData, elementFlags, SC_ScrollBarSubPage, opt, widget);
1163 addpage = querySubControlMetrics(control, ceData, elementFlags, SC_ScrollBarAddPage, opt, widget);
1164 slider = querySubControlMetrics(control, ceData, elementFlags, SC_ScrollBarSlider, opt, widget);
1165 first = querySubControlMetrics(control, ceData, elementFlags, SC_ScrollBarFirst, opt, widget);
1166 last = querySubControlMetrics(control, ceData, elementFlags, SC_ScrollBarLast, opt, widget);
1169 if ( useThreeButtonScrollBar ) {
1171 subline2.moveBy(-addline.width(), 0);
1174 subline2.moveBy(0, -addline.height());
1179 if ((controls & SC_ScrollBarSubLine) && subline.isValid()) {
1180 drawPrimitive(PE_ScrollBarSubLine, p, ceData, elementFlags, subline, cg,
1181 sflags | (active == SC_ScrollBarSubLine ?
1182 Style_Down : Style_Default));
1184 if (useThreeButtonScrollBar && subline2.isValid())
1185 drawPrimitive(PE_ScrollBarSubLine, p, ceData, elementFlags, subline2, cg,
1186 sflags | (active == SC_ScrollBarSubLine ?
1187 Style_Down : Style_Default));
1190 if ((controls & SC_ScrollBarAddLine) && addline.isValid())
1191 drawPrimitive(PE_ScrollBarAddLine, p, ceData, elementFlags, addline, cg,
1192 sflags | ((active == SC_ScrollBarAddLine) ?
1193 Style_Down : Style_Default));
1195 if ((controls & SC_ScrollBarSubPage) && subpage.isValid())
1196 drawPrimitive(PE_ScrollBarSubPage, p, ceData, elementFlags, subpage, cg,
1197 sflags | ((active == SC_ScrollBarSubPage) ?
1198 Style_Down : Style_Default));
1200 if ((controls & SC_ScrollBarAddPage) && addpage.isValid())
1201 drawPrimitive(PE_ScrollBarAddPage, p, ceData, elementFlags, addpage, cg,
1202 sflags | ((active == SC_ScrollBarAddPage) ?
1203 Style_Down : Style_Default));
1205 if ((controls & SC_ScrollBarFirst) && first.isValid())
1206 drawPrimitive(PE_ScrollBarFirst, p, ceData, elementFlags, first, cg,
1207 sflags | ((active == SC_ScrollBarFirst) ?
1208 Style_Down : Style_Default));
1210 if ((controls & SC_ScrollBarLast) && last.isValid())
1211 drawPrimitive(PE_ScrollBarLast, p, ceData, elementFlags, last, cg,
1212 sflags | ((active == SC_ScrollBarLast) ?
1213 Style_Down : Style_Default));
1215 if ((controls & SC_ScrollBarSlider) && slider.isValid()) {
1216 drawPrimitive(PE_ScrollBarSlider, p, ceData, elementFlags, slider, cg,
1217 sflags | ((active == SC_ScrollBarSlider) ?
1218 Style_Down : Style_Default));
1220 if (elementFlags & CEF_HasFocus) {
1221 TQRect fr(slider.x() + 2, slider.y() + 2,
1222 slider.width() - 5, slider.height() - 5);
1223 drawPrimitive(PE_FocusRect, p, ceData, elementFlags, fr, cg, Style_Default);
1233 TQRect groove = querySubControlMetrics(CC_Slider, ceData, elementFlags, SC_SliderGroove, opt, widget);
1234 TQRect handle = querySubControlMetrics(CC_Slider, ceData, elementFlags, SC_SliderHandle, opt, widget);
1237 TQPixmap pix(ceData.rect.size());
1241 if ( (elementFlags & CEF_HasParentWidget) &&
1242 !ceData.parentWidgetData.bgPixmap.isNull() ) {
1243 TQPixmap pixmap = ceData.parentWidgetData.bgPixmap;
1244 p2.drawTiledPixmap(r, pixmap, ceData.pos);
1246 pix.fill(cg.background());
1249 if ((controls & SC_SliderGroove) && groove.isValid()) {
1250 drawTDEStylePrimitive( KPE_SliderGroove, &p2, ceData, elementFlags, groove, cg, flags, opt, widget );
1253 if (elementFlags & CEF_HasFocus) {
1254 drawPrimitive(PE_FocusRect, &p2, ceData, elementFlags, groove, cg);
1259 if (controls & SC_SliderTickmarks)
1260 TQCommonStyle::drawComplexControl(control, &p2, ceData, elementFlags,
1261 r, cg, flags, SC_SliderTickmarks, active, opt, widget);
1264 if ((controls & SC_SliderHandle) && handle.isValid()) {
1265 if (active == SC_SliderHandle)
1266 flags |= Style_Active;
1267 drawTDEStylePrimitive( KPE_SliderHandle, &p2, ceData, elementFlags, handle, cg, flags, opt, widget );
1272 TQPaintDevice* ppd = p->device();
1273 if (ppd->isExtDev()) {
1274 p->drawPixmap(0, 0, pix);
1277 bitBlt((TQWidget*)widget, r.x(), r.y(), &pix);
1292 if ( controls & SC_ListView )
1293 TQCommonStyle::drawComplexControl( control, p, ceData, elementFlags, r, cg, flags, controls, active, opt, widget );
1296 if ( controls & (SC_ListViewBranch | SC_ListViewExpand) )
1299 if (opt.isDefault())
1302 TQListViewItem *item = opt.listViewItem();
1303 TQListViewItem *child = item->firstChild();
1308 TQPointArray dotlines;
1310 if ( active == SC_All && controls == SC_ListViewExpand ) {
1314 dotlines[0] = TQPoint( r.right(), r.top() );
1315 dotlines[1] = TQPoint( r.right(), r.bottom() );
1319 int linetop = 0, linebot = 0;
1321 dotoffset = (item->itemPos() + item->height() - y) % 2;
1322 dotlines.resize( item->childCount() * 4 );
1326 while ( child && y + child->height() <= 0 )
1328 y += child->totalHeight();
1329 child = nextVisibleSibling(child);
1332 int bx = r.width() / 2;
1335 TQListView* v = item->listView();
1336 int lh = TQMAX( p->fontMetrics().height() + 2 * v->itemMargin(),
1337 TQApplication::globalStrut().height() );
1343 TQStyle::StyleFlags boxflags;
1344 while ( child && y < r.height() )
1347 if ( (child->isExpandable() || child->childCount()) &&
1348 (child->height() > 0) )
1351 boxrect = TQRect( bx-4, linebot-4, 9, 9 );
1352 boxflags = child->isOpen() ? TQStyle::Style_Off : TQStyle::Style_On;
1355 drawTDEStylePrimitive( KPE_ListViewExpander, p, ceData, elementFlags, boxrect, cg, boxflags, opt, NULL );
1358 p->setPen( cg.mid() );
1359 dotlines[c++] = TQPoint( bx, linetop );
1360 dotlines[c++] = TQPoint( bx, linebot - 5 );
1361 dotlines[c++] = TQPoint( bx + 5, linebot );
1362 dotlines[c++] = TQPoint( r.width(), linebot );
1363 linetop = linebot + 5;
1366 dotlines[c++] = TQPoint( bx+1, linebot );
1367 dotlines[c++] = TQPoint( r.width(), linebot );
1370 y += child->totalHeight();
1371 child = nextVisibleSibling(child);
1375 linebot = r.height();
1377 if ( linetop < linebot )
1379 dotlines[c++] = TQPoint( bx, linetop );
1380 dotlines[c++] = TQPoint( bx, linebot );
1385 static int thickness = kPixelMetric( KPM_ListViewBranchThickness, ceData, elementFlags );
1388 TQStyle::StyleFlags branchflags;
1389 for( line = 0; line < c; line += 2 )
1398 if ( dotlines[line].y() == dotlines[line+1].y() )
1401 int end = dotlines[line+1].x();
1402 int point = dotlines[line].x();
1403 int other = dotlines[line].y();
1405 branchrect = TQRect( point, other-(thickness/2), end-point, thickness );
1406 branchflags = TQStyle::Style_Horizontal;
1409 drawTDEStylePrimitive( KPE_ListViewBranch, p, ceData, elementFlags, branchrect, cg, branchflags, opt, NULL );
1413 int end = dotlines[line+1].y();
1414 int point = dotlines[line].y();
1415 int other = dotlines[line].x();
1416 int pixmapoffset = ((point & 1) != dotoffset ) ? 1 : 0;
1418 branchrect = TQRect( other-(thickness/2), point, thickness, end-point );
1420 branchflags = TQStyle::Style_NoChange;
1422 branchflags = TQStyle::Style_Default;
1425 drawTDEStylePrimitive( KPE_ListViewBranch, p, ceData, elementFlags, branchrect, cg, branchflags, opt, NULL );
1433 TQCommonStyle::drawComplexControl( control, p, ceData, elementFlags, r, cg,
1434 flags, controls, active, opt, widget );
1440 TQStyle::SubControl TDEStyle::querySubControl( TQ_ComplexControl control,
1441 const TQStyleControlElementData &ceData,
1442 ControlElementFlags elementFlags,
1444 const TQStyleOption &opt,
1445 const TQWidget* widget )
const
1447 TQStyle::SubControl ret = TQCommonStyle::querySubControl(control, ceData, elementFlags, pos, opt, widget);
1451 if (control == CC_ScrollBar && ret == SC_None)
1452 ret = SC_ScrollBarSubLine;
1458 TQRect TDEStyle::querySubControlMetrics( TQ_ComplexControl control,
1459 const TQStyleControlElementData &ceData,
1460 ControlElementFlags elementFlags,
1462 const TQStyleOption &opt,
1463 const TQWidget* widget )
const
1467 if (control == CC_ScrollBar)
1473 bool horizontal = ceData.orientation == TQt::Horizontal;
1474 int sliderstart = ceData.startStep;
1475 int sbextent = pixelMetric(PM_ScrollBarExtent, ceData, elementFlags, widget);
1476 int maxlen = (horizontal ? ceData.rect.width() : ceData.rect.height())
1477 - (sbextent * (threeButtonScrollBar ? 3 : 2));
1481 if (ceData.maxSteps != ceData.minSteps)
1483 uint range = ceData.maxSteps - ceData.minSteps;
1484 sliderlen = (ceData.pageStep * maxlen) / (range + ceData.pageStep);
1486 int slidermin = pixelMetric( PM_ScrollBarSliderMin, ceData, elementFlags, widget );
1487 if ( sliderlen < slidermin || range > INT_MAX / 2 )
1488 sliderlen = slidermin;
1489 if ( sliderlen > maxlen )
1497 case SC_ScrollBarSubLine: {
1499 if (platinumScrollBar) {
1501 ret.setRect(ceData.rect.width() - 2 * sbextent, 0, sbextent, sbextent);
1503 ret.setRect(0, ceData.rect.height() - 2 * sbextent, sbextent, sbextent);
1505 ret.setRect(0, 0, sbextent, sbextent);
1509 case SC_ScrollBarAddLine: {
1511 if (nextScrollBar) {
1513 ret.setRect(sbextent, 0, sbextent, sbextent);
1515 ret.setRect(0, sbextent, sbextent, sbextent);
1518 ret.setRect(ceData.rect.width() - sbextent, 0, sbextent, sbextent);
1520 ret.setRect(0, ceData.rect.height() - sbextent, sbextent, sbextent);
1525 case SC_ScrollBarSubPage: {
1527 if (platinumScrollBar) {
1529 ret.setRect(0, 0, sliderstart, sbextent);
1531 ret.setRect(0, 0, sbextent, sliderstart);
1532 }
else if (nextScrollBar) {
1534 ret.setRect(sbextent*2, 0, sliderstart-2*sbextent, sbextent);
1536 ret.setRect(0, sbextent*2, sbextent, sliderstart-2*sbextent);
1539 ret.setRect(sbextent, 0, sliderstart - sbextent, sbextent);
1541 ret.setRect(0, sbextent, sbextent, sliderstart - sbextent);
1546 case SC_ScrollBarAddPage: {
1550 if (platinumScrollBar)
1552 else if (nextScrollBar)
1558 ret.setRect(sliderstart + sliderlen, 0,
1559 maxlen - sliderstart - sliderlen + fudge, sbextent);
1561 ret.setRect(0, sliderstart + sliderlen, sbextent,
1562 maxlen - sliderstart - sliderlen + fudge);
1566 case SC_ScrollBarGroove: {
1567 int multi = threeButtonScrollBar ? 3 : 2;
1570 if (platinumScrollBar)
1572 else if (nextScrollBar)
1578 ret.setRect(fudge, 0, ceData.rect.width() - sbextent * multi, ceData.rect.height());
1580 ret.setRect(0, fudge, ceData.rect.width(), ceData.rect.height() - sbextent * multi);
1584 case SC_ScrollBarSlider: {
1586 ret.setRect(sliderstart, 0, sliderlen, sbextent);
1588 ret.setRect(0, sliderstart, sbextent, sliderlen);
1593 ret = TQCommonStyle::querySubControlMetrics(control, ceData, elementFlags, sc, opt, widget);
1597 ret = TQCommonStyle::querySubControlMetrics(control, ceData, elementFlags, sc, opt, widget);
1602 static const char *
const tdestyle_close_xpm[] = {
1619 static const char *
const tdestyle_maximize_xpm[]={
1637 static const char *
const tdestyle_minimize_xpm[] = {
1654 static const char *
const tdestyle_normalizeup_xpm[] = {
1672 static const char *
const tdestyle_shade_xpm[] = {
1689 static const char *
const tdestyle_unshade_xpm[] = {
1706 static const char *
const dock_window_close_xpm[] = {
1726 static const char *
const information_xpm[]={
1733 "...........********.............",
1734 "........***aaaaaaaa***..........",
1735 "......**aaaaaaaaaaaaaa**........",
1736 ".....*aaaaaaaaaaaaaaaaaa*.......",
1737 "....*aaaaaaaabbbbaaaaaaaac......",
1738 "...*aaaaaaaabbbbbbaaaaaaaac.....",
1739 "..*aaaaaaaaabbbbbbaaaaaaaaac....",
1740 ".*aaaaaaaaaaabbbbaaaaaaaaaaac...",
1741 ".*aaaaaaaaaaaaaaaaaaaaaaaaaac*..",
1742 "*aaaaaaaaaaaaaaaaaaaaaaaaaaaac*.",
1743 "*aaaaaaaaaabbbbbbbaaaaaaaaaaac*.",
1744 "*aaaaaaaaaaaabbbbbaaaaaaaaaaac**",
1745 "*aaaaaaaaaaaabbbbbaaaaaaaaaaac**",
1746 "*aaaaaaaaaaaabbbbbaaaaaaaaaaac**",
1747 "*aaaaaaaaaaaabbbbbaaaaaaaaaaac**",
1748 "*aaaaaaaaaaaabbbbbaaaaaaaaaaac**",
1749 ".*aaaaaaaaaaabbbbbaaaaaaaaaac***",
1750 ".*aaaaaaaaaaabbbbbaaaaaaaaaac***",
1751 "..*aaaaaaaaaabbbbbaaaaaaaaac***.",
1752 "...caaaaaaabbbbbbbbbaaaaaac****.",
1753 "....caaaaaaaaaaaaaaaaaaaac****..",
1754 ".....caaaaaaaaaaaaaaaaaac****...",
1755 "......ccaaaaaaaaaaaaaacc****....",
1756 ".......*cccaaaaaaaaccc*****.....",
1757 "........***cccaaaac*******......",
1758 "..........****caaac*****........",
1759 ".............*caaac**...........",
1760 "...............caac**...........",
1761 "................cac**...........",
1762 ".................cc**...........",
1763 "..................***...........",
1764 "...................**..........."};
1766 static const char*
const warning_xpm[]={
1772 ".............***................",
1773 "............*aaa*...............",
1774 "...........*aaaaa*b.............",
1775 "...........*aaaaa*bb............",
1776 "..........*aaaaaaa*bb...........",
1777 "..........*aaaaaaa*bb...........",
1778 ".........*aaaaaaaaa*bb..........",
1779 ".........*aaaaaaaaa*bb..........",
1780 "........*aaaaaaaaaaa*bb.........",
1781 "........*aaaa***aaaa*bb.........",
1782 ".......*aaaa*****aaaa*bb........",
1783 ".......*aaaa*****aaaa*bb........",
1784 "......*aaaaa*****aaaaa*bb.......",
1785 "......*aaaaa*****aaaaa*bb.......",
1786 ".....*aaaaaa*****aaaaaa*bb......",
1787 ".....*aaaaaa*****aaaaaa*bb......",
1788 "....*aaaaaaaa***aaaaaaaa*bb.....",
1789 "....*aaaaaaaa***aaaaaaaa*bb.....",
1790 "...*aaaaaaaaa***aaaaaaaaa*bb....",
1791 "...*aaaaaaaaaa*aaaaaaaaaa*bb....",
1792 "..*aaaaaaaaaaa*aaaaaaaaaaa*bb...",
1793 "..*aaaaaaaaaaaaaaaaaaaaaaa*bb...",
1794 ".*aaaaaaaaaaaa**aaaaaaaaaaa*bb..",
1795 ".*aaaaaaaaaaa****aaaaaaaaaa*bb..",
1796 "*aaaaaaaaaaaa****aaaaaaaaaaa*bb.",
1797 "*aaaaaaaaaaaaa**aaaaaaaaaaaa*bb.",
1798 "*aaaaaaaaaaaaaaaaaaaaaaaaaaa*bbb",
1799 "*aaaaaaaaaaaaaaaaaaaaaaaaaaa*bbb",
1800 ".*aaaaaaaaaaaaaaaaaaaaaaaaa*bbbb",
1801 "..*************************bbbbb",
1802 "....bbbbbbbbbbbbbbbbbbbbbbbbbbb.",
1803 ".....bbbbbbbbbbbbbbbbbbbbbbbbb.."};
1805 static const char*
const critical_xpm[]={
1811 "...........********.............",
1812 ".........************...........",
1813 ".......****************.........",
1814 "......******************........",
1815 ".....********************a......",
1816 "....**********************a.....",
1817 "...************************a....",
1818 "..*******b**********b*******a...",
1819 "..******bbb********bbb******a...",
1820 ".******bbbbb******bbbbb******a..",
1821 ".*******bbbbb****bbbbb*******a..",
1822 "*********bbbbb**bbbbb*********a.",
1823 "**********bbbbbbbbbb**********a.",
1824 "***********bbbbbbbb***********aa",
1825 "************bbbbbb************aa",
1826 "************bbbbbb************aa",
1827 "***********bbbbbbbb***********aa",
1828 "**********bbbbbbbbbb**********aa",
1829 "*********bbbbb**bbbbb*********aa",
1830 ".*******bbbbb****bbbbb*******aa.",
1831 ".******bbbbb******bbbbb******aa.",
1832 "..******bbb********bbb******aaa.",
1833 "..*******b**********b*******aa..",
1834 "...************************aaa..",
1835 "....**********************aaa...",
1836 "....a********************aaa....",
1837 ".....a******************aaa.....",
1838 "......a****************aaa......",
1839 ".......aa************aaaa.......",
1840 ".........aa********aaaaa........",
1841 "...........aaaaaaaaaaa..........",
1842 ".............aaaaaaa............"};
1844 TQPixmap TDEStyle::stylePixmap( StylePixmap stylepixmap,
1845 const TQStyleControlElementData &ceData,
1846 ControlElementFlags elementFlags,
1847 const TQStyleOption& opt,
1848 const TQWidget* widget)
const
1850 switch (stylepixmap) {
1851 case SP_TitleBarShadeButton:
1852 return TQPixmap(
const_cast<const char**
>(tdestyle_shade_xpm));
1853 case SP_TitleBarUnshadeButton:
1854 return TQPixmap(
const_cast<const char**
>(tdestyle_unshade_xpm));
1855 case SP_TitleBarNormalButton:
1856 return TQPixmap(
const_cast<const char**
>(tdestyle_normalizeup_xpm));
1857 case SP_TitleBarMinButton:
1858 return TQPixmap(
const_cast<const char**
>(tdestyle_minimize_xpm));
1859 case SP_TitleBarMaxButton:
1860 return TQPixmap(
const_cast<const char**
>(tdestyle_maximize_xpm));
1861 case SP_TitleBarCloseButton:
1862 return TQPixmap(
const_cast<const char**
>(tdestyle_close_xpm));
1863 case SP_DockWindowCloseButton:
1864 return TQPixmap(
const_cast<const char**
>(dock_window_close_xpm ));
1865 case SP_MessageBoxInformation:
1866 return TQPixmap(
const_cast<const char**
>(information_xpm));
1867 case SP_MessageBoxWarning:
1868 return TQPixmap(
const_cast<const char**
>(warning_xpm));
1869 case SP_MessageBoxCritical:
1870 return TQPixmap(
const_cast<const char**
>(critical_xpm));
1874 return TQCommonStyle::stylePixmap(stylepixmap, ceData, elementFlags, opt, widget);
1878 int TDEStyle::styleHint( TQ_StyleHint sh,
const TQStyleControlElementData &ceData, ControlElementFlags elementFlags,
1879 const TQStyleOption &opt, TQStyleHintReturn* shr,
const TQWidget* w)
const
1883 case SH_EtchDisabledText:
1884 return d->etchDisabledText ? 1 : 0;
1886 case SH_PopupMenu_Scrollable:
1887 return d->scrollablePopupmenus ? 1 : 0;
1889 case SH_HideUnderlineAcceleratorWhenAltUp:
1890 return d->autoHideAccelerators ? 1 : 0;
1892 case SH_MenuBar_AltKeyNavigation:
1893 return d->menuAltKeyNavigation ? 1 : 0;
1895 case SH_PopupMenu_SubMenuPopupDelay:
1896 if ( styleHint( SH_PopupMenu_SloppySubMenus, ceData, elementFlags, TQStyleOption::Default, 0, w ) )
1897 return TQMIN( 100, d->popupMenuDelay );
1899 return d->popupMenuDelay;
1901 case SH_PopupMenu_SloppySubMenus:
1902 return d->sloppySubMenus;
1904 case SH_ItemView_ChangeHighlightOnFocus:
1905 case SH_Slider_SloppyKeyEvents:
1906 case SH_MainWindow_SpaceBelowMenuBar:
1907 case SH_PopupMenu_AllowActiveAndDisabled:
1910 case SH_Slider_SnapToValue:
1911 case SH_PrintDialog_RightAlignButtons:
1912 case SH_FontDialog_SelectAssociatedText:
1913 case SH_MenuBar_MouseTracking:
1914 case SH_PopupMenu_MouseTracking:
1915 case SH_ComboBox_ListMouseTracking:
1916 case SH_ScrollBar_MiddleClickAbsolutePosition:
1918 case SH_LineEdit_PasswordCharacter:
1921 const TQFontMetrics &fm = w->fontMetrics();
1922 if (fm.inFont(TQChar(0x25CF))) {
1924 }
else if (fm.inFont(TQChar(0x2022))) {
1932 return TQCommonStyle::styleHint(sh, ceData, elementFlags, opt, shr, w);
1937 bool TDEStyle::objectEventHandler(
const TQStyleControlElementData &ceData, ControlElementFlags elementFlags,
void* source, TQEvent *event )
1939 if (ceData.widgetObjectTypes.contains(TQOBJECT_OBJECT_NAME_STRING)) {
1940 TQObject*
object =
reinterpret_cast<TQObject*
>(source);
1941 if ( d->useFilledFrameWorkaround )
1951 if (
event->type() == TQEvent::Paint
1952 && (frame = ::tqqt_cast<TQFrame*>(
object)) )
1954 if (frame->frameShape() != TQFrame::ToolBarPanel && frame->frameShape() != TQFrame::MenuBarPanel)
1957 bool horizontal =
true;
1958 TQPaintEvent* pe = (TQPaintEvent*)event;
1959 TQToolBar *toolbar = ::tqqt_cast< TQToolBar *>( frame );
1960 TQRect r = pe->rect();
1962 if (toolbar && toolbar->orientation() == Qt::Vertical)
1966 if ( r.height() == frame->height() )
1970 TQPaintEvent dummyPE( TQRect( r.x(), 0, r.width(), frame->height()) );
1971 TQApplication::sendEvent( frame, &dummyPE );
1974 if ( r.width() == frame->width() )
1977 TQPaintEvent dummyPE( TQRect( 0, r.y(), frame->width(), r.height()) );
1978 TQApplication::sendEvent( frame, &dummyPE );
1995 TransparencyHandler::TransparencyHandler(
TDEStyle* style,
1996 TransparencyEngine tEngine,
float menuOpacity,
bool useDropShadow )
2001 opacity = menuOpacity;
2002 dropShadow = useDropShadow;
2003 pix.setOptimization(TQPixmap::BestOptim);
2006 TransparencyHandler::~TransparencyHandler()
2010 bool TransparencyHandler::haveX11RGBASupport()
2013 if (TQPaintDevice::x11AppDepth() == 32) {
2021 #define REAL_ALPHA_STRENGTH 255.0
2024 void TransparencyHandler::rightShadow(TQImage& dst)
2026 bool have_composite = haveX11RGBASupport();
2028 if (dst.depth() != 32)
2029 dst = dst.convertDepth(32);
2032 int pixels = dst.width() * dst.height();
2033 #ifdef WORDS_BIGENDIAN
2034 unsigned char* data = dst.bits() + 1;
2036 unsigned char* data = dst.bits();
2038 for(
int i = 0; i < 16; i++) {
2039 if (have_composite) {
2043 *data = (
unsigned char)(REAL_ALPHA_STRENGTH*(1.0-top_right_corner[i])); data++;
2046 *data = (
unsigned char)((*data)*top_right_corner[i]); data++;
2047 *data = (
unsigned char)((*data)*top_right_corner[i]); data++;
2048 *data = (
unsigned char)((*data)*top_right_corner[i]); data++;
2055 for(
int i = 0; i < pixels; i++) {
2056 if (have_composite) {
2060 *data = (
unsigned char)(REAL_ALPHA_STRENGTH*(1.0-shadow_strip[c])); data++;
2063 *data = (
unsigned char)((*data)*shadow_strip[c]); data++;
2064 *data = (
unsigned char)((*data)*shadow_strip[c]); data++;
2065 *data = (
unsigned char)((*data)*shadow_strip[c]); data++;
2073 for(
int i = 0; i < 16; i++) {
2074 if (have_composite) {
2078 *data = (
unsigned char)(REAL_ALPHA_STRENGTH*(1.0-bottom_right_corner[i])); data++;
2081 *data = (
unsigned char)((*data)*bottom_right_corner[i]); data++;
2082 *data = (
unsigned char)((*data)*bottom_right_corner[i]); data++;
2083 *data = (
unsigned char)((*data)*bottom_right_corner[i]); data++;
2089 void TransparencyHandler::bottomShadow(TQImage& dst)
2091 bool have_composite = haveX11RGBASupport();
2093 if (dst.depth() != 32)
2094 dst = dst.convertDepth(32);
2097 int width = dst.width() - 4;
2098 double strip_data = shadow_strip[0];
2099 double* corner =
const_cast<double*
>(bottom_left_corner);
2101 #ifdef WORDS_BIGENDIAN
2102 unsigned char* data = dst.bits() + 1;
2104 unsigned char* data = dst.bits();
2107 for(
int y = 0; y < 4; y++)
2110 for(
int x = 0; x < 4; x++) {
2111 if (have_composite) {
2115 *data = (
unsigned char)(REAL_ALPHA_STRENGTH*(1.0-(*corner))); data++;
2118 *data = (
unsigned char)((*data)*(*corner)); data++;
2119 *data = (
unsigned char)((*data)*(*corner)); data++;
2120 *data = (
unsigned char)((*data)*(*corner)); data++;
2127 for(
int x = 0; x < width; x++) {
2128 if (have_composite) {
2132 *data = (
unsigned char)(REAL_ALPHA_STRENGTH*(1.0-strip_data)); data++;
2135 *data = (
unsigned char)((*data)*strip_data); data++;
2136 *data = (
unsigned char)((*data)*strip_data); data++;
2137 *data = (
unsigned char)((*data)*strip_data); data++;
2142 strip_data = shadow_strip[line++];
2146 TQImage TransparencyHandler::handleRealAlpha(TQImage img) {
2147 TQImage clearImage = img.convertDepth(32);
2148 clearImage.setAlphaBuffer(
true);
2150 int w = clearImage.width();
2151 int h = clearImage.height();
2153 for (
int y = 0; y < h; ++y) {
2154 TQRgb *ls = (TQRgb *)clearImage.scanLine( y );
2155 for (
int x = 0; x < w; ++x) {
2156 ls[x] = tqRgba( 0, 0, 0, 0 );
2164 void TransparencyHandler::createShadowWindows(
const TQWidget* p)
2167 int x2 = p->x()+p->width();
2168 int y2 = p->y()+p->height();
2169 TQRect shadow1(x2, p->y() + 4, 4, p->height());
2170 TQRect shadow2(p->x() + 4, y2, p->width() - 4, 4);
2172 bool have_composite = haveX11RGBASupport();
2176 se.w1 =
new TQWidget(0, 0, (WFlags)(WStyle_Customize | WType_Popup | WX11BypassWM) );
2177 se.w2 =
new TQWidget(0, 0, (WFlags)(WStyle_Customize | WType_Popup | WX11BypassWM) );
2178 se.w1->setGeometry(shadow1);
2179 se.w2->setGeometry(shadow2);
2180 XSelectInput(tqt_xdisplay(), se.w1->winId(), StructureNotifyMask );
2181 XSelectInput(tqt_xdisplay(), se.w2->winId(), StructureNotifyMask );
2184 shadowMap()[p] = se;
2187 TQPixmap pix_shadow1;
2188 TQPixmap pix_shadow2;
2189 if (have_composite) {
2190 pix_shadow1 = TQPixmap(shadow1.width(), shadow1.height());
2191 pix_shadow2 = TQPixmap(shadow2.width(), shadow2.height());
2194 pix_shadow1 = TQPixmap::grabWindow(tqt_xrootwin(),
2195 shadow1.x(), shadow1.y(), shadow1.width(), shadow1.height());
2196 pix_shadow2 = TQPixmap::grabWindow(tqt_xrootwin(),
2197 shadow2.x(), shadow2.y(), shadow2.width(), shadow2.height());
2201 img = pix_shadow1.convertToImage();
2202 if (have_composite) img = handleRealAlpha(img);
2204 pix_shadow1.convertFromImage(img);
2205 img = pix_shadow2.convertToImage();
2206 if (have_composite) img = handleRealAlpha(img);
2208 pix_shadow2.convertFromImage(img);
2211 se.w1->setErasePixmap(pix_shadow1);
2212 se.w2->setErasePixmap(pix_shadow2);
2216 XMapWindow(tqt_xdisplay(), se.w1->winId());
2217 XMapWindow(tqt_xdisplay(), se.w2->winId());
2223 void TransparencyHandler::removeShadowWindows(
const TQWidget* p)
2226 ShadowMap::iterator it = shadowMap().find(p);
2227 if (it != shadowMap().
end())
2229 ShadowElements se = it.data();
2230 XUnmapWindow(tqt_xdisplay(), se.w1->winId());
2231 XUnmapWindow(tqt_xdisplay(), se.w2->winId());
2232 XFlush(tqt_xdisplay());
2235 shadowMap().erase(it);
2242 bool TransparencyHandler::eventFilter( TQObject*
object, TQEvent* event )
2244 #if !defined Q_WS_MAC && !defined Q_WS_WIN
2249 TQWidget* p = (TQWidget*)
object;
2250 TQEvent::Type et =
event->type();
2252 if (et == TQEvent::Show)
2257 pix = TQPixmap::grabWindow(tqt_xrootwin(),
2258 p->x(), p->y(), p->width(), p->height());
2263 if (tqt_use_xrender) {
2264 XRenderBlendToPixmap(p);
2272 blendToPixmap(p->colorGroup(), p);
2277 blendToColor(p->colorGroup().button());
2280 p->setErasePixmap(pix);
2288 if ((dropShadow || useDropShadow(p))
2289 && p->width() > 16 && p->height() > 16 && !shadowMap().contains( p ))
2290 createShadowWindows(p);
2292 else if (et == TQEvent::Resize && p->isShown() && p->isTopLevel())
2295 if (dropShadow || useDropShadow(p))
2297 removeShadowWindows(p);
2298 createShadowWindows(p);
2301 else if (et == TQEvent::Hide)
2304 if (dropShadow || useDropShadow(p))
2305 removeShadowWindows(p);
2309 p->setErasePixmap(TQPixmap());
2318 void TransparencyHandler::blendToColor(
const TQColor &col)
2320 if (opacity < 0.0 || opacity > 1.0)
2323 TQImage img = pix.convertToImage();
2329 void TransparencyHandler::blendToPixmap(
const TQColorGroup &cg,
const TQWidget* p)
2331 if (opacity < 0.0 || opacity > 1.0)
2335 blendPix.resize( pix.width(), pix.height() );
2337 if (blendPix.width() != pix.width() ||
2338 blendPix.height() != pix.height())
2342 if (::tqqt_cast<TQPopupMenu*>(p))
2343 tdestyle->renderMenuBlendPixmap( blendPix, cg, ::tqqt_cast<TQPopupMenu*>(p) );
2345 blendPix.fill(cg.button());
2347 TQImage blendImg = blendPix.convertToImage();
2348 TQImage backImg = pix.convertToImage();
2358 void TransparencyHandler::XRenderBlendToPixmap(
const TQWidget* p)
2361 renderPix.resize( pix.width(), pix.height() );
2364 if (::tqqt_cast<TQPopupMenu*>(p))
2365 tdestyle->renderMenuBlendPixmap( renderPix, p->colorGroup(),
2366 ::tqqt_cast<TQPopupMenu*>(p) );
2368 renderPix.fill(p->colorGroup().button());
2370 Display* dpy = tqt_xdisplay();
2372 Picture alphaPicture;
2373 XRenderPictFormat Rpf;
2374 XRenderPictureAttributes Rpa;
2376 clr.alpha = ((
unsigned short)(255*opacity) << 8);
2378 Rpf.type = PictTypeDirect;
2380 Rpf.direct.alphaMask = 0xff;
2383 XRenderPictFormat* xformat = XRenderFindFormat(dpy,
2384 PictFormatType | PictFormatDepth | PictFormatAlphaMask, &Rpf, 0);
2386 alphaPixmap = XCreatePixmap(dpy, p->handle(), 1, 1, 8);
2387 alphaPicture = XRenderCreatePicture(dpy, alphaPixmap, xformat, CPRepeat, &Rpa);
2389 XRenderFillRectangle(dpy, PictOpSrc, alphaPicture, &clr, 0, 0, 1, 1);
2391 XRenderComposite(dpy, PictOpOver,
2392 renderPix.x11RenderHandle(), alphaPicture, pix.x11RenderHandle(),
2396 pix.width(), pix.height());
2398 XRenderFreePicture(dpy, alphaPicture);
2399 XFreePixmap(dpy, alphaPixmap);
2403 void TDEStyle::virtual_hook(
int,
void* )
2408 extern "C" KDE_EXPORT
2409 void kde_tdestyle_set_scrollbar_type_windows(
void* style )
2413 #include "tdestyle.moc"