Move flags and look into the tab too. The flags are needed to determine e.g. whether or not the zoom button should be drawn.

git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@42552 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Clemens Zeidler
2011-08-03 01:36:50 +00:00
parent 8992f603ed
commit 1c1415732d
10 changed files with 149 additions and 135 deletions
+12 -10
View File
@@ -1221,20 +1221,20 @@ Window::SetLook(window_look look, BRegion* updateRegion)
if (fCurrentStack.Get() == NULL)
return;
int32 stackPosition = PositionInStack();
::Decorator* decorator = Decorator();
if (decorator == NULL && look != B_NO_BORDER_WINDOW_LOOK) {
// we need a new decorator
decorator = gDecorManager.AllocateDecorator(this);
fCurrentStack->SetDecorator(decorator);
if (IsFocus()) {
int32 index = PositionInStack();
decorator->SetFocus(index, true);
}
if (IsFocus())
decorator->SetFocus(stackPosition, true);
}
if (decorator != NULL) {
DesktopSettings settings(fDesktop);
decorator->SetLook(settings, look, updateRegion);
decorator->SetLook(stackPosition, settings, look, updateRegion);
// we might need to resize the window!
decorator->GetSizeLimits(&fMinWidth, &fMinHeight, &fMaxWidth,
@@ -1288,7 +1288,8 @@ Window::SetFlags(uint32 flags, BRegion* updateRegion)
if (decorator == NULL)
return;
decorator->SetFlags(flags, updateRegion);
int32 stackPosition = PositionInStack();
decorator->SetFlags(stackPosition, flags, updateRegion);
// we might need to resize the window!
decorator->GetSizeLimits(&fMinWidth, &fMinHeight, &fMaxWidth, &fMaxHeight);
@@ -2101,7 +2102,6 @@ Window::DetachFromWindowStack(bool ownStackNeeded)
decorator->SetDrawingEngine(remainingTop->fDrawingEngine);
// propagate focus to the decorator
remainingTop->SetFocus(remainingTop->IsFocus());
remainingTop->SetFeel(remainingTop->Feel());
remainingTop->SetLook(remainingTop->Look(), &dirty);
}
@@ -2145,8 +2145,11 @@ Window::AddWindowToStack(Window* window)
window->DetachFromWindowStack(false);
window->fCurrentStack.SetTo(stack);
if (decorator != NULL)
decorator->AddTab(window->Title(), position, &dirty);
if (decorator != NULL) {
DesktopSettings settings(fDesktop);
decorator->AddTab(settings, window->Title(), window->Look(),
window->Flags(), position, &dirty);
}
window->SetLook(window->Look(), &dirty);
fDesktop->RebuildAndRedrawAfterWindowChange(TopLayerStackWindow(), dirty);
@@ -2196,7 +2199,6 @@ Window::MoveToTopStackLayer()
if (decorator == NULL)
return false;
decorator->SetDrawingEngine(fDrawingEngine);
DesktopSettings settings(fDesktop);
SetLook(Look(), NULL);
decorator->SetTopTap(PositionInStack());
return fCurrentStack->MoveToTopLayer(this);
+4 -5
View File
@@ -63,12 +63,12 @@ DecorAddOn::AllocateDecorator(Desktop* desktop, DrawingEngine* engine,
DesktopSettings settings(desktop);
Decorator* decorator;
decorator = _AllocateDecorator(settings, rect, look, flags);
decorator = _AllocateDecorator(settings, rect);
desktop->UnlockSingleWindow();
if (!decorator)
return NULL;
if (decorator->AddTab(title) == false) {
if (decorator->AddTab(settings, title, look, flags) == false) {
delete decorator;
return NULL;
}
@@ -94,10 +94,9 @@ DecorAddOn::GetDesktopListeners()
Decorator*
DecorAddOn::_AllocateDecorator(DesktopSettings& settings, BRect rect,
window_look look, uint32 flags)
DecorAddOn::_AllocateDecorator(DesktopSettings& settings, BRect rect)
{
return new (std::nothrow)SATDecorator(settings, rect, look, flags);
return new (std::nothrow)SATDecorator(settings, rect);
}
+1 -1
View File
@@ -52,7 +52,7 @@ public:
protected:
virtual Decorator* _AllocateDecorator(DesktopSettings& settings,
BRect rect, window_look look, uint32 flags);
BRect rect);
DesktopListenerList fDesktopListeners;
+31 -22
View File
@@ -31,6 +31,9 @@ Decorator::Tab::Tab()
closePressed(false),
zoomPressed(false),
minimizePressed(false),
look(B_TITLED_WINDOW_LOOK),
flags(0),
isFocused(false),
title("")
{
@@ -48,15 +51,11 @@ Decorator::Tab::Tab()
\param wfeel style of window feel. See Window.h
\param wflags various window flags. See Window.h
*/
Decorator::Decorator(DesktopSettings& settings, BRect rect, window_look look,
uint32 flags)
Decorator::Decorator(DesktopSettings& settings, BRect rect)
:
fDrawingEngine(NULL),
fDrawState(),
fLook(look),
fFlags(flags),
fTitleBarRect(),
fFrame(rect),
fResizeRect(),
@@ -81,12 +80,15 @@ Decorator::~Decorator()
Decorator::Tab*
Decorator::AddTab(const char* title, int32 index, BRegion* updateRegion)
Decorator::AddTab(DesktopSettings& settings, const char* title,
window_look look, uint32 flags, int32 index, BRegion* updateRegion)
{
Decorator::Tab* tab = _AllocateNewTab();
if (tab == NULL)
return NULL;
tab->title = title;
tab->look = look;
tab->flags = flags;
bool ok = false;
if (index >= 0) {
@@ -100,14 +102,15 @@ Decorator::AddTab(const char* title, int32 index, BRegion* updateRegion)
return NULL;
}
if (_AddTab(index, updateRegion) == false) {
Decorator::Tab* oldTop = fTopTab;
fTopTab = tab;
if (_AddTab(settings, index, updateRegion) == false) {
fTabList.RemoveItem(tab);
delete tab;
fTopTab = oldTop;
return NULL;
}
fTopTab = tab;
_InvalidateFootprint();
return tab;
}
@@ -184,7 +187,7 @@ Decorator::SetDrawingEngine(DrawingEngine* engine)
\param flags New value for the flags
*/
void
Decorator::SetFlags(uint32 flags, BRegion* updateRegion)
Decorator::SetFlags(int32 tab, uint32 flags, BRegion* updateRegion)
{
// we're nice to our subclasses - we make sure B_NOT_{H|V|}_RESIZABLE
// are in sync (it's only a semantical simplification, not a necessity)
@@ -194,7 +197,10 @@ Decorator::SetFlags(uint32 flags, BRegion* updateRegion)
if (flags & B_NOT_RESIZABLE)
flags |= B_NOT_H_RESIZABLE | B_NOT_V_RESIZABLE;
_SetFlags(flags, updateRegion);
Decorator::Tab* decoratorTab = fTabList.ItemAt(tab);
if (decoratorTab == NULL)
return;
_SetFlags(decoratorTab, flags, updateRegion);
_InvalidateFootprint();
// the border might have changed (smaller/larger tab)
}
@@ -214,10 +220,13 @@ Decorator::FontsChanged(DesktopSettings& settings, BRegion* updateRegion)
\param look New value for the look
*/
void
Decorator::SetLook(DesktopSettings& settings, window_look look,
Decorator::SetLook(int32 tab, DesktopSettings& settings, window_look look,
BRegion* updateRect)
{
_SetLook(settings, look, updateRect);
Decorator::Tab* decoratorTab = fTabList.ItemAt(tab);
if (decoratorTab == NULL)
return;
_SetLook(decoratorTab, settings, look, updateRect);
_InvalidateFootprint();
// the border very likely changed
}
@@ -227,9 +236,9 @@ Decorator::SetLook(DesktopSettings& settings, window_look look,
\return the decorator's window look
*/
window_look
Decorator::Look() const
Decorator::Look(int32 tab) const
{
return fLook;
return TabAt(tab)->look;
}
@@ -237,9 +246,9 @@ Decorator::Look() const
\return the decorator's window flags
*/
uint32
Decorator::Flags() const
Decorator::Flags(int32 tab) const
{
return fFlags;
return TabAt(tab)->flags;
}
@@ -846,17 +855,17 @@ Decorator::_FontsChanged(DesktopSettings& settings, BRegion* updateRegion)
void
Decorator::_SetLook(DesktopSettings& settings, window_look look,
BRegion* updateRect)
Decorator::_SetLook(Decorator::Tab* tab, DesktopSettings& settings,
window_look look, BRegion* updateRect)
{
fLook = look;
tab->look = look;
}
void
Decorator::_SetFlags(uint32 flags, BRegion* updateRegion)
Decorator::_SetFlags(Decorator::Tab* tab, uint32 flags, BRegion* updateRegion)
{
fFlags = flags;
tab->flags = flags;
}
+18 -17
View File
@@ -41,6 +41,8 @@ public:
bool zoomPressed : 1;
bool minimizePressed : 1;
window_look look;
uint32 flags;
bool isFocused : 1;
BString title;
@@ -76,18 +78,18 @@ public:
};
public:
Decorator(DesktopSettings& settings, BRect rect,
window_look look, uint32 flags);
Decorator(DesktopSettings& settings, BRect rect);
virtual ~Decorator();
virtual Decorator::Tab* AddTab(const char* title, int32 index = -1,
BRegion* updateRegion = NULL);
virtual Decorator::Tab* AddTab(DesktopSettings& settings, const char* title,
window_look look, uint32 flags,
int32 index = -1, BRegion* updateRegion = NULL);
virtual bool RemoveTab(int32 index,
BRegion* updateRegion = NULL);
virtual bool MoveTab(int32 from, int32 to, bool isMoving,
BRegion* updateRegion = NULL);
virtual int32 TabAt(const BPoint& where) const;
Decorator::Tab* TabAt(int32 index)
Decorator::Tab* TabAt(int32 index) const
{ return fTabList.ItemAt(index); }
int32 CountTabs() const
{ return fTabList.CountItems(); }
@@ -99,13 +101,13 @@ public:
void FontsChanged(DesktopSettings& settings,
BRegion* updateRegion = NULL);
void SetLook(DesktopSettings& settings, window_look look,
BRegion* updateRegion = NULL);
void SetFlags(uint32 flags,
void SetLook(int32 tab, DesktopSettings& settings,
window_look look, BRegion* updateRegion = NULL);
void SetFlags(int32 tab, uint32 flags,
BRegion* updateRegion = NULL);
window_look Look() const;
uint32 Flags() const;
window_look Look(int32 tab) const;
uint32 Flags(int32 tab) const;
BRect BorderRect() const;
BRect TitleBarRect() const;
@@ -195,9 +197,10 @@ protected:
virtual void _FontsChanged(DesktopSettings& settings,
BRegion* updateRegion = NULL);
virtual void _SetLook(DesktopSettings& settings,
window_look look, BRegion* updateRegion = NULL);
virtual void _SetFlags(uint32 flags,
virtual void _SetLook(Decorator::Tab* tab,
DesktopSettings& settings, window_look look,
BRegion* updateRegion = NULL);
virtual void _SetFlags(Decorator::Tab* tab, uint32 flags,
BRegion* updateRegion = NULL);
virtual void _MoveBy(BPoint offset);
@@ -206,7 +209,8 @@ protected:
virtual bool _SetSettings(const BMessage& settings,
BRegion* updateRegion = NULL);
virtual bool _AddTab(int32 index = -1,
virtual bool _AddTab(DesktopSettings& settings,
int32 index = -1,
BRegion* updateRegion = NULL) = 0;
virtual bool _RemoveTab(int32 index,
BRegion* updateRegion = NULL) = 0;
@@ -219,9 +223,6 @@ protected:
DrawingEngine* fDrawingEngine;
DrawState fDrawState;
window_look fLook;
uint32 fFlags;
BRect fTitleBarRect;
BRect fFrame;
BRect fResizeRect;
+72 -69
View File
@@ -101,10 +101,9 @@ const rgb_color DefaultDecorator::kNonFocusFrameColors[2] = {
// TODO: get rid of DesktopSettings here, and introduce private accessor
// methods to the Decorator base class
DefaultDecorator::DefaultDecorator(DesktopSettings& settings, BRect rect,
window_look look, uint32 flags)
DefaultDecorator::DefaultDecorator(DesktopSettings& settings, BRect rect)
:
Decorator(settings, rect, look, flags),
Decorator(settings, rect),
// focus color constants
kFocusTabColor(settings.UIColor(B_WINDOW_TAB_COLOR)),
kFocusTabColorLight(tint_color(kFocusTabColor,
@@ -124,11 +123,6 @@ DefaultDecorator::DefaultDecorator(DesktopSettings& settings, BRect rect,
fOldMovingTab(0, 0, -1, -1)
{
_UpdateFont(settings);
// Do initial decorator setup
_DoLayout();
// TODO: If the decorator was created with a frame too small, it should
// resize itself!
@@ -234,7 +228,7 @@ DefaultDecorator::RegionAt(BPoint where, int32& tab) const
return region;
// check the resize corner
if (fLook == B_DOCUMENT_WINDOW_LOOK && fResizeRect.Contains(where))
if (fTopTab->look == B_DOCUMENT_WINDOW_LOOK && fResizeRect.Contains(where))
return REGION_RIGHT_BOTTOM_CORNER;
// hit-test the borders
@@ -253,11 +247,11 @@ DefaultDecorator::RegionAt(BPoint where, int32& tab) const
return REGION_NONE;
// check resize area
if ((fFlags & B_NOT_RESIZABLE) == 0
&& (fLook == B_TITLED_WINDOW_LOOK
|| fLook == B_FLOATING_WINDOW_LOOK
|| fLook == B_MODAL_WINDOW_LOOK
|| fLook == kLeftTitledWindowLook)) {
if ((fTopTab->flags & B_NOT_RESIZABLE) == 0
&& (fTopTab->look == B_TITLED_WINDOW_LOOK
|| fTopTab->look == B_FLOATING_WINDOW_LOOK
|| fTopTab->look == B_MODAL_WINDOW_LOOK
|| fTopTab->look == kLeftTitledWindowLook)) {
BRect resizeRect(BPoint(fBottomBorder.right - kBorderResizeLength,
fBottomBorder.bottom - kBorderResizeLength),
fBottomBorder.RightBottom());
@@ -305,13 +299,13 @@ DefaultDecorator::ExtendDirtyRegion(Region region, BRegion& dirty)
break;
case REGION_CLOSE_BUTTON:
if ((fFlags & B_NOT_CLOSABLE) == 0)
if ((fTopTab->flags & B_NOT_CLOSABLE) == 0)
for (int32 i = 0; i < fTabList.CountItems(); i++)
dirty.Include(fTabList.ItemAt(i)->closeRect);
break;
case REGION_ZOOM_BUTTON:
if ((fFlags & B_NOT_ZOOMABLE) == 0)
if ((fTopTab->flags & B_NOT_ZOOMABLE) == 0)
for (int32 i = 0; i < fTabList.CountItems(); i++)
dirty.Include(fTabList.ItemAt(i)->zoomRect);
break;
@@ -347,7 +341,7 @@ DefaultDecorator::ExtendDirtyRegion(Region region, BRegion& dirty)
break;
case REGION_RIGHT_BOTTOM_CORNER:
if ((fFlags & B_NOT_RESIZABLE) == 0)
if ((fTopTab->flags & B_NOT_RESIZABLE) == 0)
dirty.Include(fResizeRect);
break;
@@ -382,7 +376,7 @@ DefaultDecorator::_DoLayout()
bool hasTab = false;
switch ((int)Look()) {
switch ((int)fTopTab->look) {
case B_MODAL_WINDOW_LOOK:
fBorderWidth = 5;
break;
@@ -471,7 +465,7 @@ DefaultDecorator::_DoTabLayout()
font_height fontHeight;
fDrawState.Font().GetHeight(fontHeight);
if (fLook != kLeftTitledWindowLook) {
if (tab->look != kLeftTitledWindowLook) {
tabRect.Set(fFrame.left - fBorderWidth,
fFrame.top - fBorderWidth
- ceilf(fontHeight.ascent + fontHeight.descent + 7.0),
@@ -486,7 +480,7 @@ DefaultDecorator::_DoTabLayout()
}
// format tab rect for a floating window - make the rect smaller
if (fLook == B_FLOATING_WINDOW_LOOK) {
if (tab->look == B_FLOATING_WINDOW_LOOK) {
tabRect.InsetBy(0, 2);
tabRect.OffsetBy(0, 2);
}
@@ -498,9 +492,9 @@ DefaultDecorator::_DoTabLayout()
// tab->minTabSize contains just the room for the buttons
tab->minTabSize = inset * 2 + tab->textOffset;
if ((fFlags & B_NOT_CLOSABLE) == 0)
if ((tab->flags & B_NOT_CLOSABLE) == 0)
tab->minTabSize += offset + size;
if ((fFlags & B_NOT_ZOOMABLE) == 0)
if ((tab->flags & B_NOT_ZOOMABLE) == 0)
tab->minTabSize += offset + size;
// tab->maxTabSize contains tab->minTabSize + the width required for the
@@ -512,7 +506,7 @@ DefaultDecorator::_DoTabLayout()
tab->maxTabSize += tab->textOffset;
tab->maxTabSize += tab->minTabSize;
float tabSize = (fLook != kLeftTitledWindowLook
float tabSize = (tab->look != kLeftTitledWindowLook
? fFrame.Width() : fFrame.Height()) + fBorderWidth * 2;
if (tabSize < tab->minTabSize)
tabSize = tab->minTabSize;
@@ -520,7 +514,7 @@ DefaultDecorator::_DoTabLayout()
tabSize = tab->maxTabSize;
// layout buttons and truncate text
if (fLook != kLeftTitledWindowLook)
if (tab->look != kLeftTitledWindowLook)
tabRect.right = tabRect.left + tabSize;
else
tabRect.bottom = tabRect.top + tabSize;
@@ -651,7 +645,7 @@ DefaultDecorator::_DrawFrame(BRect invalid)
// NOTE: the DrawingEngine needs to be locked for the entire
// time for the clipping to stay valid for this decorator
if (fLook == B_NO_BORDER_WINDOW_LOOK)
if (fTopTab->look == B_NO_BORDER_WINDOW_LOOK)
return;
if (fBorderWidth <= 0)
@@ -659,7 +653,7 @@ DefaultDecorator::_DrawFrame(BRect invalid)
// Draw the border frame
BRect r = BRect(fTopBorder.LeftTop(), fBottomBorder.RightBottom());
switch ((int)fLook) {
switch ((int)fTopTab->look) {
case B_TITLED_WINDOW_LOOK:
case B_DOCUMENT_WINDOW_LOOK:
case B_MODAL_WINDOW_LOOK:
@@ -731,7 +725,8 @@ DefaultDecorator::_DrawFrame(BRect invalid)
fDrawingEngine->StrokeLine(BPoint(r.left + i, r.top + i),
BPoint(r.right - i, r.top + i), colors[i * 2]);
}
if (fTitleBarRect.IsValid() && fLook != kLeftTitledWindowLook) {
if (fTitleBarRect.IsValid()
&& fTopTab->look != kLeftTitledWindowLook) {
// grey along the bottom of the tab
// (overwrites "white" from frame)
fDrawingEngine->StrokeLine(
@@ -750,7 +745,8 @@ DefaultDecorator::_DrawFrame(BRect invalid)
fDrawingEngine->StrokeLine(BPoint(r.left + i, r.top + i),
BPoint(r.left + i, r.bottom - i), colors[i * 2]);
}
if (fLook == kLeftTitledWindowLook && fTitleBarRect.IsValid()) {
if (fTopTab->look == kLeftTitledWindowLook
&& fTitleBarRect.IsValid()) {
// grey along the right side of the tab
// (overwrites "white" from frame)
fDrawingEngine->StrokeLine(
@@ -801,13 +797,13 @@ DefaultDecorator::_DrawFrame(BRect invalid)
}
// Draw the resize knob if we're supposed to
if (!(fFlags & B_NOT_RESIZABLE)) {
if (!(fTopTab->flags & B_NOT_RESIZABLE)) {
r = fResizeRect;
ComponentColors colors;
_GetComponentColors(COMPONENT_RESIZE_CORNER, colors);
switch ((int)fLook) {
switch ((int)fTopTab->look) {
case B_DOCUMENT_WINDOW_LOOK:
{
if (!invalid.Intersects(r))
@@ -899,7 +895,7 @@ DefaultDecorator::_DrawTab(Decorator::Tab* tab, BRect invalid)
colors[COLOR_TAB_FRAME_LIGHT]);
fDrawingEngine->StrokeLine(tabRect.LeftTop(), tabRect.RightTop(),
colors[COLOR_TAB_FRAME_LIGHT]);
if (fLook != kLeftTitledWindowLook) {
if (tab->look != kLeftTitledWindowLook) {
fDrawingEngine->StrokeLine(tabRect.RightTop(), tabRect.RightBottom(),
colors[COLOR_TAB_FRAME_DARK]);
} else {
@@ -914,14 +910,14 @@ DefaultDecorator::_DrawTab(Decorator::Tab* tab, BRect invalid)
// bevel
fDrawingEngine->StrokeLine(BPoint(tabRect.left + 1, tabRect.top + 1),
BPoint(tabRect.left + 1,
tabBotton - (fLook == kLeftTitledWindowLook ? 1 : 0)),
tabBotton - (tab->look == kLeftTitledWindowLook ? 1 : 0)),
colors[COLOR_TAB_BEVEL]);
fDrawingEngine->StrokeLine(BPoint(tabRect.left + 1, tabRect.top + 1),
BPoint(tabRect.right - (fLook == kLeftTitledWindowLook ? 0 : 1),
BPoint(tabRect.right - (tab->look == kLeftTitledWindowLook ? 0 : 1),
tabRect.top + 1),
colors[COLOR_TAB_BEVEL]);
if (fLook != kLeftTitledWindowLook) {
if (tab->look != kLeftTitledWindowLook) {
fDrawingEngine->StrokeLine(BPoint(tabRect.right - 1, tabRect.top + 2),
BPoint(tabRect.right - 1, tabBotton),
colors[COLOR_TAB_SHADOW]);
@@ -938,7 +934,7 @@ DefaultDecorator::_DrawTab(Decorator::Tab* tab, BRect invalid)
gradient.AddColor(colors[COLOR_TAB_LIGHT], 0);
gradient.AddColor(colors[COLOR_TAB], 255);
if (fLook != kLeftTitledWindowLook) {
if (tab->look != kLeftTitledWindowLook) {
gradient.SetEnd(tabRect.LeftBottom());
fDrawingEngine->FillRect(BRect(tabRect.left + 2, tabRect.top + 2,
tabRect.right - 2, tabBotton), gradient);
@@ -997,7 +993,7 @@ DefaultDecorator::_DrawTitle(Decorator::Tab* _tab, BRect r)
fDrawState.Font().GetHeight(fontHeight);
BPoint titlePos;
if (fLook != kLeftTitledWindowLook) {
if (tab->look != kLeftTitledWindowLook) {
titlePos.x = closeRect.IsValid() ? closeRect.right + tab->textOffset
: tabRect.left + tab->textOffset;
titlePos.y = floorf(((tabRect.top + 2.0) + tabRect.bottom
@@ -1080,8 +1076,8 @@ DefaultDecorator::_FontsChanged(DesktopSettings& settings,
void
DefaultDecorator::_SetLook(DesktopSettings& settings, window_look look,
BRegion* updateRegion)
DefaultDecorator::_SetLook(Decorator::Tab* tab, DesktopSettings& settings,
window_look look, BRegion* updateRegion)
{
// TODO: we could be much smarter about the update region
@@ -1089,7 +1085,7 @@ DefaultDecorator::_SetLook(DesktopSettings& settings, window_look look,
if (updateRegion != NULL)
updateRegion->Include(&GetFootprint());
fLook = look;
tab->look = look;
_UpdateFont(settings);
_InvalidateBitmaps();
@@ -1102,7 +1098,8 @@ DefaultDecorator::_SetLook(DesktopSettings& settings, window_look look,
void
DefaultDecorator::_SetFlags(uint32 flags, BRegion* updateRegion)
DefaultDecorator::_SetFlags(Decorator::Tab* tab, uint32 flags,
BRegion* updateRegion)
{
// TODO: we could be much smarter about the update region
@@ -1110,7 +1107,7 @@ DefaultDecorator::_SetFlags(uint32 flags, BRegion* updateRegion)
if (updateRegion != NULL)
updateRegion->Include(&GetFootprint());
fFlags = flags;
tab->flags = flags;
_DoLayout();
_InvalidateFootprint();
@@ -1124,8 +1121,9 @@ DefaultDecorator::_SetFocus(Decorator::Tab* _tab)
{
DefaultDecorator::Tab* tab = static_cast<DefaultDecorator::Tab*>(_tab);
tab->buttonFocus = IsFocus(tab)
|| ((fLook == B_FLOATING_WINDOW_LOOK || fLook == kLeftTitledWindowLook)
&& (fFlags & B_AVOID_FOCUS) != 0);
|| ((tab->look == B_FLOATING_WINDOW_LOOK
|| tab->look == kLeftTitledWindowLook)
&& (tab->flags & B_AVOID_FOCUS) != 0);
if (CountTabs() > 1)
_LayoutTabItems(tab, tab->tabRect);
}
@@ -1165,9 +1163,9 @@ DefaultDecorator::_ResizeBy(BPoint offset, BRegion* dirty)
fFrame.bottom += offset.y;
// Handle invalidation of resize rect
if (dirty && !(fFlags & B_NOT_RESIZABLE)) {
if (dirty && !(fTopTab->flags & B_NOT_RESIZABLE)) {
BRect realResizeRect;
switch ((int)fLook) {
switch ((int)fTopTab->look) {
case B_DOCUMENT_WINDOW_LOOK:
realResizeRect = fResizeRect;
// Resize rect at old location
@@ -1261,7 +1259,7 @@ DefaultDecorator::_ResizeBy(BPoint offset, BRegion* dirty)
float delta = tabOffset - tab->tabOffset;
tab->tabOffset = (uint32)tabOffset;
if (fLook != kLeftTitledWindowLook)
if (fTopTab->look != kLeftTitledWindowLook)
tabRect.OffsetBy(delta, 0.0);
else
tabRect.OffsetBy(0.0, delta);
@@ -1271,9 +1269,10 @@ DefaultDecorator::_ResizeBy(BPoint offset, BRegion* dirty)
if (tabSize > tab->maxTabSize)
tabSize = tab->maxTabSize;
if (fLook != kLeftTitledWindowLook && tabSize != tabRect.Width()) {
if (fTopTab->look != kLeftTitledWindowLook
&& tabSize != tabRect.Width()) {
tabRect.right = tabRect.left + tabSize;
} else if (fLook == kLeftTitledWindowLook
} else if (fTopTab->look == kLeftTitledWindowLook
&& tabSize != tabRect.Height()) {
tabRect.bottom = tabRect.top + tabSize;
}
@@ -1289,7 +1288,7 @@ DefaultDecorator::_ResizeBy(BPoint offset, BRegion* dirty)
BRect redraw(tabRect);
if (delta != 0.0) {
redraw = redraw | oldTabRect;
if (fLook != kLeftTitledWindowLook)
if (fTopTab->look != kLeftTitledWindowLook)
redraw.bottom++;
else
redraw.right++;
@@ -1382,8 +1381,11 @@ DefaultDecorator::_SetSettings(const BMessage& settings, BRegion* updateRegion)
bool
DefaultDecorator::_AddTab(int32 index, BRegion* updateRegion)
DefaultDecorator::_AddTab(DesktopSettings& settings, int32 index,
BRegion* updateRegion)
{
_UpdateFont(settings);
_DoLayout();
if (updateRegion != NULL)
updateRegion->Include(fTitleBarRect);
@@ -1443,7 +1445,7 @@ DefaultDecorator::_GetFootprint(BRegion *region)
region->MakeEmpty();
if (fLook == B_NO_BORDER_WINDOW_LOOK)
if (fTopTab->look == B_NO_BORDER_WINDOW_LOOK)
return;
region->Include(fTopBorder);
@@ -1451,12 +1453,12 @@ DefaultDecorator::_GetFootprint(BRegion *region)
region->Include(fRightBorder);
region->Include(fBottomBorder);
if (fLook == B_BORDERED_WINDOW_LOOK)
if (fTopTab->look == B_BORDERED_WINDOW_LOOK)
return;
region->Include(&fTabsRegion);
if (fLook == B_DOCUMENT_WINDOW_LOOK) {
if (fTopTab->look == B_DOCUMENT_WINDOW_LOOK) {
// include the rectangular resize knob on the bottom right
float knobSize = kResizeKnobSize - fBorderWidth;
region->Include(BRect(fFrame.right - knobSize, fFrame.bottom - knobSize,
@@ -1469,9 +1471,9 @@ void
DefaultDecorator::DrawButtons(Decorator::Tab* tab, const BRect& invalid)
{
// Draw the buttons if we're supposed to
if (!(fFlags & B_NOT_CLOSABLE) && invalid.Intersects(tab->closeRect))
if (!(tab->flags & B_NOT_CLOSABLE) && invalid.Intersects(tab->closeRect))
_DrawClose(tab, false, tab->closeRect);
if (!(fFlags & B_NOT_ZOOMABLE) && invalid.Intersects(tab->zoomRect))
if (!(tab->flags & B_NOT_ZOOMABLE) && invalid.Intersects(tab->zoomRect))
_DrawZoom(tab, false, tab->zoomRect);
}
@@ -1555,9 +1557,10 @@ void
DefaultDecorator::_UpdateFont(DesktopSettings& settings)
{
ServerFont font;
if (fLook == B_FLOATING_WINDOW_LOOK || fLook == kLeftTitledWindowLook) {
if (fTopTab->look == B_FLOATING_WINDOW_LOOK
|| fTopTab->look == kLeftTitledWindowLook) {
settings.GetDefaultPlainFont(font);
if (fLook == kLeftTitledWindowLook)
if (fTopTab->look == kLeftTitledWindowLook)
font.SetRotation(90.0f);
} else
settings.GetDefaultBoldFont(font);
@@ -1623,11 +1626,11 @@ void
DefaultDecorator::_GetButtonSizeAndOffset(const BRect& tabRect, float* _offset,
float* _size, float* _inset) const
{
float tabSize = fLook == kLeftTitledWindowLook ?
float tabSize = fTopTab->look == kLeftTitledWindowLook ?
tabRect.Width() : tabRect.Height();
bool smallTab = fLook == B_FLOATING_WINDOW_LOOK
|| fLook == kLeftTitledWindowLook;
bool smallTab = fTopTab->look == B_FLOATING_WINDOW_LOOK
|| fTopTab->look == kLeftTitledWindowLook;
*_offset = smallTab ? floorf(fDrawState.Font().Size() / 2.6)
: floorf(fDrawState.Font().Size() / 2.3);
@@ -1657,7 +1660,7 @@ DefaultDecorator::_LayoutTabItems(Decorator::Tab* _tab, const BRect& tabRect)
BRect& zoomRect = tab->zoomRect;
// calulate close rect based on the tab rectangle
if (fLook != kLeftTitledWindowLook) {
if (tab->look != kLeftTitledWindowLook) {
closeRect.Set(tabRect.left + offset, tabRect.top + offset,
tabRect.left + offset + size, tabRect.top + offset + size);
@@ -1665,9 +1668,9 @@ DefaultDecorator::_LayoutTabItems(Decorator::Tab* _tab, const BRect& tabRect)
tabRect.right - offset, tabRect.top + offset + size);
// hidden buttons have no width
if ((Flags() & B_NOT_CLOSABLE) != 0)
if ((tab->flags & B_NOT_CLOSABLE) != 0)
closeRect.right = closeRect.left - offset;
if ((Flags() & B_NOT_ZOOMABLE) != 0)
if ((tab->flags & B_NOT_ZOOMABLE) != 0)
zoomRect.left = zoomRect.right + offset;
} else {
closeRect.Set(tabRect.left + offset, tabRect.top + offset,
@@ -1677,9 +1680,9 @@ DefaultDecorator::_LayoutTabItems(Decorator::Tab* _tab, const BRect& tabRect)
tabRect.left + size + offset, tabRect.bottom - offset);
// hidden buttons have no height
if ((Flags() & B_NOT_CLOSABLE) != 0)
if ((tab->flags & B_NOT_CLOSABLE) != 0)
closeRect.bottom = closeRect.top - offset;
if ((Flags() & B_NOT_ZOOMABLE) != 0)
if ((tab->flags & B_NOT_ZOOMABLE) != 0)
zoomRect.top = zoomRect.bottom + offset;
}
@@ -1687,7 +1690,7 @@ DefaultDecorator::_LayoutTabItems(Decorator::Tab* _tab, const BRect& tabRect)
// TODO: the +2 is there because the title often appeared
// truncated for no apparent reason - OTOH the title does
// also not appear perfectly in the middle
if (fLook != kLeftTitledWindowLook)
if (tab->look != kLeftTitledWindowLook)
size = (zoomRect.left - closeRect.right) - tab->textOffset * 2 + inset;
else
size = (zoomRect.top - closeRect.bottom) - tab->textOffset * 2 + inset;
@@ -1878,8 +1881,8 @@ DefaultDecorator::_GetComponentColors(Component component,
float
DefaultDecorator::_DefaultTextOffset() const
{
return (fLook == B_FLOATING_WINDOW_LOOK
|| fLook == kLeftTitledWindowLook) ? 10 : 18;
return (fTopTab->look == B_FLOATING_WINDOW_LOOK
|| fTopTab->look == kLeftTitledWindowLook) ? 10 : 18;
}
@@ -1887,7 +1890,7 @@ float
DefaultDecorator::_SingleTabOffsetAndSize(float& tabSize)
{
float maxLocation;
if (fLook != kLeftTitledWindowLook) {
if (fTopTab->look != kLeftTitledWindowLook) {
tabSize = fRightBorder.right - fLeftBorder.left;
} else {
tabSize = fBottomBorder.bottom - fTopBorder.top;
+6 -6
View File
@@ -44,8 +44,7 @@ public:
};
DefaultDecorator(DesktopSettings& settings,
BRect frame, window_look look,
uint32 flags);
BRect frame);
virtual ~DefaultDecorator();
virtual float TabLocation(int32 tab) const;
@@ -126,10 +125,10 @@ protected:
virtual void _FontsChanged(DesktopSettings& settings,
BRegion* updateRegion);
virtual void _SetLook(DesktopSettings& settings,
window_look look,
virtual void _SetLook(Decorator::Tab* tab,
DesktopSettings& settings, window_look look,
BRegion* updateRegion = NULL);
virtual void _SetFlags(uint32 flags,
virtual void _SetFlags(Decorator::Tab* tab, uint32 flags,
BRegion* updateRegion = NULL);
virtual void _MoveBy(BPoint offset);
@@ -142,7 +141,8 @@ protected:
virtual bool _SetSettings(const BMessage& settings,
BRegion* updateRegion = NULL);
virtual bool _AddTab(int32 index = -1,
virtual bool _AddTab(DesktopSettings& settings,
int32 index = -1,
BRegion* updateRegion = NULL);
virtual bool _RemoveTab(int32 index,
BRegion* updateRegion = NULL);
@@ -49,10 +49,9 @@ static const rgb_color kHighlightTabColorShadow = tint_color(kHighlightTabColor,
(B_DARKEN_1_TINT + B_NO_TINT) / 2);
SATDecorator::SATDecorator(DesktopSettings& settings, BRect frame,
window_look look, uint32 flags)
SATDecorator::SATDecorator(DesktopSettings& settings, BRect frame)
:
DefaultDecorator(settings, frame, look, flags)
DefaultDecorator(settings, frame)
{
}
+1 -2
View File
@@ -23,8 +23,7 @@ public:
public:
SATDecorator(DesktopSettings& settings,
BRect frame, window_look look,
uint32 flags);
BRect frame);
protected:
virtual void GetComponentColors(Component component,
@@ -379,6 +379,8 @@ SATWindow::RemovedFromGroup(SATGroup* group, bool stayBelowMouse)
fWindow->Title());
_RestoreOriginalSize(stayBelowMouse);
if (group->CountItems() == 1)
group->WindowAt(0)->_RestoreOriginalSize(false);
if (fShutdown) {
fGroupCookie->Uninit();