/*
* 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