package upd tui

This commit is contained in:
mjallen18
2026-01-22 12:55:23 -06:00
parent 5fed9a649f
commit 1410f0fe25

View File

@@ -305,10 +305,86 @@ class PackagesScreen(ScreenBase):
while True:
self.stdscr.clear()
h, w = self.stdscr.getmaxyx()
self.stdscr.addstr(0, 0, "Packages (version.json)")
for i, (name, _path) in enumerate(self.packages[:h-3], start=0):
# Determine split layout
left_w = max(30, min(60, w // 3))
right_x = left_w + 1
right_w = max(0, w - right_x)
# Left pane: package list
self.stdscr.addstr(0, 0, "Packages (version.json)"[:max(0, left_w-1)])
max_rows = h - 3
for i, (name, _path) in enumerate(self.packages[:max_rows], start=0):
sel = ">" if i == self.idx else " "
self.stdscr.addstr(1+i, 0, f"{sel} {name}"[:w-1])
self.stdscr.addstr(1 + i, 0, f"{sel} {name}"[:max(0, left_w-1)])
# Right pane: preview of selected package (non-interactive summary)
if right_w >= 20 and self.packages:
try:
name, path = self.packages[self.idx]
self.stdscr.addstr(0, right_x, f"{name}"[:max(0, right_w-1)])
self.stdscr.addstr(1, right_x, f"{path}"[:max(0, right_w-1)])
self.stdscr.addstr(2, right_x, "Sources:"[:max(0, right_w-1)])
spec = load_json(path)
merged_vars, merged_srcs, _ = merged_view(spec, None)
snames = sorted(list(merged_srcs.keys()))
max_src_rows = max(0, h - 6)
for i2, sname in enumerate(snames[:max_src_rows], start=0):
comp = merged_srcs[sname]
fetcher = comp.get("fetcher", "none")
# Construct concise reference similar to detail view
display_ref = comp.get("tag") or comp.get("rev") or comp.get("version") or ""
if fetcher == "github":
rendered = render_templates(comp, merged_vars)
tag = rendered.get("tag")
rev = rendered.get("rev")
owner = (rendered.get("owner") or merged_vars.get("owner") or "")
repo = (rendered.get("repo") or merged_vars.get("repo") or "")
if tag and owner and repo:
display_ref = f"{owner}/{repo}@{tag}"
elif tag:
display_ref = tag
elif rev and owner and repo:
display_ref = f"{owner}/{repo}@{rev[:7]}"
elif rev:
display_ref = rev[:12]
elif fetcher == "url":
rendered = render_templates(comp, merged_vars)
url = rendered.get("url") or rendered.get("urlTemplate") or ""
if url:
owner = str(merged_vars.get("owner", "") or "")
repo = str(merged_vars.get("repo", "") or "")
rp = str(merged_vars.get("releasePrefix", "") or "")
rs = str(merged_vars.get("releaseSuffix", "") or "")
base = str(merged_vars.get("base", "") or "")
rel = str(merged_vars.get("release", "") or "")
tag = f"{rp}{base}-{rel}{rs}" if (base and rel) else ""
parsed = urlparse(url)
filename = os.path.basename(parsed.path) if parsed and parsed.path else ""
if owner and repo and tag and filename:
display_ref = f"{owner}/{repo}@{tag} · {filename}"
elif filename:
display_ref = filename
else:
display_ref = url
else:
display_ref = ""
# Truncate reference to fit right pane
if isinstance(display_ref, str):
max_ref = max(0, right_w - 30)
ref_short = (display_ref[:max_ref] + ("..." if len(display_ref) > max_ref else ""))
else:
ref_short = display_ref
self.stdscr.addstr(3 + i2, right_x, f"{sname:<20} {fetcher:<7} {ref_short}"[:max(0, right_w-1)])
# Hint line for workflow
hint = "Enter: open details | k/j: move | q: quit"
if h >= 5:
self.stdscr.addstr(h - 5, right_x, hint[:max(0, right_w-1)])
except Exception as e:
self.stdscr.addstr(2, right_x, f"Failed to load: {e}"[:max(0, right_w-1)])
self.draw_status(h, w)
self.stdscr.refresh()
ch = self.stdscr.getch()
@@ -661,6 +737,35 @@ class PackageDetailScreen(ScreenBase):
ref_short = display_ref if not isinstance(display_ref, str) else (display_ref[:60] + ("..." if len(display_ref) > 60 else ""))
sel = ">" if i == self.sidx else " "
self.stdscr.addstr(3+i, 0, f"{sel} {name:<20} {fetcher:<7} ref={ref_short}"[:w-1])
# Latest candidates section for selected component (auto-fetched)
if self.snames:
_sel_name = self.snames[self.sidx]
_comp = self.merged_srcs[_sel_name]
_fetcher = _comp.get("fetcher", "none")
# Preload candidates lazily for selected item
if _fetcher in ("github", "git", "url") and _sel_name not in self.candidates:
self.fetch_candidates_for(_sel_name)
y_latest = h - 6
if y_latest >= 3:
self.stdscr.addstr(y_latest, 0, "Latest:"[:w-1])
if _fetcher in ("github", "git"):
_cand = self.candidates.get(_sel_name, {})
_line = f" release={_cand.get('release') or '-'} tag={_cand.get('tag') or '-'} commit={( (_cand.get('commit') or '')[:12] ) or '-'}"
self.stdscr.addstr(y_latest+1, 0, _line[:w-1])
elif _fetcher == "url":
_cand_u = self.url_candidates.get(_sel_name, {}) or {}
_tag = _cand_u.get("tag") or (self.candidates.get(_sel_name, {}).get("release") or "-")
_line = f" tag={_tag} base={_cand_u.get('base') or '-'} release={_cand_u.get('release') or '-'}"
self.stdscr.addstr(y_latest+1, 0, _line[:w-1])
else:
if self.pkg_name == "linux-cachyos" and _sel_name == "linux":
_suffix = self.cachyos_suffix()
_latest = self.fetch_cachyos_linux_latest(_suffix)
self.stdscr.addstr(y_latest+1, 0, f" linux from PKGBUILD: {_latest or '-'}"[:w-1])
else:
self.stdscr.addstr(y_latest+1, 0, " -"[:w-1])
# Footer instructions
self.stdscr.addstr(h-4, 0, "Enter: component actions | r: refresh candidates | h: prefetch hash | e: edit field | s: save | Backspace: back | q: quit")
self.draw_status(h, w)