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();
2325 pix.convertFromImage(img);
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();
2350 pix.convertFromImage(backImg);
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"
two button, windows style
~TDEStyle()
Destructs the TDEStyle object.
Off-screen paint device with extended features.
TDEStylePrimitive
TDEStyle Primitive Elements:
Internal transparency enabled.
static KPixmap & gradient(KPixmap &pixmap, const TQColor &ca, const TQColor &cb, GradientType type, int ncols=3)
Creates a gradient from color a to color b of the specified type.
Simplifies and extends the TQStyle API to make style coding easier.
const TDEShortcut & end()
two button, platinum style
static TQString defaultStyle()
Returns the default widget style depending on color depth.
uint TDEStyleFlags
TDEStyle Flags:
TDEStyle(TDEStyleFlags flags=TDEStyle::Default, TDEStyleScrollBarType sbtype=TDEStyle::WindowsStyleScrollBar)
Constructs a TDEStyle object.
virtual void renderMenuBlendPixmap(KPixmap &pix, const TQColorGroup &cg, const TQPopupMenu *popup) const
This virtual function defines the pixmap used to blend between the popup menu and the background to c...
TDEStyleFlags styleFlags() const
Returns the TDEStyle flags used to initialize the style.
static TQImage & blend(const TQColor &clr, TQImage &dst, float opacity)
Blends a color into the destination image, using an opacity value for blending one into another...
void setScrollBarType(TDEStyleScrollBarType sbtype)
Modifies the scrollbar type used by the style.
TDEStyleScrollBarType
TDEStyle ScrollBarType: