// Copyright 2019 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef UI_VIEWS_LAYOUT_LAYOUT_MANAGER_BASE_H_ #define UI_VIEWS_LAYOUT_LAYOUT_MANAGER_BASE_H_ #include <map> #include <memory> #include <optional> #include <set> #include <utility> #include <vector> #include "base/dcheck_is_on.h" #include "base/memory/raw_ptr.h" #include "base/scoped_multi_source_observation.h" #include "base/types/pass_key.h" #include "ui/gfx/geometry/insets.h" #include "ui/gfx/geometry/rect.h" #include "ui/gfx/geometry/size.h" #include "ui/views/layout/layout_manager.h" #include "ui/views/layout/layout_types.h" #include "ui/views/layout/proposed_layout.h" #include "ui/views/view_observer.h" #include "ui/views/views_export.h" namespace views { class View; // Base class for layout managers that can do layout calculation separately // from layout application. Derived classes must implement // CalculateProposedLayout(). Used in interpolating and animating layouts. class VIEWS_EXPORT LayoutManagerBase : public LayoutManager, public ViewObserver { … }; // Provides methods for doing additional, manual manipulation of a // `LayoutManagerBase` and its managed Views inside its host View's // layout implementation, ideally before `LayoutManager::Layout()` is invoked. // // In most cases, the layout manager should do all of the layout. However, in // some cases, specific children of the host may be explicitly manipulated; for // example, to conditionally show a button which (if visible) should be included // in the layout. // // All of the direct manipulation functions on `LayoutManagerBase` and `View`, // such as `View::SetVisible()` and // `LayoutManagerBase::SetChildIncludedInLayout()`, cause cascades of layout // invalidation up the Views tree, so are not appropriate to be used inside of a // `Layout()` override. In the case that manual layout manipulation is required // alongside the use of a layout manager, a `ManualLayoutUtil` should be used // instead of callin those other methods directly. // // This class should only be instantiated and used inside the `Layout()` method // of a `View` or derived class, before `LayoutManager::Layout()` is invoked. class VIEWS_EXPORT ManualLayoutUtil { … }; } // namespace views #endif // UI_VIEWS_LAYOUT_LAYOUT_MANAGER_BASE_H_