Save and restore layout.
This commit is contained in:
@@ -67,6 +67,7 @@ public:
|
|||||||
|
|
||||||
Area* AreaFor(const BView* view) const;
|
Area* AreaFor(const BView* view) const;
|
||||||
Area* AreaFor(const BLayoutItem* item) const;
|
Area* AreaFor(const BLayoutItem* item) const;
|
||||||
|
int32 CountAreas() const;
|
||||||
Area* AreaAt(int32 index) const;
|
Area* AreaAt(int32 index) const;
|
||||||
Area* CurrentArea() const;
|
Area* CurrentArea() const;
|
||||||
bool SetCurrentArea(const Area* area);
|
bool SetCurrentArea(const Area* area);
|
||||||
@@ -122,6 +123,9 @@ public:
|
|||||||
YTab* bottom = NULL, XTab* left = NULL,
|
YTab* bottom = NULL, XTab* left = NULL,
|
||||||
XTab* right = NULL);
|
XTab* right = NULL);
|
||||||
|
|
||||||
|
bool SaveLayout(BMessage* archive) const;
|
||||||
|
bool RestoreLayout(const BMessage* archive);
|
||||||
|
|
||||||
virtual BSize BaseMinSize();
|
virtual BSize BaseMinSize();
|
||||||
virtual BSize BaseMaxSize();
|
virtual BSize BaseMaxSize();
|
||||||
virtual BSize BasePreferredSize();
|
virtual BSize BasePreferredSize();
|
||||||
|
|||||||
+142
-7
@@ -11,6 +11,7 @@
|
|||||||
#include <math.h> // for floor
|
#include <math.h> // for floor
|
||||||
#include <new>
|
#include <new>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
#include "RowColumnManager.h"
|
#include "RowColumnManager.h"
|
||||||
#include "ViewLayoutItem.h"
|
#include "ViewLayoutItem.h"
|
||||||
@@ -129,8 +130,8 @@ BALMLayout::YTabAt(int32 index) const
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int
|
static int
|
||||||
CompareXTabFunc(const XTab* tab1, const XTab* tab2)
|
compare_x_tab_func(const XTab* tab1, const XTab* tab2)
|
||||||
{
|
{
|
||||||
if (tab1->Value() < tab2->Value())
|
if (tab1->Value() < tab2->Value())
|
||||||
return -1;
|
return -1;
|
||||||
@@ -140,8 +141,8 @@ CompareXTabFunc(const XTab* tab1, const XTab* tab2)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int
|
static int
|
||||||
CompareYTabFunc(const YTab* tab1, const YTab* tab2)
|
compare_y_tab_func(const YTab* tab1, const YTab* tab2)
|
||||||
{
|
{
|
||||||
if (tab1->Value() < tab2->Value())
|
if (tab1->Value() < tab2->Value())
|
||||||
return -1;
|
return -1;
|
||||||
@@ -151,11 +152,10 @@ CompareYTabFunc(const YTab* tab1, const YTab* tab2)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
const XTabList&
|
const XTabList&
|
||||||
BALMLayout::OrderedXTabs()
|
BALMLayout::OrderedXTabs()
|
||||||
{
|
{
|
||||||
fXTabList.SortItems(CompareXTabFunc);
|
fXTabList.SortItems(compare_x_tab_func);
|
||||||
return fXTabList;
|
return fXTabList;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -163,7 +163,7 @@ BALMLayout::OrderedXTabs()
|
|||||||
const YTabList&
|
const YTabList&
|
||||||
BALMLayout::OrderedYTabs()
|
BALMLayout::OrderedYTabs()
|
||||||
{
|
{
|
||||||
fYTabList.SortItems(CompareYTabFunc);
|
fYTabList.SortItems(compare_y_tab_func);
|
||||||
return fYTabList;
|
return fYTabList;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -230,6 +230,13 @@ BALMLayout::AreaFor(const BLayoutItem* item) const
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int32
|
||||||
|
BALMLayout::CountAreas() const
|
||||||
|
{
|
||||||
|
return CountItems();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
Area*
|
Area*
|
||||||
BALMLayout::AreaAt(int32 index) const
|
BALMLayout::AreaAt(int32 index) const
|
||||||
{
|
{
|
||||||
@@ -670,6 +677,134 @@ BALMLayout::AddItemToBottom(BLayoutItem* item, YTab* _bottom, XTab* left,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
enum {
|
||||||
|
kLeftBorderIndex = -2,
|
||||||
|
kTopBorderIndex = -3,
|
||||||
|
kRightBorderIndex = -4,
|
||||||
|
kBottomBorderIndex = -5,
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
bool
|
||||||
|
BALMLayout::SaveLayout(BMessage* archive) const
|
||||||
|
{
|
||||||
|
archive->MakeEmpty();
|
||||||
|
|
||||||
|
archive->AddInt32("nXTabs", CountXTabs());
|
||||||
|
archive->AddInt32("nYTabs", CountYTabs());
|
||||||
|
|
||||||
|
XTabList xTabs = fXTabList;
|
||||||
|
xTabs.RemoveItem(fLeft);
|
||||||
|
xTabs.RemoveItem(fRight);
|
||||||
|
YTabList yTabs = fYTabList;
|
||||||
|
yTabs.RemoveItem(fTop);
|
||||||
|
yTabs.RemoveItem(fBottom);
|
||||||
|
|
||||||
|
int32 nAreas = CountAreas();
|
||||||
|
for (int32 i = 0; i < nAreas; i++) {
|
||||||
|
Area* area = AreaAt(i);
|
||||||
|
if (area->Left() == fLeft)
|
||||||
|
archive->AddInt32("left", kLeftBorderIndex);
|
||||||
|
else
|
||||||
|
archive->AddInt32("left", xTabs.IndexOf(area->Left()));
|
||||||
|
if (area->Top() == fTop)
|
||||||
|
archive->AddInt32("top", kTopBorderIndex);
|
||||||
|
else
|
||||||
|
archive->AddInt32("top", yTabs.IndexOf(area->Top()));
|
||||||
|
if (area->Right() == fRight)
|
||||||
|
archive->AddInt32("right", kRightBorderIndex);
|
||||||
|
else
|
||||||
|
archive->AddInt32("right", xTabs.IndexOf(area->Right()));
|
||||||
|
if (area->Bottom() == fBottom)
|
||||||
|
archive->AddInt32("bottom", kBottomBorderIndex);
|
||||||
|
else
|
||||||
|
archive->AddInt32("bottom", yTabs.IndexOf(area->Bottom()));
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool
|
||||||
|
BALMLayout::RestoreLayout(const BMessage* archive)
|
||||||
|
{
|
||||||
|
int32 neededXTabs;
|
||||||
|
int32 neededYTabs;
|
||||||
|
if (archive->FindInt32("nXTabs", &neededXTabs) != B_OK)
|
||||||
|
return false;
|
||||||
|
if (archive->FindInt32("nYTabs", &neededYTabs) != B_OK)
|
||||||
|
return false;
|
||||||
|
// First store a reference to all needed tabs otherwise they might get lost
|
||||||
|
// while editing the layout
|
||||||
|
std::vector<BReference<XTab> > newXTabs;
|
||||||
|
std::vector<BReference<YTab> > newYTabs;
|
||||||
|
int32 existingXTabs = fXTabList.CountItems();
|
||||||
|
for (int32 i = 0; i < neededXTabs; i++) {
|
||||||
|
if (i < existingXTabs)
|
||||||
|
newXTabs.push_back(BReference<XTab>(fXTabList.ItemAt(i)));
|
||||||
|
else
|
||||||
|
newXTabs.push_back(AddXTab());
|
||||||
|
}
|
||||||
|
int32 existingYTabs = fYTabList.CountItems();
|
||||||
|
for (int32 i = 0; i < neededYTabs; i++) {
|
||||||
|
if (i < existingYTabs)
|
||||||
|
newYTabs.push_back(BReference<YTab>(fYTabList.ItemAt(i)));
|
||||||
|
else
|
||||||
|
newYTabs.push_back(AddYTab());
|
||||||
|
}
|
||||||
|
|
||||||
|
XTabList xTabs = fXTabList;
|
||||||
|
xTabs.RemoveItem(fLeft);
|
||||||
|
xTabs.RemoveItem(fRight);
|
||||||
|
YTabList yTabs = fYTabList;
|
||||||
|
yTabs.RemoveItem(fTop);
|
||||||
|
yTabs.RemoveItem(fBottom);
|
||||||
|
|
||||||
|
int32 nAreas = CountAreas();
|
||||||
|
for (int32 i = 0; i < nAreas; i++) {
|
||||||
|
Area* area = AreaAt(i);
|
||||||
|
if (area == NULL)
|
||||||
|
return false;
|
||||||
|
int32 left = -1;
|
||||||
|
if (archive->FindInt32("left", i, &left) != B_OK)
|
||||||
|
break;
|
||||||
|
int32 top = archive->FindInt32("top", i);
|
||||||
|
int32 right = archive->FindInt32("right", i);
|
||||||
|
int32 bottom = archive->FindInt32("bottom", i);
|
||||||
|
|
||||||
|
XTab* leftTab = NULL;
|
||||||
|
YTab* topTab = NULL;
|
||||||
|
XTab* rightTab = NULL;
|
||||||
|
YTab* bottomTab = NULL;
|
||||||
|
|
||||||
|
if (left == kLeftBorderIndex)
|
||||||
|
leftTab = fLeft;
|
||||||
|
else
|
||||||
|
leftTab = xTabs.ItemAt(left);
|
||||||
|
if (top == kTopBorderIndex)
|
||||||
|
topTab = fTop;
|
||||||
|
else
|
||||||
|
topTab = yTabs.ItemAt(top);
|
||||||
|
if (right == kRightBorderIndex)
|
||||||
|
rightTab = fRight;
|
||||||
|
else
|
||||||
|
rightTab = xTabs.ItemAt(right);
|
||||||
|
if (bottom == kBottomBorderIndex)
|
||||||
|
bottomTab = fBottom;
|
||||||
|
else
|
||||||
|
bottomTab = yTabs.ItemAt(bottom);
|
||||||
|
if (leftTab == NULL || topTab == NULL || rightTab == NULL
|
||||||
|
|| bottomTab == NULL)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
area->SetLeft(leftTab);
|
||||||
|
area->SetTop(topTab);
|
||||||
|
area->SetRight(rightTab);
|
||||||
|
area->SetBottom(bottomTab);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the left variable.
|
* Gets the left variable.
|
||||||
*/
|
*/
|
||||||
|
|||||||
Reference in New Issue
Block a user