log_view.cpp
Go to the documentation of this file.
1 
28 #include <log_view/log_view.h>
29 
30 #include <clocale>
31 #include <cctype>
32 #include <clocale>
33 #include <string>
34 
35 #include <log_view/utils.h>
36 
37 namespace log_view {
38 
40  logs_(logs),
41  log_filter_(logs_)
42 {
43 
44 }
45 
47  close();
48 }
49 
50 void LogView::init() {
51  setlocale(LC_ALL, "");
52  initscr();
53  use_default_colors();
54  start_color();
55  init_pair(CP_DEFAULT, -1, -1);
56  init_pair(CP_RED, COLOR_RED, -1);
57  init_pair(CP_YELLOW, COLOR_YELLOW, -1);
58  init_pair(CP_GREY, 8, -1);
59  init_pair(CP_DEFAULT_CYAN, -1, COLOR_CYAN);
60  init_pair(CP_DEFAULT_GREY, -1, 8);
61  noecho();
62  curs_set(0);
63  raw();
64  keypad(stdscr, true);
65  mouseinterval(0);
66  mousemask(ALL_MOUSE_EVENTS | REPORT_MOUSE_POSITION, NULL);
67  printf("\033[?1003h\n");
68 
69  refresh();
70 
71  log_panel_ = std::make_shared<LogPanel>(LINES - 2, COLS, 1, 0, logs_, log_filter_);
72  panels_.push_back(log_panel_);
73 
74  status_panel_ = std::make_shared<StatusPanel>(1, COLS, 0, 0, logs_);
75  panels_.push_back(status_panel_);
76 
77  level_panel_ = std::make_shared<LevelPanel>(1, COLS, LINES - 1, 0, log_filter_);
78  panels_.push_back(level_panel_);
79 
80  search_panel_ = std::make_shared<SearchPanel>(1, COLS, LINES - 1, 0, log_filter_);
81  search_panel_->hide(true);
82  panels_.push_back(search_panel_);
83 
84  filter_panel_ = std::make_shared<FilterPanel>(1, COLS, LINES - 1, 0, log_filter_);
85  filter_panel_->hide(true);
86  panels_.push_back(filter_panel_);
87 
88  exclude_panel_ = std::make_shared<ExcludePanel>(1, COLS, LINES - 1, 0, log_filter_);
89  exclude_panel_->hide(true);
90  panels_.push_back(exclude_panel_);
91 
92  node_panel_ = std::make_shared<NodePanel>(LINES - 2, COLS / 2, 1, COLS / 2 - (COLS + 1) % 2, log_filter_);
93  node_panel_->hide(true);
94  panels_.push_back(node_panel_);
95 
96  help_panel_ = std::make_shared<HelpPanel>(21, COLS - 8, 2, 4);
97  help_panel_->hide(true);
98  panels_.push_back(help_panel_);
99 
100  refreshLayout();
101 
102  update_panels();
103  doupdate();
104 
105  refreshLayout();
106 }
107 
109  endwin();
110 }
111 
112 bool LogView::exited() const {
113  return exited_;
114 }
115 
116 void LogView::setConnected(bool connected) {
117  status_panel_->setConnected(connected);
118 }
119 
120 void LogView::setRosTime(const ros::Time& time) {
121  status_panel_->setRosTime(time);
122 }
123 
125  status_panel_->setSystemTime(time);
126 }
127 
131  timeout(50);
132  int ch = getch();
133 
134  bool key_used = false;
135  if (ch == KEY_MOUSE) {
136  MEVENT event;
137  if (getmouse(&event) == OK) {
138  if (event.bstate & BUTTON4_PRESSED) {
139  ch = KEY_UP;
140  key_used = false;
141  }
142  else {
143  key_used = true;
144 
145  bool pressed = event.bstate & (BUTTON1_PRESSED | BUTTON2_PRESSED | BUTTON3_PRESSED);
146  if (pressed) {
147  for (size_t i = 0; i < panels_.size(); i++) {
148  size_t idx = panels_.size() - (i + 1);
149  auto& panel = panels_[idx];
150  if (panel->handleMouse(event)) {
151  break;
152  }
153  }
154  }
155  else {
156  for (auto& panel: panels_) {
157  panel->handleMouse(event);
158  }
159  }
160  }
161  }
162  }
163 
164  if (!key_used) {
165  std::for_each(panels_.rbegin(), panels_.rend(), [&](PanelInterfacePtr& panel) {
166  if (!key_used) {
167  key_used = panel->handleKey(ch);
168  }
169  });
170  }
171 
172  if (!key_used) {
173  std::for_each(panels_.rbegin(), panels_.rend(), [&](PanelInterfacePtr& panel) {
174  if (!key_used && panel->focus()) {
175  key_used = panel->handleInput(ch);
176  if (key_used) {
177  if (!panel->focus()) {
178  focusNext(panel);
179  refreshLayout();
180  }
181  if (!panel->visible()) {
182  refreshLayout();
183  }
184  }
185  }
186  });
187  }
188 
189  if (!key_used && !mouse_down_) {
190  for (size_t i = 1; i <= panels_.size(); i++) {
191  key_used = panels_[panels_.size() - i]->handleNavigation(ch);
192  if (key_used) {
193  level_panel_->refresh();
194  break;
195  }
196  }
197  }
198 
199  if (!key_used && !mouse_down_) {
200  if (ch == KEY_RESIZE)
201  {
202  refreshLayout();
203  }
204  else if (/*ch == KEY_ESC || */ch == ctrl('q') || ch == ctrl('c')) {
205  exited_ = true;
206  }
207  else if (ch == '\t') {
208  tab();
209  }
210  else if (ch == ctrl('s')) {
211  search_panel_->toggle();
212  if (search_panel_->focus()) {
214  }
215  else {
217  }
218  refreshLayout();
219  }
220  else if (ch == ctrl('x')) {
221  search_panel_->clearSearch();
222  refreshLayout();
223  }
224  else if (ch == KEY_BACKSPACE) {
226  log_panel_->forceRefresh();
227  }
228  else if (ch == KEY_ENTER_VAL) {
230  log_panel_->forceRefresh();
231  }
232  else if (ch == ctrl('e')) {
233  exclude_panel_->hide(exclude_panel_->visible());
234  if (exclude_panel_->focus()) {
236  }
237  else {
239  }
240  refreshLayout();
241  }
242  else if (ch == ctrl('f')) {
243  filter_panel_->hide(filter_panel_->visible());
244  if (filter_panel_->focus()) {
246  }
247  else {
249  }
250  refreshLayout();
251  }
252  else if (ch == ctrl('h')) {
253  help_panel_->hide(help_panel_->visible());
254  }
255  else if (ch == ctrl('n')) {
256  node_panel_->hide(node_panel_->visible());
257  if (node_panel_->focus()) {
259  }
260  else {
262  }
263  }
264  else if (ch == KEY_F(1)) {
265  level_panel_->toggleDebug();
266  }
267  else if (ch == KEY_F(2)) {
268  level_panel_->toggleInfo();
269  }
270  else if (ch == KEY_F(3)) {
271  level_panel_->toggleWarn();
272  }
273  else if (ch == KEY_F(4)) {
274  level_panel_->toggleError();
275  }
276  else if (ch == KEY_F(5)) {
277  level_panel_->toggleFatal();
278  }
279  else if (ch == KEY_F(7)) {
280  level_panel_->toggleAllNodes();
281  }
282  }
283 
284  log_panel_->refresh();
285  if (log_scroll_ != log_panel_->scrollbar()) {
286  refreshLayout();
287  log_scroll_ = log_panel_->scrollbar();
288  }
289 
290  if (node_panel_->visible()) {
291  node_panel_->refresh();
292  }
293 
294  status_panel_->refresh();
295 
296  if (help_panel_->visible()) {
297  help_panel_->toTop();
298  }
299 
300  curs_set(0);
301  for (auto& panel: panels_) {
302  panel->setCursor();
303  }
304 
305  update_panels();
306  doupdate();
307 }
308 
310  status_panel_->resize(1, COLS, 0, 0);
311  log_panel_->resize(LINES - (2 + filter_panel_->visible() + exclude_panel_->visible() + search_panel_->visible()), COLS, 1, 0);
312  level_panel_->resize(1, COLS, LINES - (1 + filter_panel_->visible() + exclude_panel_->visible() + search_panel_->visible()), 0);
313  search_panel_->resize(1, COLS, LINES - (1 + exclude_panel_->visible() + filter_panel_->visible()), 0);
314  filter_panel_->resize(1, COLS, LINES - (1 + exclude_panel_->visible()), 0);
315  exclude_panel_->resize(1, COLS, LINES - 1, 0);
316  node_panel_->resize(LINES - (2 + filter_panel_->visible() + exclude_panel_->visible() + search_panel_->visible()), COLS / 2, 1, COLS / 2 - (COLS + 1) % 2 + !log_panel_->scrollbar());
317  help_panel_->resize(21, COLS - 8, 2, 4);
318 }
319 
320 void LogView::tab() {
321  int idx = -1;
322  for (size_t i = 0; i < panels_.size(); i++) {
323  if (panels_[i]->focus()) {
324  idx = i;
325  break;
326  }
327  }
328  if (idx == -1) {
329  return;
330  }
331 
332  panels_[idx]->setFocus(false);
333  for (size_t i = 1; i < panels_.size() + 1; i++) {
334  int next = (idx + i) % panels_.size();
335  if (panels_[next]->setFocus(true)) {
336  break;
337  }
338  }
339 }
340 
342  for (auto& panel: panels_) {
343  if (panel != focused) {
344  panel->setFocus(false);
345  }
346  }
347 }
348 
350  int idx = -1;
351  for (size_t i = 0; i < panels_.size(); i++) {
352  if (panels_[i] == panel) {
353  idx = i;
354  break;
355  }
356  }
357 
358  if (idx < 0) {
359  return;
360  }
361 
362  for (size_t i = 1; i < panels_.size(); i++) {
363  int next = (idx + i) % panels_.size();
364  if (panels_[next]->setFocus(true)) {
365  break;
366  }
367  }
368 }
369 
370 } // namespace log_view
bool exited() const
Definition: log_view.cpp:112
LogStorePtr logs_
Definition: log_view.h:73
#define COLOR_RED
std::shared_ptr< PanelInterface > PanelInterfacePtr
#define COLOR_YELLOW
LogFilter log_filter_
Definition: log_view.h:74
void setRosTime(const ros::Time &time)
Definition: log_view.cpp:120
std::shared_ptr< LogStore > LogStorePtr
Definition: log_store.h:55
NodePanelPtr node_panel_
Definition: log_view.h:89
HelpPanelPtr help_panel_
Definition: log_view.h:90
#define KEY_ENTER_VAL
LevelPanelPtr level_panel_
Definition: log_view.h:84
std::vector< PanelInterfacePtr > panels_
Definition: log_view.h:82
void unfocusOthers(const PanelInterfacePtr &focused)
Definition: log_view.cpp:341
ExcludePanelPtr exclude_panel_
Definition: log_view.h:87
LogPanelPtr log_panel_
Definition: log_view.h:88
LogView(LogStorePtr &logs)
Definition: log_view.cpp:39
void setConnected(bool connected)
Definition: log_view.cpp:116
FilterPanelPtr filter_panel_
Definition: log_view.h:86
SearchPanelPtr search_panel_
Definition: log_view.h:85
void refreshLayout()
Definition: log_view.cpp:309
void setSystemTime(const ros::WallTime &time)
Definition: log_view.cpp:124
int ctrl(char key)
Definition: utils.cpp:121
StatusPanelPtr status_panel_
Definition: log_view.h:83
void focusNext(const PanelInterfacePtr &panel)
Definition: log_view.cpp:349


log_view
Author(s): Marc Alban
autogenerated on Thu Mar 4 2021 03:21:52