From d5d969fc6a2332e7ac930aa397bd109f9e771d2c Mon Sep 17 00:00:00 2001 From: Henrik Rydgard Date: Thu, 18 Jul 2013 16:56:47 +0200 Subject: [PATCH] Fix measuring bug in GridLayout --- ui/viewgroup.cpp | 46 ++++++++++++++++++++++++---------------------- ui/viewgroup.h | 3 ++- 2 files changed, 26 insertions(+), 23 deletions(-) diff --git a/ui/viewgroup.cpp b/ui/viewgroup.cpp index 31dea8ccd4..712bc4c8cc 100644 --- a/ui/viewgroup.cpp +++ b/ui/viewgroup.cpp @@ -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; } } } diff --git a/ui/viewgroup.h b/ui/viewgroup.h index a4902ee75f..8adf9584c4 100644 --- a/ui/viewgroup.h +++ b/ui/viewgroup.h @@ -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.