Chromium Code Reviews| Index: ash/common/system/tray/tri_view.cc |
| diff --git a/ash/common/system/tray/tri_view.cc b/ash/common/system/tray/tri_view.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..07615392d0bbe74e7e7f55f9b8ae960f62546656 |
| --- /dev/null |
| +++ b/ash/common/system/tray/tri_view.cc |
| @@ -0,0 +1,165 @@ |
| +// Copyright 2016 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#include "ash/common/system/tray/tri_view.h" |
| + |
| +#include "ash/common/system/tray/size_range_layout.h" |
| +#include "base/logging.h" |
| +#include "ui/views/border.h" |
| +#include "ui/views/layout/box_layout.h" |
| +#include "ui/views/layout/fill_layout.h" |
| +#include "ui/views/layout/layout_manager.h" |
| + |
| +namespace ash { |
| +namespace { |
| + |
| +// Converts TriView::Orientation values to views::BoxLayout::Orientation values. |
| +views::BoxLayout::Orientation GetOrientation(TriView::Orientation orientation) { |
| + switch (orientation) { |
| + case TriView::Orientation::HORIZONTAL: |
| + return views::BoxLayout::kHorizontal; |
| + case TriView::Orientation::VERTICAL: |
| + return views::BoxLayout::kVertical; |
| + } |
| + // Required for some compilers. |
| + NOTREACHED(); |
| + return views::BoxLayout::kHorizontal; |
| +} |
| + |
| +} // namespace |
| + |
| +TriView::TriView() : TriView(0) {} |
| + |
| +TriView::TriView(int padding_between_containers) |
| + : TriView(Orientation::HORIZONTAL, padding_between_containers) {} |
| + |
| +TriView::TriView(Orientation orientation) : TriView(orientation, 0) {} |
| + |
| +TriView::TriView(Orientation orientation, int padding_between_containers) |
| + : box_layout_(new views::BoxLayout(GetOrientation(orientation), |
| + 0, |
| + 0, |
| + padding_between_containers)), |
| + start_container_layout_manager_(new SizeRangeLayout), |
| + center_container_layout_manager_(new SizeRangeLayout), |
| + end_container_layout_manager_(new SizeRangeLayout) { |
| + AddChildView(new views::View); |
| + AddChildView(new views::View); |
| + AddChildView(new views::View); |
| + |
| + GetContainer(Container::START) |
| + ->SetLayoutManager(GetLayoutManager(Container::START)); |
| + GetContainer(Container::CENTER) |
| + ->SetLayoutManager(GetLayoutManager(Container::CENTER)); |
| + GetContainer(Container::END) |
| + ->SetLayoutManager(GetLayoutManager(Container::END)); |
| + |
| + GetLayoutManager(Container::START) |
| + ->SetLayoutManager(CreateDefaultLayoutManager(orientation)); |
| + GetLayoutManager(Container::CENTER) |
| + ->SetLayoutManager(CreateDefaultLayoutManager(orientation)); |
| + GetLayoutManager(Container::END) |
| + ->SetLayoutManager(CreateDefaultLayoutManager(orientation)); |
| + |
| + SetLayoutManager(box_layout_); |
| + |
| + ignore_hierarchy_changed_ = false; |
| +} |
| + |
| +TriView::~TriView() { |
| + ignore_hierarchy_changed_ = true; |
| +} |
| + |
| +void TriView::SetMinCrossAxisSize(int min_size) { |
| + box_layout_->set_minimum_cross_axis_size(min_size); |
| +} |
| + |
| +void TriView::SetMinSize(Container container, const gfx::Size& size) { |
| + GetLayoutManager(container)->SetMinSize(size); |
| +} |
| + |
| +void TriView::SetMaxSize(Container container, const gfx::Size& size) { |
| + GetLayoutManager(container)->SetMaxSize(size); |
| +} |
| + |
| +void TriView::AddView(Container container, views::View* view) { |
| + GetContainer(container)->AddChildView(view); |
| +} |
| + |
| +void TriView::RemoveAllChildren(Container container, bool delete_children) { |
| + GetContainer(container)->RemoveAllChildViews(delete_children); |
| +} |
| + |
| +void TriView::SetInsets(const gfx::Insets& insets) { |
| + box_layout_->set_inside_border_insets(insets); |
| +} |
| + |
| +void TriView::SetContainerBorder(Container container, |
| + std::unique_ptr<views::Border> border) { |
| + GetContainer(container)->SetBorder(std::move(border)); |
| +} |
| + |
| +void TriView::SetContainerVisible(Container container, bool visible) { |
| + GetContainer(container)->SetVisible(visible); |
| +} |
| + |
| +void TriView::SetFlexForContainer(Container container, int flex) { |
| + box_layout_->SetFlexForView(GetContainer(container), flex); |
| +} |
| + |
| +void TriView::SetContainerLayout( |
| + Container container, |
| + std::unique_ptr<views::LayoutManager> layout_manager) { |
| + GetLayoutManager(container)->SetLayoutManager(std::move(layout_manager)); |
| + if (GetLayoutManager(container)) |
| + GetLayoutManager(container)->Installed(GetContainer(container)); |
| +} |
| + |
| +void TriView::ViewHierarchyChanged( |
| + const views::View::ViewHierarchyChangedDetails& details) { |
| + views::View::ViewHierarchyChanged(details); |
| + if (ignore_hierarchy_changed_) |
| + return; |
| + |
| + if (details.parent == this) { |
| + if (details.is_add) { |
| + DCHECK(false) |
| + << "Child views should not be added directly. They should be added " |
| + "using TriView::AddView()."; |
| + } else { |
| + DCHECK(false) << "Container views should not be removed."; |
| + } |
| + } |
| +} |
| + |
| +std::unique_ptr<views::LayoutManager> TriView::CreateDefaultLayoutManager( |
| + Orientation orientation) const { |
| + views::BoxLayout* box_layout = |
| + new views::BoxLayout(GetOrientation(orientation), 0, 0, 0); |
| + box_layout->set_main_axis_alignment( |
| + views::BoxLayout::MAIN_AXIS_ALIGNMENT_CENTER); |
| + box_layout->set_cross_axis_alignment( |
| + views::BoxLayout::CROSS_AXIS_ALIGNMENT_CENTER); |
| + return std::unique_ptr<views::LayoutManager>(box_layout); |
| +} |
| + |
| +views::View* TriView::GetContainer(Container container) const { |
| + return const_cast<View*>(child_at(static_cast<int>(container))); |
|
tdanderson
2016/10/26 19:29:12
views::View*
bruthig
2016/10/26 21:24:16
Done.
|
| +} |
| + |
| +SizeRangeLayout* TriView::GetLayoutManager(Container container) const { |
| + switch (container) { |
| + case Container::START: |
| + return start_container_layout_manager_; |
| + case Container::CENTER: |
| + return center_container_layout_manager_; |
| + case Container::END: |
| + return end_container_layout_manager_; |
| + } |
| + // Required for some compilers. |
| + NOTREACHED(); |
| + return nullptr; |
| +} |
| + |
| +} // namespace ash |