From 920f1f010284d59bad86f78355ed90ac2f3e1d2c Mon Sep 17 00:00:00 2001 From: Benji Dial Date: Mon, 8 Mar 2021 16:46:22 -0500 Subject: mouse movement in raleigh, with colorpicker dragging example --- src/user/raleigh/w/button.cpp | 8 +++++++ src/user/raleigh/w/colorpicker.cpp | 46 ++++++++++++++++++++++++++++++++++++-- src/user/raleigh/w/padding.cpp | 8 +++++++ src/user/raleigh/w/vbox.cpp | 11 +++++++++ src/user/raleigh/widget.cpp | 1 + src/user/raleigh/window.cpp | 3 +++ 6 files changed, 75 insertions(+), 2 deletions(-) (limited to 'src/user/raleigh') diff --git a/src/user/raleigh/w/button.cpp b/src/user/raleigh/w/button.cpp index 2abf9a9..224b930 100644 --- a/src/user/raleigh/w/button.cpp +++ b/src/user/raleigh/w/button.cpp @@ -55,4 +55,12 @@ namespace raleigh { } void button::notify_has_opaque_parent(widget *parent) {} + + void button::on_mouse_move(coord window_coords) { + if ((window_coords.x >= inner.window_offset.x) && + (window_coords.y >= inner.window_offset.y) && + (window_coords.x < inner.window_offset.x + inner.size.x) && + (window_coords.y < inner.window_offset.y + inner.size.y)) + inner.on_mouse_move(window_coords); + } } \ No newline at end of file diff --git a/src/user/raleigh/w/colorpicker.cpp b/src/user/raleigh/w/colorpicker.cpp index faa720e..4ccd0ce 100644 --- a/src/user/raleigh/w/colorpicker.cpp +++ b/src/user/raleigh/w/colorpicker.cpp @@ -2,7 +2,8 @@ namespace raleigh { colorpicker::colorpicker(_pixel_t default_color, uint8_t resolution) - : picked_color(default_color), resolution(resolution), inv_res(256 / resolution) { + : picked_color(default_color), resolution(resolution), + inv_res(256 / resolution), selected(NO) { size = coord(inv_res * 2, inv_res * 2); closest_opaque = this; } @@ -32,19 +33,26 @@ namespace raleigh { } void colorpicker::handle_click(coord window_coords, enum mouse_packet::mouse_button click_type, bool up) { - if (up || (click_type != mouse_packet::LEFT)) + if (click_type != mouse_packet::LEFT) return; + if (up) { + selected = NO; + return; + } window_coords.x -= window_offset.x; window_coords.y -= window_offset.y; if ((window_coords.x < inv_res) && (window_coords.y < inv_res)) { + selected = R; picked_color.g = window_coords.x * resolution; picked_color.b = window_coords.y * resolution; } else if (window_coords.y < inv_res) { + selected = G; picked_color.b = (window_coords.x - inv_res) * resolution; picked_color.r = window_coords.y * resolution; } else if (window_coords.x < inv_res) { + selected = B; picked_color.r = window_coords.x * resolution; picked_color.g = (window_coords.y - inv_res) * resolution; } @@ -52,4 +60,38 @@ namespace raleigh { } void colorpicker::notify_has_opaque_parent(widget *parent) {} + + void colorpicker::on_mouse_move(coord window_coords) { + uint32_t x = window_coords.x - window_offset.x; + uint32_t y = window_coords.y - window_offset.y; + switch (selected) { + case NO: + return; + case R: + if (x >= inv_res) + x = inv_res - 1; + if (y >= inv_res) + y = inv_res - 1; + picked_color.g = x * resolution; + picked_color.b = y * resolution; + break; + case G: + if (x < inv_res) + x = inv_res; + if (y >= inv_res) + y = inv_res - 1; + picked_color.b = x * resolution; + picked_color.r = y * resolution; + break; + case B: + if (x >= inv_res) + x = inv_res - 1; + if (y < inv_res) + y = inv_res; + picked_color.r = x * resolution; + picked_color.g = y * resolution; + break; + } + w->notify_needs_paint(*this); + } } \ No newline at end of file diff --git a/src/user/raleigh/w/padding.cpp b/src/user/raleigh/w/padding.cpp index c1f7b85..782a8a9 100644 --- a/src/user/raleigh/w/padding.cpp +++ b/src/user/raleigh/w/padding.cpp @@ -34,4 +34,12 @@ namespace raleigh { void padding::notify_child_size_change(widget &child, coord old_size) { set_size(coord(inner.size.x + pad_by * 2, inner.size.y + pad_by * 2)); } + + void padding::on_mouse_move(coord window_coords) { + if ((window_coords.x >= inner.window_offset.x) && + (window_coords.y >= inner.window_offset.y) && + (window_coords.x < inner.window_offset.x + inner.size.x) && + (window_coords.y < inner.window_offset.y + inner.size.y)) + inner.on_mouse_move(window_coords); + } } \ No newline at end of file diff --git a/src/user/raleigh/w/vbox.cpp b/src/user/raleigh/w/vbox.cpp index 263da2a..77ce592 100644 --- a/src/user/raleigh/w/vbox.cpp +++ b/src/user/raleigh/w/vbox.cpp @@ -63,4 +63,15 @@ namespace raleigh { notify_window_change(); } } + + void vbox::on_mouse_move(coord window_coords) { + for (dllist::node *n = widgets.first; n; n = n->next) + if ((window_coords.x >= n->d.window_offset.x) && + (window_coords.y >= n->d.window_offset.y) && + (window_coords.x < n->d.window_offset.x + n->d.size.x) && + (window_coords.y < n->d.window_offset.y + n->d.size.y)) { + n->d.on_mouse_move(window_coords); + return; + } + } } \ No newline at end of file diff --git a/src/user/raleigh/widget.cpp b/src/user/raleigh/widget.cpp index 719cc06..0a47c3b 100644 --- a/src/user/raleigh/widget.cpp +++ b/src/user/raleigh/widget.cpp @@ -11,6 +11,7 @@ namespace raleigh { void widget::handle_key(struct key_packet kp) {} void widget::on_focus() {} void widget::on_unfocus() {} + void widget::on_mouse_move(coord window_coords) {} void widget::notify_child_size_change(widget &child, coord old_size) {} void widget::set_size(coord new_size) { diff --git a/src/user/raleigh/window.cpp b/src/user/raleigh/window.cpp index 5d1a3de..cb9f363 100644 --- a/src/user/raleigh/window.cpp +++ b/src/user/raleigh/window.cpp @@ -57,6 +57,8 @@ namespace raleigh { focussed->on_focus(); else if (wa.action_type == wa.FOCUS_LEAVE) focussed->on_unfocus(); + else if (wa.action_type == wa.MOUSE_MOVE) + root.on_mouse_move(coord(wa.moved_to.x, wa.moved_to.y)); } } @@ -78,6 +80,7 @@ namespace raleigh { if (handle) return; handle = _new_window(size.x, size.y, pixbuf); + _wants_mouse_moves(handle); if (!handle) show_error_and_quitf("Failed to get window handle for requested window."); open_windows.add_front(*this); -- cgit v1.2.3