YSTest: label.cpp 源文件

YSTest PreAlpha_b500_20140530 The YSLib Test Project

- 首页
- 相关页面
- 模块
- 命名空间
- 类
- 文件

- 文件列表
- 文件成员

全部 类 命名空间 文件 函数 变量 类型定义 枚举 枚举值 友元 宏定义 组 页
label.cpp
浏览该文件的文档.
1 /*
2 © 2011-2014 FrankHB.
3
4 This file is part of the YSLib project, and may only be used,
5 modified, and distributed under the terms of the YSLib project
6 license, LICENSE.TXT. By continuing to use, modify, or distribute
7 this file you indicate that you have read the license and
8 understand and accept it fully.
9 */
10
28 #include "YSLib/UI/YModules.h"
29 #include YFM_YSLib_UI_Label
30 #include YFM_YSLib_Service_TextLayout
31 #include YFM_YSLib_UI_YWidgetEvent
32
33 namespace YSLib
34 {
35
36 namespace UI
37 {
38
39 MLabel::MLabel(const Drawing::Font& fnt, TextAlignment a)
40 : Font(fnt), Margin(Drawing::DefaultMargin),
41 HorizontalAlignment(a), VerticalAlignment(TextAlignment::Center),
42 AutoWrapLine(false), /*AutoSize(false), AutoEllipsis(false),*/ Text()
43 {}
44
45 void
46 MLabel::DrawText(const Size& s, Color c, const PaintContext& e)
47 {
48 Drawing::TextState ts;
49 const Rect bounds(e.Location, s);
50
51 yunseq(ts.Font = Font, ts.Color = c,
52 ts.Margin = FetchMargin(bounds + Margin, e.Target.GetSize())),
53 ts.ResetPen(e.Location, Margin);
54
55 if(!AutoWrapLine)
56 {
57 switch(HorizontalAlignment)
58 {
59 case TextAlignment::Center:
60 case TextAlignment::Right:
61 {
62 SPos horizontal_offset(bounds.Width - GetHorizontalOf(Margin)
63 - FetchStringWidth(ts.Font, Text));
64
65 if(horizontal_offset > 0)
66 {
67 if(HorizontalAlignment == TextAlignment::Center)
68 horizontal_offset /= 2;
69 ts.Pen.X += horizontal_offset;
70 }
71 }
72 case TextAlignment::Left:
73 default:
74 break;
75 }
76 switch(VerticalAlignment)
77 {
78 case TextAlignment::Center:
79 case TextAlignment::Down:
80 {
81 SPos vertical_offset(bounds.Height - GetVerticalOf(Margin)
82 - GetTextLineHeightOf(ts));
83
84 if(vertical_offset > 0)
85 {
86 if(VerticalAlignment == TextAlignment::Center)
87 vertical_offset /= 2;
88 ts.Pen.Y += vertical_offset;
89 }
90 }
91 case TextAlignment::Up:
92 default:
93 break;
94 }
95 }
96 DrawClippedText(e.Target, e.ClipArea & (bounds + Margin), ts);
97 }
98
99 void
100 MLabel::DrawClippedText(const Graphics& g, const Rect& mask,
101 Drawing::TextState& ts)
102 {
103 Drawing::DrawClippedText(g, mask, ts, Text, AutoWrapLine);
104 }
105
106
107 void
108 Label::Refresh(PaintEventArgs&& e)
109 {
110 DrawText(GetSizeOf(*this), ForeColor, e);
111 }
112
113
114 MTextList::MTextList(const shared_ptr<ListType>& h, const Drawing::Font& fnt)
115 : MLabel(fnt),
116 hList(h), tsList(Font)
117 {
118 if(!hList)
119 hList = make_shared<ListType>();
120 }
121
122 MTextList::ItemType*
123 MTextList::GetItemPtr(const IndexType& idx)
124 {
125 auto& lst(GetListRef());
126
127 return IsInInterval<IndexType>(idx, lst.size()) ? &lst[idx] : nullptr;
128 }
129 const MTextList::ItemType*
130 MTextList::GetItemPtr(const IndexType& idx) const
131 {
132 const auto& lst(GetList());
133
134 return IsInInterval<IndexType>(idx, lst.size()) ? &lst[idx] : nullptr;
135 }
136
137 SDst
138 MTextList::GetMaxTextWidth() const
139 {
140 return FetchMaxTextWidth(Font, GetList().cbegin(), GetList().cend());
141 }
142
143 MTextList::IndexType
144 MTextList::Find(const ItemType& text) const
145 {
146 const auto& lst(GetList());
147 const auto i(std::find(lst.begin(), lst.end(), text));
148
149 return i != lst.end() ? i - lst.begin() : IndexType(-1);
150 }
151
152 void
153 MTextList::RefreshTextState()
154 {
155 yunseq(tsList.LineGap = GetVerticalOf(Margin), tsList.Font = Font);
156 }
157
158 } // namespace UI;
159
160 } // namespace YSLib;
161
YSLib::Drawing::TextState::Pen
Point Pen
笔坐标。
Definition: TextBase.h:99
YSLib::UI::MTextList::IndexType
typename ListType::size_type IndexType
索引类型。
Definition: label.h:149
YSLib::Drawing::DefaultMargin
yconstexpr Padding DefaultMargin(2, 2, 2, 2)
默认边距。
YSLib::UI::GetSizeOf
pt pt Y const IWidget &wgt const IWidget &wgt GetSizeOf
无效化：使相对于部件的子部件的指定区域在直接和间接的窗口缓冲区中无效。
Definition: ywidget.h:156
YSLib::Drawing::FetchStringWidth
SDst FetchStringWidth(const Font &fnt, _tIter s)
取迭代器指定的单行字符串在字体指定、无边界限制时的显示宽度。
Definition: TextLayout.h:192
YSLib::Drawing::TextState::LineGap
u8 LineGap
行距。
Definition: TextBase.h:100
YModules.h
YSLib::Drawing::FetchMargin
YF_API Padding FetchMargin(const Rect &, const Size &)
取内边界相对于外边界的边距。
Definition: ygdi.cpp:51
YSLib::UI::TextAlignment::Down
YSLib::Drawing::GetVerticalOf
SDst GetVerticalOf(const Padding &m)
取竖直边距和。
Definition: ygdi.h:116
YSLib::Drawing::FetchMaxTextWidth
SDst FetchMaxTextWidth(const Font &font, _tIter first, _tIter last)
取指定字体显示的迭代器范围中的文本的最大宽度。
Definition: TextLayout.h:318
YSLib::Drawing::bounds
bounds
Definition: ydraw.h:188
YSLib::UI::MTextList::Find
IndexType Find(const ItemType &) const
查找项。
Definition: label.cpp:144
YSLib::Drawing::DrawClippedText
YF_API void DrawClippedText(const Graphics &g, const Rect &mask, TextState &ts, const String &str, bool line_wrap)
绘制剪切区域的文本。
Definition: TextRenderer.cpp:214
YSLib::UI::PaintEventArgs
部件绘制参数。
Definition: ywgtevt.h:276
YSLib::UI::MTextList::GetItemPtr
DefDeMoveCtor(MTextList) public const ItemType * GetItemPtr(const IndexType &) const
取文本列表。
Definition: label.cpp:123
platform::SDst
std::uint16_t SDst
屏幕坐标距离。
Definition: Video.h:39
YSLib::Drawing::TextState::Margin
Padding Margin
边距：文本区域到显示区域的距离。
Definition: TextBase.h:94
YSLib::UI::MLabel::Text
String Text
标签文本。
Definition: label.h:76
YSLib::UI::MLabel::DrawClippedText
const PaintContext &virtual void DrawClippedText(const Graphics &, const Rect &, Drawing::TextState &)
绘制剪切文本：使用指定的图形接口上下文、相对于部件的边界和文本状态。
Definition: label.cpp:100
YSLib::Text::String
YSLib 标准字符串（使用 UCS-2 作为内部编码）。
Definition: ystring.h:47
yunseq
#define yunseq
无序列依赖表达式组求值。
Definition: ydef.h:748
YSLib::UI::TextAlignment::Left
YSLib::Drawing::TextState
文本状态。
Definition: TextBase.h:87
YSLib::Drawing::DrawText
YF_API void DrawText(const Graphics &g, TextState &ts, const String &str, bool line_wrap)
绘制文本。
Definition: TextRenderer.cpp:236
YSLib::UI::MTextList::MTextList
MTextList(const shared_ptr< ListType > &={}, const Drawing::Font &={})
构造：使用文本列表句柄和字体指针。
Definition: label.cpp:114
YSLib::Drawing::GBinaryGroup::Y
_type Y
分量。
Definition: ygdibase.h:59
YSLib::Drawing::Rect
屏幕标准矩形：表示屏幕矩形区域。
Definition: ygdibase.h:416
YSLib::Drawing::PenStyle::Font
Drawing::Font Font
字体。
Definition: TextBase.h:57
YSLib::UI::SPos
const IWidget &wgt SPos
Definition: ywidget.h:104
YSLib::Drawing::PenStyle::Color
Drawing::Color Color
笔颜色。
Definition: TextBase.h:58
YSLib::Drawing::GBinaryGroup::X
_type X
Definition: ygdibase.h:59
YSLib::UI::MLabel::HorizontalAlignment
TextAlignment HorizontalAlignment
文本水平和竖直对齐属性。
Definition: label.h:68
YSLib::UI::MLabel::AutoWrapLine
bool AutoWrapLine
启用自动换行。
Definition: label.h:73
YSLib::UI::MTextList::hList
shared_ptr< ListType > hList
文本列表句柄。
Definition: label.h:152
YSLib::UI::TextAlignment::Up
YSLib::Drawing::Graphics
二维图形接口上下文。
Definition: ygdibase.h:721
YSLib::UI::MTextList::tsList
Drawing::TextState tsList
列表文本状态。
Definition: label.h:157
YSLib::UI::MLabel::Margin
Drawing::Padding Margin
文本和容器的间距。
Definition: label.h:62
platform_ex::Windows::s
return s
Definition: MinGW32.cpp:49
YSLib::UI::TextAlignment
TextAlignment
Definition: label.h:44
YSLib::UI::BorderArea::Center
YSLib::UI::TextAlignment::Right
YSLib::UI::MLabel
标签模块。
Definition: label.h:58
YSLib::Drawing::g
c yconstfn g
Definition: ystyle.h:104
YSLib::Drawing::Font
字体：字模，包含字型、样式和大小。
Definition: Font.h:546
YSLib::UI::Widget::ForeColor
Color ForeColor
默认前景色。
Definition: ywidget.h:375
CHRLib::c
c
Definition: chrproc.h:76
YSLib::UI::Widget::Refresh
virtual void Refresh(PaintEventArgs &&)
刷新：按指定参数绘制界面并更新状态。
Definition: ywidget.cpp:264
platform::Color
颜色。
Definition: Video.h:339
YSLib::UI::MLabel::MLabel
MLabel(const Drawing::Font &={}, TextAlignment=TextAlignment::Left)
构造：使用指定字体。
Definition: label.cpp:39
YSLib::Drawing::Size
屏幕区域大小。
Definition: ygdibase.h:249
YSLib::UI::MTextList::RefreshTextState
void RefreshTextState()
刷新文本状态。
Definition: label.cpp:153
YSLib::UI::MLabel::VerticalAlignment
TextAlignment VerticalAlignment
Definition: label.h:68
YSLib::Drawing::TextState::ResetPen
PDefHOp(TextState &,=, const PenStyle &ps) ImplRet(PenStyle void ResetPen()
赋值：笔样式。
Definition: TextBase.h:145