From 93e1f7dfd0df3684487e930bbcdf50487357b12b Mon Sep 17 00:00:00 2001 From: DarkWyrm Date: Tue, 8 Jul 2003 01:35:48 +0000 Subject: [PATCH] Graphical retooling of the Windows decorator. Much better. :) git-svn-id: file:///srv/svn/repos/haiku/trunk/current@3896 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- .../decorators/WinDecorator/WinDecorator.cpp | 256 ++++++++++-------- .../decorators/WinDecorator/WinDecorator.h | 7 +- 2 files changed, 140 insertions(+), 123 deletions(-) diff --git a/src/add-ons/decorators/WinDecorator/WinDecorator.cpp b/src/add-ons/decorators/WinDecorator/WinDecorator.cpp index f69fdd1064..6f203bf0af 100644 --- a/src/add-ons/decorators/WinDecorator/WinDecorator.cpp +++ b/src/add-ons/decorators/WinDecorator/WinDecorator.cpp @@ -19,19 +19,10 @@ printf("WinDecorator()\n"); #endif taboffset=0; - button_highercol.SetColor(255,255,255); - button_lowercol.SetColor(0,0,0); - - button_highcol=button_lowercol.MakeBlendColor(button_highercol,0.85); - button_midcol=button_lowercol.MakeBlendColor(button_highercol,0.75); - button_lowcol=button_lowercol.MakeBlendColor(button_highercol,0.5); - - frame_highercol.SetColor(216,216,216); - frame_lowercol.SetColor(110,110,110); - - frame_highcol=frame_lowercol.MakeBlendColor(frame_highercol,0.75); - frame_midcol=frame_lowercol.MakeBlendColor(frame_highercol,0.5); - frame_lowcol=frame_lowercol.MakeBlendColor(frame_highercol,0.25); + frame_highcol.SetColor(255,255,255); + frame_midcol.SetColor(216,216,216); + frame_lowcol.SetColor(110,110,110); + frame_lowercol.SetColor(0,0,0); _DoLayout(); @@ -102,25 +93,23 @@ void WinDecorator::_DoLayout(void) #ifdef DEBUG_DECOR printf("WinDecorator()::_DoLayout()\n"); #endif - _tabrect=_frame; _borderrect=_frame; + _tabrect=_frame; - _borderrect.top+=19; - - _tabrect.bottom=_tabrect.top+18; + _tabrect.InsetBy(4,4); + _tabrect.bottom=_tabrect.top+19; _zoomrect=_tabrect; - _zoomrect.top+=4; - _zoomrect.right-=4; - _zoomrect.bottom-=4; - _zoomrect.left=_zoomrect.right-10; - _zoomrect.bottom=_zoomrect.top+10; + _zoomrect.top+=3; + _zoomrect.right-=3; + _zoomrect.bottom-=3; + _zoomrect.left=_zoomrect.right-15; _closerect=_zoomrect; - _zoomrect.OffsetBy(0-_zoomrect.Width()-4,0); + _zoomrect.OffsetBy(0-_zoomrect.Width()-3,0); _minimizerect=_zoomrect; - _minimizerect.OffsetBy(0-_zoomrect.Width()-2,0); + _minimizerect.OffsetBy(0-_zoomrect.Width()-1,0); } void WinDecorator::MoveBy(float x, float y) @@ -229,34 +218,61 @@ printf("WinDecorator::Draw()\n"); void WinDecorator::_DrawZoom(BRect r) { - DrawBlendedRect(r,GetZoom()); - + DrawBeveledRect(r,GetZoom()); + // Draw the Zoom box - _layerdata.highcolor=textcol; - _driver->StrokeRect(r.InsetByCopy(2,2),&_layerdata,(int8*)&solidhigh); + + BRect rect(r); + rect.InsetBy(2,2); + rect.InsetBy(1,0); + rect.bottom--; + rect.right--; + + if(GetZoom()) + rect.OffsetBy(1,1); + + _layerdata.highcolor.SetColor(0,0,0); + _driver->StrokeRect(rect,&_layerdata,(int8*)&solidhigh); + rect.InsetBy(1,1); + _driver->StrokeLine(rect.LeftTop(),rect.RightTop(),&_layerdata,(int8*)&solidhigh); + } void WinDecorator::_DrawClose(BRect r) { // Just like DrawZoom, but for a close button - DrawBlendedRect(r,GetClose()); + DrawBeveledRect(r,GetClose()); // Draw the X - _layerdata.highcolor=textcol; - _driver->StrokeLine(BPoint(_closerect.left+2,_closerect.top+2),BPoint(_closerect.right-2, - _closerect.bottom-2),&_layerdata,(int8*)&solidhigh); - _driver->StrokeLine(BPoint(_closerect.right-2,_closerect.top+2),BPoint(_closerect.left+2, - _closerect.bottom-2),&_layerdata,(int8*)&solidhigh); + + BRect rect(r); + rect.InsetBy(4,4); + rect.right--; + rect.top--; + + if(GetClose()) + rect.OffsetBy(1,1); + + _layerdata.highcolor.SetColor(0,0,0); + _driver->StrokeLine(rect.LeftTop(),rect.RightBottom(),&_layerdata,(int8*)&solidhigh); + _driver->StrokeLine(rect.RightTop(),rect.LeftBottom(),&_layerdata,(int8*)&solidhigh); + rect.OffsetBy(1,0); + _driver->StrokeLine(rect.LeftTop(),rect.RightBottom(),&_layerdata,(int8*)&solidhigh); + _driver->StrokeLine(rect.RightTop(),rect.LeftBottom(),&_layerdata,(int8*)&solidhigh); } void WinDecorator::_DrawMinimize(BRect r) { // Just like DrawZoom, but for a Minimize button - DrawBlendedRect(r,GetMinimize()); + DrawBeveledRect(r,GetMinimize()); _layerdata.highcolor=textcol; - _driver->StrokeLine(BPoint(_minimizerect.left+2,_minimizerect.bottom-2),BPoint(_minimizerect.right-2, - _minimizerect.bottom-2),&_layerdata,(int8*)&solidhigh); + BRect rect(r.left+5,r.bottom-4,r.right-5,r.bottom-3); + if(GetMinimize()) + rect.OffsetBy(1,1); + + _layerdata.highcolor.SetColor(0,0,0); + _driver->StrokeRect(rect,&_layerdata,(int8*)&solidhigh); } void WinDecorator::_DrawTab(BRect r) @@ -266,13 +282,13 @@ void WinDecorator::_DrawTab(BRect r) if(_look==B_NO_BORDER_WINDOW_LOOK) return; - _layerdata.highcolor=frame_lowcol; - _driver->StrokeRect(_tabrect,&_layerdata,(int8*)&solidhigh); +// _layerdata.highcolor=frame_lowcol; +// _driver->StrokeRect(_tabrect,&_layerdata,(int8*)&solidhigh); // UpdateTitle(layer->name->String()); _layerdata.highcolor=tab_highcol; - _driver->FillRect(_tabrect.InsetByCopy(1,1),&_layerdata,(int8*)&solidhigh); + _driver->FillRect(_tabrect,&_layerdata,(int8*)&solidhigh); // Draw the buttons if we're supposed to if(!(_flags & B_NOT_CLOSABLE)) @@ -281,60 +297,73 @@ void WinDecorator::_DrawTab(BRect r) _DrawZoom(_zoomrect); } -void WinDecorator::DrawBlendedRect(BRect r, bool down) +void WinDecorator::DrawBeveledRect(BRect r, bool down) { - // This bad boy is used to draw a rectangle with a gradient. - // Note that it is not part of the Decorator API - it's specific - // to just the WinDecorator. Called by DrawZoom and DrawClose - - // Actually just draws a blended square - int32 w=r.IntegerWidth(), h=r.IntegerHeight(); - - rgb_color tmpcol,halfcol, startcol, endcol; - float rstep,gstep,bstep,i; - - int steps=(wStrokeLine(rect.LeftTop(),rect.RightTop(),&_layerdata,(int8*)&solidhigh); - for(i=0;i<=steps; i++) - { - SetRGBColor(&tmpcol, uint8(startcol.red-(i*rstep)), - uint8(startcol.green-(i*gstep)), - uint8(startcol.blue-(i*bstep))); - _layerdata.highcolor=tmpcol; - _driver->StrokeLine(BPoint(r.left,r.top+i), - BPoint(r.left+i,r.top),&_layerdata,(int8*)&solidhigh); + // Left highlight + _driver->StrokeLine(rect.LeftTop(),rect.LeftBottom(),&_layerdata,(int8*)&solidhigh); - SetRGBColor(&tmpcol, uint8(halfcol.red-(i*rstep)), - uint8(halfcol.green-(i*gstep)), - uint8(halfcol.blue-(i*bstep))); + // Right shading + _layerdata.highcolor=lower; - _layerdata.highcolor=tmpcol; - _driver->StrokeLine(BPoint(r.left+steps,r.top+i), - BPoint(r.left+i,r.top+steps),&_layerdata,(int8*)&solidhigh); + pt=rect.RightTop(); + pt.y++; + _driver->StrokeLine(pt,rect.RightBottom(),&_layerdata,(int8*)&solidhigh); + + // Bottom shading + pt=rect.LeftBottom(); + pt.x++; + _driver->StrokeLine(pt,rect.RightBottom(),&_layerdata,(int8*)&solidhigh); - } + rect.InsetBy(1,1); + // Top inside highlight + _layerdata.highcolor=higher; + _driver->StrokeLine(rect.LeftTop(),rect.RightTop(),&_layerdata,(int8*)&solidhigh); -// _layerdata.highcolor=startcol; -// _driver->FillRect(r,&_layerdata,(int8*)&solidhigh); - _layerdata.highcolor=frame_lowcol; - _driver->StrokeRect(r,&_layerdata,(int8*)&solidhigh); + // Left inside highlight + _driver->StrokeLine(rect.LeftTop(),rect.LeftBottom(),&_layerdata,(int8*)&solidhigh); + + // Right inside shading + _layerdata.highcolor=lower; + + pt=rect.RightTop(); + pt.y++; + _driver->StrokeLine(pt,rect.RightBottom(),&_layerdata,(int8*)&solidhigh); + + // Bottom inside shading + pt=rect.LeftBottom(); + pt.x++; + _driver->StrokeLine(pt,rect.RightBottom(),&_layerdata,(int8*)&solidhigh); + + rect.InsetBy(1,1); + + _layerdata.highcolor=mid; + _driver->FillRect(rect,&_layerdata,(int8*)&solidhigh); } void WinDecorator::_SetColors(void) @@ -346,53 +375,44 @@ void WinDecorator::_DrawFrame(BRect rect) { if(_look==B_NO_BORDER_WINDOW_LOOK) return; - + BRect r=_borderrect; - _layerdata.highcolor=frame_midcol; - _driver->StrokeLine(BPoint(r.left,r.top),BPoint(r.right-1,r.top), - &_layerdata,(int8*)&solidhigh); - _layerdata.highcolor=frame_lowcol; - _driver->StrokeLine(BPoint(r.left,r.top),BPoint(r.left,r.bottom), - &_layerdata,(int8*)&solidhigh); - _layerdata.highcolor=frame_lowercol; - _driver->StrokeLine(BPoint(r.right,r.bottom),BPoint(r.right,r.top), - &_layerdata,(int8*)&solidhigh); - _layerdata.highcolor=frame_lowercol; - _driver->StrokeLine(BPoint(r.right,r.bottom),BPoint(r.left,r.bottom), - &_layerdata,(int8*)&solidhigh); + _layerdata.highcolor.SetColor(255,0,0); + _driver->StrokeRect(r,&_layerdata,(int8*)&solidhigh); + + BPoint pt; - r.InsetBy(1,1); - _layerdata.highcolor=frame_highercol; - _driver->StrokeLine(BPoint(r.left,r.top),BPoint(r.right-1,r.top), - &_layerdata,(int8*)&solidhigh); - _layerdata.highcolor=frame_highercol; - _driver->StrokeLine(BPoint(r.left,r.top),BPoint(r.left,r.bottom), - &_layerdata,(int8*)&solidhigh); _layerdata.highcolor=frame_midcol; - _driver->StrokeLine(BPoint(r.right,r.bottom),BPoint(r.right,r.top), - &_layerdata,(int8*)&solidhigh); - _layerdata.highcolor=frame_midcol; - _driver->StrokeLine(BPoint(r.right,r.bottom),BPoint(r.left,r.bottom), - &_layerdata,(int8*)&solidhigh); + pt=r.RightTop(); + pt.x--; + _driver->StrokeLine(r.LeftTop(),pt,&_layerdata,(int8*)&solidhigh); + pt=r.LeftBottom(); + pt.y--; + _driver->StrokeLine(r.LeftTop(),pt,&_layerdata,(int8*)&solidhigh); + + _layerdata.highcolor=frame_lowercol; + _driver->StrokeLine(r.RightTop(),r.RightBottom(),&_layerdata,(int8*)&solidhigh); + _driver->StrokeLine(r.LeftBottom(),r.RightBottom(),&_layerdata,(int8*)&solidhigh); r.InsetBy(1,1); _layerdata.highcolor=frame_highcol; - _driver->StrokeRect(r,&_layerdata,(int8*)&solidhigh); + pt=r.RightTop(); + pt.x--; + _driver->StrokeLine(r.LeftTop(),pt,&_layerdata,(int8*)&solidhigh); + pt=r.LeftBottom(); + pt.y--; + _driver->StrokeLine(r.LeftTop(),pt,&_layerdata,(int8*)&solidhigh); + _layerdata.highcolor=frame_lowcol; + _driver->StrokeLine(r.RightTop(),r.RightBottom(),&_layerdata,(int8*)&solidhigh); + _driver->StrokeLine(r.LeftBottom(),r.RightBottom(),&_layerdata,(int8*)&solidhigh); + r.InsetBy(1,1); - _layerdata.highcolor=frame_lowercol; - _driver->StrokeLine(BPoint(r.left,r.top),BPoint(r.right-1,r.top), - &_layerdata,(int8*)&solidhigh); - _layerdata.highcolor=frame_lowercol; - _driver->StrokeLine(BPoint(r.left,r.top),BPoint(r.left,r.bottom), - &_layerdata,(int8*)&solidhigh); - _layerdata.highcolor=frame_highercol; - _driver->StrokeLine(BPoint(r.right,r.bottom),BPoint(r.right,r.top), - &_layerdata,(int8*)&solidhigh); - _layerdata.highcolor=frame_highercol; - _driver->StrokeLine(BPoint(r.right,r.bottom),BPoint(r.left,r.bottom), - &_layerdata,(int8*)&solidhigh); + _layerdata.highcolor=frame_midcol; + _driver->StrokeRect(r,&_layerdata,(int8*)&solidhigh); + r.InsetBy(1,1); + _driver->StrokeRect(r,&_layerdata,(int8*)&solidhigh); } extern "C" float get_decorator_version(void) diff --git a/src/add-ons/decorators/WinDecorator/WinDecorator.h b/src/add-ons/decorators/WinDecorator/WinDecorator.h index 996ecdadac..12a1834361 100644 --- a/src/add-ons/decorators/WinDecorator/WinDecorator.h +++ b/src/add-ons/decorators/WinDecorator/WinDecorator.h @@ -28,14 +28,11 @@ protected: void _DoLayout(void); void _SetFocus(void); void _SetColors(void); - void DrawBlendedRect(BRect r, bool down); + void DrawBeveledRect(BRect r, bool down); uint32 taboffset; RGBColor tab_highcol, tab_lowcol; - RGBColor button_highcol, button_lowcol; - RGBColor button_highercol, button_lowercol, button_midcol; - RGBColor frame_highcol, frame_midcol, frame_lowcol, frame_highercol, - frame_lowercol; + RGBColor frame_highcol, frame_midcol, frame_lowcol, frame_lowercol; RGBColor textcol; uint64 solidhigh, solidlow;