/*
* Copyright (c) 2020-2021 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* @addtogroup UI_Components
* @{
*
* @brief Defines UI components such as buttons, texts, images, lists, and progress bars.
*
* @since 1.0
* @version 1.0
*/
/**
* @file ui_view_group.h
*
* @brief Declares a view group.
*
* @since 1.0
* @version 1.0
*/
#ifndef GRAPHIC_LITE_UI_VIEW_GROUP_H
#define GRAPHIC_LITE_UI_VIEW_GROUP_H
#include "components/ui_view.h"
namespace OHOS {
/**
* @brief Represents a view group that consists of its child views.
*
* The child views can be added to, inserted in, and removed from the view group.
* Child views that are added later are displayed at the upper layer of this view group.
* All child views are stored in a linked list.
*
* @since 1.0
* @version 1.0
*/
class UIViewGroup : public UIView {
public:
/**
* @brief A default constructor used to create a UIViewGroup instance.
*
* @since 1.0
* @version 1.0
*/
UIViewGroup();
/**
* @brief A destructor used to delete the UIViewGroup instance.
*
* @since 1.0
* @version 1.0
*/
virtual ~UIViewGroup();
/**
* @brief Obtains the view type.
*
* @return Returns UI_VIEW_GROUP, as defined in {@link UIViewType}.
* @since 1.0
* @version 1.0
*/
UIViewType GetViewType() const override
{
return UI_VIEW_GROUP;
}
/**
* @brief Adds a child view.
*
* @param view Indicates the pointer to the child view to add.
* @since 1.0
* @version 1.0
*/
virtual void Add(UIView* view);
/**
* @brief Inserts a new child view behind the current one.
*
* @param prevView Indicates the pointer to the current child view, previous to the new child view to insert.
* @param view Indicates the pointer to the new child view to insert.
* @since 1.0
* @version 1.0
*/
virtual void Insert(UIView* prevView, UIView* insertView);
/**
* @brief Removes a child view.
*
* @param view Indicates the pointer to the child view to remove.
* @since 1.0
* @version 1.0
*/
virtual void Remove(UIView* view);
/**
* @brief Removes all child views.
*
* @since 1.0
* @version 1.0
*/
virtual void RemoveAll();
/**
* @brief Obtains the target child view that is visible and can respond to touch events based on given coordinates.
*
* @param point Indicates the given coordinates.
* @param last Indicates the double pointer to the target view. nullptr indicates that the target
* view is not available.
* @since 1.0
* @version 1.0
*/
void GetTargetView(const Point& point, UIView** last) override;
/**
* @brief Obtains the current view and target view based on specified coordinates. The obtained current view
* must include the specified coordinates and is a visible top view that can respond to touch events,
* and the obtained target view must be the top view that includes the specified coordinates.
*
* @param point Indicates the specified coordinates.
* @param current Indicates the double pointer to the current view to obtain.
* nullptr indicates that the target view fails to be obtained.
* @param target Indicates the double pointer to the target view to obtain.
* nullptr indicates that the target view fails to be obtained.
* @since 5.0
* @version 3.0
*/
void GetTargetView(const Point& point, UIView** current, UIView** target) override;
/**
* @brief Moves all child views.
*
* @param x Indicates the offset distance by which this view group is moved on the x-axis.
* @param y Indicates the offset distance by which this view group is moved on the y-axis.
* @since 1.0
* @version 1.0
*/
virtual void MoveChildByOffset(int16_t x, int16_t y);
/**
* @brief Obtains the first child view in this view group.
*
* @return Returns the first child view.
* @since 1.0
* @version 1.0
*/
UIView* GetChildrenHead() const
{
return childrenHead_;
}
/**
* @brief Obtains the last child view in this view group.
*
* @return Returns the last child view.
* @since 1.0
* @version 1.0
*/
UIView* GetChildrenTail() const
{
return childrenTail_;
}
/**
* @brief Obtains the first render child view in this view group.
*
* @return Returns the first render child view.
*/
UIView* GetChildrenRenderHead() const;
/**
* @brief Set the first render child view in this view group.
*
* @param renderHead the first render child view.
*/
void SetChildrenRenderHead(UIView* renderHead);
/**
* @brief Sets whether this view group is intercepted upon touch events.
*
* @param flag Specifies whether this view group is intercepted upon touch events. true indicates that
* this view group is intercepted upon touch events, and false indicates the opposite case.
* @since 1.0
* @version 1.0
*/
void SetDisallowIntercept(bool flag)
{
disallowIntercept_ = flag;
}
/**
* @brief Obtains the target child view with a specified ID.
*
* @param id Indicates the pointer to the ID of the target child view.
* @return Returns the target child view if available; returns nullptr otherwise.
* @since 1.0
* @version 1.0
*/
UIView* GetChildById(const char* id) const override;
/**
* @brief Sets whether the size of this view group is adaptive to that of all child views.
*
* @param state Specifies whether the size of this view group is adaptive to that of all child views.
* true indicates automatic adaption is enabled, and false indicates the opposite case.
* @since 1.0
* @version 1.0
*/
void SetAutoSize(bool state)
{
isAutoSize_ = state;
}
#if ENABLE_FOCUS_MANAGER
/**
* @brief 设置组件是否拦截焦点.
*
* @param interceptFocus 是否拦截焦点.
* @since 5.0
* @version 3.0
*/
void SetInterceptFocus(bool interceptFocus)
{
isInterceptFocus_ = interceptFocus;
}
/**
* @brief 获取组件是否拦截焦点.
*
* @return 是否为焦点.
* @since 5.0
* @version 3.0
*/
bool IsInterceptFocus() const
{
return isInterceptFocus_;
}
#endif
/**
* @brief Update the render tree
*
* @param targetView the view being added/removed or changed zIndex.
*/
void UpdateRenderView(UIView* targetView);
protected:
/**
* @brief Obtains the rectangle area of a new view group after being adaptive to the size of all child views.
*
* @return Returns the rectangle area of the new view group.
* @since 1.0
* @version 1.0
*/
Rect GetAllChildRelativeRect() const;
/**
* @brief Performs operations needed after a child view is added or removed.
*
* @since 1.0
* @version 1.0
*/
virtual void OnChildChanged() {}
/**
* @brief Indicates the pointer to the first child view of this view group.
*/
UIView* childrenHead_;
/**
* @brief Indicates the pointer to the first render child view of this view group.
*/
UIView* childrenRenderHead_;
/**
* @brief Indicates the pointer to the last child view of this view group.
*/
UIView* childrenTail_;
/**
* @brief Represents the number of child views.
*/
uint16_t childrenNum_;
/**
* @brief Specifies the sliding state of this view group.
*/
bool isDragging_;
/**
* @brief Specifies whether this view group is intercepted upon touch events.
*/
bool disallowIntercept_;
/**
* @brief Specifies whether the size of this view group is adaptive to that of all child views.
*/
bool isAutoSize_;
private:
void AutoResize();
void InsertRenderView(UIView* anchorView, UIView* anchorPreView, UIView* targetView);
void RemoveRenderView(UIView* targetView);
#if ENABLE_FOCUS_MANAGER
bool isInterceptFocus_ : 1;
#endif
};
} // namespace OHOS
#endif // GRAPHIC_LITE_UI_VIEW_GROUP_H