/* * 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_swipe_view.h * * @brief Defines the attributes and common functions of a swipe view. * * Each swipe view consists of multiple child views, which can be navigated through swiping. The child views can be * either horizontal or vertical. * * @since 1.0 * @version 1.0 */ #ifndef GRAPHIC_LITE_UI_SWIPE_VIEW_H #define GRAPHIC_LITE_UI_SWIPE_VIEW_H #include "animator/animator.h" #include "components/ui_abstract_scroll.h" namespace OHOS { /** * @brief Represents a swipe view. * * Each swipe view consists of multiple child views, which can be navigated through swiping. The child views can be * either horizontal or vertical. * * @see UIAbstractScroll * @since 1.0 * @version 1.0 */ class UISwipeView : public UIAbstractScroll { public: /** * @brief Represents a listener for changes of the swipe view. * * This is an inner class of UISwipeView. It contains a callback function to be invoked when the swipe view * state changes. * * @since 1.0 * @version 1.0 */ class OnSwipeListener : public HeapBase { public: virtual void OnSwipe(UISwipeView& view) = 0; virtual ~OnSwipeListener() {} }; enum AlignMode : uint8_t { ALIGN_LEFT, ALIGN_CENTER, ALIGN_RIGHT }; /** * @brief A constructor used to create a UISwipeView instance. * * @since 1.0 * @version 1.0 */ UISwipeView(uint8_t direction = HORIZONTAL); /** * @brief A destructor used to delete the UISwipeView instance. * * @since 1.0 * @version 1.0 */ virtual ~UISwipeView(); /** * @brief Obtains the component type. * * @return Returns the component type, as defined in {@link UIViewType}. * @since 1.0 * @version 1.0 */ UIViewType GetViewType() const override { return UI_SWIPE_VIEW; } /** * @brief Sets the dragging direction. * * @param direction Indicates the dragging direction, either {@link HORIZONTAL} or {@link VERTICAL}. * @since 1.0 * @version 1.0 */ void SetDirection(uint8_t direction) { direction_ = direction; } /** * @brief Obtains the dragging direction. * * @return Returns the dragging direction. * @since 1.0 * @version 1.0 */ uint8_t GetDirection() const { return direction_; } /** * @brief Adds a view. * * @param view Indicates the view to add. * @since 1.0 * @version 1.0 */ void Add(UIView* view) override; /** * @brief Inserts a view. * * @param prevView Indicates the previous view. * @param insertView Indicates the view to insert. * @since 1.0 * @version 1.0 */ void Insert(UIView* prevView, UIView* insertView) override; /** * @brief Deletes a view. * * @param view Indicates the view to delete. * @since 1.0 * @version 1.0 */ virtual void Remove(UIView* view) override; /** * @brief Sets the index for the current tab. * * @param index Indicates the index of a view. * @param needAnimator Specifies whether a flip animation is needed. false (default value) indicates a flip * animation is not needed, and true indicates the opposite case. * @since 1.0 * @version 1.0 */ void SetCurrentPage(uint16_t index, bool needAnimator = false); /** * @brief Obtains the current tab index. * * @return Returns the current tab index. * @since 1.0 * @version 1.0 */ uint16_t GetCurrentPage() const { return curIndex_; } /** * @brief Obtains the current view. * * @return Returns the current view. * @since 1.0 * @version 1.0 */ UIView* GetCurrentView() const { return curView_; } /** * @brief Sets a blank size, as defined in {@link DEFAULT_BLANK_SIZE} * * @param size Indicates the blank size to set. * @since 1.0 * @version 1.0 */ void SetBlankSize(uint16_t size) { blankSize_ = size; } /** * @fn void OnDragEvent(const DragEvent& event) override * * @brief revice drag event, Switch to specified view when drag * * @param event The drag event */ bool OnDragEvent(const DragEvent& event) override; bool OnDragEndEvent(const DragEvent& event) override; #if ENABLE_ROTATE_INPUT bool OnRotateStartEvent(const RotateEvent& event) override; bool OnRotateEvent(const RotateEvent& event) override; bool OnRotateEndEvent(const RotateEvent& event) override; #endif /** * @brief Sets the time for the page being animated. The page will go beyond the blank during this time. * * @param time Indicates the time of the page being animated. * @since 1.0 * @version 1.0 */ void SetAnimatorTime(uint16_t time); /** * @brief Sets whether the swipe view supports a cycle swipe. * * @param loop Indicates the cycle swipe flag. true indicates the cycle swipe is supported, and false * indicates the opposite case. * @since 1.0 * @version 1.0 */ void SetLoopState(bool loop) { loop_ = loop; } /** * @brief Obtains a view based on its index. * * @param Indicates the index of a view. * @return Returns the view. * @since 1.0 * @version 1.0 */ UIView* GetViewByIndex(uint16_t index) const; /** * @brief Obtains the listener set for swipe events. * * @return Returns the swipe event listener. * @since 1.0 * @version 1.0 */ OnSwipeListener*& GetOnSwipeListener() { return swipeListener_; } /** * @brief Sets the listener that contains a callback to be invoked upon a swipe event. * * @param onSwipeListener Indicates the listener to set. * @since 1.0 * @version 1.0 */ void SetOnSwipeListener(OnSwipeListener* onSwipeListener) { swipeListener_ = onSwipeListener; } /** * @brief Sets the alignment mode for child components of UISwipeView. * * @param alignMode Indicates the alignment mode to set, as enumerated in {@link AlignMode}. * The default value is ALIGN_CENTER. * @since 1.0 * @version 1.0 */ void SetAlignMode(AlignMode alignMode = ALIGN_CENTER) { alignMode_ = alignMode; } /** * @brief Obtains the alignment mode of child components of UISwipeView. * * @return Returns the alignment mode. For details, see {@link AlignMode}. * @since 1.0 * @version 1.0 */ AlignMode GetAlignMode() { return alignMode_; } /** * @brief Indicates the horizontal direction. * * @since 1.0 * @version 1.0 */ static constexpr uint8_t HORIZONTAL = 0; /** * @brief Indicates the vertical direction. * * @since 1.0 * @version 1.0 */ static constexpr uint8_t VERTICAL = 1; void SetXScrollBarVisible(bool visible) = delete; void SetYScrollBarVisible(bool visible) = delete; void SetScrollBarSide(uint8_t side) = delete; void SetScrollBarCenter(Point center) = delete; protected: bool DragXInner(int16_t distance) override; bool DragYInner(int16_t distance) override; void SortChild(); void StopAnimator() override; virtual void SwitchToPage(int16_t dst, bool needAnimator = true); void MoveChildByOffset(int16_t xOffset, int16_t yOffset) override; void MoveHeadOrTailChild(); /** * @brief Indicates that the animation duration is 12 ticks. * * @since 1.0 * @version 1.0 */ constexpr static uint16_t ANIMATOR_TIME = 12; /** * @brief Indicates the maximum distance of an invalid dragging. Dragging is not triggered if the distance is less * than this value. * * @since 1.0 * @version 1.0 */ constexpr static uint16_t STOP_DISTANCE = 5; /** * @brief Indicates the maximum distance between the first and the last tab when the current view is not in a cycle * swipe mode. The page can be rebound after the setting. * * @since 1.0 * @version 1.0 */ constexpr static uint16_t DEFAULT_BLANK_SIZE = 30; uint16_t tickTime_; OnSwipeListener* swipeListener_; uint16_t curIndex_; uint16_t blankSize_; UIView* curView_; AlignMode alignMode_ = ALIGN_CENTER; bool loop_; private: void RefreshCurrentViewByPosition(int16_t (UIView::*pfnGetXOrY)() const, int16_t (UIView::*pfnGetWidthOrHeight)()); void RefreshCurrentViewByThrow(int16_t distance, uint8_t dragDirection, int16_t (UIView::*pfnGetXOrY)() const, int16_t (UIView::*pfnGetWidthOrHeight)()); bool IsNeedLoop(); void MoveFirstChildToLast(); void MoveLastChildToFirst(); void CalculateInvalidate(); void CurrentIndexInc(); void CurrentIndexDec(); void Vibrator(); }; } // namespace OHOS #endif // GRAPHIC_LITE_UI_SWIPE_VIEW_H