summaryrefslogtreecommitdiff
path: root/src/panes.zig
diff options
context:
space:
mode:
authorGabriel Schneider <[email protected]>2026-09-15 13:46:50 -0300
committerGabriel Schneider <[email protected]>2026-09-15 17:24:42 -0300
commit6d7b506c8a380e4dd97f337590ca079d810a360a (patch)
tree71075c8c4383df25c6ecd5140ef75063a897b444 /src/panes.zig
parent13d0d107a06d7ac5fb5f8e86c747e54603f51b4e (diff)
downloadpardes-6d7b506c8a380e4dd97f337590ca079d810a360a.tar.gz
pardes-6d7b506c8a380e4dd97f337590ca079d810a360a.zip
Follow embedded PDF links through Look
Diffstat (limited to 'src/panes.zig')
-rw-r--r--src/panes.zig29
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,
};
}