Line data Source code
1 : /* SPDX-License-Identifier: GPL-3.0-or-later */
2 : /* Copyright 2026 Peter Csaszar */
3 :
4 : /**
5 : * @file tui/status_row.c
6 : * @brief Status-row rendering implementation (US-11 v2).
7 : */
8 :
9 : #include "tui/status_row.h"
10 :
11 : #include <string.h>
12 :
13 30 : void status_row_init(StatusRow *sr) {
14 30 : if (!sr) return;
15 30 : memset(sr, 0, sizeof(*sr));
16 : }
17 :
18 3 : void status_row_set_message(StatusRow *sr, const char *msg) {
19 3 : if (!sr) return;
20 3 : if (!msg) { sr->message[0] = '\0'; return; }
21 2 : strncpy(sr->message, msg, STATUS_ROW_MSG_MAX - 1);
22 2 : sr->message[STATUS_ROW_MSG_MAX - 1] = '\0';
23 : }
24 :
25 17 : static const char *hint_for(StatusMode m) {
26 17 : switch (m) {
27 14 : case STATUS_MODE_DIALOGS:
28 14 : return "[dialogs] j/k move Enter open Tab history q quit";
29 3 : case STATUS_MODE_HISTORY:
30 3 : return "[history] j/k scroll Tab dialogs q quit";
31 : }
32 0 : return "";
33 : }
34 :
35 20 : void status_row_render(const StatusRow *sr,
36 : const Pane *pane, Screen *screen) {
37 20 : if (!sr || !pane || !screen || !pane_is_valid(pane)) return;
38 : /* The row is always one line; ignore extra pane rows so callers can pass
39 : * a taller pane without getting extra blanks. */
40 17 : pane_fill(pane, screen, 0, 0, pane->cols, SCREEN_ATTR_REVERSE);
41 17 : const char *hint = hint_for(sr->mode);
42 17 : pane_put_str(pane, screen, 0, 0, hint, SCREEN_ATTR_REVERSE);
43 17 : if (sr->message[0]) {
44 1 : int mlen = (int)strlen(sr->message);
45 1 : int col = pane->cols - mlen - 1;
46 1 : if (col < 1) col = 1;
47 1 : pane_put_str(pane, screen, 0, col, sr->message, SCREEN_ATTR_REVERSE);
48 : }
49 : }
|