size_range_layout.cc 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. // Copyright 2016 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include <limits>
  5. #include "ash/system/tray/size_range_layout.h"
  6. #include "base/check.h"
  7. #include "ui/views/layout/fill_layout.h"
  8. namespace ash {
  9. // static
  10. const int SizeRangeLayout::kAbsoluteMinSize = 0;
  11. const int SizeRangeLayout::kAbsoluteMaxSize = std::numeric_limits<int>::max();
  12. // Non static
  13. SizeRangeLayout::SizeRangeLayout()
  14. : SizeRangeLayout(gfx::Size(kAbsoluteMinSize, kAbsoluteMinSize),
  15. gfx::Size(kAbsoluteMaxSize, kAbsoluteMaxSize)) {}
  16. SizeRangeLayout::SizeRangeLayout(const gfx::Size& size)
  17. : SizeRangeLayout(size, size) {}
  18. SizeRangeLayout::SizeRangeLayout(const gfx::Size& min_size,
  19. const gfx::Size& max_size)
  20. : layout_manager_(new views::FillLayout()),
  21. min_size_(gfx::Size(kAbsoluteMinSize, kAbsoluteMinSize)),
  22. max_size_(gfx::Size(kAbsoluteMaxSize, kAbsoluteMaxSize)) {
  23. SetMinSize(min_size);
  24. SetMaxSize(max_size);
  25. }
  26. SizeRangeLayout::~SizeRangeLayout() = default;
  27. void SizeRangeLayout::SetSize(const gfx::Size& size) {
  28. SetMinSize(size);
  29. SetMaxSize(size);
  30. }
  31. void SizeRangeLayout::SetMinSize(const gfx::Size& size) {
  32. min_size_ = size;
  33. min_size_.SetToMax(gfx::Size());
  34. max_size_.SetToMax(min_size_);
  35. }
  36. void SizeRangeLayout::SetMaxSize(const gfx::Size& size) {
  37. max_size_ = size;
  38. max_size_.SetToMax(gfx::Size());
  39. min_size_.SetToMin(max_size_);
  40. }
  41. void SizeRangeLayout::SetLayoutManager(
  42. std::unique_ptr<LayoutManager> layout_manager) {
  43. DCHECK(layout_manager_);
  44. layout_manager_ = std::move(layout_manager);
  45. layout_manager_->Installed(host_);
  46. }
  47. void SizeRangeLayout::Installed(views::View* host) {
  48. DCHECK(!host_);
  49. host_ = host;
  50. layout_manager_->Installed(host);
  51. }
  52. void SizeRangeLayout::Layout(views::View* host) {
  53. layout_manager_->Layout(host);
  54. }
  55. gfx::Size SizeRangeLayout::GetPreferredSize(const views::View* host) const {
  56. gfx::Size preferred_size = layout_manager_->GetPreferredSize(host);
  57. ClampSizeToRange(&preferred_size);
  58. return preferred_size;
  59. }
  60. int SizeRangeLayout::GetPreferredHeightForWidth(const views::View* host,
  61. int width) const {
  62. const int height = layout_manager_->GetPreferredHeightForWidth(host, width);
  63. gfx::Size size(0, height);
  64. ClampSizeToRange(&size);
  65. return size.height();
  66. }
  67. void SizeRangeLayout::ViewAdded(views::View* host, views::View* view) {
  68. layout_manager_->ViewAdded(host, view);
  69. }
  70. void SizeRangeLayout::ViewRemoved(views::View* host, views::View* view) {
  71. layout_manager_->ViewRemoved(host, view);
  72. }
  73. void SizeRangeLayout::ClampSizeToRange(gfx::Size* size) const {
  74. size->SetToMax(min_size_);
  75. size->SetToMin(max_size_);
  76. }
  77. } // namespace ash