Skip to content

Commit

Permalink
WinDecorator: fix some glitches
Browse files Browse the repository at this point in the history
* The decorator now draws the titlebar.
* The titlebar is font sensitive.
* The minimize button is usable.
* The buttons are pressable.
* Fix a redraw issue.
  • Loading branch information
janus2 committed Jul 4, 2015
1 parent bcc9926 commit 9bd024e
Showing 1 changed file with 57 additions and 22 deletions.
79 changes: 57 additions & 22 deletions src/add-ons/decorators/WinDecorator/WinDecorator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -116,10 +116,19 @@ WinDecorator::Draw()


Decorator::Region
WinDecorator::RegionAt(BPoint where, int32& tab) const
WinDecorator::RegionAt(BPoint where, int32& tabIndex) const
{
tabIndex = -1;

for (int32 i = 0; i < fTabList.CountItems(); i++) {
Decorator::Tab* tab = fTabList.ItemAt(i);
if (tab->minimizeRect.Contains(where)) {
tabIndex = i;
return REGION_MINIMIZE_BUTTON;
}
}
// Let the base class version identify hits of the buttons and the tab.
Region region = Decorator::RegionAt(where, tab);
Region region = Decorator::RegionAt(where, tabIndex);
if (region != REGION_NONE)
return region;

Expand Down Expand Up @@ -185,40 +194,58 @@ WinDecorator::_DoLayout()
fBorderRect = fFrame;
switch ((int)fTopTab->look) {
case B_MODAL_WINDOW_LOOK:
fBorderRect.InsetBy(-4, -4);
fBorderWidth = 4;
break;

case B_TITLED_WINDOW_LOOK:
case B_DOCUMENT_WINDOW_LOOK:
hasTab = true;
fBorderRect.InsetBy(-4, -4);
fBorderWidth = 4;
break;
case B_FLOATING_WINDOW_LOOK:
fBorderWidth = 0;
hasTab = true;
break;

case B_BORDERED_WINDOW_LOOK:
fBorderRect.InsetBy(-1, -1);
fBorderWidth = 1;
break;

default:
fBorderWidth = 0;
break;
}

fBorderRect.InsetBy(-fBorderWidth, -fBorderWidth);

if (hasTab) {
fBorderRect.top -= 19;
font_height fontHeight;
fDrawState.Font().GetHeight(fontHeight);

float tabSize = ceilf(fontHeight.ascent + fontHeight.descent + 4.0);

if (tabSize < 20)
tabSize = 20;
fBorderRect.top -= tabSize;

fTitleBarRect.Set(fFrame.left - 1,
fFrame.top - tabSize,
((fFrame.right - fFrame.left) < 32.0 ?
fFrame.left + 32.0 : fFrame.right) + 1,
fFrame.top - 1);

for (int32 i = 0; i < fTabList.CountItems(); i++) {
Decorator::Tab* tab = fTabList.ItemAt(i);

tab->tabRect.top -= 19;
tab->tabRect.bottom = tab->tabRect.top + 19;
tab->tabRect = fTitleBarRect;

const float buttonsInset = 3;

tab->zoomRect = tab->tabRect;
tab->zoomRect.top += 3;
tab->zoomRect.right -= 3;
tab->zoomRect.bottom -= 3;
tab->zoomRect.left = tab->zoomRect.right - 15;
tab->zoomRect.top += buttonsInset;
tab->zoomRect.right -= buttonsInset;
tab->zoomRect.bottom -= buttonsInset;
tab->zoomRect.left = tab->zoomRect.right - tabSize + buttonsInset;

tab->closeRect = tab->zoomRect;
tab->zoomRect.OffsetBy(0 - tab->zoomRect.Width() - 3, 0);
Expand Down Expand Up @@ -305,7 +332,7 @@ WinDecorator::_DrawTab(Decorator::Tab* tab, BRect rect)
return;
}

fDrawingEngine->FillRect(tabRect, fTabColor);
fDrawingEngine->FillRect(tabRect & rect, fTabColor);

_DrawTitle(tab, tabRect);

Expand Down Expand Up @@ -346,8 +373,17 @@ WinDecorator::_DrawTitle(Decorator::Tab* tab, BRect rect)
tab->truncatedTitleLength = tab->truncatedTitle.Length();
fDrawingEngine->SetFont(fDrawState.Font());

font_height fontHeight;
fDrawState.Font().GetHeight(fontHeight);

BPoint titlePos;
titlePos.x = tabRect.left + 5;
titlePos.y = floorf(((tabRect.top + 2.0) + tabRect.bottom
+ fontHeight.ascent + fontHeight.descent) / 2.0
- fontHeight.descent + 0.5);

fDrawingEngine->DrawString(tab->truncatedTitle, tab->truncatedTitleLength,
BPoint(tabRect.left + 5, closeRect.bottom - 1));
titlePos);
}


Expand Down Expand Up @@ -383,7 +419,7 @@ void
WinDecorator::_DrawMinimize(Decorator::Tab* tab, bool direct, BRect rect)
{
// Just like DrawZoom, but for a Minimize button
_DrawBeveledRect(rect, true);
_DrawBeveledRect(rect, tab->minimizePressed);

fDrawingEngine->SetHighColor(fTextColor);
BRect minimizeBox(rect.left + 5, rect.bottom - 4, rect.right - 5,
Expand All @@ -408,7 +444,7 @@ WinDecorator::_DrawMinimize(Decorator::Tab* tab, bool direct, BRect rect)
void
WinDecorator::_DrawZoom(Decorator::Tab* tab, bool direct, BRect rect)
{
_DrawBeveledRect(rect, true);
_DrawBeveledRect(rect, tab->zoomPressed);

// Draw the Zoom box

Expand Down Expand Up @@ -444,7 +480,7 @@ WinDecorator::_DrawClose(Decorator::Tab* tab, bool direct, BRect rect)
rect.bottom));

// Just like DrawZoom, but for a close button
_DrawBeveledRect(rect, true);
_DrawBeveledRect(rect, tab->closePressed);

// Draw the X

Expand Down Expand Up @@ -533,8 +569,7 @@ WinDecorator::_ResizeBy(BPoint offset, BRegion* dirty)
fFrame.bottom += offset.y;
fTitleBarRect.right += offset.x;
fTitleBarRect.bottom += offset.y;
fResizeRect.right += offset.x;
fResizeRect.bottom += offset.y;
fResizeRect.OffsetBy(offset);
fBorderRect.right += offset.x;
fBorderRect.bottom += offset.y;

Expand Down Expand Up @@ -691,7 +726,7 @@ WinDecorator::_DrawBeveledRect(BRect r, bool down)
fDrawingEngine->StrokeLine(point, rect.RightBottom(), lower);

rect.InsetBy(1,1);

fDrawingEngine->SetHighColor(high);
// Top inside highlight
fDrawingEngine->StrokeLine(rect.LeftTop(), rect.RightTop());

Expand All @@ -701,12 +736,12 @@ WinDecorator::_DrawBeveledRect(BRect r, bool down)
// Right inside shading
point = rect.RightTop();
point.y++;
fDrawingEngine->StrokeLine(point, rect.RightBottom(), lower);
fDrawingEngine->StrokeLine(point, rect.RightBottom(), low);

// Bottom inside shading
point = rect.LeftBottom();
point.x++;
fDrawingEngine->StrokeLine(point, rect.RightBottom(), lower);
fDrawingEngine->StrokeLine(point, rect.RightBottom(), low);

rect.InsetBy(1,1);

Expand Down

0 comments on commit 9bd024e

Please sign in to comment.