diff --git a/src/add-ons/decorators/SATDecorator/SATDecorator.cpp b/src/add-ons/decorators/SATDecorator/SATDecorator.cpp index 2aafb50578..a6b0dc5cd0 100644 --- a/src/add-ons/decorators/SATDecorator/SATDecorator.cpp +++ b/src/add-ons/decorators/SATDecorator/SATDecorator.cpp @@ -470,6 +470,17 @@ SATDecorator::GetComponentColors(Component component, ComponentColors _colors) _colors[COLOR_TAB_TEXT] = kFocusTextColor; break; + case COMPONENT_CLOSE_BUTTON: + case COMPONENT_ZOOM_BUTTON: + if (!fTabHighlighted) { + DefaultDecorator::GetComponentColors(component, _colors); + return; + } + + _colors[COLOR_BUTTON] = kHighlightTabColor; + _colors[COLOR_BUTTON_LIGHT] = kHighlightTabColorLight; + break; + case COMPONENT_LEFT_BORDER: case COMPONENT_RIGHT_BORDER: case COMPONENT_TOP_BORDER: diff --git a/src/servers/app/DefaultDecorator.cpp b/src/servers/app/DefaultDecorator.cpp index c13c5cafd4..7e977285ed 100644 --- a/src/servers/app/DefaultDecorator.cpp +++ b/src/servers/app/DefaultDecorator.cpp @@ -726,7 +726,7 @@ DefaultDecorator::_DrawClose(BRect rect) ServerBitmap* bitmap = fCloseBitmaps[index]; if (bitmap == NULL) { bitmap = _GetBitmapForButton(COMPONENT_CLOSE_BUTTON, GetClose(), - fButtonFocus, rect.IntegerWidth(), rect.IntegerHeight(), this); + rect.IntegerWidth(), rect.IntegerHeight()); fCloseBitmaps[index] = bitmap; } @@ -782,7 +782,7 @@ DefaultDecorator::_DrawZoom(BRect rect) ServerBitmap* bitmap = fZoomBitmaps[index]; if (bitmap == NULL) { bitmap = _GetBitmapForButton(COMPONENT_ZOOM_BUTTON, GetZoom(), - fButtonFocus, rect.IntegerWidth(), rect.IntegerHeight(), this); + rect.IntegerWidth(), rect.IntegerHeight()); fZoomBitmaps[index] = bitmap; } @@ -1167,6 +1167,17 @@ DefaultDecorator::GetComponentColors(Component component, } break; + case COMPONENT_CLOSE_BUTTON: + case COMPONENT_ZOOM_BUTTON: + if (fButtonFocus) { + _colors[COLOR_BUTTON] = kFocusTabColor; + _colors[COLOR_BUTTON_LIGHT] = kFocusTabColorLight; + } else { + _colors[COLOR_BUTTON] = kNonFocusTabColor; + _colors[COLOR_BUTTON_LIGHT] = kNonFocusTabColorLight; + } + break; + case COMPONENT_LEFT_BORDER: case COMPONENT_RIGHT_BORDER: case COMPONENT_TOP_BORDER: @@ -1224,25 +1235,21 @@ DefaultDecorator::_DrawButtonBitmap(ServerBitmap* bitmap, BRect rect) /*! \brief Draws a framed rectangle with a gradient. - \param down The rectangle should be drawn recessed or not + \param down The rectangle should be drawn recessed or not. + \param colors A button color array with the colors to be used. */ void DefaultDecorator::_DrawBlendedRect(DrawingEngine* engine, BRect rect, - bool down, bool focus) + bool down, const ComponentColors& colors) { - ComponentColors colors; - GetComponentColors(COMPONENT_TAB, colors); - // figure out which colors to use rgb_color startColor, endColor; - rgb_color tabColor = focus ? kFocusTabColor : kNonFocusTabColor; - // TODO: Use GetComponentColors() only! if (down) { - startColor = tint_color(tabColor, B_DARKEN_1_TINT); - endColor = colors[COLOR_TAB_LIGHT]; + startColor = tint_color(colors[COLOR_BUTTON], B_DARKEN_1_TINT); + endColor = colors[COLOR_BUTTON_LIGHT]; } else { - startColor = tint_color(tabColor, B_LIGHTEN_MAX_TINT); - endColor = tabColor; + startColor = tint_color(colors[COLOR_BUTTON], B_LIGHTEN_MAX_TINT); + endColor = colors[COLOR_BUTTON]; } // fill @@ -1257,7 +1264,7 @@ DefaultDecorator::_DrawBlendedRect(DrawingEngine* engine, BRect rect, // outline rect.InsetBy(-1, -1); - engine->StrokeRect(rect, tint_color(tabColor, B_DARKEN_2_TINT)); + engine->StrokeRect(rect, tint_color(colors[COLOR_BUTTON], B_DARKEN_2_TINT)); } @@ -1343,24 +1350,27 @@ DefaultDecorator::_InvalidateBitmaps() ServerBitmap* -DefaultDecorator::_GetBitmapForButton(Component item, bool down, bool focus, - int32 width, int32 height, DefaultDecorator* object) +DefaultDecorator::_GetBitmapForButton(Component item, bool down, int32 width, + int32 height) { // TODO: the list of shared bitmaps is never freed struct decorator_bitmap { Component item; bool down; - bool focus; int32 width; int32 height; - rgb_color focusColor; - rgb_color nonFocusColor; + rgb_color baseColor; + rgb_color lightColor; UtilityBitmap* bitmap; decorator_bitmap* next; }; static BLocker sBitmapListLock("decorator lock", true); static decorator_bitmap* sBitmapList = NULL; + + ComponentColors colors; + GetComponentColors(item, colors); + BAutolock locker(sBitmapListLock); // search our list for a matching bitmap @@ -1368,10 +1378,9 @@ DefaultDecorator::_GetBitmapForButton(Component item, bool down, bool focus, decorator_bitmap* current = sBitmapList; while (current) { if (current->item == item && current->down == down - && current->focus == focus && current->width == width - && current->height == height - && current->focusColor == object->kFocusTabColor - && current->nonFocusColor == object->kNonFocusTabColor) { + && current->width == width && current->height == height + && current->baseColor == colors[COLOR_BUTTON] + && current->lightColor == colors[COLOR_BUTTON_LIGHT]) { return current->bitmap; } @@ -1389,12 +1398,12 @@ DefaultDecorator::_GetBitmapForButton(Component item, bool down, bool focus, BRect rect(0, 0, width - 1, height - 1); - STRACE(("DefaultDecorator creating bitmap for %s %sfocus %s at size %ldx%ld\n", - item == COMPONENT_CLOSE_BUTTON ? "close" : "zoom", focus ? "" : "non-", + STRACE(("DefaultDecorator creating bitmap for %s %s at size %ldx%ld\n", + item == COMPONENT_CLOSE_BUTTON ? "close" : "zoom", down ? "down" : "up", width, height)); switch (item) { case COMPONENT_CLOSE_BUTTON: - object->_DrawBlendedRect(sBitmapDrawingEngine, rect, down, focus); + _DrawBlendedRect(sBitmapDrawingEngine, rect, down, colors); break; case COMPONENT_ZOOM_BUTTON: @@ -1406,15 +1415,13 @@ DefaultDecorator::_GetBitmapForButton(Component item, bool down, bool focus, BRect zoomRect(rect); zoomRect.left += inset; zoomRect.top += inset; - object->_DrawBlendedRect(sBitmapDrawingEngine, zoomRect, - down, focus); + _DrawBlendedRect(sBitmapDrawingEngine, zoomRect, down, colors); inset = floorf(width / 2.1); zoomRect = rect; zoomRect.right -= inset; zoomRect.bottom -= inset; - object->_DrawBlendedRect(sBitmapDrawingEngine, zoomRect, - down, focus); + _DrawBlendedRect(sBitmapDrawingEngine, zoomRect, down, colors); break; } @@ -1436,12 +1443,11 @@ DefaultDecorator::_GetBitmapForButton(Component item, bool down, bool focus, entry->item = item; entry->down = down; - entry->focus = focus; entry->width = width; entry->height = height; entry->bitmap = bitmap; - entry->focusColor = object->kFocusTabColor; - entry->nonFocusColor = object->kNonFocusTabColor; + entry->baseColor = colors[COLOR_BUTTON]; + entry->lightColor = colors[COLOR_BUTTON_LIGHT]; entry->next = sBitmapList; sBitmapList = entry; return bitmap; diff --git a/src/servers/app/DefaultDecorator.h b/src/servers/app/DefaultDecorator.h index bd7145b1bc..79a623fec5 100644 --- a/src/servers/app/DefaultDecorator.h +++ b/src/servers/app/DefaultDecorator.h @@ -68,6 +68,11 @@ protected: COLOR_TAB_TEXT = 6 }; + enum { + COLOR_BUTTON = 0, + COLOR_BUTTON_LIGHT = 1 + }; + typedef rgb_color ComponentColors[7]; protected: @@ -118,12 +123,12 @@ private: void _DrawButtonBitmap(ServerBitmap* bitmap, BRect rect); void _DrawBlendedRect(DrawingEngine *engine, - BRect rect, bool down, bool focus); + BRect rect, bool down, + const ComponentColors& colors); void _LayoutTabItems(const BRect& tabRect); void _InvalidateBitmaps(); - static ServerBitmap* _GetBitmapForButton(Component item, bool down, - bool focus, int32 width, int32 height, - DefaultDecorator* object); + ServerBitmap* _GetBitmapForButton(Component item, bool down, + int32 width, int32 height); protected: static const rgb_color kFrameColors[4];