Graphical retooling of the Windows decorator. Much better. :)

git-svn-id: file:///srv/svn/repos/haiku/trunk/current@3896 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
DarkWyrm
2003-07-08 01:35:48 +00:00
parent ad3b616b82
commit 93e1f7dfd0
2 changed files with 140 additions and 123 deletions
@@ -19,19 +19,10 @@ printf("WinDecorator()\n");
#endif #endif
taboffset=0; taboffset=0;
button_highercol.SetColor(255,255,255); frame_highcol.SetColor(255,255,255);
button_lowercol.SetColor(0,0,0); frame_midcol.SetColor(216,216,216);
frame_lowcol.SetColor(110,110,110);
button_highcol=button_lowercol.MakeBlendColor(button_highercol,0.85); frame_lowercol.SetColor(0,0,0);
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);
_DoLayout(); _DoLayout();
@@ -102,25 +93,23 @@ void WinDecorator::_DoLayout(void)
#ifdef DEBUG_DECOR #ifdef DEBUG_DECOR
printf("WinDecorator()::_DoLayout()\n"); printf("WinDecorator()::_DoLayout()\n");
#endif #endif
_tabrect=_frame;
_borderrect=_frame; _borderrect=_frame;
_tabrect=_frame;
_borderrect.top+=19; _tabrect.InsetBy(4,4);
_tabrect.bottom=_tabrect.top+19;
_tabrect.bottom=_tabrect.top+18;
_zoomrect=_tabrect; _zoomrect=_tabrect;
_zoomrect.top+=4; _zoomrect.top+=3;
_zoomrect.right-=4; _zoomrect.right-=3;
_zoomrect.bottom-=4; _zoomrect.bottom-=3;
_zoomrect.left=_zoomrect.right-10; _zoomrect.left=_zoomrect.right-15;
_zoomrect.bottom=_zoomrect.top+10;
_closerect=_zoomrect; _closerect=_zoomrect;
_zoomrect.OffsetBy(0-_zoomrect.Width()-4,0); _zoomrect.OffsetBy(0-_zoomrect.Width()-3,0);
_minimizerect=_zoomrect; _minimizerect=_zoomrect;
_minimizerect.OffsetBy(0-_zoomrect.Width()-2,0); _minimizerect.OffsetBy(0-_zoomrect.Width()-1,0);
} }
void WinDecorator::MoveBy(float x, float y) void WinDecorator::MoveBy(float x, float y)
@@ -229,34 +218,61 @@ printf("WinDecorator::Draw()\n");
void WinDecorator::_DrawZoom(BRect r) void WinDecorator::_DrawZoom(BRect r)
{ {
DrawBlendedRect(r,GetZoom()); DrawBeveledRect(r,GetZoom());
// Draw the Zoom box // 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) void WinDecorator::_DrawClose(BRect r)
{ {
// Just like DrawZoom, but for a close button // Just like DrawZoom, but for a close button
DrawBlendedRect(r,GetClose()); DrawBeveledRect(r,GetClose());
// Draw the X // Draw the X
_layerdata.highcolor=textcol;
_driver->StrokeLine(BPoint(_closerect.left+2,_closerect.top+2),BPoint(_closerect.right-2, BRect rect(r);
_closerect.bottom-2),&_layerdata,(int8*)&solidhigh); rect.InsetBy(4,4);
_driver->StrokeLine(BPoint(_closerect.right-2,_closerect.top+2),BPoint(_closerect.left+2, rect.right--;
_closerect.bottom-2),&_layerdata,(int8*)&solidhigh); 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) void WinDecorator::_DrawMinimize(BRect r)
{ {
// Just like DrawZoom, but for a Minimize button // Just like DrawZoom, but for a Minimize button
DrawBlendedRect(r,GetMinimize()); DrawBeveledRect(r,GetMinimize());
_layerdata.highcolor=textcol; _layerdata.highcolor=textcol;
_driver->StrokeLine(BPoint(_minimizerect.left+2,_minimizerect.bottom-2),BPoint(_minimizerect.right-2, BRect rect(r.left+5,r.bottom-4,r.right-5,r.bottom-3);
_minimizerect.bottom-2),&_layerdata,(int8*)&solidhigh); if(GetMinimize())
rect.OffsetBy(1,1);
_layerdata.highcolor.SetColor(0,0,0);
_driver->StrokeRect(rect,&_layerdata,(int8*)&solidhigh);
} }
void WinDecorator::_DrawTab(BRect r) void WinDecorator::_DrawTab(BRect r)
@@ -266,13 +282,13 @@ void WinDecorator::_DrawTab(BRect r)
if(_look==B_NO_BORDER_WINDOW_LOOK) if(_look==B_NO_BORDER_WINDOW_LOOK)
return; return;
_layerdata.highcolor=frame_lowcol; // _layerdata.highcolor=frame_lowcol;
_driver->StrokeRect(_tabrect,&_layerdata,(int8*)&solidhigh); // _driver->StrokeRect(_tabrect,&_layerdata,(int8*)&solidhigh);
// UpdateTitle(layer->name->String()); // UpdateTitle(layer->name->String());
_layerdata.highcolor=tab_highcol; _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 // Draw the buttons if we're supposed to
if(!(_flags & B_NOT_CLOSABLE)) if(!(_flags & B_NOT_CLOSABLE))
@@ -281,60 +297,73 @@ void WinDecorator::_DrawTab(BRect r)
_DrawZoom(_zoomrect); _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. RGBColor higher,high,mid,low,lower;
// 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=(w<h)?w:h;
if(down) if(down)
{ {
startcol=button_lowcol.GetColor32(); lower.SetColor(255,255,255);
endcol=button_highcol.GetColor32(); low.SetColor(216,216,216);
mid.SetColor(192,192,192);
high.SetColor(128,128,128);
higher.SetColor(0,0,0);
} }
else else
{ {
startcol=button_highcol.GetColor32(); higher.SetColor(255,255,255);
endcol=button_lowcol.GetColor32(); high.SetColor(216,216,216);
mid.SetColor(192,192,192);
low.SetColor(128,128,128);
lower.SetColor(0,0,0);
} }
halfcol=MakeBlendColor(startcol,endcol,0.5); BRect rect(r);
BPoint pt;
rstep=float(startcol.red-halfcol.red)/steps; // Top highlight
gstep=float(startcol.green-halfcol.green)/steps; _layerdata.highcolor=higher;
bstep=float(startcol.blue-halfcol.blue)/steps; _driver->StrokeLine(rect.LeftTop(),rect.RightTop(),&_layerdata,(int8*)&solidhigh);
for(i=0;i<=steps; i++) // Left highlight
{ _driver->StrokeLine(rect.LeftTop(),rect.LeftBottom(),&_layerdata,(int8*)&solidhigh);
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);
SetRGBColor(&tmpcol, uint8(halfcol.red-(i*rstep)), // Right shading
uint8(halfcol.green-(i*gstep)), _layerdata.highcolor=lower;
uint8(halfcol.blue-(i*bstep)));
_layerdata.highcolor=tmpcol; pt=rect.RightTop();
_driver->StrokeLine(BPoint(r.left+steps,r.top+i), pt.y++;
BPoint(r.left+i,r.top+steps),&_layerdata,(int8*)&solidhigh); _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; // Left inside highlight
// _driver->FillRect(r,&_layerdata,(int8*)&solidhigh); _driver->StrokeLine(rect.LeftTop(),rect.LeftBottom(),&_layerdata,(int8*)&solidhigh);
_layerdata.highcolor=frame_lowcol;
_driver->StrokeRect(r,&_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) void WinDecorator::_SetColors(void)
@@ -346,53 +375,44 @@ void WinDecorator::_DrawFrame(BRect rect)
{ {
if(_look==B_NO_BORDER_WINDOW_LOOK) if(_look==B_NO_BORDER_WINDOW_LOOK)
return; return;
BRect r=_borderrect; BRect r=_borderrect;
_layerdata.highcolor=frame_midcol; _layerdata.highcolor.SetColor(255,0,0);
_driver->StrokeLine(BPoint(r.left,r.top),BPoint(r.right-1,r.top), _driver->StrokeRect(r,&_layerdata,(int8*)&solidhigh);
&_layerdata,(int8*)&solidhigh);
_layerdata.highcolor=frame_lowcol; BPoint pt;
_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);
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; _layerdata.highcolor=frame_midcol;
_driver->StrokeLine(BPoint(r.right,r.bottom),BPoint(r.right,r.top), pt=r.RightTop();
&_layerdata,(int8*)&solidhigh); pt.x--;
_layerdata.highcolor=frame_midcol; _driver->StrokeLine(r.LeftTop(),pt,&_layerdata,(int8*)&solidhigh);
_driver->StrokeLine(BPoint(r.right,r.bottom),BPoint(r.left,r.bottom), pt=r.LeftBottom();
&_layerdata,(int8*)&solidhigh); 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); r.InsetBy(1,1);
_layerdata.highcolor=frame_highcol; _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); r.InsetBy(1,1);
_layerdata.highcolor=frame_lowercol; _layerdata.highcolor=frame_midcol;
_driver->StrokeLine(BPoint(r.left,r.top),BPoint(r.right-1,r.top), _driver->StrokeRect(r,&_layerdata,(int8*)&solidhigh);
&_layerdata,(int8*)&solidhigh); r.InsetBy(1,1);
_layerdata.highcolor=frame_lowercol; _driver->StrokeRect(r,&_layerdata,(int8*)&solidhigh);
_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);
} }
extern "C" float get_decorator_version(void) extern "C" float get_decorator_version(void)
@@ -28,14 +28,11 @@ protected:
void _DoLayout(void); void _DoLayout(void);
void _SetFocus(void); void _SetFocus(void);
void _SetColors(void); void _SetColors(void);
void DrawBlendedRect(BRect r, bool down); void DrawBeveledRect(BRect r, bool down);
uint32 taboffset; uint32 taboffset;
RGBColor tab_highcol, tab_lowcol; RGBColor tab_highcol, tab_lowcol;
RGBColor button_highcol, button_lowcol; RGBColor frame_highcol, frame_midcol, frame_lowcol, frame_lowercol;
RGBColor button_highercol, button_lowercol, button_midcol;
RGBColor frame_highcol, frame_midcol, frame_lowcol, frame_highercol,
frame_lowercol;
RGBColor textcol; RGBColor textcol;
uint64 solidhigh, solidlow; uint64 solidhigh, solidlow;