Skip to content

Commit

Permalink
sheet: Give status msgs a priority which decays with time
Browse files Browse the repository at this point in the history
Allows errors to be displayed for longer without them blocking other
status messages after the user has been given time to view them.

Possibly errors should be displayed in a separate buffer or location,
but while we are overloading the status this gives the user chance to
view them.
  • Loading branch information
richiejp committed Dec 17, 2024
1 parent b871542 commit 2ed256f
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 10 deletions.
31 changes: 21 additions & 10 deletions app/sheet.c
Original file line number Diff line number Diff line change
Expand Up @@ -166,7 +166,8 @@ size_t display_data_rowcount(struct zsvsheet_display_dimensions *dims) {
return dims->rows - dims->footer_span - dims->header_span;
}

char zsvsheet_status_text[256] = {0};
static int zsvsheet_status_priority;
static char zsvsheet_status_text[256];
static void zsvsheet_display_status_text(const struct zsvsheet_display_dimensions *ddims) {
// clear the entire line
mvprintw(ddims->rows - ddims->footer_span, 0, "%-*s", (int)sizeof(zsvsheet_status_text), "");
Expand All @@ -177,15 +178,24 @@ static void zsvsheet_display_status_text(const struct zsvsheet_display_dimension
attroff(A_REVERSE);
}

static void zsvsheet_priv_set_status(const struct zsvsheet_display_dimensions *ddims, int overwrite, const char *fmt,
#define ZSVSHEET_STATUS_LOW_PRIO 1
#define ZSVSHEET_STATUS_HIGH_PRIO 10

static void zsvsheet_priv_set_status(const struct zsvsheet_display_dimensions *ddims, int priority, const char *fmt,
...) {
if (overwrite || !*zsvsheet_status_text) {
if (priority > zsvsheet_status_priority || !*zsvsheet_status_text) {
va_list argv;
va_start(argv, fmt);
vsnprintf(zsvsheet_status_text, sizeof(zsvsheet_status_text), fmt, argv);
va_end(argv);
// note: if (n < (int)sizeof(zsvsheet_status_text)), then we just ignore
zsvsheet_status_priority = priority;
}

// The priority decays with each call which is at least n times per second as set by halfdelay
if (zsvsheet_status_priority > 0)
zsvsheet_status_priority--;

zsvsheet_display_status_text(ddims);
}

Expand Down Expand Up @@ -331,7 +341,7 @@ char zsvsheet_handle_find_next(struct zsvsheet_ui_buffer *uib, const char *needl
*update_buffer = zsvsheet_goto_input_raw_row(uib, zsvsheet_opts->found_rownum, header_span, ddims, (size_t)-1);
return 1;
}
zsvsheet_priv_set_status(ddims, 1, "Not found");
zsvsheet_priv_set_status(ddims, ZSVSHEET_STATUS_HIGH_PRIO, "Not found");
return 0;
}

Expand Down Expand Up @@ -394,11 +404,11 @@ static zsvsheet_status zsvsheet_open_file_handler(struct zsvsheet_proc_context *
if ((err = zsvsheet_ui_buffer_open_file(filename, NULL, state->custom_prop_handler, di->ui_buffers.base,
di->ui_buffers.current))) {
if (err > 0)
zsvsheet_priv_set_status(di->dimensions, 1, "%s: %s", filename, strerror(err));
zsvsheet_priv_set_status(di->dimensions, ZSVSHEET_STATUS_HIGH_PRIO, "%s: %s", filename, strerror(err));
else if (err < 0)
zsvsheet_priv_set_status(di->dimensions, 1, "Unexpected error");
zsvsheet_priv_set_status(di->dimensions, ZSVSHEET_STATUS_HIGH_PRIO, "Unexpected error");
else
zsvsheet_priv_set_status(di->dimensions, 1, "Not found: %s", filename);
zsvsheet_priv_set_status(di->dimensions, ZSVSHEET_STATUS_HIGH_PRIO, "Not found: %s", filename);
return zsvsheet_status_ignore;
}
no_input:
Expand Down Expand Up @@ -645,7 +655,7 @@ static void zsvsheet_check_buffer_worker_updates(struct zsvsheet_ui_buffer *ub,
struct zsvsheet_sheet_context *handler_state) {
pthread_mutex_lock(&ub->mutex);
if (ub->status)
zsvsheet_priv_set_status(display_dims, 1, ub->status);
zsvsheet_priv_set_status(display_dims, ZSVSHEET_STATUS_LOW_PRIO, ub->status);
if (ub->index_ready && ub->dimensions.row_count != ub->index->row_count + 1) {
ub->dimensions.row_count = ub->index->row_count + 1;
handler_state->display_info.update_buffer = true;
Expand Down Expand Up @@ -741,7 +751,7 @@ int ZSV_MAIN_FUNC(ZSV_COMMAND)(int argc, const char *argv[], struct zsv_opts *op
ch = getch();

handler_state.display_info.update_buffer = false;
zsvsheet_priv_set_status(&display_dims, 1, "");
zsvsheet_priv_set_status(&display_dims, ZSVSHEET_STATUS_LOW_PRIO, "");

if (ch != ERR) {
status = zsvsheet_key_press(ch, &handler_state);
Expand All @@ -758,7 +768,8 @@ int ZSV_MAIN_FUNC(ZSV_COMMAND)(int argc, const char *argv[], struct zsv_opts *op
struct zsvsheet_opts zsvsheet_opts = {0};
if (read_data(&ub, NULL, current_ui_buffer->input_offset.row, current_ui_buffer->input_offset.col, header_span,
&zsvsheet_opts, custom_prop_handler)) {
zsvsheet_priv_set_status(&display_dims, 1, "Unexpected error!"); // to do: better error message
zsvsheet_priv_set_status(&display_dims, ZSVSHEET_STATUS_HIGH_PRIO,
"Unexpected error!"); // to do: better error message
continue;
}
}
Expand Down
1 change: 1 addition & 0 deletions app/sheet/handlers.c
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ zsvsheet_status zsvsheet_set_status(struct zsvsheet_proc_context *ctx, const cha
va_end(argv);
// note: if (n < (int)sizeof(zsvsheet_status_text)), then we just ignore
zsvsheet_display_status_text(state->display_info.dimensions);
zsvsheet_status_priority = ZSVSHEET_STATUS_HIGH_PRIO;
return zsvsheet_status_ok;
}

Expand Down

0 comments on commit 2ed256f

Please sign in to comment.