aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CruUI-Generate/cru_ui.cpp62
-rw-r--r--CruUI-Generate/cru_ui.hpp39
2 files changed, 99 insertions, 2 deletions
diff --git a/CruUI-Generate/cru_ui.cpp b/CruUI-Generate/cru_ui.cpp
index 043eef5d..afd588d6 100644
--- a/CruUI-Generate/cru_ui.cpp
+++ b/CruUI-Generate/cru_ui.cpp
@@ -1514,6 +1514,16 @@ namespace cru::ui
}
+ void Control::OnMouseWheel(events::MouseWheelEventArgs& args)
+ {
+
+ }
+
+ void Control::OnMouseWheelCore(events::MouseWheelEventArgs& args)
+ {
+
+ }
+
void Control::RaiseMouseEnterEvent(MouseEventArgs& args)
{
OnMouseEnterCore(args);
@@ -1556,6 +1566,13 @@ namespace cru::ui
mouse_click_event.Raise(args);
}
+ void Control::RaiseMouseWheelEvent(MouseWheelEventArgs& args)
+ {
+ OnMouseWheelCore(args);
+ OnMouseWheel(args);
+ mouse_wheel_event.Raise(args);
+ }
+
void Control::OnMouseClickBegin(MouseButton button)
{
@@ -2598,6 +2615,14 @@ namespace cru::ui
result = 0;
return true;
}
+ case WM_MOUSEWHEEL:
+ POINT point;
+ point.x = GET_X_LPARAM(l_param);
+ point.y = GET_Y_LPARAM(l_param);
+ ScreenToClient(hwnd, &point);
+ OnMouseWheelInternal(GET_WHEEL_DELTA_WPARAM(w_param), point);
+ result = 0;
+ return true;
case WM_KEYDOWN:
OnKeyDownInternal(static_cast<int>(w_param));
result = 0;
@@ -2908,6 +2933,20 @@ namespace cru::ui
DispatchEvent(control, &Control::RaiseMouseUpEvent, nullptr, dip_point, button);
}
+ void Window::OnMouseWheelInternal(short delta, POINT point)
+ {
+ const auto dip_point = PiToDip(point);
+
+ Control* control;
+
+ if (mouse_capture_control_)
+ control = mouse_capture_control_;
+ else
+ control = HitTest(dip_point);
+
+ DispatchEvent(control, &Control::RaiseMouseWheelEvent, nullptr, dip_point, static_cast<float>(delta));
+ }
+
void Window::OnKeyDownInternal(int virtual_code)
{
DispatchEvent(focus_control_, &Control::RaiseKeyDownEvent, nullptr, virtual_code);
@@ -3770,6 +3809,29 @@ namespace cru::ui::controls
}
}
+ void ScrollControl::OnMouseWheelCore(events::MouseWheelEventArgs& args)
+ {
+ Control::OnMouseWheelCore(args);
+
+ constexpr const auto view_delta = 30.0f;
+
+ if (args.GetDelta() == 0.0f)
+ return;
+
+ const auto content_rect = GetRect(RectRange::Content);
+ if (IsVerticalScrollEnabled() && GetScrollOffsetY() != (args.GetDelta() > 0.0f ? 0.0f : AtLeast0(GetViewHeight() - content_rect.height)))
+ {
+ SetScrollOffset(std::nullopt, GetScrollOffsetY() - args.GetDelta() / WHEEL_DELTA * view_delta);
+ 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);
+ return;
+ }
+ }
+
void ScrollControl::CoerceAndSetOffsets(const float offset_x, const float offset_y, const bool update_children)
{
const auto old_offset_x = offset_x_;
diff --git a/CruUI-Generate/cru_ui.hpp b/CruUI-Generate/cru_ui.hpp
index dc8c206e..6dff57cd 100644
--- a/CruUI-Generate/cru_ui.hpp
+++ b/CruUI-Generate/cru_ui.hpp
@@ -1158,6 +1158,30 @@ namespace cru::ui::events
};
+ class MouseWheelEventArgs : public MouseEventArgs
+ {
+ public:
+ MouseWheelEventArgs(Object* sender, Object* original_sender, const Point& point, const float delta)
+ : MouseEventArgs(sender, original_sender, point), delta_(delta)
+ {
+
+ }
+ MouseWheelEventArgs(const MouseWheelEventArgs& other) = default;
+ MouseWheelEventArgs(MouseWheelEventArgs&& other) = default;
+ MouseWheelEventArgs& operator=(const MouseWheelEventArgs& other) = default;
+ MouseWheelEventArgs& operator=(MouseWheelEventArgs&& other) = default;
+ ~MouseWheelEventArgs() override = default;
+
+ float GetDelta() const
+ {
+ return delta_;
+ }
+
+ private:
+ float delta_;
+ };
+
+
class DrawEventArgs : public UiEventArgs
{
public:
@@ -1377,6 +1401,7 @@ namespace cru::ui::events
using UiEvent = Event<UiEventArgs>;
using MouseEvent = Event<MouseEventArgs>;
using MouseButtonEvent = Event<MouseButtonEventArgs>;
+ using MouseWheelEvent = Event<MouseWheelEventArgs>;
using DrawEvent = Event<DrawEventArgs>;
using PositionChangedEvent = Event<PositionChangedEventArgs>;
using SizeChangedEvent = Event<SizeChangedEventArgs>;
@@ -1769,6 +1794,8 @@ namespace cru::ui
//Raised when a mouse button is pressed in the control and released in the control with mouse not leaving it between two operations.
events::MouseButtonEvent mouse_click_event;
+ events::MouseWheelEvent mouse_wheel_event;
+
events::KeyEvent key_down_event;
events::KeyEvent key_up_event;
events::CharEvent char_event;
@@ -1842,6 +1869,9 @@ namespace cru::ui
virtual void OnMouseUpCore(events::MouseButtonEventArgs& args);
virtual void OnMouseClickCore(events::MouseButtonEventArgs& args);
+ virtual void OnMouseWheel(events::MouseWheelEventArgs& args);
+ virtual void OnMouseWheelCore(events::MouseWheelEventArgs& args);
+
void RaiseMouseEnterEvent(events::MouseEventArgs& args);
void RaiseMouseLeaveEvent(events::MouseEventArgs& args);
void RaiseMouseMoveEvent(events::MouseEventArgs& args);
@@ -1849,6 +1879,8 @@ namespace cru::ui
void RaiseMouseUpEvent(events::MouseButtonEventArgs& args);
void RaiseMouseClickEvent(events::MouseButtonEventArgs& args);
+ void RaiseMouseWheelEvent(events::MouseWheelEventArgs& args);
+
virtual void OnMouseClickBegin(MouseButton button);
virtual void OnMouseClickEnd(MouseButton button);
@@ -2257,7 +2289,8 @@ namespace cru::ui
void OnMouseLeaveInternal();
void OnMouseDownInternal(MouseButton button, POINT point);
void OnMouseUpInternal(MouseButton button, POINT point);
-
+
+ void OnMouseWheelInternal(short delta, POINT point);
void OnKeyDownInternal(int virtual_code);
void OnKeyUpInternal(int virtual_code);
void OnCharInternal(wchar_t c);
@@ -2895,7 +2928,7 @@ namespace cru::ui::controls
// Done: Draw(no need)
// Done: API
// Done: ScrollBar
- // TODO: MouseEvent
+ // Done: MouseEvent
class ScrollControl : public Control
{
private:
@@ -3007,6 +3040,8 @@ namespace cru::ui::controls
void OnMouseMoveCore(events::MouseEventArgs& args) override final;
void OnMouseUpCore(events::MouseButtonEventArgs& args) override final;
+ void OnMouseWheelCore(events::MouseWheelEventArgs& args) override;
+
private:
void CoerceAndSetOffsets(float offset_x, float offset_y, bool update_children = true);
void UpdateScrollBarVisibility();