Skip to content

Commit 2b75d93

Browse files
author
jai
committed
changes to sort columns in a view using keys
1 parent 7513907 commit 2b75d93

File tree

5 files changed

+149
-14
lines changed

5 files changed

+149
-14
lines changed

userspace/libsinsp/cursescomponents.cpp

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,7 @@ curses_table_sidemenu::curses_table_sidemenu(sidemenu_type type, sinsp_cursesui*
194194
m_selct = selct;
195195
m_selct_ori = m_selct;
196196
m_type = type;
197+
m_selct_final = m_selct;
197198
}
198199

199200
curses_table_sidemenu::~curses_table_sidemenu()
@@ -235,6 +236,10 @@ void curses_table_sidemenu::render()
235236
{
236237
wattrset(m_win, m_parent->m_colors[sinsp_cursesui::PANEL_HIGHLIGHT_FOCUS]);
237238
}
239+
else if (j == m_selct_final)
240+
{
241+
wattrset(m_win, m_parent->m_colors[sinsp_cursesui::HELP_BOLD]);
242+
}
238243
else
239244
{
240245
wattrset(m_win, m_parent->m_colors[sinsp_cursesui::PROCESS]);
@@ -287,6 +292,7 @@ sysdig_table_action curses_table_sidemenu::handle_input(int ch)
287292
int32_t prev_select;
288293
int input;
289294

295+
g_logger.format("curses_table_sidemenu::handle_input: %c\n", ch);
290296
switch(ch)
291297
{
292298
case KEY_F(1):
@@ -308,11 +314,14 @@ sysdig_table_action curses_table_sidemenu::handle_input(int ch)
308314
}
309315

310316
m_parent->m_selected_view_sidemenu_entry = m_selct;
311-
}
312-
else
313-
{
314-
m_parent->m_selected_action_sidemenu_entry = m_selct;
315-
}
317+
} else if (m_type == ST_COLUMNS) {
318+
m_parent->m_selected_view_sort_sidemenu_entry = m_selct;
319+
m_selct_final = m_selct;
320+
}
321+
else
322+
{
323+
m_parent->m_selected_action_sidemenu_entry = m_selct;
324+
}
316325

317326
return STA_SWITCH_VIEW;
318327
case KEY_BACKSPACE:
@@ -332,6 +341,10 @@ sysdig_table_action curses_table_sidemenu::handle_input(int ch)
332341

333342
return STA_SWITCH_VIEW;
334343
}
344+
else if (m_type == ST_COLUMNS)
345+
{
346+
m_parent->m_selected_view_sort_sidemenu_entry = m_selct_ori;
347+
}
335348
else
336349
{
337350
m_parent->m_selected_action_sidemenu_entry = m_selct_ori;
@@ -975,6 +988,9 @@ void curses_textbox::render()
975988
//
976989
sysdig_table_action curses_textbox::handle_input(int ch)
977990
{
991+
992+
g_logger.format("curses_textbox::handle_input: %c\n", ch);
993+
978994
if(m_sidemenu)
979995
{
980996
sysdig_table_action ta = m_sidemenu->handle_input(ch);
@@ -1268,6 +1284,7 @@ bool curses_textbox::on_search_next()
12681284
}
12691285
}
12701286

1287+
12711288
///////////////////////////////////////////////////////////////////////////////
12721289
// curses_viewinfo_page implementation
12731290
///////////////////////////////////////////////////////////////////////////////
@@ -1294,7 +1311,7 @@ curses_viewinfo_page::curses_viewinfo_page(sinsp_cursesui* parent,
12941311
config.m_scroll_on_append = false;
12951312
config.m_bounding_box = true;
12961313
config.m_do_wrap = true;
1297-
1314+
parent->m_selected_view_sort_sidemenu_entry = -1;
12981315
m_ctext->set_config(&config);
12991316

13001317
//
@@ -1450,6 +1467,7 @@ sysdig_table_action curses_viewinfo_page::handle_input(int ch)
14501467
{
14511468
int32_t totlines;
14521469

1470+
g_logger.format("curses_viewinfo_page::handle_input: %c\n", ch);
14531471
m_ctext->get_buf_size(&totlines);
14541472

14551473
if(totlines < (int32_t)m_parent->m_screenh)
@@ -1752,6 +1770,7 @@ sysdig_table_action curses_mainhelp_page::handle_input(int ch)
17521770
{
17531771
int32_t totlines;
17541772

1773+
g_logger.format("curses_mainhelp_page::handle_input: %c\n", ch);
17551774
m_ctext->get_buf_size(&totlines);
17561775

17571776
if(totlines < (int32_t)m_parent->m_screenh)

userspace/libsinsp/cursescomponents.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,7 @@ class curses_scrollable_list
106106
void selection_goto(int32_t datasize, int32_t row);
107107

108108
int32_t m_selct;
109+
int32_t m_selct_final;
109110
int32_t m_selct_ori;
110111
int32_t m_firstrow;
111112
uint32_t m_w;
@@ -120,6 +121,7 @@ class curses_table_sidemenu : public curses_scrollable_list
120121
ST_NONE,
121122
ST_VIEWS,
122123
ST_ACTIONS,
124+
ST_COLUMNS,
123125
};
124126

125127
curses_table_sidemenu(sidemenu_type type,
@@ -231,5 +233,6 @@ class curses_viewinfo_page
231233
ctext* m_ctext;
232234
};
233235

236+
234237
#endif // NOCURSESUI
235-
#endif // CSYSDIG
238+
#endif // CSYSDIG

userspace/libsinsp/cursestable.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,8 @@ class curses_table :
8686
sinsp_table::tabletype m_type;
8787

8888
friend class curses_table_sidemenu;
89+
friend class sinsp_cursesui; // for access to m_data in sinsp_cursesui::handle_input
8990
};
9091

9192
#endif // NOCURSESUI
92-
#endif // CSYSDIG
93+
#endif // CSYSDIG

userspace/libsinsp/cursesui.cpp

Lines changed: 114 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@ sinsp_cursesui::sinsp_cursesui(sinsp* inspector,
8585
m_viewinfo_page = NULL;
8686
m_mainhelp_page = NULL;
8787

88+
m_view_sort_sidemenu = NULL;
8889
if(!m_raw_output)
8990
{
9091
//
@@ -161,6 +162,7 @@ sinsp_cursesui::sinsp_cursesui(sinsp* inspector,
161162
//
162163
m_menuitems.push_back(sinsp_menuitem_info("F1", "Help", sinsp_menuitem_info::ALL, KEY_F(1)));
163164
m_menuitems.push_back(sinsp_menuitem_info("F2", "Views", sinsp_menuitem_info::ALL, KEY_F(2)));
165+
m_menuitems.push_back(sinsp_menuitem_info("1", "Sort", sinsp_menuitem_info::ALL, KEY_F(3)));
164166
m_menuitems.push_back(sinsp_menuitem_info("F4", "Filter", sinsp_menuitem_info::ALL, KEY_F(4)));
165167
m_menuitems.push_back(sinsp_menuitem_info("F5", "Echo", sinsp_menuitem_info::TABLE, KEY_F(5)));
166168
m_menuitems.push_back(sinsp_menuitem_info("F6", "Dig", sinsp_menuitem_info::TABLE, KEY_F(6)));
@@ -250,6 +252,7 @@ void sinsp_cursesui::configure(sinsp_view_manager* views)
250252
m_selected_view = m_views.get_selected_view();
251253
m_selected_view_sidemenu_entry = m_selected_view;
252254
m_selected_action_sidemenu_entry = 0;
255+
m_selected_view_sort_sidemenu_entry = -1;
253256
}
254257

255258
void sinsp_cursesui::start(bool is_drilldown, bool is_spy_switch)
@@ -873,6 +876,11 @@ void sinsp_cursesui::render()
873876
m_view_sidemenu->render();
874877
}
875878

879+
if(m_view_sort_sidemenu)
880+
{
881+
m_view_sort_sidemenu->render();
882+
}
883+
876884
if(m_action_sidemenu)
877885
{
878886
m_action_sidemenu->render();
@@ -937,6 +945,34 @@ void sinsp_cursesui::populate_view_sidemenu(string field, vector<sidemenu_list_e
937945
}
938946
}
939947

948+
void sinsp_cursesui::populate_view_cols_sidemenu()
949+
{
950+
uint32_t k = 0;
951+
952+
vector<sidemenu_list_entry> viewlist;
953+
sinsp_view_info* vinfo = get_selected_view();
954+
955+
for(auto it : vinfo->m_columns)
956+
{
957+
if (it.m_name != "NA") {
958+
viewlist.push_back(sidemenu_list_entry(it.m_name, k++));
959+
}
960+
}
961+
962+
if(viewlist.size() == 0)
963+
{
964+
viewlist.push_back(sidemenu_list_entry("<NO COLUMNS>", 0));
965+
}
966+
967+
if(m_view_sort_sidemenu != NULL)
968+
{
969+
m_view_sort_sidemenu->m_selct = 0;
970+
m_view_sort_sidemenu->set_entries(&viewlist);
971+
}
972+
}
973+
974+
975+
940976
void sinsp_cursesui::populate_action_sidemenu()
941977
{
942978
uint32_t k = 0;
@@ -1157,6 +1193,9 @@ void sinsp_cursesui::switch_view(bool is_spy_switch)
11571193

11581194
delete m_action_sidemenu;
11591195
m_action_sidemenu = NULL;
1196+
1197+
delete m_view_sort_sidemenu;
1198+
m_view_sort_sidemenu = NULL;
11601199

11611200
if(m_viz != NULL)
11621201
{
@@ -1744,6 +1783,8 @@ sysdig_table_action sinsp_cursesui::handle_input(int ch)
17441783
//
17451784
// Avoid parsing keys during file load
17461785
//
1786+
1787+
g_logger.format("sinsp_cursesui::handle_input: %c\n", ch);
17471788
if((!m_inspector->is_live()) && !is_eof())
17481789
{
17491790
if(ch != KEY_BACKSPACE &&
@@ -1800,8 +1841,7 @@ sysdig_table_action sinsp_cursesui::handle_input(int ch)
18001841
delete m_viewinfo_page;
18011842
m_viewinfo_page = NULL;
18021843
}
1803-
1804-
return ta;
1844+
return ta;
18051845
}
18061846
else if(ta != STA_PARENT_HANDLE)
18071847
{
@@ -1840,6 +1880,42 @@ sysdig_table_action sinsp_cursesui::handle_input(int ch)
18401880
return STA_NONE;
18411881
}
18421882
}
1883+
1884+
if(m_view_sort_sidemenu != NULL)
1885+
{
1886+
sysdig_table_action ta = m_view_sort_sidemenu->handle_input(ch);
1887+
if(ta == STA_SWITCH_VIEW)
1888+
{
1889+
sinsp_view_info* vinfo = get_selected_view();
1890+
1891+
g_logger.format("sorting %s using column %d", vinfo->m_name.c_str(), m_selected_view_sort_sidemenu_entry);
1892+
ASSERT(m_selected_view_sort_sidemenu_entry < vinfo->m_columns.size());
1893+
m_datatable->set_sorting_col(m_selected_view_sort_sidemenu_entry+1);
1894+
m_datatable->sort_sample();
1895+
// m_viz->update_data(m_datatable->get_sample(get_time_delta()), true);
1896+
m_viz->update_data(m_viz->m_data);
1897+
m_viz->render(true);
1898+
return STA_NONE;
1899+
}
1900+
else if(ta == STA_DESTROY_CHILD)
1901+
{
1902+
m_viz->set_x_start(0);
1903+
delete m_view_sort_sidemenu;
1904+
m_view_sort_sidemenu = NULL;
1905+
m_viz->set_x_start(0);
1906+
m_viz->recreate_win(m_screenh - 3);
1907+
m_viz->render(true);
1908+
m_viz->render(true);
1909+
render();
1910+
}
1911+
else if(ta != STA_PARENT_HANDLE)
1912+
{
1913+
return STA_NONE;
1914+
}
1915+
}
1916+
1917+
1918+
18431919
}
18441920

18451921
if(m_output_filtering || m_output_searching || m_search_caller_interface != NULL)
@@ -1963,8 +2039,37 @@ sysdig_table_action sinsp_cursesui::handle_input(int ch)
19632039
curs_set(1);
19642040
render();
19652041
break;
1966-
//case KEY_F(3):
1967-
// break;
2042+
case '1':
2043+
if(m_view_sidemenu != NULL)
2044+
{
2045+
break;
2046+
}
2047+
if(m_view_sort_sidemenu == NULL) {
2048+
m_viz->set_x_start(VIEW_SIDEMENU_WIDTH);
2049+
m_view_sort_sidemenu = new curses_table_sidemenu(curses_table_sidemenu::ST_COLUMNS,
2050+
this, m_selected_view_sort_sidemenu_entry, VIEW_SIDEMENU_WIDTH);
2051+
2052+
populate_view_cols_sidemenu();
2053+
m_view_sort_sidemenu->set_title("Select sort column");
2054+
2055+
m_viz->set_x_start(VIEW_SIDEMENU_WIDTH);
2056+
m_viz->recreate_win(m_screenh - 3);
2057+
render();
2058+
m_viewinfo_page = NULL;
2059+
}
2060+
else
2061+
{
2062+
m_viz->set_x_start(0);
2063+
delete m_view_sort_sidemenu;
2064+
m_view_sort_sidemenu = NULL;
2065+
m_viz->set_x_start(0);
2066+
m_viz->recreate_win(m_screenh - 3);
2067+
m_viz->render(true);
2068+
m_viz->render(true);
2069+
render();
2070+
}
2071+
2072+
break;
19682073
case '\\':
19692074
case KEY_F(4):
19702075
m_search_caller_interface = NULL;
@@ -2099,7 +2204,11 @@ sysdig_table_action sinsp_cursesui::handle_input(int ch)
20992204
{
21002205
event = &m_view_sidemenu->m_last_mevent;
21012206
}
2102-
else if(m_action_sidemenu != NULL)
2207+
else if(m_view_sort_sidemenu != NULL)
2208+
{
2209+
event = &m_view_sort_sidemenu->m_last_mevent;
2210+
}
2211+
else if(m_action_sidemenu != NULL)
21032212
{
21042213
event = &m_action_sidemenu->m_last_mevent;
21052214
}

userspace/libsinsp/cursesui.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -563,6 +563,7 @@ class sinsp_cursesui
563563
int32_t m_prev_selected_view;
564564
uint32_t m_selected_view_sidemenu_entry;
565565
uint32_t m_selected_action_sidemenu_entry;
566+
uint32_t m_selected_view_sort_sidemenu_entry;
566567
sinsp_ui_selection_hierarchy m_sel_hierarchy;
567568
curses_table* m_viz;
568569
uint32_t m_screenw;
@@ -575,6 +576,7 @@ class sinsp_cursesui
575576
curses_table_sidemenu* m_view_sidemenu;
576577
curses_table_sidemenu* m_action_sidemenu;
577578
curses_viewinfo_page* m_viewinfo_page;
579+
curses_table_sidemenu* m_view_sort_sidemenu;
578580
curses_mainhelp_page* m_mainhelp_page;
579581
curses_textbox* m_spy_box;
580582
sinsp_evt::param_fmt m_spybox_text_format;
@@ -604,6 +606,7 @@ class sinsp_cursesui
604606
sysdig_table_action handle_input(int ch);
605607
void populate_view_sidemenu(string field, vector<sidemenu_list_entry>* viewlist);
606608
void populate_action_sidemenu();
609+
void populate_view_cols_sidemenu();
607610
void print_progress(double progress);
608611
void show_selected_view_info();
609612
#endif
@@ -642,4 +645,4 @@ class sinsp_cursesui
642645
bool m_truncated_input;
643646
};
644647

645-
#endif // CSYSDIG
648+
#endif // CSYSDIG

0 commit comments

Comments
 (0)