ai: remove edit feature

This commit is contained in:
Emil Lerch 2026-03-19 12:12:48 -07:00
parent 4a3df7a05b
commit 8124ca0e88
Signed by: lobo
GPG key ID: A7B62D657EF764F8
2 changed files with 21 additions and 100 deletions

View file

@ -300,8 +300,6 @@ pub const App = struct {
// ETF profile (loaded lazily on quote tab) // ETF profile (loaded lazily on quote tab)
etf_profile: ?zfin.EtfProfile = null, etf_profile: ?zfin.EtfProfile = null,
etf_loaded: bool = false, etf_loaded: bool = false,
// Signal to the run loop to launch $EDITOR then restart
wants_edit: bool = false,
// Analysis tab state // Analysis tab state
analysis_result: ?zfin.analysis.AnalysisResult = null, analysis_result: ?zfin.analysis.AnalysisResult = null,
analysis_loaded: bool = false, analysis_loaded: bool = false,
@ -639,15 +637,6 @@ pub const App = struct {
self.scroll_offset = 0; self.scroll_offset = 0;
return ctx.consumeAndRedraw(); return ctx.consumeAndRedraw();
}, },
.edit => {
if (self.portfolio_path != null or self.watchlist_path != null) {
self.wants_edit = true;
ctx.quit = true;
} else {
self.setStatus("No portfolio or watchlist file to edit");
return ctx.consumeAndRedraw();
}
},
.reload_portfolio => { .reload_portfolio => {
self.reloadPortfolioFile(); self.reloadPortfolioFile();
return ctx.consumeAndRedraw(); return ctx.consumeAndRedraw();
@ -1245,38 +1234,6 @@ pub const App = struct {
if (self.account_map) |*am| am.deinit(); if (self.account_map) |*am| am.deinit();
} }
fn reloadFiles(self: *App) void {
// Reload portfolio
if (self.portfolio) |*pf| pf.deinit();
self.portfolio = null;
if (self.portfolio_path) |path| {
const file_data = std.fs.cwd().readFileAlloc(self.allocator, path, 10 * 1024 * 1024) catch null;
if (file_data) |d| {
defer self.allocator.free(d);
if (zfin.cache.deserializePortfolio(self.allocator, d)) |pf| {
self.portfolio = pf;
} else |_| {}
}
}
// Reload watchlist
freeWatchlist(self.allocator, self.watchlist);
self.watchlist = null;
if (self.watchlist_path) |path| {
self.watchlist = loadWatchlist(self.allocator, path);
}
// Reset portfolio view state
self.portfolio_loaded = false;
self.freePortfolioSummary();
self.expanded = [_]bool{false} ** 64;
self.cursor = 0;
self.scroll_offset = 0;
self.portfolio_rows.clearRetainingCapacity();
}
/// Reload portfolio file from disk without re-fetching prices.
/// Uses cached candle data to recompute summary.
fn reloadPortfolioFile(self: *App) void { fn reloadPortfolioFile(self: *App) void {
portfolio_tab.reloadPortfolioFile(self); portfolio_tab.reloadPortfolioFile(self);
} }
@ -1522,11 +1479,11 @@ pub const App = struct {
"Tab 5", "Tab 6", "Scroll down", "Scroll up", "Tab 5", "Tab 6", "Scroll down", "Scroll up",
"Scroll to top", "Scroll to bottom", "Page down", "Page up", "Scroll to top", "Scroll to bottom", "Page down", "Page up",
"Select next", "Select prev", "Expand/collapse", "Select symbol", "Select next", "Select prev", "Expand/collapse", "Select symbol",
"Change symbol (search)", "This help", "Edit portfolio/watchlist", "Reload portfolio from disk", "Change symbol (search)", "This help", "Reload portfolio from disk", "Toggle all calls (options)",
"Toggle all calls (options)", "Toggle all puts (options)", "Filter +/- 1 NTM", "Filter +/- 2 NTM", "Toggle all puts (options)", "Filter +/- 1 NTM", "Filter +/- 2 NTM", "Filter +/- 3 NTM",
"Filter +/- 3 NTM", "Filter +/- 4 NTM", "Filter +/- 5 NTM", "Filter +/- 6 NTM", "Filter +/- 4 NTM", "Filter +/- 5 NTM", "Filter +/- 6 NTM", "Filter +/- 7 NTM",
"Filter +/- 7 NTM", "Filter +/- 8 NTM", "Filter +/- 9 NTM", "Chart: next timeframe", "Filter +/- 8 NTM", "Filter +/- 9 NTM", "Chart: next timeframe", "Chart: prev timeframe",
"Chart: prev timeframe", "Sort: next column", "Sort: prev column", "Sort: reverse order", "Sort: next column", "Sort: prev column", "Sort: reverse order",
}; };
for (actions, 0..) |action, ai| { for (actions, 0..) |action, ai| {
@ -1947,7 +1904,6 @@ pub fn run(allocator: std.mem.Allocator, config: zfin.Config, args: []const []co
defer freeWatchlist(allocator, app_inst.watchlist); defer freeWatchlist(allocator, app_inst.watchlist);
defer app_inst.deinitData(); defer app_inst.deinitData();
while (true) {
{ {
var vx_app = try vaxis.vxfw.App.init(allocator); var vx_app = try vaxis.vxfw.App.init(allocator);
defer vx_app.deinit(); defer vx_app.deinit();
@ -1962,39 +1918,6 @@ pub fn run(allocator: std.mem.Allocator, config: zfin.Config, args: []const []co
} }
try vx_app.run(app_inst.widget(), .{}); try vx_app.run(app_inst.widget(), .{});
} }
// vx_app is fully torn down here (terminal restored to cooked mode)
if (!app_inst.wants_edit) break;
app_inst.wants_edit = false;
launchEditor(allocator, app_inst.portfolio_path, app_inst.watchlist_path);
app_inst.reloadFiles();
app_inst.active_tab = .portfolio;
}
}
/// Launch $EDITOR on the portfolio and/or watchlist files.
fn launchEditor(allocator: std.mem.Allocator, portfolio_path: ?[]const u8, watchlist_path: ?[]const u8) void {
const editor = std.posix.getenv("EDITOR") orelse std.posix.getenv("VISUAL") orelse "vi";
var argv_buf: [4][]const u8 = undefined;
var argc: usize = 0;
argv_buf[argc] = editor;
argc += 1;
if (portfolio_path) |p| {
argv_buf[argc] = p;
argc += 1;
}
if (watchlist_path) |p| {
argv_buf[argc] = p;
argc += 1;
}
const argv = argv_buf[0..argc];
var child = std.process.Child.init(argv, allocator);
child.spawn() catch return;
_ = child.wait() catch {};
} }
// Tests // Tests

View file

@ -25,7 +25,6 @@ pub const Action = enum {
select_symbol, select_symbol,
symbol_input, symbol_input,
help, help,
edit,
reload_portfolio, reload_portfolio,
collapse_all_calls, collapse_all_calls,
collapse_all_puts, collapse_all_puts,
@ -108,7 +107,6 @@ const default_bindings = [_]Binding{
.{ .action = .select_symbol, .key = .{ .codepoint = 's' } }, .{ .action = .select_symbol, .key = .{ .codepoint = 's' } },
.{ .action = .symbol_input, .key = .{ .codepoint = '/' } }, .{ .action = .symbol_input, .key = .{ .codepoint = '/' } },
.{ .action = .help, .key = .{ .codepoint = '?' } }, .{ .action = .help, .key = .{ .codepoint = '?' } },
.{ .action = .edit, .key = .{ .codepoint = 'e' } },
.{ .action = .reload_portfolio, .key = .{ .codepoint = 'R' } }, .{ .action = .reload_portfolio, .key = .{ .codepoint = 'R' } },
.{ .action = .collapse_all_calls, .key = .{ .codepoint = 'c' } }, .{ .action = .collapse_all_calls, .key = .{ .codepoint = 'c' } },
.{ .action = .collapse_all_puts, .key = .{ .codepoint = 'p' } }, .{ .action = .collapse_all_puts, .key = .{ .codepoint = 'p' } },