YSTest: TextBox.h 源文件

YSTest PreAlpha_b800_20170810 The YSLib Test Project

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

- 文件列表
- 文件成员

TextBox.h
浏览该文件的文档.
1 /*
2 © 2014-2017 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 #ifndef YSL_INC_UI_TextBox_h_
29 #define YSL_INC_UI_TextBox_h_ 1
30
31 #include "YModules.h"
32 #include YFM_YSLib_UI_YControl
33 #include YFM_YSLib_UI_Label
34 #include YFM_YSLib_Service_YTimer
35 #include YFM_YSLib_UI_YGUI
36 #include YFM_YSLib_UI_Animation
37
38 namespace YSLib
39 {
40
41 namespace UI
42 {
43
48 class YF_API TextPlaceholder
49 {
50 private:
52 observer_ptr<IWidget> p_captured = {};
53
54 public:
55 Drawing::Font Font{};
56 Color ForeColor{ColorSpace::Gray};
57 String Text{};
58 char32_t MaskChar = char32_t();
59
61 DefGetter(const ynothrow, observer_ptr<IWidget>, CapturedPtr, p_captured)
62
63 template<class _tControl, typename _fSwap>
64 void
65 BindByFocus(_tControl& ctl, _fSwap f)
66 {
67 yunseq(
68 FetchEvent<GotFocus>(ctl) += [&, f, this]{
69 if(p_captured.get() == std::addressof(ctl) && Text.empty())
70 {
71 ystdex::invoke(f, this, ctl);
72 p_captured = {};
73 }
74 },
75 FetchEvent<LostFocus>(ctl) += [&, f, this]{
76 if(!p_captured && ctl.Text.empty())
77 {
78 ystdex::invoke(f, this, ctl);
79 p_captured = YSLib::make_observer(std::addressof(ctl));
80 }
81 }
82 );
83 }
84
85 template<class _tControl>
86 void
87 SwapLabel(_tControl& ctl)
88 {
89 SwapText(ctl);
90
91 using std::swap;
92
93 swap(ctl.Font, Font),
94 swap(ctl.ForeColor, ForeColor);
95 }
96
97 template<class _tControl>
98 void
99 SwapText(_tControl& ctl)
100 {
101 using std::swap;
102
103 swap(ctl.Text, Text);
104 }
105
106 template<class _tControl>
107 void
108 SwapTextBox(_tControl& ctl)
109 {
110 SwapLabel(ctl);
111
112 using std::swap;
113
114 swap(ctl.MaskChar, MaskChar);
115 }
116 };
117
118
123 class YF_API Caret final
124 {
125 private:
130 static GAnimationSession<InvalidationUpdater> caret_animation;
131
132 public:
134 Timers::Timer CaretTimer{std::chrono::seconds(1)};
139 HBrush CaretBrush;
144 InvalidationUpdater::Invalidator CursorInvalidator;
145
151 Caret(IWidget&, HBrush, InvalidationUpdater::Invalidator);
152 ~Caret();
153
155 bool
156 Check(IWidget&);
157
162 static void
163 Stop() ynothrow;
164 };
165
166
171 struct YF_API TextSelection final
172 {
174 using Position = GBinaryGroup<size_t>;
179 using Span = pair<Position, Position>;
180
182 Span Range;
183
188 DefPred(const ynothrow, Empty, Range.first == Range.second)
189
190
194 PDefH(void, Collapse, )
195 ImplExpr(Range.first = Range.second)
196 };
197
198
205 class YF_API TextBox : public Control, protected MLabel, protected MHilightText
206 {
207 public:
209 using MLabel::ForeColor;
210 using MLabel::Font;
211 using MLabel::Margin;
212 using MLabel::HorizontalAlignment;
213 using MLabel::VerticalAlignment;
214 using MLabel::AutoWrapLine;
215 using MLabel::Text;
217 using MHilightText::HilightBackColor;
219 using MHilightText::HilightTextColor;
220
225 TextSelection Selection;
230 Caret CursorCaret;
236 size_t MaxLength{size_t(-1)};
245 char32_t MaskChar = char32_t();
246
247 private:
252 SDst h_offset;
253
254 public:
259 explicit
260 TextBox(const Rect& = {}, const Drawing::Font& = {}, const
261 pair<Drawing::Color, Drawing::Color>& = FetchGUIConfiguration().Colors
262 .GetPair(Styles::Highlight, Styles::HighlightText));
263 DefDeMoveCtor(TextBox)
264
265
271 Point
272 GetCaretLocation() const;
279 TextSelection::Position
280 GetCaretPosition(const Point&);
285 Point
286 GetPenOffset() const;
287
293 void
294 CollapseCaret();
295
301 void
302 ExportCaretLocation() const;
303
310 static bool
311 InvalidateDefaultCaret(IWidget&);
312
314 void
315 PaintDefaultCaret(PaintEventArgs&&);
316
318 void
319 Refresh(PaintEventArgs&&) override;
320
325 void
326 SelectAll();
327
332 PDefH(void, RestoreCaretTimer, )
333 ImplExpr(Activate(CursorCaret.CaretTimer))
334
342 void
343 ReplaceSelection(const String&);
344
346 void
347 UpdateTextBoxClippedText(const PaintContext&, TextState&);
348 };
349
350 } // namespace UI;
351
352 } // namespace YSLib;
353
354 #endif
355
YSLib::Timers::Timer
计时器。
Definition: YTimer.h:77
YSLib::UI::PDefH
PDefH(void, DisplayFor, IWidget &wgt, Timers::TimeSpan delay) ImplExpr(Show(wgt)
在一定时间内显示部件。
YSLib::UI::TextBox::h_offset
SDst h_offset
文字区域水平基准负偏移：文本内容在光标回退方向超出的未显示部分大小。
Definition: TextBox.h:252
YSLib::UI::ynothrow
AView &y ynothrow
Definition: YWidgetView.cpp:47
YSLib::Drawing::Font
字体：字模，包含字型、样式和大小。
Definition: Font.h:583
DefPred
#define DefPred(_q, _n,...)
Definition: YBaseMacro.h:232
YSLib::UI::FetchGUIConfiguration
GUIConfiguration & FetchGUIConfiguration()
Definition: YGUI.cpp:519
YSLib::UI::TextPlaceholder::SwapLabel
void SwapLabel(_tControl &ctl)
Definition: TextBox.h:87
YSLib
YSLib 命名空间。
Definition: AndroidHost.h:45
YSLib::UI::MHilightText::HilightTextColor
Color HilightTextColor
高亮文本色。
Definition: Label.h:219
YSLib::UI::Caret::CursorInvalidator
InvalidationUpdater::Invalidator CursorInvalidator
供闪烁动画使用的指定无效化区域的光标位置刷新器。
Definition: TextBox.h:144
UI
ystdex::make_observer
observer_ptr< _type > make_observer(_type *p)
Definition: pointer.hpp:326
platform::size_t
YF_API size_t
Definition: FileIO.h:1353
YSLib::UI::Caret::caret_animation
static GAnimationSession< InvalidationUpdater > caret_animation
插入符闪烁动画。
Definition: TextBox.h:130
YSLib::UI::MHilightText::HilightBackColor
Color HilightBackColor
高亮背景色。
Definition: Label.h:217
YSLib::UI::Caret
插入符光标。
Definition: TextBox.h:123
CHRLib::f
f(d, s)
Text
YSLib::UI::MLabel::ForeColor
Color ForeColor
默认前景色。
Definition: Label.h:77
YSLib::UI::Styles::HighlightText
Definition: YStyle.h:327
YSLib::UI::TextPlaceholder::SwapText
void SwapText(_tControl &ctl)
Definition: TextBox.h:99
DefDeMoveCtor
#define DefDeMoveCtor(_t)
Definition: YBaseMacro.h:167
Color
Pixel Color
Definition: CharRenderer.cpp:58
YSLib::UI::MLabel
标签模块。
Definition: Label.h:61
YSLib::UI::MLabel::AutoWrapLine
bool AutoWrapLine
启用自动换行。
Definition: Label.h:91
YSLib::UI::TextBox::CursorCaret
Caret CursorCaret
插入符光标。
Definition: TextBox.h:230
YSLib::UI::MLabel::Margin
Drawing::Padding Margin
文本和容器的间距。
Definition: Label.h:79
yunseq
#define yunseq
无序列依赖表达式组求值。
Definition: ydef.h:1022
YSLib::UI::TextBox::Selection
TextSelection Selection
选择区域：结束位置指示插入符光标逻辑位置。
Definition: TextBox.h:225
platform::SDst
std::uint16_t SDst
屏幕坐标距离。
Definition: Video.h:44
YSLib::Drawing::TextState
文本状态。
Definition: TextBase.h:86
YSLib::UI::InvalidationUpdater::Invalidator
std::function< bool(IWidget &)> Invalidator
Definition: Animation.h:130
YSLib::UI::MLabel::HorizontalAlignment
TextAlignment HorizontalAlignment
文本水平和竖直对齐属性。
Definition: Label.h:85
YF_API
#define YF_API
Definition: Platform.h:56
YSLib::UI::HBrush
std::function< void(PaintEventArgs &&)> HBrush
画刷回调函数。
Definition: YComponent.h:81
YSLib::UI::PaintEventArgs
部件绘制参数。
Definition: YWidgetEvent.h:323
YSLib::UI::Activate
void Activate(Console &, Drawing::Color, Drawing::Color)
Definition: Console.cpp:45
YSLib::Drawing::GBinaryGroup
屏幕二元组。
Definition: YGDIBase.h:54
YModules.h
YSLib::Drawing::Rect
屏幕标准矩形：表示屏幕矩形区域。
Definition: YGDIBase.h:540
ystdex::swap
void swap(container_adaptor< _tSeqCon > &x, container_adaptor< _tSeqCon > &y)
Definition: container.hpp:179
YSLib::UI::MLabel::VerticalAlignment
TextAlignment VerticalAlignment
Definition: Label.h:86
YSLib::UI::Control
控件。
Definition: YControl.h:275
DefGetter
#define DefGetter(_q, _t, _n,...)
Definition: YBaseMacro.h:241
platform::FAT::LFN::MaxLength
UCS-2 项最大长度。
Definition: YCLib/FileSystem.h:937
YSLib::UI::ImplExpr
IWidget bool b ImplExpr(wgt.GetController().SetEnabled(b)) YF_API bool Enable(IWidget &
设置部件可用性，且当可用性改变时无效化部件区域。
ystdex::invoke
result_of_t< _fCallable &&(_tParams &&...)> invoke(_fCallable &&f, _tParams &&...args)
调用可调用对象。
Definition: functional.hpp:339
YSLib::UI::TextBox
文本框。
Definition: TextBox.h:205
YSLib::UI::TextPlaceholder::SwapTextBox
void SwapTextBox(_tControl &ctl)
Definition: TextBox.h:108
YSLib::UI::TextSelection::Span
pair< Position, Position > Span
文本区段：表示起始和结束位置。
Definition: TextBox.h:179
YSLib::UI::MLabel::Text
String Text
标签文本。
Definition: Label.h:94
YSLib::Drawing::char32_t
tr TextRegion &tr char32_t
Definition: TextLayout.h:92
YSLib::UI::TextPlaceholder
添加默认文本到特定的部件。
Definition: TextBox.h:48
YSLib::UI::TextSelection
文本选择区域。
Definition: TextBox.h:171
YSLib::Consoles::Gray
Definition: YConsole.h:60
YSLib::UI::MHilightText
高亮文本模块。
Definition: Label.h:213
YSLib::UI::MLabel::Font
Drawing::Font Font
字体。
Definition: Label.h:78
YSLib::UI::GAnimationSession< InvalidationUpdater >
YSLib::UI::TextSelection::Range
Span Range
选择的范围。
Definition: TextBox.h:182
YSLib::UI::Caret::CaretBrush
HBrush CaretBrush
插入符画刷。
Definition: TextBox.h:139
YSLib::UI::Styles::Highlight
高亮背景。
Definition: YStyle.h:319
YSLib::swap
void swap(ValueNode &x, ValueNode &y) ynothrow
Definition: ValueNode.cpp:73
YSLib::Text::String
YSLib 标准字符串（使用 UCS-2 作为内部编码）。
Definition: YString.h:46