Guard dashboard help panel writes to avoid curses overflow
This commit is contained in:
@@ -457,18 +457,32 @@ class ReactorDashboard:
|
|||||||
self._draw_health_bars(right_win, right_y)
|
self._draw_health_bars(right_win, right_y)
|
||||||
|
|
||||||
def _draw_help_panel(self, win: "curses._CursesWindow") -> None:
|
def _draw_help_panel(self, win: "curses._CursesWindow") -> None:
|
||||||
|
def _add_safe(row: int, col: int, text: str, attr: int = 0) -> bool:
|
||||||
|
max_y, max_x = win.getmaxyx()
|
||||||
|
if row >= max_y - 1 or col >= max_x - 1:
|
||||||
|
return False
|
||||||
|
clipped = text[: max(0, max_x - col - 1)]
|
||||||
|
try:
|
||||||
|
win.addstr(row, col, clipped, attr)
|
||||||
|
except curses.error:
|
||||||
|
return False
|
||||||
|
return True
|
||||||
|
|
||||||
win.erase()
|
win.erase()
|
||||||
win.box()
|
win.box()
|
||||||
win.addstr(0, 2, " Controls ", curses.color_pair(1) | curses.A_BOLD)
|
_add_safe(0, 2, " Controls ", curses.color_pair(1) | curses.A_BOLD)
|
||||||
y = 2
|
y = 2
|
||||||
for title, entries in self.help_sections:
|
for title, entries in self.help_sections:
|
||||||
win.addstr(y, 2, title, curses.color_pair(1) | curses.A_BOLD)
|
if not _add_safe(y, 2, title, curses.color_pair(1) | curses.A_BOLD):
|
||||||
|
return
|
||||||
y += 1
|
y += 1
|
||||||
for entry in entries:
|
for entry in entries:
|
||||||
win.addstr(y, 4, f"{entry.key:<8} {entry.description}")
|
if not _add_safe(y, 4, f"{entry.key:<8} {entry.description}"):
|
||||||
|
return
|
||||||
y += 1
|
y += 1
|
||||||
y += 1
|
y += 1
|
||||||
win.addstr(y, 2, "Tips:", curses.color_pair(2) | curses.A_BOLD)
|
if not _add_safe(y, 2, "Tips:", curses.color_pair(2) | curses.A_BOLD):
|
||||||
|
return
|
||||||
tips = [
|
tips = [
|
||||||
"Start pumps before withdrawing rods.",
|
"Start pumps before withdrawing rods.",
|
||||||
"Bring turbine and consumer online after thermal stabilization.",
|
"Bring turbine and consumer online after thermal stabilization.",
|
||||||
@@ -478,7 +492,8 @@ class ReactorDashboard:
|
|||||||
"Watch component health to avoid automatic trips.",
|
"Watch component health to avoid automatic trips.",
|
||||||
]
|
]
|
||||||
for idx, tip in enumerate(tips, start=y + 2):
|
for idx, tip in enumerate(tips, start=y + 2):
|
||||||
win.addstr(idx, 4, f"- {tip}")
|
if not _add_safe(idx, 4, f"- {tip}"):
|
||||||
|
break
|
||||||
|
|
||||||
def _draw_status_panel(self, win: "curses._CursesWindow", state: PlantState) -> None:
|
def _draw_status_panel(self, win: "curses._CursesWindow", state: PlantState) -> None:
|
||||||
win.erase()
|
win.erase()
|
||||||
|
|||||||
Reference in New Issue
Block a user