@@ -102,6 +102,9 @@ sinsp_cursesui::sinsp_cursesui(sinsp* inspector,
102
102
m_viewinfo_page = NULL ;
103
103
m_mainhelp_page = NULL ;
104
104
105
+ m_view_sort_sidemenu = NULL ;
106
+ m_selected_view_sort_sidemenu_entry = 0 ;
107
+
105
108
if (!m_raw_output)
106
109
{
107
110
//
@@ -183,6 +186,7 @@ sinsp_cursesui::sinsp_cursesui(sinsp* inspector,
183
186
m_menuitems.push_back (sinsp_menuitem_info (" F6" , " Dig" , sinsp_menuitem_info::TABLE, KEY_F (6 )));
184
187
m_menuitems.push_back (sinsp_menuitem_info (" F7" , " Legend" , sinsp_menuitem_info::ALL, KEY_F (7 )));
185
188
m_menuitems.push_back (sinsp_menuitem_info (" F8" , " Actions" , sinsp_menuitem_info::ALL, KEY_F (8 )));
189
+ m_menuitems.push_back (sinsp_menuitem_info (" F9" , " Sort" , sinsp_menuitem_info::ALL, KEY_F (9 )));
186
190
m_menuitems.push_back (sinsp_menuitem_info (" CTRL+F" , " Search" , sinsp_menuitem_info::ALL, 6 ));
187
191
m_menuitems.push_back (sinsp_menuitem_info (" p" , " Pause" , sinsp_menuitem_info::ALL, ' p' ));
188
192
m_menuitems.push_back (sinsp_menuitem_info (" c" , " Clear" , sinsp_menuitem_info::LIST, ' c' ));
@@ -267,6 +271,8 @@ void sinsp_cursesui::configure(sinsp_view_manager* views)
267
271
m_selected_view = m_views.get_selected_view ();
268
272
m_selected_view_sidemenu_entry = m_selected_view;
269
273
m_selected_action_sidemenu_entry = 0 ;
274
+ m_selected_view_sort_sidemenu_entry = 0 ;
275
+ m_sidemenu_sorting_col = -1 ;
270
276
}
271
277
272
278
void sinsp_cursesui::start (bool is_drilldown, bool is_spy_switch)
@@ -890,6 +896,11 @@ void sinsp_cursesui::render()
890
896
m_view_sidemenu->render ();
891
897
}
892
898
899
+ if (m_view_sort_sidemenu)
900
+ {
901
+ m_view_sort_sidemenu->render ();
902
+ }
903
+
893
904
if (m_action_sidemenu)
894
905
{
895
906
m_action_sidemenu->render ();
@@ -954,6 +965,39 @@ void sinsp_cursesui::populate_view_sidemenu(string field, vector<sidemenu_list_e
954
965
}
955
966
}
956
967
968
+ void sinsp_cursesui::populate_view_cols_sidemenu ()
969
+ {
970
+ int32_t k = 0 ;
971
+
972
+ vector<sidemenu_list_entry> viewlist;
973
+ sinsp_view_info* vinfo = get_selected_view ();
974
+
975
+ for (auto it : vinfo->m_columns )
976
+ {
977
+ if (it.m_name != " NA" )
978
+ {
979
+ if (m_sidemenu_sorting_col == k)
980
+ {
981
+ viewlist.push_back (sidemenu_list_entry (it.m_name , k++));
982
+ continue ;
983
+ }
984
+ viewlist.push_back (sidemenu_list_entry (it.m_name , k++));
985
+ }
986
+ }
987
+
988
+ if (viewlist.size () == 0 )
989
+ {
990
+ viewlist.push_back (sidemenu_list_entry (" <NO COLUMNS>" , 0 ));
991
+ }
992
+
993
+ if (m_view_sort_sidemenu != NULL )
994
+ {
995
+ m_view_sort_sidemenu->set_entries (&viewlist);
996
+ }
997
+ }
998
+
999
+
1000
+
957
1001
void sinsp_cursesui::populate_action_sidemenu ()
958
1002
{
959
1003
uint32_t k = 0 ;
@@ -1174,6 +1218,9 @@ void sinsp_cursesui::switch_view(bool is_spy_switch)
1174
1218
1175
1219
delete m_action_sidemenu;
1176
1220
m_action_sidemenu = NULL ;
1221
+
1222
+ delete m_view_sort_sidemenu;
1223
+ m_view_sort_sidemenu = NULL ;
1177
1224
1178
1225
if (m_viz != NULL )
1179
1226
{
@@ -1761,6 +1808,7 @@ sysdig_table_action sinsp_cursesui::handle_input(int ch)
1761
1808
//
1762
1809
// Avoid parsing keys during file load
1763
1810
//
1811
+
1764
1812
if ((!m_inspector->is_live ()) && !is_eof ())
1765
1813
{
1766
1814
if (ch != KEY_BACKSPACE &&
@@ -1817,7 +1865,6 @@ sysdig_table_action sinsp_cursesui::handle_input(int ch)
1817
1865
delete m_viewinfo_page;
1818
1866
m_viewinfo_page = NULL ;
1819
1867
}
1820
-
1821
1868
return ta;
1822
1869
}
1823
1870
else if (ta != STA_PARENT_HANDLE)
@@ -1860,6 +1907,37 @@ sysdig_table_action sinsp_cursesui::handle_input(int ch)
1860
1907
return STA_NONE;
1861
1908
}
1862
1909
}
1910
+
1911
+ if (m_view_sort_sidemenu != NULL )
1912
+ {
1913
+ sysdig_table_action ta = m_view_sort_sidemenu->handle_input (ch);
1914
+ if (ta == STA_SWITCH_VIEW || ta == STA_DESTROY_CHILD)
1915
+ {
1916
+ if (ta == STA_SWITCH_VIEW)
1917
+ {
1918
+ sinsp_view_info* vinfo = get_selected_view ();
1919
+ ASSERT (m_selected_view_sort_sidemenu_entry < vinfo->m_columns .size ());
1920
+ m_datatable->set_sorting_col (m_selected_view_sort_sidemenu_entry+1 );
1921
+ m_datatable->sort_sample ();
1922
+ m_viz->update_data (m_viz->m_data );
1923
+ }
1924
+ delete m_view_sort_sidemenu;
1925
+ m_view_sort_sidemenu = NULL ;
1926
+ m_viz->set_x_start (0 );
1927
+ m_viz->recreate_win (m_screenh - 3 );
1928
+ m_viz->render (true );
1929
+ render ();
1930
+ if (ta == STA_SWITCH_VIEW)
1931
+ {
1932
+ return STA_NONE;
1933
+ }
1934
+ }
1935
+ else if (ta != STA_PARENT_HANDLE)
1936
+ {
1937
+ return STA_NONE;
1938
+ }
1939
+ }
1940
+
1863
1941
}
1864
1942
1865
1943
if (m_output_filtering || m_output_searching || m_search_caller_interface != NULL )
@@ -1983,8 +2061,40 @@ sysdig_table_action sinsp_cursesui::handle_input(int ch)
1983
2061
curs_set (1 );
1984
2062
render ();
1985
2063
break ;
1986
- // case KEY_F(3):
1987
- // break;
2064
+ case KEY_F (9 ):
2065
+ case ' >' : // sort columns
2066
+ if (m_view_sidemenu != NULL )
2067
+ {
2068
+ break ;
2069
+ }
2070
+ if (m_view_sort_sidemenu == NULL )
2071
+ {
2072
+ m_viz->set_x_start (VIEW_SIDEMENU_WIDTH);
2073
+ m_sidemenu_sorting_col = m_datatable->get_sorting_col () -1 ;
2074
+ m_view_sort_sidemenu = new curses_table_sidemenu (curses_table_sidemenu::ST_COLUMNS,
2075
+ this , m_sidemenu_sorting_col, VIEW_SIDEMENU_WIDTH);
2076
+
2077
+ populate_view_cols_sidemenu ();
2078
+ m_view_sort_sidemenu->set_title (" Select sort column" );
2079
+
2080
+ m_viz->set_x_start (VIEW_SIDEMENU_WIDTH);
2081
+ m_viz->recreate_win (m_screenh - 3 );
2082
+ render ();
2083
+ m_viewinfo_page = NULL ;
2084
+ }
2085
+ else
2086
+ {
2087
+ m_viz->set_x_start (0 );
2088
+ delete m_view_sort_sidemenu;
2089
+ m_view_sort_sidemenu = NULL ;
2090
+ m_viz->set_x_start (0 );
2091
+ m_viz->recreate_win (m_screenh - 3 );
2092
+ m_viz->render (true );
2093
+ m_viz->render (true );
2094
+ render ();
2095
+ }
2096
+
2097
+ break ;
1988
2098
case ' \\ ' :
1989
2099
case KEY_F (4 ):
1990
2100
m_search_caller_interface = NULL ;
@@ -2119,6 +2229,10 @@ sysdig_table_action sinsp_cursesui::handle_input(int ch)
2119
2229
{
2120
2230
event = &m_view_sidemenu->m_last_mevent ;
2121
2231
}
2232
+ else if (m_view_sort_sidemenu != NULL )
2233
+ {
2234
+ event = &m_view_sort_sidemenu->m_last_mevent ;
2235
+ }
2122
2236
else if (m_action_sidemenu != NULL )
2123
2237
{
2124
2238
event = &m_action_sidemenu->m_last_mevent ;
0 commit comments