24 class WideInputBase :
public ComponentBase {
26 WideInputBase(WideStringRef content,
27 ConstStringRef placeholder,
28 Ref<InputOption> option)
29 : content_(content), placeholder_(placeholder), option_(option) {}
31 int cursor_position_internal_ = 0;
32 int& cursor_position() {
33 int& opt = option_->cursor_position();
36 return cursor_position_internal_;
41 std::wstring password_content;
42 if (option_->password())
43 password_content = std::wstring(content_->size(), U
'•');
44 std::wstring& content = option_->password() ? password_content : *content_;
47 std::max(0, std::min<int>(content.size(), cursor_position()));
52 if (content.size() == 0) {
62 return text(content) | main_decorator |
reflect(box_);
64 std::wstring part_before_cursor = content.substr(0, cursor_position());
65 std::wstring part_at_cursor = cursor_position() < (int)content.size()
66 ? content.substr(cursor_position(), 1)
68 std::wstring part_after_cursor = cursor_position() < (int)content.size() - 1
69 ? content.substr(cursor_position() + 1)
76 text(part_before_cursor),
78 text(part_after_cursor)
83 bool OnEvent(Event event)
override {
85 std::max(0, std::min<int>(content_->size(), cursor_position()));
88 return OnMouseEvent(event);
94 if (cursor_position() == 0)
96 content_->erase(cursor_position() - 1, 1);
104 if (cursor_position() ==
int(content_->size()))
106 content_->erase(cursor_position(), 1);
107 option_->on_change();
127 cursor_position() < (
int)content_->size()) {
133 cursor_position() = 0;
138 cursor_position() = (int)content_->size();
143 if (event.is_character()) {
144 content_->insert(cursor_position(), 1,
to_wstring(event.character())[0]);
146 option_->on_change();
153 bool OnMouseEvent(Event event) {
156 if (!box_.Contain(event.mouse().x, event.mouse().y))
163 int new_cursor_position =
164 cursor_position() +
event.mouse().x - cursor_box_.x_min;
165 new_cursor_position =
166 std::max(0, std::min<int>(content_->size(), new_cursor_position));
167 if (cursor_position() != new_cursor_position) {
168 cursor_position() = new_cursor_position;
169 option_->on_change();
175 bool Focusable() const final {
return true; }
177 WideStringRef content_;
178 ConstStringRef placeholder_;
182 Ref<InputOption> option_;
190 class InputBase :
public WideInputBase {
192 InputBase(StringRef content,
193 ConstStringRef placeholder,
194 Ref<InputOption> option)
195 : WideInputBase(&wrapped_content_,
196 std::move(placeholder),
198 content_(std::move(content)),
206 bool OnEvent(Event event)
override {
208 if (WideInputBase::OnEvent(event)) {
216 std::wstring wrapped_content_;
244 return Make<InputBase>(content, placeholder, std::move(option));
272 return Make<WideInputBase>(content, placeholder, std::move(option));