resizing layers with any rule seems to work now. lots of testing remains to be done...

git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@12812 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Adi Oanca
2005-05-25 17:05:28 +00:00
parent 1ea5e6a028
commit ccf52fa4fe
5 changed files with 79 additions and 46 deletions
Binary file not shown.
+68 -44
View File
@@ -47,15 +47,8 @@ void Layer::ConvertToScreen2(BRect* rect)
if (view) if (view)
if (fParent) if (fParent)
{ {
rect->Set( rect->left - fOrigin.x, rect->OffsetBy(-fOrigin.x, -fOrigin.y);
rect->top - fOrigin.y, rect->OffsetBy(fFrame.left, fFrame.top);
rect->right - fOrigin.x,
rect->bottom - fOrigin.y);
rect->Set( rect->left + fFrame.left,
rect->top + fFrame.top,
rect->right + fFrame.left,
rect->bottom + fFrame.top);
fParent->ConvertToScreen2(rect); fParent->ConvertToScreen2(rect);
} }
@@ -214,52 +207,77 @@ Layer::resize_layer_frame_by(float x, float y)
{ {
uint16 rm = fResizeMode & 0x0000FFFF; uint16 rm = fResizeMode & 0x0000FFFF;
BRect newFrame = fFrame; BRect newFrame = fFrame;
float dx, dy;
if ((rm & 0x0F00U) == _VIEW_LEFT_ << 8)
newFrame.left += 0.0f;
else if ((rm & 0x0F00U) == _VIEW_RIGHT_ << 8)
newFrame.left += x;
else if ((rm & 0x0F00U) == _VIEW_CENTER_ << 8)
newFrame.left += x/2;
if ((rm & 0x000FU) == _VIEW_LEFT_) if ((rm & 0x000FU) == _VIEW_LEFT_)
{ newFrame.right += 0.0f;
newFrame.left += 0.0f;
newFrame.right += x;
}
else if ((rm & 0x000FU) == _VIEW_RIGHT_) else if ((rm & 0x000FU) == _VIEW_RIGHT_)
{
newFrame.left += x;
newFrame.right += x; newFrame.right += x;
}
else if ((rm & 0x000FU) == _VIEW_CENTER_) else if ((rm & 0x000FU) == _VIEW_CENTER_)
{
newFrame.left += x/2;
newFrame.right += x/2; newFrame.right += x/2;
}
if ((rm & 0x00F0U) == _VIEW_TOP_) if ((rm & 0xF000U) == _VIEW_TOP_ << 12)
{
newFrame.top += 0.0f; newFrame.top += 0.0f;
newFrame.bottom += y; else if ((rm & 0xF000U) == _VIEW_BOTTOM_ << 12)
}
else if ((rm & 0x00F0U) == _VIEW_BOTTOM_)
{
newFrame.top += y; newFrame.top += y;
newFrame.bottom += y; else if ((rm & 0xF000U) == _VIEW_CENTER_ << 12)
}
else if ((rm & 0x00F0U) == _VIEW_CENTER_)
{
newFrame.top += y/2; newFrame.top += y/2;
if ((rm & 0x00F0U) == _VIEW_TOP_ << 4)
newFrame.bottom += 0.0f;
else if ((rm & 0x00F0U) == _VIEW_BOTTOM_ << 4)
newFrame.bottom += y;
else if ((rm & 0x00F0U) == _VIEW_CENTER_ << 4)
newFrame.bottom += y/2; newFrame.bottom += y/2;
}
dx = newFrame.Width() - fFrame.Width(); if (newFrame != fFrame)
dy = newFrame.Height() - fFrame.Height();
fFrame = newFrame;
// call hook function
if (dx != 0.0f || dy != 0.0f)
ResizedByHook(dx, dy, true); // automatic
for (Layer *lay = VirtualBottomChild(); lay ; lay = VirtualUpperSibling())
{ {
lay->resize_layer_frame_by(dx, dy); float dx, dy;
fFrame = newFrame;
dx = newFrame.Width() - fFrame.Width();
dy = newFrame.Height() - fFrame.Height();
if (dx != 0.0f || dy != 0.0f)
{
// call hook function
ResizedByHook(dx, dy, true); // automatic
for (Layer *lay = VirtualBottomChild();
lay ; lay = VirtualUpperSibling())
{
lay->resize_layer_frame_by(dx, dy);
}
}
else
MovedByHook(dx, dy);
}
}
void
Layer::resize_redraw_more_regions(BRegion &redraw)
{
uint16 rm = fResizeMode & 0x0000FFFF;
if (rm & B_FOLLOW_RIGHT || rm & B_FOLLOW_H_CENTER
|| rm & B_FOLLOW_BOTTOM || rm & B_FOLLOW_V_CENTER
// TODO: these 2 don't need to be redrawn entirely. but ATM we don't have a choice
|| rm & B_FOLLOW_LEFT_RIGHT || rm & B_FOLLOW_TOP_BOTTOM)
{
redraw.Include(&fFullVisible);
}
else
{
for (Layer *lay = VirtualBottomChild();
lay; lay = VirtualUpperSibling())
lay->resize_redraw_more_regions(redraw);
} }
} }
@@ -270,8 +288,8 @@ void Layer::ResizeBy(float dx, float dy)
fFrame.Set(fFrame.left, fFrame.top, fFrame.right+dx, fFrame.bottom+dy); fFrame.Set(fFrame.left, fFrame.top, fFrame.right+dx, fFrame.bottom+dy);
// resize children using their resize_mask. // resize children using their resize_mask.
for (Layer *lay = fParent->VirtualBottomChild(); for (Layer *lay = VirtualBottomChild();
lay; lay = fParent->VirtualUpperSibling()) lay; lay = VirtualUpperSibling())
lay->resize_layer_frame_by(dx, dy); lay->resize_layer_frame_by(dx, dy);
if (!IsVisuallyHidden() && GetRootLayer()) if (!IsVisuallyHidden() && GetRootLayer())
@@ -300,6 +318,12 @@ void Layer::ResizeBy(float dx, float dy)
// 3) combine. // 3) combine.
redrawReg.Include(&redrawReg2); redrawReg.Include(&redrawReg2);
// layers that had their frame modified must be entirely redrawn.
for (Layer *lay = VirtualBottomChild();
lay; lay = VirtualUpperSibling())
lay->resize_redraw_more_regions(redrawReg);
// add redrawReg to our RootLayer's redraw region. // add redrawReg to our RootLayer's redraw region.
GetRootLayer()->fRedrawReg.Include(&redrawReg); GetRootLayer()->fRedrawReg.Include(&redrawReg);
// include layer's visible region in case we want a full update on resize // include layer's visible region in case we want a full update on resize
@@ -59,6 +59,7 @@ private:
void set_user_regions(BRegion &reg); void set_user_regions(BRegion &reg);
void clear_visible_regions(); void clear_visible_regions();
void resize_layer_frame_by(float x, float y); void resize_layer_frame_by(float x, float y);
void resize_redraw_more_regions(BRegion &redraw);
char fName[50]; char fName[50];
BRegion fVisible; BRegion fVisible;
@@ -96,5 +96,6 @@ void MyView::DrawSubTree(Layer* lay)
BRect temp = lay->Bounds(); BRect temp = lay->Bounds();
lay->ConvertToScreen2(&temp); lay->ConvertToScreen2(&temp);
FillRect(temp); FillRect(temp);
Flush();
ConstrainClippingRegion(NULL); ConstrainClippingRegion(NULL);
} }
+9 -2
View File
@@ -102,7 +102,9 @@ void clsMainWindow::test1()
c.red = rand()/256; c.red = rand()/256;
c.green = rand()/256; c.green = rand()/256;
c.blue = rand()/256; c.blue = rand()/256;
Layer *lay3 = new Layer(BRect(20,20,100,100), "lay3", B_FOLLOW_NONE, 0, c); Layer *lay3 = new Layer(BRect(20,20,100,100), "lay3",
B_FOLLOW_LEFT | B_FOLLOW_BOTTOM,
0, c);
lay2->AddLayer(lay3); lay2->AddLayer(lay3);
temp = lay1->Bounds(); temp = lay1->Bounds();
@@ -124,6 +126,11 @@ void clsMainWindow::test1()
snooze(2000000); snooze(2000000);
lay2->ResizeBy(-45, -55);
/*
snooze(2000000);
lay1->ScrollBy(0,50); lay1->ScrollBy(0,50);
snooze(2000000); snooze(2000000);
@@ -137,7 +144,7 @@ void clsMainWindow::test1()
snooze(2000000); snooze(2000000);
lay1->Invalidate(BRect(0,0,500,500)); lay1->Invalidate(BRect(0,0,500,500));
*/
} }
int main() int main()