Added Layer::Push/PopState() and moved their implementation from ServerWindow.cpp. We definitely need more encapsulation
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@13043 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
+59
-34
@@ -69,46 +69,46 @@ enum {
|
|||||||
|
|
||||||
Layer::Layer(BRect frame, const char* name, int32 token,
|
Layer::Layer(BRect frame, const char* name, int32 token,
|
||||||
uint32 resize, uint32 flags, DisplayDriver* driver)
|
uint32 resize, uint32 flags, DisplayDriver* driver)
|
||||||
: fFrame(frame), // in parent coordinates
|
:
|
||||||
// fBoundsLeftTop(0.0, 0.0),
|
fFrame(frame), // in parent coordinates
|
||||||
|
// fBoundsLeftTop(0.0, 0.0),
|
||||||
|
|
||||||
// Layer does not start out as a part of the tree
|
// Layer does not start out as a part of the tree
|
||||||
fOwner (NULL),
|
fOwner(NULL),
|
||||||
fParent (NULL),
|
fParent(NULL),
|
||||||
fUpperSibling (NULL),
|
fUpperSibling(NULL),
|
||||||
fLowerSibling (NULL),
|
fLowerSibling(NULL),
|
||||||
fTopChild (NULL),
|
fTopChild(NULL),
|
||||||
fBottomChild (NULL),
|
fBottomChild(NULL),
|
||||||
|
fCurrent(NULL),
|
||||||
|
|
||||||
fCurrent (NULL),
|
// all regions (fVisible, fFullVisible, fFull) start empty
|
||||||
|
fVisible(),
|
||||||
|
fFullVisible(),
|
||||||
|
fFull(),
|
||||||
|
|
||||||
// all regions (fVisible, fFullVisible, fFull) start empty
|
fClipReg(&fVisible),
|
||||||
fVisible (),
|
|
||||||
fFullVisible (),
|
|
||||||
fFull (),
|
|
||||||
|
|
||||||
fClipReg (&fVisible),
|
fServerWin(NULL),
|
||||||
|
fName(new BString(name)),
|
||||||
|
fViewToken(token),
|
||||||
|
|
||||||
fServerWin (NULL),
|
fFlags(flags),
|
||||||
fName (new BString(name ? name : B_EMPTY_STRING)),
|
fResizeMode(resize),
|
||||||
fViewToken (token),
|
fEventMask(0UL),
|
||||||
|
fEventOptions(0UL),
|
||||||
|
fHidden(false),
|
||||||
|
fIsTopLayer(false),
|
||||||
|
|
||||||
fFlags (flags),
|
fAdFlags(0),
|
||||||
fResizeMode (resize),
|
fClassID(AS_LAYER_CLASS),
|
||||||
fEventMask (0UL),
|
|
||||||
fEventOptions (0UL),
|
|
||||||
fHidden (false),
|
|
||||||
fIsTopLayer (false),
|
|
||||||
|
|
||||||
fAdFlags (0),
|
fFrameAction(B_LAYER_ACTION_NONE),
|
||||||
fClassID (AS_LAYER_CLASS),
|
|
||||||
|
|
||||||
fFrameAction (B_LAYER_ACTION_NONE),
|
fDriver(driver),
|
||||||
|
fLayerData(new LayerData()),
|
||||||
|
|
||||||
fDriver (driver),
|
fRootLayer(NULL)
|
||||||
fLayerData (new LayerData()),
|
|
||||||
|
|
||||||
fRootLayer (NULL)
|
|
||||||
{
|
{
|
||||||
if (!frame.IsValid()) {
|
if (!frame.IsValid()) {
|
||||||
char helper[1024];
|
char helper[1024];
|
||||||
@@ -847,15 +847,15 @@ Layer::Redraw(const BRegion& reg, Layer *startFrom)
|
|||||||
|
|
||||||
// Draw
|
// Draw
|
||||||
void
|
void
|
||||||
Layer::Draw(const BRect &r)
|
Layer::Draw(const BRect &rect)
|
||||||
{
|
{
|
||||||
#ifdef DEBUG_LAYER
|
#ifdef DEBUG_LAYER
|
||||||
printf("Layer(%s)::Draw: ", GetName());
|
printf("Layer(%s)::Draw: ", GetName());
|
||||||
r.PrintToStream();
|
rect.PrintToStream();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (!fLayerData->ViewColor().IsTransparentMagic())
|
if (!fLayerData->ViewColor().IsTransparentMagic())
|
||||||
fDriver->FillRect(r, fLayerData->ViewColor());
|
fDriver->FillRect(rect, fLayerData->ViewColor());
|
||||||
}
|
}
|
||||||
|
|
||||||
// EmptyGlobals
|
// EmptyGlobals
|
||||||
@@ -928,6 +928,31 @@ Layer::IsHidden(void) const
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
Layer::PushState()
|
||||||
|
{
|
||||||
|
LayerData *data = new LayerData();
|
||||||
|
data->prevState = fLayerData;
|
||||||
|
fLayerData = data;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
Layer::PopState()
|
||||||
|
{
|
||||||
|
if (fLayerData->prevState == NULL) {
|
||||||
|
fprintf(stderr, "WARNING: User called BView(%s)::PopState(), but there is NO state on stack!\n", fName->String());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
LayerData *data = fLayerData;
|
||||||
|
fLayerData = fLayerData->prevState;
|
||||||
|
data->prevState = NULL;
|
||||||
|
delete data;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//! Matches the BView call of the same name
|
//! Matches the BView call of the same name
|
||||||
BRect
|
BRect
|
||||||
Layer::Bounds(void) const
|
Layer::Bounds(void) const
|
||||||
|
|||||||
@@ -118,6 +118,10 @@ class Layer {
|
|||||||
void Hide(bool invalidate = true);
|
void Hide(bool invalidate = true);
|
||||||
bool IsHidden() const;
|
bool IsHidden() const;
|
||||||
|
|
||||||
|
// graphic state
|
||||||
|
void PushState();
|
||||||
|
void PopState();
|
||||||
|
|
||||||
// coordinate system
|
// coordinate system
|
||||||
BRect Bounds() const;
|
BRect Bounds() const;
|
||||||
BRect Frame() const;
|
BRect Frame() const;
|
||||||
|
|||||||
@@ -697,11 +697,8 @@ ServerWindow::DispatchMessage(int32 code, LinkMsgReader &link)
|
|||||||
case AS_LAYER_PUSH_STATE:
|
case AS_LAYER_PUSH_STATE:
|
||||||
{
|
{
|
||||||
DTRACE(("ServerWindow %s: Message AS_LAYER_PUSH_STATE: Layer: %s\n",fName, fCurrentLayer->fName->String()));
|
DTRACE(("ServerWindow %s: Message AS_LAYER_PUSH_STATE: Layer: %s\n",fName, fCurrentLayer->fName->String()));
|
||||||
// TODO: refactor, put this in Layer
|
|
||||||
LayerData *ld = new LayerData();
|
|
||||||
ld->prevState = fCurrentLayer->fLayerData;
|
|
||||||
fCurrentLayer->fLayerData = ld;
|
|
||||||
|
|
||||||
|
fCurrentLayer->PushState();
|
||||||
fCurrentLayer->RebuildFullRegion();
|
fCurrentLayer->RebuildFullRegion();
|
||||||
|
|
||||||
break;
|
break;
|
||||||
@@ -709,17 +706,8 @@ ServerWindow::DispatchMessage(int32 code, LinkMsgReader &link)
|
|||||||
case AS_LAYER_POP_STATE:
|
case AS_LAYER_POP_STATE:
|
||||||
{
|
{
|
||||||
DTRACE(("ServerWindow %s: Message AS_LAYER_POP_STATE: Layer: %s\n",fName, fCurrentLayer->fName->String()));
|
DTRACE(("ServerWindow %s: Message AS_LAYER_POP_STATE: Layer: %s\n",fName, fCurrentLayer->fName->String()));
|
||||||
if (!(fCurrentLayer->fLayerData->prevState))
|
|
||||||
{
|
|
||||||
DTRACE(("WARNING: SW(%s): User called BView(%s)::PopState(), but there is NO state on stack!\n", fName, fCurrentLayer->fName->String()));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
// TODO: refactor, put this in Layer
|
|
||||||
LayerData *ld = fCurrentLayer->fLayerData;
|
|
||||||
fCurrentLayer->fLayerData = fCurrentLayer->fLayerData->prevState;
|
|
||||||
ld->prevState = NULL;
|
|
||||||
delete ld;
|
|
||||||
|
|
||||||
|
fCurrentLayer->PopState();
|
||||||
fCurrentLayer->RebuildFullRegion();
|
fCurrentLayer->RebuildFullRegion();
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|||||||
Reference in New Issue
Block a user