processEvent
Parameters
- self:*MenuWidget
- *MenuWidget
- e:*Event
- *Event
Source
Implementation
pub fn processEvent(self: *MenuWidget, e: *Event) void {
switch (e.evt) {
.mouse => |me| {
if (me.action == .position) {
if (dvui.mouseTotalMotion().nonZero()) {
if (dvui.dataGet(null, self.data().id, "_child_popup", ?Rect.Physical) orelse null) |r| {
const center = Point.Physical{ .x = r.x + r.w / 2, .y = r.y + r.h / 2 };
const cw = dvui.currentWindow();
const to_center = center.diff(cw.mouse_pt_prev);
const movement = cw.mouse_pt.diff(cw.mouse_pt_prev);
const dot_prod = movement.x * to_center.x + movement.y * to_center.y;
const cos = dot_prod / (to_center.length() * movement.length());
if (std.math.acos(cos) < std.math.pi / 3.0) {
// there is an existing submenu and motion is
// towards the popup, so eat this event to
// prevent any menu items from focusing
e.handle(@src(), self.data());
}
}
}
if (self.mouse_mode and !e.handled) {
self.mouse_over = true;
}
}
},
else => {},
}
}