feat: add mouse hover support to editor in jump mode
This commit is contained in:
parent
d5494c492b
commit
1391372174
1 changed files with 43 additions and 6 deletions
|
@ -3491,9 +3491,19 @@ pub const Editor = struct {
|
|||
}
|
||||
|
||||
pub fn hover(self: *Self, _: Context) Result {
|
||||
const file_path = self.file_path orelse return;
|
||||
const primary = self.get_primary();
|
||||
return project_manager.hover(file_path, primary.cursor.row, primary.cursor.col);
|
||||
return self.hover_at(primary.cursor.row, primary.cursor.col);
|
||||
}
|
||||
|
||||
pub fn hover_at_abs(self: *Self, y: usize, x: usize) Result {
|
||||
const row: usize = self.view.row + y;
|
||||
const col: usize = self.view.col + x;
|
||||
return self.hover_at(row, col);
|
||||
}
|
||||
|
||||
pub fn hover_at(self: *Self, row: usize, col: usize) Result {
|
||||
const file_path = self.file_path orelse return;
|
||||
return project_manager.hover(file_path, row, col);
|
||||
}
|
||||
|
||||
pub fn add_diagnostic(
|
||||
|
@ -3738,6 +3748,9 @@ pub const EditorWidget = struct {
|
|||
last_btn_count: usize = 0,
|
||||
|
||||
hover: bool = false,
|
||||
hover_timer: ?tp.Cancellable = null,
|
||||
hover_x: c_int = -1,
|
||||
hover_y: c_int = -1,
|
||||
|
||||
const Self = @This();
|
||||
const Commands = command.Collection(Editor);
|
||||
|
@ -3769,6 +3782,7 @@ pub const EditorWidget = struct {
|
|||
}
|
||||
|
||||
pub fn deinit(self: *Self, allocator: Allocator) void {
|
||||
self.update_hover_timer(.cancel);
|
||||
self.commands.deinit();
|
||||
self.editor.deinit();
|
||||
self.plane.deinit();
|
||||
|
@ -3797,7 +3811,11 @@ pub const EditorWidget = struct {
|
|||
var pos: u32 = 0;
|
||||
var bytes: []u8 = "";
|
||||
|
||||
if (try m.match(.{ "B", tp.extract(&evtype), tp.extract(&btn), tp.any, tp.extract(&x), tp.extract(&y), tp.extract(&xpx), tp.extract(&ypx) })) {
|
||||
if (try m.match(.{ "M", tp.extract(&x), tp.extract(&y), tp.extract(&xpx), tp.extract(&ypx) })) {
|
||||
self.hover_y, self.hover_x = self.editor.plane.abs_yx_to_rel(y, x);
|
||||
if (self.editor.jump_mode)
|
||||
self.update_hover_timer(.init);
|
||||
} else if (try m.match(.{ "B", tp.extract(&evtype), tp.extract(&btn), tp.any, tp.extract(&x), tp.extract(&y), tp.extract(&xpx), tp.extract(&ypx) })) {
|
||||
try self.mouse_click_event(evtype, btn, y, x, ypx, xpx);
|
||||
} else if (try m.match(.{ "D", tp.extract(&evtype), tp.extract(&btn), tp.any, tp.extract(&x), tp.extract(&y), tp.extract(&xpx), tp.extract(&ypx) })) {
|
||||
try self.mouse_drag_event(evtype, btn, y, x, ypx, xpx);
|
||||
|
@ -3812,10 +3830,17 @@ pub const EditorWidget = struct {
|
|||
} else if (try m.match(.{ "A", tp.more })) {
|
||||
self.editor.add_match(m) catch {};
|
||||
} else if (try m.match(.{ "H", tp.extract(&self.hover) })) {
|
||||
if (self.editor.jump_mode)
|
||||
tui.current().rdr.request_mouse_cursor_pointer(self.hover)
|
||||
else
|
||||
if (self.editor.jump_mode) {
|
||||
self.update_hover_timer(.init);
|
||||
tui.current().rdr.request_mouse_cursor_pointer(self.hover);
|
||||
} else {
|
||||
self.update_hover_timer(.cancel);
|
||||
tui.current().rdr.request_mouse_cursor_text(self.hover);
|
||||
}
|
||||
} else if (try m.match(.{"HOVER"})) {
|
||||
self.update_hover_timer(.fired);
|
||||
if (self.hover_y >= 0 and self.hover_x >= 0)
|
||||
try self.editor.hover_at_abs(@intCast(self.hover_y), @intCast(self.hover_x));
|
||||
} else if (try m.match(.{ "show_whitespace", tp.extract(&self.editor.show_whitespace) })) {
|
||||
_ = "";
|
||||
} else {
|
||||
|
@ -3824,6 +3849,18 @@ pub const EditorWidget = struct {
|
|||
return true;
|
||||
}
|
||||
|
||||
fn update_hover_timer(self: *Self, event: enum { init, fired, cancel }) void {
|
||||
if (self.hover_timer) |*t| {
|
||||
if (event != .fired) t.cancel() catch {};
|
||||
t.deinit();
|
||||
self.hover_timer = null;
|
||||
}
|
||||
if (event == .init) {
|
||||
const delay_us: u64 = std.time.us_per_ms * 100;
|
||||
self.hover_timer = tp.self_pid().delay_send_cancellable(self.editor.allocator, "editor.hover_timer", delay_us, .{"HOVER"}) catch null;
|
||||
}
|
||||
}
|
||||
|
||||
const Result = command.Result;
|
||||
|
||||
fn mouse_click_event(self: *Self, evtype: c_int, btn: c_int, y: c_int, x: c_int, ypx: c_int, xpx: c_int) Result {
|
||||
|
|
Loading…
Add table
Reference in a new issue