Fix measuring bug in GridLayout

This commit is contained in:
Henrik Rydgard committed 2013-07-18 16:56:47 +02:00
1 parent cd8987b33b
commit d5d969fc6a
2 files changed
+26 -23

No files matched your search

+24 -22
View File
@@ -591,25 +591,6 @@ void ScrollView::Update(const InputState &input_state) {
}
}
void GridLayout::Measure(const UIContext &dc, MeasureSpec horiz, MeasureSpec vert) {
MeasureSpecType measureType = settings_.fillCells ? EXACTLY : AT_MOST;
for (size_t i = 0; i < views_.size(); i++) {
views_[i]->Measure(dc, MeasureSpec(measureType, settings_.columnWidth), MeasureSpec(measureType, settings_.rowHeight));
}
MeasureBySpec(layoutParams_->width, 0.0f, horiz, &measuredWidth_);
// Okay, got the width we are supposed to adjust to. Now we can calculate the number of columns.
int numColumns = (measuredWidth_ - settings_.spacing) / (settings_.columnWidth + settings_.spacing);
if (!numColumns) numColumns = 1;
int numRows = (int)(views_.size() + (numColumns - 1)) / numColumns;
float estimatedHeight = (settings_.rowHeight + settings_.spacing) * numRows;
MeasureBySpec(layoutParams_->height, estimatedHeight, vert, &measuredHeight_);
}
void AnchorLayout::Measure(const UIContext &dc, MeasureSpec horiz, MeasureSpec vert) {
MeasureBySpec(layoutParams_->width, 0.0f, horiz, &measuredWidth_);
MeasureBySpec(layoutParams_->height, 0.0f, vert, &measuredHeight_);
@@ -674,9 +655,29 @@ void AnchorLayout::Layout() {
}
}
void GridLayout::Measure(const UIContext &dc, MeasureSpec horiz, MeasureSpec vert) {
MeasureSpecType measureType = settings_.fillCells ? EXACTLY : AT_MOST;
for (size_t i = 0; i < views_.size(); i++) {
views_[i]->Measure(dc, MeasureSpec(measureType, settings_.columnWidth), MeasureSpec(measureType, settings_.rowHeight));
}
MeasureBySpec(layoutParams_->width, 0.0f, horiz, &measuredWidth_);
// Okay, got the width we are supposed to adjust to. Now we can calculate the number of columns.
numColumns_ = (measuredWidth_ - settings_.spacing) / (settings_.columnWidth + settings_.spacing);
if (!numColumns_) numColumns_ = 1;
int numRows = (int)(views_.size() + (numColumns_ - 1)) / numColumns_;
float estimatedHeight = (settings_.rowHeight + settings_.spacing) * numRows;
MeasureBySpec(layoutParams_->height, estimatedHeight, vert, &measuredHeight_);
}
void GridLayout::Layout() {
int y = 0;
int x = 0;
int count = 0;
for (size_t i = 0; i < views_.size(); i++) {
Bounds itemBounds, innerBounds;
@@ -692,12 +693,13 @@ void GridLayout::Layout() {
views_[i]->SetBounds(innerBounds);
views_[i]->Layout();
x += itemBounds.w;
if (x + itemBounds.w >= bounds_.w) {
count++;
if (count == numColumns_) {
count = 0;
x = 0;
y += itemBounds.h + settings_.spacing;
} else {
x += settings_.spacing;
x += itemBounds.w + settings_.spacing;
}
}
}
+2 -1
View File
@@ -156,7 +156,7 @@ struct GridLayoutSettings {
class GridLayout : public ViewGroup {
public:
GridLayout(GridLayoutSettings settings, LayoutParams *layoutParams = 0)
: ViewGroup(layoutParams), settings_(settings) {
: ViewGroup(layoutParams), settings_(settings), numColumns_(1) {
if (settings.orientation != ORIENT_HORIZONTAL)
ELOG("GridLayout: Vertical layouts not yet supported");
}
@@ -166,6 +166,7 @@ public:
private:
GridLayoutSettings settings_;
int numColumns_;
};
// A scrollview usually contains just a single child - a linear layout or similar.