From f78458173c1baf567cc96880571b380e95a1039a Mon Sep 17 00:00:00 2001 From: crupest Date: Wed, 28 Nov 2018 19:18:00 +0800 Subject: Refactor event system. --- src/ui/controls/text_box.cpp | 220 +++++++++++++++++++++---------------------- 1 file changed, 108 insertions(+), 112 deletions(-) (limited to 'src/ui/controls/text_box.cpp') diff --git a/src/ui/controls/text_box.cpp b/src/ui/controls/text_box.cpp index 83311548..28e1053d 100644 --- a/src/ui/controls/text_box.cpp +++ b/src/ui/controls/text_box.cpp @@ -20,149 +20,145 @@ namespace cru::ui::controls GetBorderProperty() = UiManager::GetInstance()->GetPredefineResources()->text_box_border; SetBordered(true); - } - - TextBox::~TextBox() = default; - StringView TextBox::GetControlType() const - { - return control_type; - } - - void TextBox::OnDrawContent(ID2D1DeviceContext* device_context) - { - TextControl::OnDrawContent(device_context); - if (is_caret_show_) + draw_content_event.AddHandler([this](events::DrawEventArgs& args) { - const auto caret_half_width = UiManager::GetInstance()->GetCaretInfo().half_caret_width; - FLOAT x, y; - DWRITE_HIT_TEST_METRICS metrics{}; - ThrowIfFailed(text_layout_->HitTestTextPosition(caret_position_, FALSE, &x, &y, &metrics)); - device_context->FillRectangle(D2D1::RectF(metrics.left - caret_half_width, metrics.top, metrics.left + caret_half_width, metrics.top + metrics.height), caret_brush_.Get()); - } - } + const auto device_context = args.GetDeviceContext(); + if (is_caret_show_) + { + const auto caret_half_width = UiManager::GetInstance()->GetCaretInfo().half_caret_width; + FLOAT x, y; + DWRITE_HIT_TEST_METRICS metrics{}; + ThrowIfFailed(text_layout_->HitTestTextPosition(caret_position_, FALSE, &x, &y, &metrics)); + device_context->FillRectangle(D2D1::RectF(metrics.left - caret_half_width, metrics.top, metrics.left + caret_half_width, metrics.top + metrics.height), caret_brush_.Get()); + } + }); - void TextBox::OnGetFocusCore(events::FocusChangeEventArgs& args) - { - TextControl::OnGetFocusCore(args); - assert(!caret_timer_.has_value()); - is_caret_show_ = true; - caret_timer_ = SetInterval(UiManager::GetInstance()->GetCaretInfo().caret_blink_duration, [this] + get_focus_event.bubble.AddHandler([this](events::FocusChangeEventArgs& args) { - is_caret_show_ = !is_caret_show_; - InvalidateDraw(); + assert(!caret_timer_.has_value()); + is_caret_show_ = true; + caret_timer_ = SetInterval(UiManager::GetInstance()->GetCaretInfo().caret_blink_duration, [this] + { + is_caret_show_ = !is_caret_show_; + InvalidateDraw(); + }); }); - } - void TextBox::OnLoseFocusCore(events::FocusChangeEventArgs& args) - { - Control::OnLoseFocusCore(args); - assert(caret_timer_.has_value()); - caret_timer_->Cancel(); - caret_timer_ = std::nullopt; - is_caret_show_ = false; - } + lose_focus_event.bubble.AddHandler([this](events::FocusChangeEventArgs& args) + { + assert(caret_timer_.has_value()); + caret_timer_->Cancel(); + caret_timer_ = std::nullopt; + is_caret_show_ = false; + }); - void TextBox::OnKeyDownCore(events::KeyEventArgs& args) - { - Control::OnKeyDownCore(args); - if (args.GetVirtualCode() == VK_LEFT && caret_position_ > 0) + key_down_event.bubble.AddHandler([this](events::KeyEventArgs& args) { - if (IsKeyDown(VK_SHIFT)) + if (args.GetVirtualCode() == VK_LEFT && caret_position_ > 0) { - if (GetCaretSelectionSide()) - ShiftLeftSelectionRange(-1); - else - ShiftRightSelectionRange(-1); - } - else - { - const auto selection = GetSelectedRange(); - if (selection.has_value()) + if (IsKeyDown(VK_SHIFT)) { - ClearSelection(); - caret_position_ = selection.value().position; + if (GetCaretSelectionSide()) + ShiftLeftSelectionRange(-1); + else + ShiftRightSelectionRange(-1); } else - caret_position_--; + { + const auto selection = GetSelectedRange(); + if (selection.has_value()) + { + ClearSelection(); + caret_position_ = selection.value().position; + } + else + caret_position_--; + } + InvalidateDraw(); } - InvalidateDraw(); - } - if (args.GetVirtualCode() == VK_RIGHT && caret_position_ < GetText().size()) - { - if (IsKeyDown(VK_SHIFT)) + if (args.GetVirtualCode() == VK_RIGHT && caret_position_ < GetText().size()) { - if (GetCaretSelectionSide()) - ShiftLeftSelectionRange(1); - else - ShiftRightSelectionRange(1); - } - else - { - const auto selection = GetSelectedRange(); - if (selection.has_value()) + if (IsKeyDown(VK_SHIFT)) { - ClearSelection(); - caret_position_ = selection.value().position + selection.value().count; + if (GetCaretSelectionSide()) + ShiftLeftSelectionRange(1); + else + ShiftRightSelectionRange(1); } else - caret_position_++; + { + const auto selection = GetSelectedRange(); + if (selection.has_value()) + { + ClearSelection(); + caret_position_ = selection.value().position + selection.value().count; + } + else + caret_position_++; + } } - } - } + }); - void TextBox::OnCharCore(events::CharEventArgs& args) - { - Control::OnCharCore(args); - if (args.GetChar() == L'\b') + char_event.bubble.AddHandler([this](events::CharEventArgs& args) { - if (GetSelectedRange().has_value()) - { - const auto selection_range = GetSelectedRange().value(); - auto text = GetText(); - text.erase(text.cbegin() + selection_range.position, text.cbegin() + selection_range.position + selection_range.count); - SetText(text); - caret_position_ = selection_range.position; - ClearSelection(); - } - else + if (args.GetChar() == L'\b') { - if (caret_position_ > 0) + if (GetSelectedRange().has_value()) { + const auto selection_range = GetSelectedRange().value(); auto text = GetText(); - if (!text.empty()) + text.erase(text.cbegin() + selection_range.position, text.cbegin() + selection_range.position + selection_range.count); + SetText(text); + caret_position_ = selection_range.position; + ClearSelection(); + } + else + { + if (caret_position_ > 0) { - const auto position = --caret_position_; - text.erase(text.cbegin() + position); - SetText(text); + auto text = GetText(); + if (!text.empty()) + { + const auto position = --caret_position_; + text.erase(text.cbegin() + position); + SetText(text); + } } } + return; } - return; - } - if (std::iswprint(args.GetChar())) - { - if (GetSelectedRange().has_value()) - { - const auto selection_range = GetSelectedRange().value(); - auto text = GetText(); - text.erase(selection_range.position, selection_range.count); - text.insert(text.cbegin() + selection_range.position, args.GetChar()); - SetText(text); - caret_position_ = selection_range.position + 1; - ClearSelection(); - } - else + if (std::iswprint(args.GetChar())) { - ClearSelection(); - const auto position = caret_position_++; - auto text = GetText(); - text.insert(text.cbegin() + position, { args.GetChar() }); - SetText(text); + if (GetSelectedRange().has_value()) + { + const auto selection_range = GetSelectedRange().value(); + auto text = GetText(); + text.erase(selection_range.position, selection_range.count); + text.insert(text.cbegin() + selection_range.position, args.GetChar()); + SetText(text); + caret_position_ = selection_range.position + 1; + ClearSelection(); + } + else + { + ClearSelection(); + const auto position = caret_position_++; + auto text = GetText(); + text.insert(text.cbegin() + position, { args.GetChar() }); + SetText(text); + } } - } + }); + } + + TextBox::~TextBox() = default; + + StringView TextBox::GetControlType() const + { + return control_type; } void TextBox::RequestChangeCaretPosition(const unsigned position) -- cgit v1.2.3 From b4571d0ddad966efcc6e305f5d7e79cd593a2b25 Mon Sep 17 00:00:00 2001 From: crupest Date: Wed, 28 Nov 2018 19:25:35 +0800 Subject: Change some routed events handlers in subcontrols. --- src/ui/controls/list_item.cpp | 6 +++--- src/ui/controls/scroll_control.cpp | 13 ++++++++++--- src/ui/controls/text_box.cpp | 4 ++-- src/ui/controls/text_control.cpp | 2 +- 4 files changed, 16 insertions(+), 9 deletions(-) (limited to 'src/ui/controls/text_box.cpp') diff --git a/src/ui/controls/list_item.cpp b/src/ui/controls/list_item.cpp index 92f8750f..8234da30 100644 --- a/src/ui/controls/list_item.cpp +++ b/src/ui/controls/list_item.cpp @@ -24,7 +24,7 @@ namespace cru::ui::controls device_context->DrawRectangle(Convert(rect.Shrink(Thickness(0.5))), brushes_[state_].border_brush.Get(), 1); }); - mouse_enter_event.bubble.AddHandler([this](events::MouseEventArgs& args) + mouse_enter_event.direct.AddHandler([this](events::MouseEventArgs& args) { if (GetState() == State::Select) return; @@ -35,7 +35,7 @@ namespace cru::ui::controls SetState(State::Hover); }); - mouse_leave_event.bubble.AddHandler([this](events::MouseEventArgs& args) + mouse_leave_event.direct.AddHandler([this](events::MouseEventArgs& args) { if (GetState() == State::Select) return; @@ -43,7 +43,7 @@ namespace cru::ui::controls SetState(State::Normal); }); - mouse_click_event.bubble.AddHandler([this](events::MouseButtonEventArgs& args) + mouse_click_event.direct.AddHandler([this](events::MouseButtonEventArgs& args) { if (args.GetMouseButton() == MouseButton::Left) SetState(State::Select); diff --git a/src/ui/controls/scroll_control.cpp b/src/ui/controls/scroll_control.cpp index 07715892..9681924d 100644 --- a/src/ui/controls/scroll_control.cpp +++ b/src/ui/controls/scroll_control.cpp @@ -62,7 +62,7 @@ namespace cru::ui::controls } }); - mouse_down_event.bubble.AddHandler([this](events::MouseButtonEventArgs& args) + mouse_down_event.tunnel.AddHandler([this](events::MouseButtonEventArgs& args) { if (args.GetMouseButton() == MouseButton::Left) { @@ -72,6 +72,7 @@ namespace cru::ui::controls GetWindow()->CaptureMouseFor(this); is_pressing_scroll_bar_ = Orientation::Vertical; pressing_delta_ = point.y - vertical_bar_info_.bar.top; + args.SetHandled(); return; } @@ -80,12 +81,13 @@ namespace cru::ui::controls GetWindow()->CaptureMouseFor(this); pressing_delta_ = point.x - horizontal_bar_info_.bar.left; is_pressing_scroll_bar_ = Orientation::Horizontal; + args.SetHandled(); return; } } }); - mouse_move_event.bubble.AddHandler([this](events::MouseEventArgs& args) + mouse_move_event.tunnel.AddHandler([this](events::MouseEventArgs& args) { const auto mouse_point = args.GetPoint(this); @@ -94,6 +96,7 @@ namespace cru::ui::controls const auto new_head_position = mouse_point.x - pressing_delta_; const auto new_offset = new_head_position / horizontal_bar_info_.border.width * view_width_; SetScrollOffset(new_offset, std::nullopt); + args.SetHandled(); return; } @@ -102,16 +105,18 @@ namespace cru::ui::controls const auto new_head_position = mouse_point.y - pressing_delta_; const auto new_offset = new_head_position / vertical_bar_info_.border.height * view_height_; SetScrollOffset(std::nullopt, new_offset); + args.SetHandled(); return; } }); - mouse_up_event.bubble.AddHandler([this](events::MouseButtonEventArgs& args) + mouse_up_event.tunnel.AddHandler([this](events::MouseButtonEventArgs& args) { if (args.GetMouseButton() == MouseButton::Left && is_pressing_scroll_bar_.has_value()) { GetWindow()->ReleaseCurrentMouseCapture(); is_pressing_scroll_bar_ = std::nullopt; + args.SetHandled(); } }); @@ -126,12 +131,14 @@ namespace cru::ui::controls if (IsVerticalScrollEnabled() && GetScrollOffsetY() != (args.GetDelta() > 0.0f ? 0.0f : AtLeast0(GetViewHeight() - content_rect.height))) { SetScrollOffset(std::nullopt, GetScrollOffsetY() - args.GetDelta() / WHEEL_DELTA * view_delta); + args.SetHandled(); return; } if (IsHorizontalScrollEnabled() && GetScrollOffsetX() != (args.GetDelta() > 0.0f ? 0.0f : AtLeast0(GetViewWidth() - content_rect.width))) { SetScrollOffset(GetScrollOffsetX() - args.GetDelta() / WHEEL_DELTA * view_delta, std::nullopt); + args.SetHandled(); return; } }); diff --git a/src/ui/controls/text_box.cpp b/src/ui/controls/text_box.cpp index 28e1053d..893d6e8d 100644 --- a/src/ui/controls/text_box.cpp +++ b/src/ui/controls/text_box.cpp @@ -34,7 +34,7 @@ namespace cru::ui::controls } }); - get_focus_event.bubble.AddHandler([this](events::FocusChangeEventArgs& args) + get_focus_event.direct.AddHandler([this](events::FocusChangeEventArgs& args) { assert(!caret_timer_.has_value()); is_caret_show_ = true; @@ -45,7 +45,7 @@ namespace cru::ui::controls }); }); - lose_focus_event.bubble.AddHandler([this](events::FocusChangeEventArgs& args) + lose_focus_event.direct.AddHandler([this](events::FocusChangeEventArgs& args) { assert(caret_timer_.has_value()); caret_timer_->Cancel(); diff --git a/src/ui/controls/text_control.cpp b/src/ui/controls/text_control.cpp index 71a167e2..f32c068f 100644 --- a/src/ui/controls/text_control.cpp +++ b/src/ui/controls/text_control.cpp @@ -110,7 +110,7 @@ namespace cru::ui::controls } }); - lose_focus_event.bubble.AddHandler([this](events::FocusChangeEventArgs& args) + lose_focus_event.direct.AddHandler([this](events::FocusChangeEventArgs& args) { if (is_selecting_) { -- cgit v1.2.3