diff options
Diffstat (limited to 'src/panes.zig')
| -rw-r--r-- | src/panes.zig | 29 |
1 files changed, 27 insertions, 2 deletions
diff --git a/src/panes.zig b/src/panes.zig index ea733ea1..a66d8e21 100644 --- a/src/panes.zig +++ b/src/panes.zig @@ -2129,6 +2129,7 @@ pub const Output = struct { query: lsp.Kind, search, errors, + pdf_links, }; pub const max_arg = dump.max_origin_arg; @@ -2237,6 +2238,7 @@ pub const Output = struct { // rows are `location text`, so n/N walk them .search => .{ .name = config.search_buffer, .steps = true }, .errors => .{ .name = config.errors_buffer, .doc = true }, + .pdf_links => .{ .name = config.pdf_links_buffer, .steps = true }, .cmd => |b| builtins.registry.outputTraits(b) orelse unreachable, .query => |k| switch (k) { .hover => .{ .name = config.hover_buffer }, @@ -2285,6 +2287,7 @@ pub const Output = struct { .query => |k| @tagName(k), .search => "/", .errors => config.errors_buffer, + .pdf_links => config.pdf_links_buffer, }; } @@ -2292,6 +2295,7 @@ pub const Output = struct { if (w.len == 0) return null; if (std.mem.eql(u8, w, "/")) return .search; if (std.mem.eql(u8, w, config.errors_buffer)) return .errors; + if (std.mem.eql(u8, w, config.pdf_links_buffer)) return .pdf_links; if (std.meta.stringToEnum(Builtin, w)) |b| if (builtins.registry.outputTraits(b) != null) return .{ .cmd = b }; if (std.meta.stringToEnum(lsp.Kind, w)) |k| return .{ .query = k }; @@ -2354,7 +2358,7 @@ pub const Output = struct { => {}, else => return anchor, }, - .errors => return anchor, + .errors, .pdf_links => return anchor, } if (content.len == 0) return anchor; const path_only = std.meta.eql(from, Origin{ .cmd = .Find }); @@ -2477,6 +2481,7 @@ pub const Output = struct { } } const format_locations = traits(from).steps and !traits(from).commands and + from != .pdf_links and !std.meta.eql(from, Origin{ .cmd = .Find }) and !std.meta.eql(from, Origin{ .query = .completion }); if (format_locations) { @@ -4941,8 +4946,10 @@ pub const Pdf = struct { page: usize, quads: []pdf.Quad, text: []u8, + link: ?pdf.Link = null, pub fn deinit(probe: *@This(), gpa: std.mem.Allocator) void { + if (probe.link) |*link| link.deinit(gpa); gpa.free(probe.quads); gpa.free(probe.text); probe.* = undefined; @@ -5427,6 +5434,23 @@ pub const Pdf = struct { const page = nativePageAtGridRow(core, pane, row) orelse return null; const point = panePointAtPage(core, pane, page, col, row, false) orelse return null; const state = &(pane.pdf orelse return null); + if (state.document.linkAt(core.pdf_gpa, page, point) catch null) |found| { + var link = found; + if (core.pdfLinkLocation(pane, link) != null) { + const quads = core.pdf_gpa.alloc(pdf.Quad, 1) catch { + link.deinit(core.pdf_gpa); + return null; + }; + const text = state.document.copyRectangle(core.pdf_gpa, page, link.quad) catch { + core.pdf_gpa.free(quads); + link.deinit(core.pdf_gpa); + return null; + }; + quads[0] = link.quad; + return .{ .page = page, .quads = quads, .text = text, .link = link }; + } + link.deinit(core.pdf_gpa); + } return probeWord(&state.document, core.pdf_gpa, page, point) catch null; } @@ -5618,11 +5642,12 @@ pub const Pdf = struct { else &.{}; const hover_page = if (hover_quads.len > 0) core.pdf_hover_preview.?.probe.page else null; + const link_hover = hover_quads.len > 0 and core.pdf_hover_preview.?.probe.link != null; const selection_color = core.theme().sel_bg; return .{ .hover_quads = hover_quads, .hover_page = hover_page, - .hover_color = selection_color, + .hover_color = if (link_hover) core.theme().box else selection_color, .selection_color = selection_color, }; } |
