ai: mouse clickable chart timeframes

This commit is contained in:
Emil Lerch 2026-02-26 15:52:08 -08:00
parent 5aed55665c
commit 6b06b97061
Signed by: lobo
GPG key ID: A7B62D657EF764F8

View file

@ -286,6 +286,7 @@ const App = struct {
chart_symbol: [16]u8 = undefined, // symbol the chart was rendered for chart_symbol: [16]u8 = undefined, // symbol the chart was rendered for
chart_symbol_len: usize = 0, chart_symbol_len: usize = 0,
chart_timeframe_rendered: ?chart_mod.Timeframe = null, // timeframe the chart was rendered for chart_timeframe_rendered: ?chart_mod.Timeframe = null, // timeframe the chart was rendered for
chart_timeframe_row: ?usize = null, // screen row of the timeframe selector (for mouse clicks)
chart_dirty: bool = true, // needs re-render chart_dirty: bool = true, // needs re-render
chart_price_min: f64 = 0, chart_price_min: f64 = 0,
chart_price_max: f64 = 0, chart_price_max: f64 = 0,
@ -408,6 +409,35 @@ const App = struct {
} }
} }
} }
// Quote tab: click on timeframe selector to switch timeframes
if (self.active_tab == .quote and mouse.row > 0) {
if (self.chart_timeframe_row) |tf_row| {
const content_row = @as(usize, @intCast(mouse.row)) + self.scroll_offset;
if (content_row == tf_row) {
// " Chart: [6M] YTD 1Y 3Y 5Y ([ ] to change)"
// Prefix " Chart: " = 9 chars, then each TF takes label_len+2 (brackets/spaces) + 1 gap
const col = @as(usize, @intCast(mouse.col));
const prefix_len: usize = 9; // " Chart: "
if (col >= prefix_len) {
const timeframes = [_]chart_mod.Timeframe{ .@"6M", .ytd, .@"1Y", .@"3Y", .@"5Y" };
var x: usize = prefix_len;
for (timeframes) |tf| {
const lbl_len = tf.label().len;
const slot_width = lbl_len + 2 + 1; // [XX] + space or XX + space
if (col >= x and col < x + slot_width) {
if (tf != self.chart_timeframe) {
self.chart_timeframe = tf;
self.setStatus(tf.label());
return ctx.consumeAndRedraw();
}
break;
}
x += slot_width;
}
}
}
}
}
// Options tab: single-click to select and expand/collapse // Options tab: single-click to select and expand/collapse
if (self.active_tab == .options and mouse.row > 0) { if (self.active_tab == .options and mouse.row > 0) {
const content_row = @as(usize, @intCast(mouse.row)) + self.scroll_offset; const content_row = @as(usize, @intCast(mouse.row)) + self.scroll_offset;
@ -2472,6 +2502,7 @@ const App = struct {
const hint = " ([ ] to change)"; const hint = " ([ ] to change)";
@memcpy(tf_buf[tf_pos..][0..hint.len], hint); @memcpy(tf_buf[tf_pos..][0..hint.len], hint);
tf_pos += hint.len; tf_pos += hint.len;
self.chart_timeframe_row = lines.items.len; // track which row the timeframe line is on
try lines.append(arena, .{ .text = try arena.dupe(u8, tf_buf[0..tf_pos]), .style = th.mutedStyle() }); try lines.append(arena, .{ .text = try arena.dupe(u8, tf_buf[0..tf_pos]), .style = th.mutedStyle() });
} }