diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-10 18:07:22 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-10 18:07:22 +0000 |
commit | c04dcc2e7d834218ef2d4194331e383402495ae1 (patch) | |
tree | 7333e38d10d75386e60f336b80c2443c1166031d /xbmc/guilib/GUILabel.h | |
parent | Initial commit. (diff) | |
download | kodi-c04dcc2e7d834218ef2d4194331e383402495ae1.tar.xz kodi-c04dcc2e7d834218ef2d4194331e383402495ae1.zip |
Adding upstream version 2:20.4+dfsg.upstream/2%20.4+dfsg
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'xbmc/guilib/GUILabel.h')
-rw-r--r-- | xbmc/guilib/GUILabel.h | 240 |
1 files changed, 240 insertions, 0 deletions
diff --git a/xbmc/guilib/GUILabel.h b/xbmc/guilib/GUILabel.h new file mode 100644 index 0000000..7344667 --- /dev/null +++ b/xbmc/guilib/GUILabel.h @@ -0,0 +1,240 @@ +/* + * Copyright (C) 2005-2018 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +#pragma once + +/*! +\file GUILabel.h +\brief +*/ + +#include "GUIFont.h" +#include "GUITextLayout.h" +#include "guiinfo/GUIInfoColor.h" +#include "utils/ColorUtils.h" +#include "utils/Geometry.h" + +class CLabelInfo +{ +public: + CLabelInfo(): + scrollSuffix(" | ") + { + font = NULL; + align = XBFONT_LEFT; + offsetX = offsetY = 0; + width = 0; + angle = 0; + scrollSpeed = CScrollInfo::defaultSpeed; + }; + bool UpdateColors() + { + bool changed = false; + + changed |= textColor.Update(); + changed |= shadowColor.Update(); + changed |= selectedColor.Update(); + changed |= disabledColor.Update(); + changed |= focusedColor.Update(); + changed |= invalidColor.Update(); + + return changed; + }; + + KODI::GUILIB::GUIINFO::CGUIInfoColor textColor; + KODI::GUILIB::GUIINFO::CGUIInfoColor shadowColor; + KODI::GUILIB::GUIINFO::CGUIInfoColor selectedColor; + KODI::GUILIB::GUIINFO::CGUIInfoColor disabledColor; + KODI::GUILIB::GUIINFO::CGUIInfoColor focusedColor; + KODI::GUILIB::GUIINFO::CGUIInfoColor invalidColor; + uint32_t align; + float offsetX; + float offsetY; + float width; + float angle; + CGUIFont *font; + int scrollSpeed; + std::string scrollSuffix; +}; + +/*! + \ingroup controls, labels + \brief Class for rendering text labels. Handles alignment and rendering of text within a control. + */ +class CGUILabel +{ +public: + /*! \brief allowed color categories for labels, as defined by the skin + */ + enum COLOR { COLOR_TEXT = 0, + COLOR_SELECTED, + COLOR_FOCUSED, + COLOR_DISABLED, + COLOR_INVALID }; + + /*! \brief allowed overflow handling techniques for labels, as defined by the skin + */ + enum OVER_FLOW { OVER_FLOW_TRUNCATE = 0, + OVER_FLOW_SCROLL, + OVER_FLOW_WRAP, + OVER_FLOW_CLIP }; + + CGUILabel(float posX, float posY, float width, float height, const CLabelInfo& labelInfo, OVER_FLOW overflow = OVER_FLOW_TRUNCATE); + CGUILabel(const CGUILabel& label); + + virtual ~CGUILabel() = default; + + /*! \brief Process the label + \return bool stating if process caused control to change + */ + bool Process(unsigned int currentTime); + + /*! \brief Render the label on screen + */ + void Render(); + + /*! \brief Set the maximal extent of the label + Sets the maximal size and positioning that the label may render in. Note that `textwidth>` can override + this, and `<textoffsetx>` and `<textoffsety>` may also allow the label to be moved outside this rectangle. + */ + bool SetMaxRect(float x, float y, float w, float h); + + bool SetAlign(uint32_t align); + + /*! \brief Set the text to be displayed in the label + Updates the label control and recomputes final position and size + \param text std::string to set as this labels text + \sa SetTextW, SetStyledText + */ + bool SetText(const std::string &label); + + /*! \brief Set the text to be displayed in the label + Updates the label control and recomputes final position and size + \param text std::wstring to set as this labels text + \sa SetText, SetStyledText + */ + bool SetTextW(const std::wstring &label); + + /*! \brief Set styled text to be displayed in the label + Updates the label control and recomputes final position and size + \param text styled text to set. + \param colors colors referenced in the styled text. + \sa SetText, SetTextW + */ + bool SetStyledText(const vecText& text, const std::vector<UTILS::COLOR::Color>& colors); + + /*! \brief Set the color to use for the label + Sets the color to be used for this label. Takes effect at the next render + \param color color to be used for the label + */ + bool SetColor(COLOR color); + + /*! \brief Set the final layout of the current text + Overrides the calculated layout of the current text, forcing a particular size and position + \param rect CRect containing the extents of the current text + \sa GetRenderRect, UpdateRenderRect + */ + void SetRenderRect(const CRect& rect) { m_renderRect = rect; } + + /*! \brief Set whether or not this label control should scroll + \param scrolling true if this label should scroll. + */ + bool SetScrolling(bool scrolling); + + /*! \brief Set max. text scroll count + */ + void SetScrollLoopCount(unsigned int loopCount) { m_maxScrollLoops = loopCount; } + + /*! \brief Set how this label should handle overflowing text. + \param overflow the overflow type + \sa OVER_FLOW + */ + bool SetOverflow(OVER_FLOW overflow); + + /*! \brief Set this label invalid. Forces an update of the control + */ + void SetInvalid(); + + /*! \brief Update this labels colors + */ + bool UpdateColors(); + + /*! \brief Returns the precalculated final layout of the current text + \return CRect containing the extents of the current text + \sa SetRenderRect, UpdateRenderRect + */ + const CRect& GetRenderRect() const { return m_renderRect; } + + /*! \brief Returns the precalculated full width of the current text, regardless of layout + \return full width of the current text + \sa CalcTextWidth + */ + float GetTextWidth() const { return m_textLayout.GetTextWidth(); } + + /*! \brief Returns the maximal width that this label can render into + \return Maximal width that this label can render into. Note that this may differ from the + amount given in SetMaxRect as offsets and text width overrides have been taken into account. + \sa SetMaxRect + */ + float GetMaxWidth() const; + + /*! \brief Calculates the width of some text + \param text std::wstring of text whose width we want + \return width of the given text + \sa GetTextWidth + */ + float CalcTextWidth(const std::wstring& text) const { return m_textLayout.GetTextWidth(text); } + + const CLabelInfo& GetLabelInfo() const { return m_label; } + CLabelInfo& GetLabelInfo() { return m_label; } + + /*! \brief Check a left aligned and right aligned label for overlap and cut the labels off so that no overlap occurs + + If a left-aligned label occupies some of the same space on screen as a right-aligned label, then we may be able to + correct for this by restricting the width of one or both of them. This routine checks two labels to see whether they + satisfy this assumption and, if so, adjusts the render rect of both labels so that they no longer do so. The order + of the two labels is not important, but we do assume that the left-aligned label is also the left-most on screen, and + that the right-aligned label is the right most on-screen, so that they overlap due to the fact that one or both of + the labels are longer than anticipated. In the following diagram, [R...[R R] refers to the maximal allowed and + actual space occupied by the right label. Similarly, [L L]...L] refers to the maximal and actual space occupied + by the left label. | refers to the central cutting point, i.e. the point that would divide the maximal allowed + overlap perfectly in two. There are 3 scenarios to consider: + + cut + [L [R...[R L].|..........L] R] left label ends to the left of the cut -> just crop the left label. + [L [R.....[R | L]..L] R] both left and right labels occupy more than the cut allows, so crop both. + [L [R..........|.[R L]..L] R] right label ends to the right of the cut -> just crop the right label. + + \param label1 First label to check + \param label2 Second label to check + */ + static bool CheckAndCorrectOverlap(CGUILabel &label1, CGUILabel &label2); + +protected: + UTILS::COLOR::Color GetColor() const; + + /*! \brief Computes the final layout of the text + Uses the maximal position and width of the text, as well as the text length + and alignment to compute the final render rect of the text. + \sa GetRenderRect, SetRenderRect + */ + void UpdateRenderRect(); + +private: + CLabelInfo m_label; + CGUITextLayout m_textLayout; + + bool m_scrolling; + OVER_FLOW m_overflowType; + CScrollInfo m_scrollInfo; + CRect m_renderRect; ///< actual sizing of text + CRect m_maxRect; ///< maximum sizing of text + bool m_invalid; ///< if true, the label needs recomputing + COLOR m_color; ///< color to render text \sa SetColor, GetColor + unsigned int m_maxScrollLoops = ~0U; +}; |