OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "ui/views/layout/grid_layout.h" | 5 #include "ui/views/layout/grid_layout.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "base/logging.h" | 9 #include "base/logging.h" |
10 #include "base/macros.h" | 10 #include "base/macros.h" |
11 #include "base/stl_util.h" | 11 #include "base/memory/ptr_util.h" |
12 #include "ui/views/layout/layout_constants.h" | 12 #include "ui/views/layout/layout_constants.h" |
13 #include "ui/views/view.h" | 13 #include "ui/views/view.h" |
14 #include "ui/views/window/dialog_delegate.h" | 14 #include "ui/views/window/dialog_delegate.h" |
15 | 15 |
16 namespace views { | 16 namespace views { |
17 | 17 |
18 // LayoutElement ------------------------------------------------------ | 18 // LayoutElement ------------------------------------------------------ |
19 | 19 |
20 // A LayoutElement has a size and location along one axis. It contains | 20 // A LayoutElement has a size and location along one axis. It contains |
21 // methods that are used along both axis. | 21 // methods that are used along both axis. |
22 class LayoutElement { | 22 class LayoutElement { |
23 public: | 23 public: |
24 // Invokes ResetSize on all the layout elements. | 24 // Invokes ResetSize on all the layout elements. |
25 template <class T> | 25 template <class T> |
26 static void ResetSizes(std::vector<T*>* elements) { | 26 static void ResetSizes(std::vector<std::unique_ptr<T>>* elements) { |
27 // Reset the layout width of each column. | 27 // Reset the layout width of each column. |
28 for (typename std::vector<T*>::iterator i = elements->begin(); | 28 for (const auto& element : *elements) |
29 i != elements->end(); ++i) { | 29 element->ResetSize(); |
30 (*i)->ResetSize(); | |
31 } | |
32 } | 30 } |
33 | 31 |
34 // Sets the location of each element to be the sum of the sizes of the | 32 // Sets the location of each element to be the sum of the sizes of the |
35 // preceding elements. | 33 // preceding elements. |
36 template <class T> | 34 template <class T> |
37 static void CalculateLocationsFromSize(std::vector<T*>* elements) { | 35 static void CalculateLocationsFromSize( |
| 36 std::vector<std::unique_ptr<T>>* elements) { |
38 // Reset the layout width of each column. | 37 // Reset the layout width of each column. |
39 int location = 0; | 38 int location = 0; |
40 for (typename std::vector<T*>::iterator i = elements->begin(); | 39 for (const auto& element : *elements) { |
41 i != elements->end(); ++i) { | 40 element->SetLocation(location); |
42 (*i)->SetLocation(location); | 41 location += element->Size(); |
43 location += (*i)->Size(); | |
44 } | 42 } |
45 } | 43 } |
46 | 44 |
47 // Distributes delta among the resizable elements. | 45 // Distributes delta among the resizable elements. |
48 // Each resizable element is given ResizePercent / total_percent * delta | 46 // Each resizable element is given ResizePercent / total_percent * delta |
49 // pixels extra of space. | 47 // pixels extra of space. |
50 template <class T> | 48 template <class T> |
51 static void DistributeDelta(int delta, std::vector<T*>* elements) { | 49 static void DistributeDelta(int delta, |
| 50 std::vector<std::unique_ptr<T>>* elements) { |
52 if (delta == 0) | 51 if (delta == 0) |
53 return; | 52 return; |
54 | 53 |
55 float total_percent = 0; | 54 float total_percent = 0; |
56 int resize_count = 0; | 55 int resize_count = 0; |
57 for (typename std::vector<T*>::iterator i = elements->begin(); | 56 for (const auto& element : *elements) { |
58 i != elements->end(); ++i) { | 57 total_percent += element->ResizePercent(); |
59 total_percent += (*i)->ResizePercent(); | 58 if (element->ResizePercent() > 0) |
60 if ((*i)->ResizePercent() > 0) | |
61 resize_count++; | 59 resize_count++; |
62 } | 60 } |
63 if (total_percent == 0) { | 61 if (total_percent == 0) { |
64 // None of the elements are resizable, return. | 62 // None of the elements are resizable, return. |
65 return; | 63 return; |
66 } | 64 } |
67 int remaining = delta; | 65 int remaining = delta; |
68 int resized = resize_count; | 66 int resized = resize_count; |
69 for (typename std::vector<T*>::iterator i = elements->begin(); | 67 for (const auto& element : *elements) { |
70 i != elements->end(); ++i) { | |
71 T* element = *i; | |
72 if (element->ResizePercent() > 0) { | 68 if (element->ResizePercent() > 0) { |
73 int to_give; | 69 int to_give; |
74 if (--resized == 0) { | 70 if (--resized == 0) { |
75 to_give = remaining; | 71 to_give = remaining; |
76 } else { | 72 } else { |
77 to_give = static_cast<int>(delta * | 73 to_give = static_cast<int>(delta * |
78 (element->resize_percent_ / total_percent)); | 74 (element->resize_percent_ / total_percent)); |
79 remaining -= to_give; | 75 remaining -= to_give; |
80 } | 76 } |
81 element->SetSize(element->Size() + to_give); | 77 element->SetSize(element->Size() + to_give); |
82 } | 78 } |
83 } | 79 } |
84 } | 80 } |
85 | 81 |
86 // Returns the sum of the size of the elements from start to start + length. | 82 // Returns the sum of the size of the elements from start to start + length. |
87 template <class T> | 83 template <class T> |
88 static int TotalSize(int start, int length, std::vector<T*>* elements) { | 84 static int TotalSize(int start, |
| 85 int length, |
| 86 std::vector<std::unique_ptr<T>>* elements) { |
89 DCHECK(start >= 0 && length > 0 && | 87 DCHECK(start >= 0 && length > 0 && |
90 start + length <= static_cast<int>(elements->size())); | 88 start + length <= static_cast<int>(elements->size())); |
91 int size = 0; | 89 int size = 0; |
92 for (int i = start, max = start + length; i < max; ++i) { | 90 for (int i = start, max = start + length; i < max; ++i) { |
93 size += (*elements)[i]->Size(); | 91 size += (*elements)[i]->Size(); |
94 } | 92 } |
95 return size; | 93 return size; |
96 } | 94 } |
97 | 95 |
98 explicit LayoutElement(float resize_percent) | 96 explicit LayoutElement(float resize_percent) |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
156 // values for views originating in this column. | 154 // values for views originating in this column. |
157 class Column : public LayoutElement { | 155 class Column : public LayoutElement { |
158 public: | 156 public: |
159 Column(GridLayout::Alignment h_align, | 157 Column(GridLayout::Alignment h_align, |
160 GridLayout::Alignment v_align, | 158 GridLayout::Alignment v_align, |
161 float resize_percent, | 159 float resize_percent, |
162 GridLayout::SizeType size_type, | 160 GridLayout::SizeType size_type, |
163 int fixed_width, | 161 int fixed_width, |
164 int min_width, | 162 int min_width, |
165 bool is_padding) | 163 bool is_padding) |
166 : LayoutElement(resize_percent), | 164 : LayoutElement(resize_percent), |
167 h_align_(h_align), | 165 h_align_(h_align), |
168 v_align_(v_align), | 166 v_align_(v_align), |
169 size_type_(size_type), | 167 size_type_(size_type), |
170 same_size_column_(-1), | 168 same_size_column_(-1), |
171 fixed_width_(fixed_width), | 169 fixed_width_(fixed_width), |
172 min_width_(min_width), | 170 min_width_(min_width), |
173 is_padding_(is_padding), | 171 is_padding_(is_padding), |
174 master_column_(NULL) {} | 172 master_column_(nullptr) {} |
175 | 173 |
176 ~Column() override {} | 174 ~Column() override {} |
177 | 175 |
178 GridLayout::Alignment h_align() { return h_align_; } | 176 GridLayout::Alignment h_align() { return h_align_; } |
179 GridLayout::Alignment v_align() { return v_align_; } | 177 GridLayout::Alignment v_align() { return v_align_; } |
180 | 178 |
181 void ResetSize() override; | 179 void ResetSize() override; |
182 | 180 |
183 private: | 181 private: |
184 friend class ColumnSet; | 182 friend class ColumnSet; |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
217 | 215 |
218 void Column::ResetSize() { | 216 void Column::ResetSize() { |
219 if (size_type_ == GridLayout::FIXED) { | 217 if (size_type_ == GridLayout::FIXED) { |
220 SetSize(fixed_width_); | 218 SetSize(fixed_width_); |
221 } else { | 219 } else { |
222 SetSize(min_width_); | 220 SetSize(min_width_); |
223 } | 221 } |
224 } | 222 } |
225 | 223 |
226 Column* Column::GetLastMasterColumn() { | 224 Column* Column::GetLastMasterColumn() { |
227 if (master_column_ == NULL) { | 225 if (master_column_ == nullptr) { |
228 return NULL; | 226 return nullptr; |
229 } | 227 } |
230 if (master_column_ == this) { | 228 if (master_column_ == this) { |
231 return this; | 229 return this; |
232 } | 230 } |
233 return master_column_->GetLastMasterColumn(); | 231 return master_column_->GetLastMasterColumn(); |
234 } | 232 } |
235 | 233 |
236 void Column::UnifySameSizedColumnSizes() { | 234 void Column::UnifySameSizedColumnSizes() { |
237 DCHECK(master_column_ == this); | 235 DCHECK(master_column_ == this); |
238 | 236 |
239 // Accumulate the size first. | 237 // Accumulate the size first. |
240 int size = 0; | 238 int size = 0; |
241 for (std::vector<Column*>::iterator i = same_size_columns_.begin(); | 239 for (auto column : same_size_columns_) |
242 i != same_size_columns_.end(); ++i) { | 240 size = std::max(size, column->Size()); |
243 size = std::max(size, (*i)->Size()); | |
244 } | |
245 | 241 |
246 // Then apply it. | 242 // Then apply it. |
247 for (std::vector<Column*>::iterator i = same_size_columns_.begin(); | 243 for (auto column : same_size_columns_) |
248 i != same_size_columns_.end(); ++i) { | 244 column->SetSize(size); |
249 (*i)->SetSize(size); | |
250 } | |
251 } | 245 } |
252 | 246 |
253 void Column::AdjustSize(int size) { | 247 void Column::AdjustSize(int size) { |
254 if (size_type_ == GridLayout::USE_PREF) | 248 if (size_type_ == GridLayout::USE_PREF) |
255 LayoutElement::AdjustSize(size); | 249 LayoutElement::AdjustSize(size); |
256 } | 250 } |
257 | 251 |
258 // Row ------------------------------------------------------------- | 252 // Row ------------------------------------------------------------- |
259 | 253 |
260 class Row : public LayoutElement { | 254 class Row : public LayoutElement { |
(...skipping 10 matching lines...) Expand all Loading... |
271 | 265 |
272 void ResetSize() override { | 266 void ResetSize() override { |
273 max_ascent_ = max_descent_ = 0; | 267 max_ascent_ = max_descent_ = 0; |
274 SetSize(height_); | 268 SetSize(height_); |
275 } | 269 } |
276 | 270 |
277 ColumnSet* column_set() { | 271 ColumnSet* column_set() { |
278 return column_set_; | 272 return column_set_; |
279 } | 273 } |
280 | 274 |
281 // Adjusts the size to accomodate the specified ascent/descent. | 275 // Adjusts the size to accommodate the specified ascent/descent. |
282 void AdjustSizeForBaseline(int ascent, int descent) { | 276 void AdjustSizeForBaseline(int ascent, int descent) { |
283 max_ascent_ = std::max(ascent, max_ascent_); | 277 max_ascent_ = std::max(ascent, max_ascent_); |
284 max_descent_ = std::max(descent, max_descent_); | 278 max_descent_ = std::max(descent, max_descent_); |
285 AdjustSize(max_ascent_ + max_descent_); | 279 AdjustSize(max_ascent_ + max_descent_); |
286 } | 280 } |
287 | 281 |
288 int max_ascent() const { | 282 int max_ascent() const { |
289 return max_ascent_; | 283 return max_ascent_; |
290 } | 284 } |
291 | 285 |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
357 | 351 |
358 // The baseline. Only used if the view is vertically aligned along the | 352 // The baseline. Only used if the view is vertically aligned along the |
359 // baseline. | 353 // baseline. |
360 int baseline; | 354 int baseline; |
361 }; | 355 }; |
362 | 356 |
363 static bool CompareByColumnSpan(const ViewState* v1, const ViewState* v2) { | 357 static bool CompareByColumnSpan(const ViewState* v1, const ViewState* v2) { |
364 return v1->col_span < v2->col_span; | 358 return v1->col_span < v2->col_span; |
365 } | 359 } |
366 | 360 |
367 static bool CompareByRowSpan(const ViewState* v1, const ViewState* v2) { | 361 static bool CompareByRowSpan(const std::unique_ptr<ViewState>& v1, |
| 362 const ViewState* v2) { |
368 return v1->row_span < v2->row_span; | 363 return v1->row_span < v2->row_span; |
369 } | 364 } |
370 | 365 |
371 // ColumnSet ------------------------------------------------------------- | 366 // ColumnSet ------------------------------------------------------------- |
372 | 367 |
373 ColumnSet::ColumnSet(int id) : id_(id) { | 368 ColumnSet::ColumnSet(int id) : id_(id) { |
374 } | 369 } |
375 | 370 |
376 ColumnSet::~ColumnSet() { | 371 ColumnSet::~ColumnSet() { |
377 base::STLDeleteElements(&columns_); | |
378 } | 372 } |
379 | 373 |
380 void ColumnSet::AddPaddingColumn(float resize_percent, int width) { | 374 void ColumnSet::AddPaddingColumn(float resize_percent, int width) { |
381 AddColumn(GridLayout::FILL, GridLayout::FILL, resize_percent, | 375 AddColumn(GridLayout::FILL, GridLayout::FILL, resize_percent, |
382 GridLayout::FIXED, width, width, true); | 376 GridLayout::FIXED, width, width, true); |
383 } | 377 } |
384 | 378 |
385 void ColumnSet::AddColumn(GridLayout::Alignment h_align, | 379 void ColumnSet::AddColumn(GridLayout::Alignment h_align, |
386 GridLayout::Alignment v_align, | 380 GridLayout::Alignment v_align, |
387 float resize_percent, | 381 float resize_percent, |
(...skipping 18 matching lines...) Expand all Loading... |
406 va_end(marker); | 400 va_end(marker); |
407 } | 401 } |
408 | 402 |
409 void ColumnSet::AddColumn(GridLayout::Alignment h_align, | 403 void ColumnSet::AddColumn(GridLayout::Alignment h_align, |
410 GridLayout::Alignment v_align, | 404 GridLayout::Alignment v_align, |
411 float resize_percent, | 405 float resize_percent, |
412 GridLayout::SizeType size_type, | 406 GridLayout::SizeType size_type, |
413 int fixed_width, | 407 int fixed_width, |
414 int min_width, | 408 int min_width, |
415 bool is_padding) { | 409 bool is_padding) { |
416 Column* column = new Column(h_align, v_align, resize_percent, size_type, | 410 columns_.push_back(base::MakeUnique<Column>(h_align, v_align, resize_percent, |
417 fixed_width, min_width, is_padding); | 411 size_type, fixed_width, min_width, |
418 columns_.push_back(column); | 412 is_padding)); |
419 } | 413 } |
420 | 414 |
421 void ColumnSet::AddViewState(ViewState* view_state) { | 415 void ColumnSet::AddViewState(ViewState* view_state) { |
422 // view_states are ordered by column_span (in ascending order). | 416 // view_states are ordered by column_span (in ascending order). |
423 std::vector<ViewState*>::iterator i = std::lower_bound(view_states_.begin(), | 417 auto i = std::lower_bound(view_states_.begin(), view_states_.end(), |
424 view_states_.end(), | 418 view_state, CompareByColumnSpan); |
425 view_state, | |
426 CompareByColumnSpan); | |
427 view_states_.insert(i, view_state); | 419 view_states_.insert(i, view_state); |
428 } | 420 } |
429 | 421 |
430 void ColumnSet::CalculateMasterColumns() { | 422 void ColumnSet::CalculateMasterColumns() { |
431 for (std::vector<Column*>::iterator i = columns_.begin(); | 423 for (const auto& column : columns_) { |
432 i != columns_.end(); ++i) { | |
433 Column* column = *i; | |
434 int same_size_column_index = column->same_size_column_; | 424 int same_size_column_index = column->same_size_column_; |
435 if (same_size_column_index != -1) { | 425 if (same_size_column_index != -1) { |
436 DCHECK(same_size_column_index >= 0 && | 426 DCHECK(same_size_column_index >= 0 && |
437 same_size_column_index < static_cast<int>(columns_.size())); | 427 same_size_column_index < static_cast<int>(columns_.size())); |
438 Column* master_column = column->master_column_; | 428 Column* master_column = column->master_column_; |
439 Column* same_size_column = columns_[same_size_column_index]; | 429 Column* same_size_column = columns_[same_size_column_index].get(); |
440 Column* same_size_column_master = same_size_column->master_column_; | 430 Column* same_size_column_master = same_size_column->master_column_; |
441 if (master_column == NULL) { | 431 if (master_column == nullptr) { |
442 // Current column is not linked to any other column. | 432 // Current column is not linked to any other column. |
443 if (same_size_column_master == NULL) { | 433 if (same_size_column_master == nullptr) { |
444 // Both columns are not linked. | 434 // Both columns are not linked. |
445 column->master_column_ = column; | 435 column->master_column_ = column.get(); |
446 same_size_column->master_column_ = column; | 436 same_size_column->master_column_ = column.get(); |
447 column->same_size_columns_.push_back(same_size_column); | 437 column->same_size_columns_.push_back(same_size_column); |
448 column->same_size_columns_.push_back(column); | 438 column->same_size_columns_.push_back(column.get()); |
449 } else { | 439 } else { |
450 // Column to link to is linked with other columns. | 440 // Column to link to is linked with other columns. |
451 // Add current column to list of linked columns in other columns | 441 // Add current column to list of linked columns in other columns |
452 // master column. | 442 // master column. |
453 same_size_column->GetLastMasterColumn()-> | 443 same_size_column->GetLastMasterColumn()->same_size_columns_.push_back( |
454 same_size_columns_.push_back(column); | 444 column.get()); |
455 // And update the master column for the current column to that | 445 // And update the master column for the current column to that |
456 // of the same sized column. | 446 // of the same sized column. |
457 column->master_column_ = same_size_column; | 447 column->master_column_ = same_size_column; |
458 } | 448 } |
459 } else { | 449 } else { |
460 // Current column is already linked with another column. | 450 // Current column is already linked with another column. |
461 if (same_size_column_master == NULL) { | 451 if (same_size_column_master == nullptr) { |
462 // Column to link with is not linked to any other columns. | 452 // Column to link with is not linked to any other columns. |
463 // Update it's master_column. | 453 // Update it's master_column. |
464 same_size_column->master_column_ = column; | 454 same_size_column->master_column_ = column.get(); |
465 // Add linked column to list of linked column. | 455 // Add linked column to list of linked column. |
466 column->GetLastMasterColumn()->same_size_columns_. | 456 column->GetLastMasterColumn()->same_size_columns_. |
467 push_back(same_size_column); | 457 push_back(same_size_column); |
468 } else if (column->GetLastMasterColumn() != | 458 } else if (column->GetLastMasterColumn() != |
469 same_size_column->GetLastMasterColumn()) { | 459 same_size_column->GetLastMasterColumn()) { |
470 // The two columns are already linked with other columns. | 460 // The two columns are already linked with other columns. |
471 std::vector<Column*>* same_size_columns = | 461 std::vector<Column*>* same_size_columns = |
472 &(column->GetLastMasterColumn()->same_size_columns_); | 462 &(column->GetLastMasterColumn()->same_size_columns_); |
473 std::vector<Column*>* other_same_size_columns = | 463 std::vector<Column*>* other_same_size_columns = |
474 &(same_size_column->GetLastMasterColumn()->same_size_columns_); | 464 &(same_size_column->GetLastMasterColumn()->same_size_columns_); |
475 // Add all the columns from the others master to current columns | 465 // Add all the columns from the others master to current columns |
476 // master. | 466 // master. |
477 same_size_columns->insert(same_size_columns->end(), | 467 same_size_columns->insert(same_size_columns->end(), |
478 other_same_size_columns->begin(), | 468 other_same_size_columns->begin(), |
479 other_same_size_columns->end()); | 469 other_same_size_columns->end()); |
480 // The other master is no longer a master, clear its vector of | 470 // The other master is no longer a master, clear its vector of |
481 // linked columns, and reset its master_column. | 471 // linked columns, and reset its master_column. |
482 other_same_size_columns->clear(); | 472 other_same_size_columns->clear(); |
483 same_size_column->GetLastMasterColumn()->master_column_ = column; | 473 same_size_column->GetLastMasterColumn()->master_column_ = |
| 474 column.get(); |
484 } | 475 } |
485 } | 476 } |
486 } | 477 } |
487 } | 478 } |
488 AccumulateMasterColumns(); | 479 AccumulateMasterColumns(); |
489 } | 480 } |
490 | 481 |
491 void ColumnSet::AccumulateMasterColumns() { | 482 void ColumnSet::AccumulateMasterColumns() { |
492 DCHECK(master_columns_.empty()); | 483 DCHECK(master_columns_.empty()); |
493 for (std::vector<Column*>::iterator i = columns_.begin(); | 484 for (const auto& column : columns_) { |
494 i != columns_.end(); ++i) { | |
495 Column* column = *i; | |
496 Column* master_column = column->GetLastMasterColumn(); | 485 Column* master_column = column->GetLastMasterColumn(); |
497 if (master_column && | 486 if (master_column && |
498 std::find(master_columns_.begin(), master_columns_.end(), | 487 std::find(master_columns_.begin(), master_columns_.end(), |
499 master_column) == master_columns_.end()) { | 488 master_column) == master_columns_.end()) { |
500 master_columns_.push_back(master_column); | 489 master_columns_.push_back(master_column); |
501 } | 490 } |
502 // At this point, GetLastMasterColumn may not == master_column | 491 // At this point, GetLastMasterColumn may not == master_column |
503 // (may have to go through a few Columns)_. Reset master_column to | 492 // (may have to go through a few Columns)_. Reset master_column to |
504 // avoid hops. | 493 // avoid hops. |
505 column->master_column_ = master_column; | 494 column->master_column_ = master_column; |
506 } | 495 } |
507 } | 496 } |
508 | 497 |
509 void ColumnSet::UnifySameSizedColumnSizes() { | 498 void ColumnSet::UnifySameSizedColumnSizes() { |
510 for (std::vector<Column*>::iterator i = master_columns_.begin(); | 499 for (auto column : master_columns_) |
511 i != master_columns_.end(); ++i) { | 500 column->UnifySameSizedColumnSizes(); |
512 (*i)->UnifySameSizedColumnSizes(); | |
513 } | |
514 } | 501 } |
515 | 502 |
516 void ColumnSet::UpdateRemainingWidth(ViewState* view_state) { | 503 void ColumnSet::UpdateRemainingWidth(ViewState* view_state) { |
517 for (int i = view_state->start_col, | 504 for (int i = view_state->start_col, |
518 max_col = view_state->start_col + view_state->col_span; | 505 max_col = view_state->start_col + view_state->col_span; |
519 i < max_col; ++i) { | 506 i < max_col; ++i) { |
520 view_state->remaining_width -= columns_[i]->Size(); | 507 view_state->remaining_width -= columns_[i]->Size(); |
521 } | 508 } |
522 } | 509 } |
523 | 510 |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
572 if (width < to_distribute) | 559 if (width < to_distribute) |
573 to_distribute += width; | 560 to_distribute += width; |
574 columns_[i]->SetSize(columns_[i]->Size() + to_distribute); | 561 columns_[i]->SetSize(columns_[i]->Size() + to_distribute); |
575 } | 562 } |
576 } | 563 } |
577 } | 564 } |
578 } | 565 } |
579 | 566 |
580 int ColumnSet::LayoutWidth() { | 567 int ColumnSet::LayoutWidth() { |
581 int width = 0; | 568 int width = 0; |
582 for (std::vector<Column*>::iterator i = columns_.begin(); | 569 for (const auto& column : columns_) |
583 i != columns_.end(); ++i) { | 570 width += column->Size(); |
584 width += (*i)->Size(); | 571 |
585 } | |
586 return width; | 572 return width; |
587 } | 573 } |
588 | 574 |
589 int ColumnSet::GetColumnWidth(int start_col, int col_span) { | 575 int ColumnSet::GetColumnWidth(int start_col, int col_span) { |
590 return LayoutElement::TotalSize(start_col, col_span, &columns_); | 576 return LayoutElement::TotalSize(start_col, col_span, &columns_); |
591 } | 577 } |
592 | 578 |
593 void ColumnSet::ResetColumnXCoordinates() { | 579 void ColumnSet::ResetColumnXCoordinates() { |
594 LayoutElement::CalculateLocationsFromSize(&columns_); | 580 LayoutElement::CalculateLocationsFromSize(&columns_); |
595 } | 581 } |
596 | 582 |
597 void ColumnSet::CalculateSize() { | 583 void ColumnSet::CalculateSize() { |
598 gfx::Size pref; | 584 gfx::Size pref; |
599 // Reset the preferred and remaining sizes. | 585 // Reset the preferred and remaining sizes. |
600 for (std::vector<ViewState*>::iterator i = view_states_.begin(); | 586 for (const auto& view_state : view_states_) { |
601 i != view_states_.end(); ++i) { | |
602 ViewState* view_state = *i; | |
603 if (!view_state->pref_width_fixed || !view_state->pref_height_fixed) { | 587 if (!view_state->pref_width_fixed || !view_state->pref_height_fixed) { |
604 pref = view_state->view->GetPreferredSize(); | 588 pref = view_state->view->GetPreferredSize(); |
605 if (!view_state->pref_width_fixed) | 589 if (!view_state->pref_width_fixed) |
606 view_state->pref_width = pref.width(); | 590 view_state->pref_width = pref.width(); |
607 if (!view_state->pref_height_fixed) | 591 if (!view_state->pref_height_fixed) |
608 view_state->pref_height = pref.height(); | 592 view_state->pref_height = pref.height(); |
609 } | 593 } |
610 view_state->remaining_width = pref.width(); | 594 view_state->remaining_width = pref.width(); |
611 view_state->remaining_height = pref.height(); | 595 view_state->remaining_height = pref.height(); |
612 } | 596 } |
613 | 597 |
614 // Let layout element reset the sizes for us. | 598 // Let layout element reset the sizes for us. |
615 LayoutElement::ResetSizes(&columns_); | 599 LayoutElement::ResetSizes(&columns_); |
616 | 600 |
617 // Distribute the size of each view with a col span == 1. | 601 // Distribute the size of each view with a col span == 1. |
618 std::vector<ViewState*>::iterator view_state_iterator = | 602 auto view_state_iterator = view_states_.begin(); |
619 view_states_.begin(); | |
620 for (; view_state_iterator != view_states_.end() && | 603 for (; view_state_iterator != view_states_.end() && |
621 (*view_state_iterator)->col_span == 1; ++view_state_iterator) { | 604 (*view_state_iterator)->col_span == 1; ++view_state_iterator) { |
622 ViewState* view_state = *view_state_iterator; | 605 ViewState* view_state = *view_state_iterator; |
623 Column* column = columns_[view_state->start_col]; | 606 Column* column = columns_[view_state->start_col].get(); |
624 column->AdjustSize(view_state->pref_width); | 607 column->AdjustSize(view_state->pref_width); |
625 view_state->remaining_width -= column->Size(); | 608 view_state->remaining_width -= column->Size(); |
626 } | 609 } |
627 | 610 |
628 // Make sure all linked columns have the same size. | 611 // Make sure all linked columns have the same size. |
629 UnifySameSizedColumnSizes(); | 612 UnifySameSizedColumnSizes(); |
630 | 613 |
631 // Distribute the size of each view with a column span > 1. | 614 // Distribute the size of each view with a column span > 1. |
632 for (; view_state_iterator != view_states_.end(); ++view_state_iterator) { | 615 for (; view_state_iterator != view_states_.end(); ++view_state_iterator) { |
633 ViewState* view_state = *view_state_iterator; | 616 ViewState* view_state = *view_state_iterator; |
(...skipping 15 matching lines...) Expand all Loading... |
649 } | 632 } |
650 | 633 |
651 // GridLayout ------------------------------------------------------------- | 634 // GridLayout ------------------------------------------------------------- |
652 | 635 |
653 GridLayout::GridLayout(View* host) | 636 GridLayout::GridLayout(View* host) |
654 : host_(host), | 637 : host_(host), |
655 calculated_master_columns_(false), | 638 calculated_master_columns_(false), |
656 remaining_row_span_(0), | 639 remaining_row_span_(0), |
657 current_row_(-1), | 640 current_row_(-1), |
658 next_column_(0), | 641 next_column_(0), |
659 current_row_col_set_(NULL), | 642 current_row_col_set_(nullptr), |
660 adding_view_(false) { | 643 adding_view_(false) { |
661 DCHECK(host); | 644 DCHECK(host); |
662 } | 645 } |
663 | 646 |
664 GridLayout::~GridLayout() { | 647 GridLayout::~GridLayout() { |
665 base::STLDeleteElements(&column_sets_); | |
666 base::STLDeleteElements(&view_states_); | |
667 base::STLDeleteElements(&rows_); | |
668 } | 648 } |
669 | 649 |
670 // static | 650 // static |
671 GridLayout* GridLayout::CreatePanel(View* host) { | 651 GridLayout* GridLayout::CreatePanel(View* host) { |
672 GridLayout* layout = new GridLayout(host); | 652 GridLayout* layout = new GridLayout(host); |
673 layout->SetInsets(kPanelVertMargin, kButtonHEdgeMarginNew, | 653 layout->SetInsets(kPanelVertMargin, kButtonHEdgeMarginNew, |
674 kPanelVertMargin, kButtonHEdgeMarginNew); | 654 kPanelVertMargin, kButtonHEdgeMarginNew); |
675 return layout; | 655 return layout; |
676 } | 656 } |
677 | 657 |
678 void GridLayout::SetInsets(int top, int left, int bottom, int right) { | 658 void GridLayout::SetInsets(int top, int left, int bottom, int right) { |
679 insets_.Set(top, left, bottom, right); | 659 insets_.Set(top, left, bottom, right); |
680 } | 660 } |
681 | 661 |
682 void GridLayout::SetInsets(const gfx::Insets& insets) { | 662 void GridLayout::SetInsets(const gfx::Insets& insets) { |
683 insets_ = insets; | 663 insets_ = insets; |
684 } | 664 } |
685 | 665 |
686 ColumnSet* GridLayout::AddColumnSet(int id) { | 666 ColumnSet* GridLayout::AddColumnSet(int id) { |
687 DCHECK(GetColumnSet(id) == NULL); | 667 DCHECK(GetColumnSet(id) == nullptr); |
688 ColumnSet* column_set = new ColumnSet(id); | 668 column_sets_.push_back(base::WrapUnique(new ColumnSet(id))); |
689 column_sets_.push_back(column_set); | 669 return column_sets_.back().get(); |
690 return column_set; | |
691 } | 670 } |
692 | 671 |
693 ColumnSet* GridLayout::GetColumnSet(int id) { | 672 ColumnSet* GridLayout::GetColumnSet(int id) { |
694 for (std::vector<ColumnSet*>::iterator i = column_sets_.begin(); | 673 for (const auto& column_set : column_sets_) { |
695 i != column_sets_.end(); ++i) { | 674 if (column_set->id_ == id) { |
696 if ((*i)->id_ == id) { | 675 return column_set.get(); |
697 return *i; | |
698 } | 676 } |
699 } | 677 } |
700 return NULL; | 678 return nullptr; |
701 } | 679 } |
702 | 680 |
703 void GridLayout::StartRowWithPadding(float vertical_resize, int column_set_id, | 681 void GridLayout::StartRowWithPadding(float vertical_resize, int column_set_id, |
704 float padding_resize, int padding) { | 682 float padding_resize, int padding) { |
705 AddPaddingRow(padding_resize, padding); | 683 AddPaddingRow(padding_resize, padding); |
706 StartRow(vertical_resize, column_set_id); | 684 StartRow(vertical_resize, column_set_id); |
707 } | 685 } |
708 | 686 |
709 void GridLayout::StartRow(float vertical_resize, int column_set_id) { | 687 void GridLayout::StartRow(float vertical_resize, int column_set_id) { |
710 ColumnSet* column_set = GetColumnSet(column_set_id); | 688 ColumnSet* column_set = GetColumnSet(column_set_id); |
711 DCHECK(column_set); | 689 DCHECK(column_set); |
712 AddRow(new Row(0, vertical_resize, column_set)); | 690 AddRow(base::MakeUnique<Row>(0, vertical_resize, column_set)); |
713 } | 691 } |
714 | 692 |
715 void GridLayout::AddPaddingRow(float vertical_resize, int pixel_count) { | 693 void GridLayout::AddPaddingRow(float vertical_resize, int pixel_count) { |
716 AddRow(new Row(pixel_count, vertical_resize, NULL)); | 694 AddRow(base::MakeUnique<Row>(pixel_count, vertical_resize, nullptr)); |
717 } | 695 } |
718 | 696 |
719 void GridLayout::SkipColumns(int col_count) { | 697 void GridLayout::SkipColumns(int col_count) { |
720 DCHECK(col_count > 0); | 698 DCHECK(col_count > 0); |
721 next_column_ += col_count; | 699 next_column_ += col_count; |
722 DCHECK(current_row_col_set_ && | 700 DCHECK(current_row_col_set_ && |
723 next_column_ <= current_row_col_set_->num_columns()); | 701 next_column_ <= current_row_col_set_->num_columns()); |
724 SkipPaddingColumns(); | 702 SkipPaddingColumns(); |
725 } | 703 } |
726 | 704 |
727 void GridLayout::AddView(View* view) { | 705 void GridLayout::AddView(View* view) { |
728 AddView(view, 1, 1); | 706 AddView(view, 1, 1); |
729 } | 707 } |
730 | 708 |
731 void GridLayout::AddView(View* view, int col_span, int row_span) { | 709 void GridLayout::AddView(View* view, int col_span, int row_span) { |
732 DCHECK(current_row_col_set_ && | 710 DCHECK(current_row_col_set_ && |
733 next_column_ < current_row_col_set_->num_columns()); | 711 next_column_ < current_row_col_set_->num_columns()); |
734 Column* column = current_row_col_set_->columns_[next_column_]; | 712 Column* column = current_row_col_set_->columns_[next_column_].get(); |
735 AddView(view, col_span, row_span, column->h_align(), column->v_align()); | 713 AddView(view, col_span, row_span, column->h_align(), column->v_align()); |
736 } | 714 } |
737 | 715 |
738 void GridLayout::AddView(View* view, int col_span, int row_span, | 716 void GridLayout::AddView(View* view, int col_span, int row_span, |
739 Alignment h_align, Alignment v_align) { | 717 Alignment h_align, Alignment v_align) { |
740 AddView(view, col_span, row_span, h_align, v_align, 0, 0); | 718 AddView(view, col_span, row_span, h_align, v_align, 0, 0); |
741 } | 719 } |
742 | 720 |
743 void GridLayout::AddView(View* view, int col_span, int row_span, | 721 void GridLayout::AddView(View* view, int col_span, int row_span, |
744 Alignment h_align, Alignment v_align, | 722 Alignment h_align, Alignment v_align, |
745 int pref_width, int pref_height) { | 723 int pref_width, int pref_height) { |
746 DCHECK(current_row_col_set_ && col_span > 0 && row_span > 0 && | 724 DCHECK(current_row_col_set_ && col_span > 0 && row_span > 0 && |
747 (next_column_ + col_span) <= current_row_col_set_->num_columns()); | 725 (next_column_ + col_span) <= current_row_col_set_->num_columns()); |
748 // We don't support baseline alignment of views spanning rows. Please add if | 726 // We don't support baseline alignment of views spanning rows. Please add if |
749 // you need it. | 727 // you need it. |
750 DCHECK(v_align != BASELINE || row_span == 1); | 728 DCHECK(v_align != BASELINE || row_span == 1); |
751 ViewState* state = | 729 AddViewState(base::MakeUnique<ViewState>( |
752 new ViewState(current_row_col_set_, view, next_column_, current_row_, | 730 current_row_col_set_, view, next_column_, current_row_, col_span, |
753 col_span, row_span, h_align, v_align, pref_width, | 731 row_span, h_align, v_align, pref_width, pref_height)); |
754 pref_height); | |
755 AddViewState(state); | |
756 } | 732 } |
757 | 733 |
758 static void CalculateSize(int pref_size, GridLayout::Alignment alignment, | 734 static void CalculateSize(int pref_size, GridLayout::Alignment alignment, |
759 int* location, int* size) { | 735 int* location, int* size) { |
760 if (alignment != GridLayout::FILL) { | 736 if (alignment != GridLayout::FILL) { |
761 int available_size = *size; | 737 int available_size = *size; |
762 *size = std::min(*size, pref_size); | 738 *size = std::min(*size, pref_size); |
763 switch (alignment) { | 739 switch (alignment) { |
764 case GridLayout::LEADING: | 740 case GridLayout::LEADING: |
765 // Nothing to do, location already points to start. | 741 // Nothing to do, location already points to start. |
(...skipping 26 matching lines...) Expand all Loading... |
792 } | 768 } |
793 | 769 |
794 void GridLayout::Layout(View* host) { | 770 void GridLayout::Layout(View* host) { |
795 DCHECK(host_ == host); | 771 DCHECK(host_ == host); |
796 // SizeRowsAndColumns sets the size and location of each row/column, but | 772 // SizeRowsAndColumns sets the size and location of each row/column, but |
797 // not of the views. | 773 // not of the views. |
798 gfx::Size pref; | 774 gfx::Size pref; |
799 SizeRowsAndColumns(true, host_->width(), host_->height(), &pref); | 775 SizeRowsAndColumns(true, host_->width(), host_->height(), &pref); |
800 | 776 |
801 // Size each view. | 777 // Size each view. |
802 for (std::vector<ViewState*>::iterator i = view_states_.begin(); | 778 for (const auto& view_state : view_states_) { |
803 i != view_states_.end(); ++i) { | |
804 ViewState* view_state = *i; | |
805 ColumnSet* column_set = view_state->column_set; | 779 ColumnSet* column_set = view_state->column_set; |
806 View* view = (*i)->view; | 780 View* view = view_state->view; |
807 DCHECK(view); | 781 DCHECK(view); |
808 int x = column_set->columns_[view_state->start_col]->Location() + | 782 int x = column_set->columns_[view_state->start_col]->Location() + |
809 insets_.left(); | 783 insets_.left(); |
810 int width = column_set->GetColumnWidth(view_state->start_col, | 784 int width = column_set->GetColumnWidth(view_state->start_col, |
811 view_state->col_span); | 785 view_state->col_span); |
812 CalculateSize(view_state->pref_width, view_state->h_align, | 786 CalculateSize(view_state->pref_width, view_state->h_align, |
813 &x, &width); | 787 &x, &width); |
814 int y = rows_[view_state->start_row]->Location() + insets_.top(); | 788 int y = rows_[view_state->start_row]->Location() + insets_.top(); |
815 int height = LayoutElement::TotalSize(view_state->start_row, | 789 int height = LayoutElement::TotalSize(view_state->start_row, |
816 view_state->row_span, &rows_); | 790 view_state->row_span, &rows_); |
(...skipping 27 matching lines...) Expand all Loading... |
844 gfx::Size* pref) const { | 818 gfx::Size* pref) const { |
845 // Make sure the master columns have been calculated. | 819 // Make sure the master columns have been calculated. |
846 CalculateMasterColumnsIfNecessary(); | 820 CalculateMasterColumnsIfNecessary(); |
847 pref->SetSize(0, 0); | 821 pref->SetSize(0, 0); |
848 if (rows_.empty()) | 822 if (rows_.empty()) |
849 return; | 823 return; |
850 | 824 |
851 // Calculate the preferred width of each of the columns. Some views' | 825 // Calculate the preferred width of each of the columns. Some views' |
852 // preferred heights are derived from their width, as such we need to | 826 // preferred heights are derived from their width, as such we need to |
853 // calculate the size of the columns first. | 827 // calculate the size of the columns first. |
854 for (std::vector<ColumnSet*>::iterator i = column_sets_.begin(); | 828 for (const auto& column_set : column_sets_) { |
855 i != column_sets_.end(); ++i) { | 829 column_set->CalculateSize(); |
856 (*i)->CalculateSize(); | 830 pref->set_width(std::max(pref->width(), column_set->LayoutWidth())); |
857 pref->set_width(std::max(pref->width(), (*i)->LayoutWidth())); | |
858 } | 831 } |
859 pref->set_width(pref->width() + insets_.width()); | 832 pref->set_width(pref->width() + insets_.width()); |
860 | 833 |
861 // Go over the columns again and set them all to the size we settled for. | 834 // Go over the columns again and set them all to the size we settled for. |
862 width = width ? width : pref->width(); | 835 width = width ? width : pref->width(); |
863 for (std::vector<ColumnSet*>::iterator i = column_sets_.begin(); | 836 for (const auto& column_set : column_sets_) { |
864 i != column_sets_.end(); ++i) { | 837 // We're doing a layout, divvy up any extra space. |
865 // We're doing a layout, divy up any extra space. | 838 column_set->Resize(width - column_set->LayoutWidth() - insets_.left() - |
866 (*i)->Resize(width - (*i)->LayoutWidth() - insets_.left() - | 839 insets_.right()); |
867 insets_.right()); | |
868 // And reset the x coordinates. | 840 // And reset the x coordinates. |
869 (*i)->ResetColumnXCoordinates(); | 841 column_set->ResetColumnXCoordinates(); |
870 } | 842 } |
871 | 843 |
872 // Reset the height of each row. | 844 // Reset the height of each row. |
873 LayoutElement::ResetSizes(&rows_); | 845 LayoutElement::ResetSizes(&rows_); |
874 | 846 |
875 // Do the following: | 847 // Do the following: |
876 // . If the view is aligned along it's baseline, obtain the baseline from the | 848 // . If the view is aligned along it's baseline, obtain the baseline from the |
877 // view and update the rows ascent/descent. | 849 // view and update the rows ascent/descent. |
878 // . Reset the remaining_height of each view state. | 850 // . Reset the remaining_height of each view state. |
879 // . If the width the view will be given is different than it's pref, ask | 851 // . If the width the view will be given is different than it's pref, ask |
880 // for the height given a particularly width. | 852 // for the height given a particularly width. |
881 for (std::vector<ViewState*>::iterator i= view_states_.begin(); | 853 for (const auto& view_state : view_states_) { |
882 i != view_states_.end() ; ++i) { | |
883 ViewState* view_state = *i; | |
884 view_state->remaining_height = view_state->pref_height; | 854 view_state->remaining_height = view_state->pref_height; |
885 | 855 |
886 if (view_state->v_align == BASELINE) | 856 if (view_state->v_align == BASELINE) |
887 view_state->baseline = view_state->view->GetBaseline(); | 857 view_state->baseline = view_state->view->GetBaseline(); |
888 | 858 |
889 if (view_state->h_align == FILL) { | 859 if (view_state->h_align == FILL) { |
890 // The view is resizable. As the pref height may vary with the width, | 860 // The view is resizable. As the pref height may vary with the width, |
891 // ask for the pref again. | 861 // ask for the pref again. |
892 int actual_width = | 862 int actual_width = |
893 view_state->column_set->GetColumnWidth(view_state->start_col, | 863 view_state->column_set->GetColumnWidth(view_state->start_col, |
894 view_state->col_span); | 864 view_state->col_span); |
895 if (actual_width != view_state->pref_width && | 865 if (actual_width != view_state->pref_width && |
896 !view_state->pref_height_fixed) { | 866 !view_state->pref_height_fixed) { |
897 // The width this view will get differs from its preferred. Some Views | 867 // The width this view will get differs from its preferred. Some Views |
898 // pref height varies with its width; ask for the preferred again. | 868 // pref height varies with its width; ask for the preferred again. |
899 view_state->pref_height = | 869 view_state->pref_height = |
900 view_state->view->GetHeightForWidth(actual_width); | 870 view_state->view->GetHeightForWidth(actual_width); |
901 view_state->remaining_height = view_state->pref_height; | 871 view_state->remaining_height = view_state->pref_height; |
902 } | 872 } |
903 } | 873 } |
904 } | 874 } |
905 | 875 |
906 // Update the height/ascent/descent of each row from the views. | 876 // Update the height/ascent/descent of each row from the views. |
907 std::vector<ViewState*>::iterator view_states_iterator = view_states_.begin(); | 877 auto view_states_iterator = view_states_.begin(); |
908 for (; view_states_iterator != view_states_.end() && | 878 for (; view_states_iterator != view_states_.end() && |
909 (*view_states_iterator)->row_span == 1; ++view_states_iterator) { | 879 (*view_states_iterator)->row_span == 1; ++view_states_iterator) { |
910 ViewState* view_state = *view_states_iterator; | 880 ViewState* view_state = view_states_iterator->get(); |
911 Row* row = rows_[view_state->start_row]; | 881 Row* row = rows_[view_state->start_row].get(); |
912 row->AdjustSize(view_state->remaining_height); | 882 row->AdjustSize(view_state->remaining_height); |
913 if (view_state->baseline != -1 && | 883 if (view_state->baseline != -1 && |
914 view_state->baseline <= view_state->pref_height) { | 884 view_state->baseline <= view_state->pref_height) { |
915 row->AdjustSizeForBaseline(view_state->baseline, | 885 row->AdjustSizeForBaseline(view_state->baseline, |
916 view_state->pref_height - view_state->baseline); | 886 view_state->pref_height - view_state->baseline); |
917 } | 887 } |
918 view_state->remaining_height = 0; | 888 view_state->remaining_height = 0; |
919 } | 889 } |
920 | 890 |
921 // Distribute the height of each view with a row span > 1. | 891 // Distribute the height of each view with a row span > 1. |
922 for (; view_states_iterator != view_states_.end(); ++view_states_iterator) { | 892 for (; view_states_iterator != view_states_.end(); ++view_states_iterator) { |
923 ViewState* view_state = *view_states_iterator; | 893 ViewState* view_state = view_states_iterator->get(); |
924 | 894 |
925 // Update the remaining_width from columns this view_state touches. | 895 // Update the remaining_width from columns this view_state touches. |
926 UpdateRemainingHeightFromRows(view_state); | 896 UpdateRemainingHeightFromRows(view_state); |
927 | 897 |
928 // Distribute the remaining height. | 898 // Distribute the remaining height. |
929 DistributeRemainingHeight(view_state); | 899 DistributeRemainingHeight(view_state); |
930 } | 900 } |
931 | 901 |
932 // Update the location of each of the rows. | 902 // Update the location of each of the rows. |
933 LayoutElement::CalculateLocationsFromSize(&rows_); | 903 LayoutElement::CalculateLocationsFromSize(&rows_); |
934 | 904 |
935 // We now know the preferred height, set it here. | 905 // We now know the preferred height, set it here. |
936 pref->set_height(rows_.back()->Location() + rows_.back()->Size() + | 906 pref->set_height(rows_.back()->Location() + rows_.back()->Size() + |
937 insets_.height()); | 907 insets_.height()); |
938 | 908 |
939 if (layout && height != pref->height()) { | 909 if (layout && height != pref->height()) { |
940 // We're doing a layout, and the height differs from the preferred height, | 910 // We're doing a layout, and the height differs from the preferred height, |
941 // divy up the extra space. | 911 // divvy up the extra space. |
942 LayoutElement::DistributeDelta(height - pref->height(), &rows_); | 912 LayoutElement::DistributeDelta(height - pref->height(), &rows_); |
943 | 913 |
944 // Reset y locations. | 914 // Reset y locations. |
945 LayoutElement::CalculateLocationsFromSize(&rows_); | 915 LayoutElement::CalculateLocationsFromSize(&rows_); |
946 } | 916 } |
947 } | 917 } |
948 | 918 |
949 void GridLayout::CalculateMasterColumnsIfNecessary() const { | 919 void GridLayout::CalculateMasterColumnsIfNecessary() const { |
950 if (!calculated_master_columns_) { | 920 if (!calculated_master_columns_) { |
951 calculated_master_columns_ = true; | 921 calculated_master_columns_ = true; |
952 for (std::vector<ColumnSet*>::iterator i = column_sets_.begin(); | 922 for (const auto& column_set : column_sets_) { |
953 i != column_sets_.end(); ++i) { | 923 column_set->CalculateMasterColumns(); |
954 (*i)->CalculateMasterColumns(); | |
955 } | 924 } |
956 } | 925 } |
957 } | 926 } |
958 | 927 |
959 void GridLayout::AddViewState(ViewState* view_state) { | 928 void GridLayout::AddViewState(std::unique_ptr<ViewState> view_state) { |
960 DCHECK(view_state->view && (view_state->view->parent() == NULL || | 929 DCHECK(view_state->view && (view_state->view->parent() == nullptr || |
961 view_state->view->parent() == host_)); | 930 view_state->view->parent() == host_)); |
962 if (!view_state->view->parent()) { | 931 if (!view_state->view->parent()) { |
963 adding_view_ = true; | 932 adding_view_ = true; |
964 host_->AddChildView(view_state->view); | 933 host_->AddChildView(view_state->view); |
965 adding_view_ = false; | 934 adding_view_ = false; |
966 } | 935 } |
967 remaining_row_span_ = std::max(remaining_row_span_, view_state->row_span); | 936 remaining_row_span_ = std::max(remaining_row_span_, view_state->row_span); |
968 next_column_ += view_state->col_span; | 937 next_column_ += view_state->col_span; |
969 current_row_col_set_->AddViewState(view_state); | 938 current_row_col_set_->AddViewState(view_state.get()); |
970 // view_states are ordered by row_span (in ascending order). | 939 // view_states are ordered by row_span (in ascending order). |
971 std::vector<ViewState*>::iterator i = std::lower_bound(view_states_.begin(), | 940 auto i = std::lower_bound(view_states_.begin(), view_states_.end(), |
972 view_states_.end(), | 941 view_state.get(), CompareByRowSpan); |
973 view_state, | 942 view_states_.insert(i, std::move(view_state)); |
974 CompareByRowSpan); | |
975 view_states_.insert(i, view_state); | |
976 SkipPaddingColumns(); | 943 SkipPaddingColumns(); |
977 } | 944 } |
978 | 945 |
979 void GridLayout::AddRow(Row* row) { | 946 void GridLayout::AddRow(std::unique_ptr<Row> row) { |
980 current_row_++; | 947 current_row_++; |
981 remaining_row_span_--; | 948 remaining_row_span_--; |
982 // GridLayout requires that if you add a View with a row span you use the same | 949 // GridLayout requires that if you add a View with a row span you use the same |
983 // column set for each of the rows the view lands it. This DCHECK verifies | 950 // column set for each of the rows the view lands it. This DCHECK verifies |
984 // that. | 951 // that. |
985 DCHECK(remaining_row_span_ <= 0 || | 952 DCHECK(remaining_row_span_ <= 0 || row->column_set() == nullptr || |
986 row->column_set() == NULL || | |
987 row->column_set() == GetLastValidColumnSet()); | 953 row->column_set() == GetLastValidColumnSet()); |
988 next_column_ = 0; | 954 next_column_ = 0; |
989 rows_.push_back(row); | |
990 current_row_col_set_ = row->column_set(); | 955 current_row_col_set_ = row->column_set(); |
| 956 rows_.push_back(std::move(row)); |
991 SkipPaddingColumns(); | 957 SkipPaddingColumns(); |
992 } | 958 } |
993 | 959 |
994 void GridLayout::UpdateRemainingHeightFromRows(ViewState* view_state) const { | 960 void GridLayout::UpdateRemainingHeightFromRows(ViewState* view_state) const { |
995 for (int i = 0, start_row = view_state->start_row; | 961 for (int i = 0, start_row = view_state->start_row; |
996 i < view_state->row_span; ++i) { | 962 i < view_state->row_span; ++i) { |
997 view_state->remaining_height -= rows_[i + start_row]->Size(); | 963 view_state->remaining_height -= rows_[i + start_row]->Size(); |
998 } | 964 } |
999 } | 965 } |
1000 | 966 |
(...skipping 19 matching lines...) Expand all Loading... |
1020 if (rows_[i]->IsResizable()) { | 986 if (rows_[i]->IsResizable()) { |
1021 height -= to_distribute; | 987 height -= to_distribute; |
1022 if (height < to_distribute) { | 988 if (height < to_distribute) { |
1023 // Give all slop to the last column. | 989 // Give all slop to the last column. |
1024 to_distribute += height; | 990 to_distribute += height; |
1025 } | 991 } |
1026 rows_[i]->SetSize(rows_[i]->Size() + to_distribute); | 992 rows_[i]->SetSize(rows_[i]->Size() + to_distribute); |
1027 } | 993 } |
1028 } | 994 } |
1029 } else { | 995 } else { |
1030 // None of the rows are resizable, divy the remaining height up equally | 996 // None of the rows are resizable, divvy the remaining height up equally |
1031 // among all rows the view touches. | 997 // among all rows the view touches. |
1032 int each_row_height = height / view_state->row_span; | 998 int each_row_height = height / view_state->row_span; |
1033 for (int i = start_row; i < max_row; ++i) { | 999 for (int i = start_row; i < max_row; ++i) { |
1034 height -= each_row_height; | 1000 height -= each_row_height; |
1035 if (height < each_row_height) | 1001 if (height < each_row_height) |
1036 each_row_height += height; | 1002 each_row_height += height; |
1037 rows_[i]->SetSize(rows_[i]->Size() + each_row_height); | 1003 rows_[i]->SetSize(rows_[i]->Size() + each_row_height); |
1038 } | 1004 } |
1039 view_state->remaining_height = 0; | 1005 view_state->remaining_height = 0; |
1040 } | 1006 } |
1041 } | 1007 } |
1042 | 1008 |
1043 void GridLayout::SkipPaddingColumns() { | 1009 void GridLayout::SkipPaddingColumns() { |
1044 if (!current_row_col_set_) | 1010 if (!current_row_col_set_) |
1045 return; | 1011 return; |
1046 while (next_column_ < current_row_col_set_->num_columns() && | 1012 while (next_column_ < current_row_col_set_->num_columns() && |
1047 current_row_col_set_->columns_[next_column_]->is_padding_) { | 1013 current_row_col_set_->columns_[next_column_]->is_padding_) { |
1048 next_column_++; | 1014 next_column_++; |
1049 } | 1015 } |
1050 } | 1016 } |
1051 | 1017 |
1052 ColumnSet* GridLayout::GetLastValidColumnSet() { | 1018 ColumnSet* GridLayout::GetLastValidColumnSet() { |
1053 for (int i = current_row_ - 1; i >= 0; --i) { | 1019 for (int i = current_row_ - 1; i >= 0; --i) { |
1054 if (rows_[i]->column_set()) | 1020 if (rows_[i]->column_set()) |
1055 return rows_[i]->column_set(); | 1021 return rows_[i]->column_set(); |
1056 } | 1022 } |
1057 return NULL; | 1023 return nullptr; |
1058 } | 1024 } |
1059 | 1025 |
1060 } // namespace views | 1026 } // namespace views |
OLD | NEW |