/* * Copyright (c) 2020-2022 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_label.h * * @brief Declares a UILabel class that represents a label. * * @since 1.0 * @version 1.0 */ #ifndef GRAPHIC_LITE_UI_LABEL_H #define GRAPHIC_LITE_UI_LABEL_H #include "animator/animator.h" #include "common/text.h" #include "components/ui_view.h" #if defined(ENABLE_SPANNABLE_STRING) && ENABLE_SPANNABLE_STRING #include "common/spannable_string.h" #endif namespace OHOS { /** * @brief Defines the functions for presenting a label in a specified area, setting the style and background color * of a label, and setting the display mode of a long label text. * * @since 1.0 * @version 1.0 */ class UILabel : public UIView { public: /** * @brief Enumerates the display modes of a long text. */ enum LineBreakMode : uint8_t { /** * The label size is adaptive to the text size. */ LINE_BREAK_ADAPT = 0, /** * The height of this label remains unchanged, and the width is adaptive to the text size. */ LINE_BREAK_STRETCH, /** * The width of this label remains unchanged, and the height is adaptive to the text size. * The text switches to the next line if the text exceeds the maximum label width. */ LINE_BREAK_WRAP, /** * The width and height of this label remain unchanged. * If this text is too long, ellipsis will be used at the end. */ LINE_BREAK_ELLIPSIS, /** * The width and height of this label remain unchanged. * If this text is too long, it will be rolled to display. */ LINE_BREAK_MARQUEE, /** * The width and height of this label remain unchanged. * If this text is too long, it will be cropped to display. */ LINE_BREAK_CLIP, /** * Maximum value of the line break mode, which is used for validity check. */ LINE_BREAK_MAX, }; /** * @brief A constructor used to create a UILabel instance. * * @since 1.0 * @version 1.0 */ UILabel(); /** * @brief A destructor used to delete the UILabel instance. * * @since 1.0 * @version 1.0 */ virtual ~UILabel(); /** * @brief Obtains the view type. * * @return Returns UI_LABEL, as defined in {@link UIViewType}. * @since 1.0 * @version 1.0 */ UIViewType GetViewType() const override { return UI_LABEL; } /** * @brief Obtains the width of this label. * * @return Returns the label width. * @since 1.0 * @version 1.0 */ int16_t GetWidth() override; /** * @brief Obtains the height of this label. * * @return Returns the label height. * @since 1.0 * @version 1.0 */ int16_t GetHeight() override; /** * @brief Sets the view style. * @param style Indicates the view style. * @since 1.0 * @version 1.0 */ void SetStyle(Style& style) override { UIView::SetStyle(style); } /** * @brief Sets a style. * * @param key Indicates the key of the style to set. * @param value Indicates the value matching the key. * @since 1.0 * @version 1.0 */ void SetStyle(uint8_t key, int64_t value) override; /** * @brief Checks whether this label needs to be covered before drawing it. * * @param invalidatedArea Indicates the area to draw. * @return Returns true if this label needs to be covered; returns false otherwise. * @since 1.0 * @version 1.0 */ bool OnPreDraw(Rect& invalidatedArea) const override { return false; } /** * @brief Draws this label. * * @param invalidatedArea Indicates the area to draw. * @since 1.0 * @version 1.0 */ void OnDraw(BufferInfo& gfxDstBuffer, const Rect& invalidatedArea) override; /** * @brief Sets the text content for this label. * * @param text Indicates the pointer to the text content. * @since 1.0 * @version 1.0 */ void SetText(const char* text); #if defined(ENABLE_SPANNABLE_STRING) && ENABLE_SPANNABLE_STRING /** * @brief Sets the SpannableString content for this label. * * @param text Indicates the pointer to the text content. */ void SetText(const SpannableString* text); #endif /** * @brief Obtains the text of this label. * * @return Returns the text. * @since 1.0 * @version 1.0 */ const char* GetText() const { return (labelText_ == nullptr) ? nullptr : labelText_->GetText(); } /** * @brief Sets the line break mode for this text. * * @param lineBreakMode Indicates the line break mode to set. * @since 1.0 * @version 1.0 */ void SetLineBreakMode(const uint8_t lineBreakMode); /** * @brief Obtains the line break mode of this text. * * @return Returns the line break mode. * @since 1.0 * @version 1.0 */ uint8_t GetLineBreakMode() const { return lineBreakMode_; } /** * @brief Sets the color for this text. * * @param color Indicates the text color to set. * @since 1.0 * @version 1.0 */ void SetTextColor(ColorType color) { useTextColor_ = true; textColor_ = color; } /** * @brief Obtains the color of this text. * * @return Returns the text color. * @since 1.0 * @version 1.0 */ ColorType GetTextColor() const { return useTextColor_ ? textColor_ : GetStyleConst().textColor_; } /** * @brief Sets the alignment mode for this text. * * @param horizontalAlign Indicates the horizontal alignment mode to set, * which can be {@link TEXT_ALIGNMENT_LEFT}, * {@link TEXT_ALIGNMENT_CENTER}, or {@link TEXT_ALIGNMENT_RIGHT}. * @param verticalAlign Indicates the vertical alignment mode to set, which can be * {@link TEXT_ALIGNMENT_TOP} (default mode), {@link TEXT_ALIGNMENT_CENTER}, * or {@link TEXT_ALIGNMENT_BOTTOM}. * @since 1.0 * @version 1.0 */ void SetAlign(UITextLanguageAlignment horizontalAlign, UITextLanguageAlignment verticalAlign = TEXT_ALIGNMENT_TOP); /** * @brief Obtains the horizontal alignment mode. * * @return Returns the horizontal alignment mode. * @since 1.0 * @version 1.0 */ UITextLanguageAlignment GetHorAlign() { InitLabelText(); return labelText_->GetHorAlign(); } /** * @brief Obtains the vertical alignment mode. * * @return Returns the vertical alignment mode. * @since 1.0 * @version 1.0 */ UITextLanguageAlignment GetVerAlign() { InitLabelText(); return labelText_->GetVerAlign(); } /** * @brief Sets the direction for this text. * * @return direct Returns the text direction, as defined in {@link UITextLanguageDirect}. * @since 1.0 * @version 1.0 */ void SetDirect(UITextLanguageDirect direct) { InitLabelText(); labelText_->SetDirect(direct); } /** * @brief Obtains the direction of this text. * * @return Returns the text direction, as defined in {@link UITextLanguageDirect}. * @since 1.0 * @version 1.0 */ UITextLanguageDirect GetDirect() { InitLabelText(); return labelText_->GetDirect(); } /** * @brief Sets the font ID for this label. * * @param fontId Indicates the font ID composed of font name and size. * @since 1.0 * @version 1.0 */ void SetFontId(uint16_t fontId); /** * @brief Obtains the font ID composed of font name and size. * * @return Returns the front ID of this label. * @since 1.0 * @version 1.0 */ uint16_t GetFontId() { InitLabelText(); return labelText_->GetFontId(); } /** * @brief Sets the font for this label. * * @param name Indicates the pointer to the font name. * @param size Indicates the font size to set. * @since 1.0 * @version 1.0 */ void SetFont(const char* name, uint8_t size); /** * @brief Sets the scroll speed for this text. * * @param speed Indicates the scroll speed to set. * @since 1.0 * @version 1.0 */ void SetRollSpeed(uint16_t speed); /** * @brief Obtains the scroll speed for this text. * * @return Returns the scroll speed. */ uint16_t GetRollSpeed() const; /** * @brief Obtains the width of this text. * * @return Returns the text width. * @since 1.0 * @version 1.0 */ uint16_t GetTextWidth(); /** * @brief Obtains the height of this text. * * @return Returns the text height. * @since 1.0 * @version 1.0 */ uint16_t GetTextHeight(); /** * @brief Sets the position where this text starts to roll. * * @param pos Indicates the position to set. * @since 1.0 * @version 1.0 */ void SetRollStartPos(int16_t pos); /** * @brief Obtains the position where this text starts to roll. * * @return Returns the position where this text starts to roll. * @since 1.0 * @version 1.0 */ int16_t GetRollStartPos() const; /** * @brief Sets the width for this label. * * @param width Indicates the width to set. * @since 1.0 * @version 1.0 */ void SetWidth(int16_t width) override; /** * @brief Sets the height for this label. * * @param height Indicates the height to set. * @since 1.0 * @version 1.0 */ void SetHeight(int16_t height) override; void ReMeasure() override; void SetSupportBaseLine(bool baseLine) { InitLabelText(); labelText_->SetSupportBaseLine(baseLine); } void SetBackgroundColorSpan(ColorType backgroundColor, int16_t start, int16_t end) { labelText_->SetBackgroundColorSpan(backgroundColor, start, end); } void SetForegroundColorSpan(ColorType fontColor, int16_t start, int16_t end) { labelText_->SetForegroundColorSpan(fontColor, start, end); } void SetLineBackgroundSpan(ColorType lineBackgroundColor, int16_t start, int16_t end) { labelText_->SetLineBackgroundSpan(lineBackgroundColor, start, end); } void SetAbsoluteSizeSpan(uint16_t start, uint16_t end, uint8_t size); void SetRelativeSizeSpan(uint16_t start, uint16_t end, float size); protected: Text* labelText_; void RefreshLabel(); virtual void InitLabelText(); private: friend class LabelAnimator; void RemeasureForMarquee(int16_t textWidth); bool needRefresh_ : 1; bool useTextColor_ : 1; bool hasAnimator_ : 1; uint8_t lineBreakMode_ : 4; uint16_t ellipsisIndex_; int16_t offsetX_; ColorType textColor_; static constexpr uint16_t DEFAULT_ANIMATOR_SPEED = 35; union { Animator* animator; struct { uint16_t speed; int16_t pos; }; } animator_; }; } // namespace OHOS #endif // GRAPHIC_LITE_UI_LABEL_H