| Index: ash/common/system/tray/three_view_layout.h
|
| diff --git a/ash/common/system/tray/three_view_layout.h b/ash/common/system/tray/three_view_layout.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..7f840f4067861509d8fe03a07b8fd87363dd7bb4
|
| --- /dev/null
|
| +++ b/ash/common/system/tray/three_view_layout.h
|
| @@ -0,0 +1,158 @@
|
| +// 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.
|
| +
|
| +#ifndef ASH_COMMON_SYSTEM_TRAY_THREE_VIEW_LAYOUT_H_
|
| +#define ASH_COMMON_SYSTEM_TRAY_THREE_VIEW_LAYOUT_H_
|
| +
|
| +#include <memory>
|
| +
|
| +#include "ash/ash_export.h"
|
| +#include "base/macros.h"
|
| +#include "ui/gfx/geometry/insets.h"
|
| +#include "ui/gfx/geometry/size.h"
|
| +#include "ui/views/layout/layout_manager.h"
|
| +
|
| +namespace views {
|
| +class Border;
|
| +class BoxLayout;
|
| +class View;
|
| +} // namespace views
|
| +
|
| +namespace ash {
|
| +class SizeRangeLayout;
|
| +
|
| +// A layout manager that has 3 child containers (START, CENTER, END) which can
|
| +// be arranged vertically or horizontally. The child containers can have
|
| +// minimum and/or maximum preferred size defined as well as a flex weight that
|
| +// is used to distribute excess space across the main axis, i.e. flexible width
|
| +// for the horizontal orientation. By default all the containers have a flex
|
| +// weight of 0, meaning no flexibility, and no minimum or maximum size.
|
| +//
|
| +// Views are laid out within each container as per the LayoutManager that has
|
| +// been installed on that container. By default a BoxLayout manager is installed
|
| +// on each container with the same orientation as |this| has been created with.
|
| +// The default BoxLayout will use a center alignment for both the main axis and
|
| +// cross axis alignment.
|
| +class ASH_EXPORT ThreeViewLayout : public views::LayoutManager {
|
| + public:
|
| + enum class Orientation {
|
| + HORIZONTAL,
|
| + VERTICAL,
|
| + };
|
| +
|
| + // The different containers that child Views can be added to.
|
| + enum class Container { START, CENTER, END };
|
| +
|
| + // Constructs a layout with horizontal orientation and 0 padding between
|
| + // containers.
|
| + ThreeViewLayout();
|
| +
|
| + // Constructs a layout with Horizontal orientation and the specified padding
|
| + // between containers.
|
| + //
|
| + // TODO(bruthig): The |padding_between_containers| can only be set on
|
| + // BoxLayouts during construction. Investigate whether this can be a mutable
|
| + // property of BoxLayouts and if so consider dropping it as a constructor
|
| + // parameter here.
|
| + explicit ThreeViewLayout(int padding_between_containers);
|
| +
|
| + // Constructs a layout with the specified orientation and 0 padding between
|
| + // containers.
|
| + explicit ThreeViewLayout(Orientation orientation);
|
| +
|
| + // Constructs a layout with the specified orientation and padding between
|
| + // containers.
|
| + ThreeViewLayout(Orientation orientation, int padding_between_containers);
|
| +
|
| + ~ThreeViewLayout() override;
|
| +
|
| + // Set the minimum cross axis size for the layout, i.e. the minimum height for
|
| + // a horizontal orientation.
|
| + void SetMinCrossAxisSize(int min_size);
|
| +
|
| + // Set the minimum size for the given |container|.
|
| + void SetMinSize(Container container, const gfx::Size& size);
|
| +
|
| + // Set the maximum size for the given |container|.
|
| + void SetMaxSize(Container container, const gfx::Size& size);
|
| +
|
| + // Adds the child |view| to the specified |container|.
|
| + void AddView(Container container, views::View* view);
|
| +
|
| + // Removes all current children from the specified |container| and adds the
|
| + // child |view| to it.
|
| + void SetView(Container container, views::View* view);
|
| +
|
| + // During layout the |insets| are applied to the host views entire space
|
| + // before allocating the remaining space to the container views.
|
| + void SetInsets(const gfx::Insets& insets);
|
| +
|
| + // Sets the border for the given |container|.
|
| + void SetBorder(Container container, std::unique_ptr<views::Border> border);
|
| +
|
| + // Sets wither the |container| is visible. During a layout the space will be
|
| + // allocated to the visible containers only. i.e. non-visible containers will
|
| + // not be allocated any space.
|
| + void SetContainerVisible(Container container, bool visible);
|
| +
|
| + // Sets the flex weight for the given |container|. Using the preferred size as
|
| + // the basis, free space along the main axis is distributed to views in the
|
| + // ratio of their flex weights. Similarly, if the views will overflow the
|
| + // parent, space is subtracted in these ratios.
|
| + //
|
| + // A flex of 0 means this view is not resized. Flex values must not be
|
| + // negative.
|
| + //
|
| + // Note that non-zero flex values will take precedence over size constraints.
|
| + // i.e. even if |container| has a max size set the space allocated during
|
| + // layout may be larger if |flex| > 0 and similar for min size constraints.
|
| + void SetFlexForContainer(Container container, int flex);
|
| +
|
| + // Sets the |layout_manager| used by the given |container|.
|
| + void SetLayoutManager(Container container,
|
| + std::unique_ptr<LayoutManager> layout_manager);
|
| +
|
| + // LayoutManager:
|
| + void Installed(views::View* host) override;
|
| + void Layout(views::View* host) override;
|
| + gfx::Size GetPreferredSize(const views::View* host) const override;
|
| + int GetPreferredHeightForWidth(const views::View* host,
|
| + int width) const override;
|
| + void ViewAdded(views::View* host, views::View* view) override;
|
| + void ViewRemoved(views::View* host, views::View* view) override;
|
| +
|
| + private:
|
| + friend class ThreeViewLayoutTest;
|
| +
|
| + // Creates a default LayoutManager for the given |orientation|.
|
| + std::unique_ptr<views::LayoutManager> CreateDefaultLayoutManager(
|
| + Orientation orientation) const;
|
| +
|
| + // Returns the View for the given |container|.
|
| + views::View* GetContainer(Container container) const;
|
| +
|
| + // Returns the layout manager for the given |container|.
|
| + SizeRangeLayout* GetLayoutManager(Container container) const;
|
| +
|
| + // The layout manager that lays out the different Container Views.
|
| + std::unique_ptr<views::BoxLayout> box_layout_;
|
| +
|
| + // The host View that this layout manager has been installed on.
|
| + views::View* host_ = nullptr;
|
| +
|
| + views::View* start_container_ = nullptr;
|
| + SizeRangeLayout* start_container_layout_manager_ = nullptr;
|
| +
|
| + views::View* center_container_ = nullptr;
|
| + SizeRangeLayout* center_container_layout_manager_ = nullptr;
|
| +
|
| + views::View* end_container_ = nullptr;
|
| + SizeRangeLayout* end_container_layout_manager_ = nullptr;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(ThreeViewLayout);
|
| +};
|
| +
|
| +} // namespace ash
|
| +
|
| +#endif // ASH_COMMON_SYSTEM_TRAY_THREE_VIEW_LAYOUT_H_
|
|
|