mirror of
https://github.com/hrydgard/ppsspp.git
synced 2026-11-11 00:29:37 +01:00
Fix measuring bug in GridLayout
This commit is contained in:
1 parent
cd8987b33b
commit
d5d969fc6a
2 files changed
+26
-23
No files matched your search
+24
-22
@@ -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
@@ -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.
|
||||
|
||||
Reference in new issue
Block a user