/* * 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_circle_progress.h * * @brief Defines the attributes and common functions of a circular progress bar. * * @since 1.0 * @version 1.0 */ #ifndef GRAPHIC_LITE_UI_CIRCLE_PROGRESS_H #define GRAPHIC_LITE_UI_CIRCLE_PROGRESS_H #include "components/ui_abstract_progress.h" namespace OHOS { /** * @brief Represents a circular progress bar. * * This class is used to set the start and end angles, range, and current value to display the circular progress bar. * * @see UIAbstractProgress * @since 1.0 * @version 1.0 */ class UICircleProgress : public UIAbstractProgress { public: /** * @brief A constructor used to create a UICircleProgress instance. * * @since 1.0 * @version 1.0 */ UICircleProgress(); /** * @brief A destructor used to delete the UICircleProgress instance. * * @since 1.0 * @version 1.0 */ virtual ~UICircleProgress() {} /** * @brief Obtains the view type. * * @return Returns the view type, as defined in {@link UIViewType}. * @since 1.0 * @version 1.0 */ UIViewType GetViewType() const override { return UI_CIRCLE_PROGRESS; } bool OnPreDraw(Rect& invalidatedArea) const override { return false; } void OnDraw(BufferInfo& gfxDstBuffer, const Rect& invalidatedArea) override; /** * @brief Sets the coordinates of the center point for this circular progress bar. * * The coordinates of the center point refer to the position relative to the view. * * @param x Indicates the x-coordinate to set. The default value is 0. * @param y Indicates the y-coordinate to set. The default value is 0. * @see GetCenterPosition * @since 1.0 * @version 1.0 */ void SetCenterPosition(int16_t x, int16_t y); /** * @brief Obtains the coordinates of the center point for this circular progress bar. * * The coordinates of the center point refer to the position relative to the view. * * @return Returns the coordinates of the center point. * @see SetCenterPosition * @since 1.0 * @version 1.0 */ Point GetCenterPosition() const { return center_; } /** * @brief Sets the outer radius for this circular progress bar. * * @param radius Indicates the outer radius to set. * @see GetRadius * @since 1.0 * @version 1.0 */ void SetRadius(uint16_t radius) { radius_ = radius; } /** * @brief Obtains the outer radius of this circular progress bar. * * @return Returns the outer radius. * @see SetRadius * @since 1.0 * @version 1.0 */ uint16_t GetRadius() const { return radius_; } /** * @brief Sets the start angle. * * The 12-clock direction is 0 degrees, and the 3-clock direction is 90 degrees. \n * If the start angle is smaller than the end angle, the progress bar is clockwise. * Otherwise, the progress bar is anticlockwise. \n * The maximum range of a progress bar is a circle. If the difference between the start angle and end angle * exceeds 360 degrees, a circular progress bar is created. \n * * @param startAngle Indicates the start angle to set, which can be any value represented by int16_t. * The default value is 0. * @see GetStartAngle | SetEndAngle * @since 1.0 * @version 1.0 */ void SetStartAngle(int16_t startAngle); /** * @brief Obtains the start angle. * * @return Returns the start angle. * @see SetStartAngle * @since 1.0 * @version 1.0 */ int16_t GetStartAngle() const { return startAngle_; } /** * @brief Sets the end angle. * * The 12-clock direction is 0 degrees, and the 3-clock direction is 90 degrees. \n * If the start angle is smaller than the end angle, the progress bar is clockwise. * Otherwise, the progress bar is anticlockwise. \n * The maximum range of a progress bar is a circle. If the difference between the start angle and end angle * exceeds 360 degrees, a circular progress bar is created. \n * * @param endAngle Indicates the end angle to set, which can be any value represented by int16_t. * The default value is 360. * @see GetEndAngle | SetStartAngle * @since 1.0 * @version 1.0 */ void SetEndAngle(int16_t endAngle); /** * @brief Obtains the end angle. * * @return Returns the end angle. * @see SetEndAngle * @since 1.0 * @version 1.0 */ int16_t GetEndAngle() const { return endAngle_; } /** * @brief Sets the coordinates of the foreground image for this progress bar relative to the view. * * @param x Indicates the x-coordinate to set. The default value is 0. * @param y Indicates the y-coordinate to set. The default value is 0. * @see SetBackgroundImagePosition * @since 1.0 * @version 1.0 */ void SetProgressImagePosition(int16_t x, int16_t y) { progressImagePos_.x = x + style_->paddingLeft_ + style_->borderWidth_; progressImagePos_.y = y + style_->paddingTop_ + style_->borderWidth_; } /** * @brief Sets the coordinates of the background image for this progress bar relative to the view. * * @param x Indicates the x-coordinate to set. The default value is 0. * @param y Indicates the y-coordinate to set. The default value is 0. * @see SetProgressImagePosition * @since 1.0 * @version 1.0 */ void SetBackgroundImagePosition(int16_t x, int16_t y) { backgroundImagePos_.x = x + style_->paddingLeft_ + style_->borderWidth_; backgroundImagePos_.y = y + style_->paddingTop_ + style_->borderWidth_; } /** * @brief Sets the foreground color for this progress bar. * * @param color Indicates the foreground color to set. For details, see {@link ColorType}. * @since 1.0 * @version 1.0 */ void SetLineColor(ColorType color) { SetForegroundStyle(STYLE_LINE_COLOR, color.full); } private: static constexpr uint16_t MAX_ANGLE_VALUE = CIRCLE_IN_DEGREE; static constexpr uint16_t MIN_ANGLE_VALUE = 0; void GetStartEndAngle(int16_t& start, int16_t& end) const; void GetAngleRange(int16_t& start, int16_t& end) const; void GetRedrawAngle(int16_t& start, int16_t& end) const; void DrawCommonCircle(BufferInfo& gfxDstBuffer, const Rect& invalidatedArea); Point center_; Point backgroundImagePos_; Point progressImagePos_; uint16_t radius_; int16_t startAngle_; int16_t endAngle_; }; } // namespace OHOS #endif // GRAPHIC_LITE_UI_CIRCLE_PROGRESS_H