spdk_top: Update display functions for double sorting

Modify display functions to accommodate newly added double sorting
mechanisms.

Signed-off-by: Michael Piszczek <mpiszczek@ddn.com>
Change-Id: I51a2037f4c7dc3689638052383afaed89d850347
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/9865
Community-CI: Broadcom CI <spdk-ci.pdl@broadcom.com>
Community-CI: Mellanox Build Bot
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
Reviewed-by: Krzysztof Karas <krzysztof.karas@intel.com>
This commit is contained in:
Michael Piszczek 2021-10-13 12:21:58 -04:00 committed by Tomasz Zawadzki
parent d12792b11b
commit 6e3dfffc84

View File

@ -1147,7 +1147,7 @@ draw_tab_win(enum tabs tab)
}
static void
draw_tabs(enum tabs tab_index, uint8_t sort_col)
draw_tabs(enum tabs tab_index, uint8_t sort_col, uint8_t sort_col2)
{
struct col_desc *col_desc = g_col_desc[tab_index];
WINDOW *tab = g_tabs[tab_index];
@ -1171,6 +1171,10 @@ draw_tabs(enum tabs tab_index, uint8_t sort_col)
draw_offset = offset + (col_desc[i].max_data_string / 2) - (col_desc[i].name_len / 2);
if (i == sort_col) {
wattron(tab, COLOR_PAIR(4));
print_max_len(tab, 1, draw_offset, 0, ALIGN_LEFT, col_desc[i].name);
wattroff(tab, COLOR_PAIR(4));
} else if (i == sort_col2) {
wattron(tab, COLOR_PAIR(3));
print_max_len(tab, 1, draw_offset, 0, ALIGN_LEFT, col_desc[i].name);
wattroff(tab, COLOR_PAIR(3));
@ -1208,9 +1212,10 @@ resize_interface(enum tabs tab)
wclear(g_tabs[i]);
wresize(g_tabs[i], g_max_row - MENU_WIN_HEIGHT - TAB_WIN_HEIGHT - 2, g_max_col);
mvwin(g_tabs[i], TABS_LOCATION_ROW, TABS_LOCATION_COL);
draw_tabs(i, g_current_sort_col[i], g_current_sort_col2[i]);
}
draw_tabs(tab, g_current_sort_col[tab]);
draw_tabs(tab, g_current_sort_col[tab], g_current_sort_col2[tab]);
for (i = 0; i < NUMBER_OF_TABS; i++) {
wclear(g_tab_win[i]);
@ -1228,7 +1233,7 @@ static void
switch_tab(enum tabs tab)
{
wclear(g_tabs[tab]);
draw_tabs(tab, g_current_sort_col[tab]);
draw_tabs(tab, g_current_sort_col[tab], g_current_sort_col2[tab]);
top_panel(g_panels[tab]);
update_panels();
doupdate();
@ -1635,7 +1640,7 @@ static void
apply_filters(enum tabs tab)
{
wclear(g_tabs[tab]);
draw_tabs(tab, g_current_sort_col[tab]);
draw_tabs(tab, g_current_sort_col[tab], g_current_sort_col2[tab]);
}
static ITEM **
@ -1841,18 +1846,23 @@ static void
sort_type(enum tabs tab, int item_index)
{
g_current_sort_col[tab] = item_index;
wclear(g_tabs[tab]);
draw_tabs(tab, g_current_sort_col[tab]);
}
static void
change_sorting(uint8_t tab)
sort_type2(enum tabs tab, int item_index)
{
g_current_sort_col2[tab] = item_index;
}
static void
change_sorting(uint8_t tab, int winnum, bool *pstop_loop)
{
const int WINDOW_HEADER_LEN = 4;
const int WINDOW_BORDER_LEN = 3;
const int WINDOW_START_X = 1;
const int WINDOW_START_Y = 3;
const int WINDOW_HEADER_END_LINE = 2;
const int WINDOW_START_Y = 4;
const int WINDOW_HEADER_END_LINE = 3;
const int WINDOW_MIN_WIDTH = 31;
PANEL *sort_panel;
WINDOW *sort_win;
ITEM **my_items;
@ -1860,8 +1870,10 @@ change_sorting(uint8_t tab)
int i, c, elements;
bool stop_loop = false;
ITEM *cur;
char *name;
char *help;
void (*p)(enum tabs tab, int item_index);
uint8_t len = 0;
uint8_t len = WINDOW_MIN_WIDTH;
for (i = 0; g_col_desc[tab][i].name != NULL; ++i) {
len = spdk_max(len, g_col_desc[tab][i].name_len);
@ -1877,15 +1889,16 @@ change_sorting(uint8_t tab)
for (i = 0; i < elements; ++i) {
my_items[i] = new_item(g_col_desc[tab][i].name, NULL);
set_item_userptr(my_items[i], sort_type);
set_item_userptr(my_items[i], (winnum == 0) ? sort_type : sort_type2);
}
my_menu = new_menu((ITEM **)my_items);
menu_opts_off(my_menu, O_SHOWDESC);
sort_win = newwin(elements + WINDOW_HEADER_LEN, len + WINDOW_BORDER_LEN, (g_max_row - elements) / 2,
(g_max_col - len) / 2);
sort_win = newwin(elements + WINDOW_HEADER_LEN + 1, len + WINDOW_BORDER_LEN,
(g_max_row - elements) / 2,
(g_max_col - len) / 2 - len + len * winnum);
assert(sort_win != NULL);
keypad(sort_win, TRUE);
sort_panel = new_panel(sort_win);
@ -1899,7 +1912,16 @@ change_sorting(uint8_t tab)
set_menu_sub(my_menu, derwin(sort_win, elements, len + 1, WINDOW_START_Y, WINDOW_START_X));
box(sort_win, 0, 0);
print_in_middle(sort_win, 1, 0, len + WINDOW_BORDER_LEN, "Sorting", COLOR_PAIR(3));
if (winnum == 0) {
name = "Sorting #1";
help = "Right key for second sorting";
} else {
name = "Sorting #2";
help = "Left key for first sorting";
}
print_in_middle(sort_win, 1, 0, len + WINDOW_BORDER_LEN, name, COLOR_PAIR(3));
print_in_middle(sort_win, 2, 0, len + WINDOW_BORDER_LEN, help, COLOR_PAIR(3));
mvwaddch(sort_win, WINDOW_HEADER_END_LINE, 0, ACS_LTEE);
mvwhline(sort_win, WINDOW_HEADER_END_LINE, 1, ACS_HLINE, len + 1);
mvwaddch(sort_win, WINDOW_HEADER_END_LINE, len + WINDOW_BORDER_LEN - 1, ACS_RTEE);
@ -1910,7 +1932,17 @@ change_sorting(uint8_t tab)
while (!stop_loop) {
c = wgetch(sort_win);
/*
* First sorting window:
* Up/Down - select first sorting column;
* Enter - apply current column;
* Right - open second sorting window.
* Second sorting window:
* Up/Down - select second sorting column;
* Enter - apply current column of both sorting windows;
* Left - exit second window and reset second sorting key;
* Right - do nothing.
*/
switch (c) {
case KEY_DOWN:
menu_driver(my_menu, REQ_DOWN_ITEM);
@ -1918,19 +1950,51 @@ change_sorting(uint8_t tab)
case KEY_UP:
menu_driver(my_menu, REQ_UP_ITEM);
break;
case KEY_RIGHT:
if (winnum > 0) {
break;
}
change_sorting(tab, winnum + 1, &stop_loop);
/* Restore input. */
keypad(sort_win, TRUE);
post_menu(my_menu);
refresh();
wrefresh(sort_win);
redrawwin(sort_win);
if (winnum == 0) {
cur = current_item(my_menu);
p = item_userptr(cur);
p(tab, item_index(cur));
}
break;
case 27: /* ESC */
stop_loop = true;
break;
case KEY_LEFT:
if (winnum > 0) {
sort_type2(tab, COL_THREADS_NONE);
}
/* FALLTHROUGH */
case 10: /* Enter */
stop_loop = true;
cur = current_item(my_menu);
p = item_userptr(cur);
p(tab, item_index(cur));
if (winnum > 0 && c == 10) {
*pstop_loop = true;
}
if (c == 10) {
cur = current_item(my_menu);
p = item_userptr(cur);
p(tab, item_index(cur));
}
break;
}
wrefresh(sort_win);
}
if (winnum == 0) {
wclear(g_tabs[tab]);
draw_tabs(tab, g_current_sort_col[tab], g_current_sort_col2[tab]);
}
unpost_menu(my_menu);
free_menu(my_menu);
@ -1943,8 +2007,10 @@ change_sorting(uint8_t tab)
del_panel(sort_panel);
delwin(sort_win);
wclear(g_menu_win);
draw_menu_win();
if (winnum == 0) {
wclear(g_menu_win);
draw_menu_win();
}
}
static void
@ -2632,7 +2698,8 @@ show_stats(pthread_t *data_thread)
switch_tab(active_tab);
break;
case 's':
change_sorting(active_tab);
sort_type2(active_tab, COL_THREADS_NONE);
change_sorting(active_tab, 0, NULL);
break;
case 'c':
filter_columns(active_tab);
@ -2649,7 +2716,7 @@ show_stats(pthread_t *data_thread)
}
wclear(g_tabs[active_tab]);
g_selected_row = 0;
draw_tabs(active_tab, g_current_sort_col[active_tab]);
draw_tabs(active_tab, g_current_sort_col[active_tab], g_current_sort_col2[active_tab]);
break;
case KEY_PPAGE: /* PgUp */
if (current_page > 0) {
@ -2657,7 +2724,7 @@ show_stats(pthread_t *data_thread)
}
wclear(g_tabs[active_tab]);
g_selected_row = 0;
draw_tabs(active_tab, g_current_sort_col[active_tab]);
draw_tabs(active_tab, g_current_sort_col[active_tab], g_current_sort_col2[active_tab]);
break;
case KEY_UP: /* Arrow up */
if (g_selected_row > 0) {
@ -2725,7 +2792,7 @@ draw_interface(void)
g_tabs[i] = newwin(g_max_row - MENU_WIN_HEIGHT - TAB_WIN_HEIGHT - 2, g_max_col, TABS_LOCATION_ROW,
TABS_LOCATION_COL);
draw_tabs(i, g_current_sort_col[i]);
draw_tabs(i, g_current_sort_col[i], g_current_sort_col2[i]);
g_panels[i] = new_panel(g_tabs[i]);
assert(g_panels[i] != NULL);
}