[lua] Add onmousemove/down/up events to canvas widget

At the moment very basic properties were added to the received event:
x, y, and button.
This commit is contained in:
David Capello 2022-12-14 22:13:49 -03:00
parent 25682a44d8
commit 0aaa9fdddf
3 changed files with 61 additions and 0 deletions

View File

@ -58,6 +58,32 @@ void Canvas::onInitTheme(ui::InitThemeEvent& ev)
setBgColor(bg);
}
bool Canvas::onProcessMessage(ui::Message* msg)
{
switch (msg->type()) {
case ui::kMouseMoveMessage: {
auto mouseMsg = static_cast<ui::MouseMessage*>(msg);
MouseMove(mouseMsg);
break;
}
case ui::kMouseDownMessage: {
auto mouseMsg = static_cast<ui::MouseMessage*>(msg);
MouseDown(mouseMsg);
break;
}
case ui::kMouseUpMessage: {
auto mouseMsg = static_cast<ui::MouseMessage*>(msg);
MouseUp(mouseMsg);
break;
}
}
return ui::Widget::onProcessMessage(msg);
}
void Canvas::onResize(ui::ResizeEvent& ev)
{
Widget::onResize(ev);

View File

@ -27,9 +27,13 @@ public:
void callPaint();
obs::signal<void(GraphicsContext&)> Paint;
obs::signal<void(ui::MouseMessage*)> MouseMove;
obs::signal<void(ui::MouseMessage*)> MouseDown;
obs::signal<void(ui::MouseMessage*)> MouseUp;
private:
void onInitTheme(ui::InitThemeEvent& ev) override;
bool onProcessMessage(ui::Message* msg) override;
void onResize(ui::ResizeEvent& ev) override;
void onPaint(ui::PaintEvent& ev) override;

View File

@ -32,6 +32,7 @@
#include "ui/grid.h"
#include "ui/label.h"
#include "ui/manager.h"
#include "ui/message.h"
#include "ui/separator.h"
#include "ui/slider.h"
#include "ui/window.h"
@ -923,6 +924,36 @@ int Dialog_canvas(lua_State* L)
});
}
lua_pop(L, 1);
auto mouseCallback =
[](lua_State* L, ui::MouseMessage* msg) {
lua_pushinteger(L, msg->position().x);
lua_setfield(L, -2, "x");
lua_pushinteger(L, msg->position().y);
lua_setfield(L, -2, "y");
lua_pushinteger(L, int(msg->button()));
lua_setfield(L, -2, "button");
};
type = lua_getfield(L, 2, "onmousemove");
if (type == LUA_TFUNCTION) {
Dialog_connect_signal(L, 1, widget->MouseMove, mouseCallback);
}
lua_pop(L, 1);
type = lua_getfield(L, 2, "onmousedown");
if (type == LUA_TFUNCTION) {
Dialog_connect_signal(L, 1, widget->MouseDown, mouseCallback);
}
lua_pop(L, 1);
type = lua_getfield(L, 2, "onmouseup");
if (type == LUA_TFUNCTION) {
Dialog_connect_signal(L, 1, widget->MouseUp, mouseCallback);
}
lua_pop(L, 1);
}
}