From ebe561b8083782a105a2ee29fb0a031d1c2427d3 Mon Sep 17 00:00:00 2001 From: Gabriel Schneider Date: Tue, 15 Sep 2026 17:24:57 -0300 Subject: Keep column grips blank and muted in every focus state --- test/column_drag.zig | 37 +++++++++++++++++++++++++++++++++++++ test/web-snapshots/touch.mjs | 6 +++--- 2 files changed, 40 insertions(+), 3 deletions(-) (limited to 'test') diff --git a/test/column_drag.zig b/test/column_drag.zig index 341c8b70..1c9a344e 100644 --- a/test/column_drag.zig +++ b/test/column_drag.zig @@ -169,3 +169,40 @@ test "column grip is separate from compact text and the resize seam" { try std.testing.expect(p.drag == .border_v); p.update(.{ .mouse = .{ .button = .left, .kind = .release, .col = seam, .row = body_row } }); } + +test "column grips stay blank and muted across focus hover and drag" { + const p = try Pardes.init(std.testing.allocator, .{ .tty_only = true, .cols = 80, .rows = 20 }); + defer p.deinit(); + _ = try p.setTestFile("left\n"); + p.presentation.enabled = false; + p.settings.column_tags = true; + p.row_metrics = .{ .body_w = 10, .body_h = 20, .tagline_w = 5, .tagline_h = 10 }; + try std.testing.expect(p.executeBuiltinLine(0, "New")); + try std.testing.expect(layout.splitColumn(p, p.active, p.active, false)); + var frame = std.heap.ArenaAllocator.init(p.gpa); + defer frame.deinit(); + for ([_]bool{ false, true }) |focus_tint| { + p.settings.focus_tint = focus_tint; + for (0..p.ncol) |active_column| { + p.active = p.col_panes[active_column][0]; + const x = p.col_x[active_column]; + p.update(.{ .mouse = .{ .button = .none, .kind = .motion, .col = x, .row = pardes.TOPBAR_H } }); + for ([_]bool{ false, true }) |dragging| { + if (dragging) mouse(p, .press, x); + _ = frame.reset(.retain_capacity); + const surface = try p.render(frame.allocator()); + const muted: pardes.Color = .{ .rgb = p.chromeTheme().column_box_dim }; + for (0..p.ncol) |column| { + for (0..config.GUTTER) |offset| { + const cell = surface.at(p.col_x[column] + @as(u16, @intCast(offset)), pardes.TOPBAR_H); + try std.testing.expectEqualStrings(" ", cell.grapheme()); + try std.testing.expectEqual(muted, cell.style.bg); + try std.testing.expectEqual(pardes.FontRole.tagline, cell.style.font_role); + } + try std.testing.expectEqual(p.col_x[column] + config.GUTTER, (try tagLayer(p, column)).viewport.x); + } + if (dragging) mouse(p, .release, x); + } + } + } +} diff --git a/test/web-snapshots/touch.mjs b/test/web-snapshots/touch.mjs index 3820117e..b78cbdc0 100644 --- a/test/web-snapshots/touch.mjs +++ b/test/web-snapshots/touch.mjs @@ -100,7 +100,7 @@ export default async function ({ grid, touch, wait, stable, delay, evaluate, mou renderer.render(); const columnGrip=renderer.tagRoot.querySelector('[data-tag-grip]'); const marks=node=>[...node.children].map(mark=>[parseFloat(mark.style.left),parseFloat(mark.style.top),parseFloat(mark.style.width)]); - result.columnMarks=marks(columnGrip); + result.columnMarks=columnGrip ? marks(columnGrip) : []; tagValues[1]=2;tagValues[5]=1;bytes[40]=32;data.setUint32(48,0x778899,true); renderer.render(); result.paneMarks=marks(renderer.tagRoot.querySelector('[data-tag-grip]')); @@ -119,8 +119,8 @@ export default async function ({ grid, touch, wait, stable, delay, evaluate, mou gripVisible:"",covered:"hidden",background:"rgb(51, 68, 85)",cached:true,bgInvalidates:true}, "tag text uses its own columns after a fixed body-width grip, with cursor and cached base background"); - assert.deepEqual(compactGeometry.columnMarks,[[7,13,6],[7,16,6]]); - assert.deepEqual(compactGeometry.paneMarks,[[7,33,6],[7,36,6]],"pane and column handles share physical horizontal mark geometry"); + assert.deepEqual(compactGeometry.columnMarks,[],"column handles have no mark"); + assert.deepEqual(compactGeometry.paneMarks,[[7,33,6],[7,36,6]],"pane handles keep their physical mark geometry"); let frame = await grid(); assert.equal(tags(frame).length, 1); -- cgit v1.3