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"); // Enable mouse move events
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  printf("\033[?1003l\n"); // Disable mouse movement events
110  endwin();
111 }
112 
113 bool LogView::exited() const {
114  return exited_;
115 }
116 
117 void LogView::setConnected(bool connected) {
118  status_panel_->setConnected(connected);
119 }
120 
121 void LogView::setRosTime(const ros::Time& time) {
122  status_panel_->setRosTime(time);
123 }
124 
126  status_panel_->setSystemTime(time);
127 }
128 
132  timeout(50);
133  int ch = getch();
134 
135  bool key_used = false;
136  if (ch == KEY_MOUSE) {
137  MEVENT event;
138  if (getmouse(&event) == OK) {
139  if (event.bstate & BUTTON4_PRESSED) {
140  ch = KEY_UP;
141  key_used = false;
142  }
143  else {
144  key_used = true;
145 
146  bool pressed = event.bstate & (BUTTON1_PRESSED | BUTTON2_PRESSED | BUTTON3_PRESSED);
147  if (pressed) {
148  for (size_t i = 0; i < panels_.size(); i++) {
149  size_t idx = panels_.size() - (i + 1);
150  auto& panel = panels_[idx];
151  if (panel->handleMouse(event)) {
152  break;
153  }
154  }
155  }
156  else {
157  for (auto& panel: panels_) {
158  panel->handleMouse(event);
159  }
160  }
161  }
162  }
163  }
164 
165  if (!key_used) {
166  std::for_each(panels_.rbegin(), panels_.rend(), [&](PanelInterfacePtr& panel) {
167  if (!key_used) {
168  key_used = panel->handleKey(ch);
169  }
170  });
171  }
172 
173  if (!key_used) {
174  std::for_each(panels_.rbegin(), panels_.rend(), [&](PanelInterfacePtr& panel) {
175  if (!key_used && panel->focus()) {
176  key_used = panel->handleInput(ch);
177  if (key_used) {
178  if (!panel->focus()) {
179  focusNext(panel);
180  refreshLayout();
181  }
182  if (!panel->visible()) {
183  refreshLayout();
184  }
185  }
186  }
187  });
188  }
189 
190  if (!key_used && !mouse_down_) {
191  for (size_t i = 1; i <= panels_.size(); i++) {
192  key_used = panels_[panels_.size() - i]->handleNavigation(ch);
193  if (key_used) {
194  level_panel_->refresh();
195  break;
196  }
197  }
198  }
199 
200  if (!key_used && !mouse_down_) {
201  if (ch == KEY_RESIZE)
202  {
203  refreshLayout();
204  }
205  else if (/*ch == KEY_ESC || */ch == ctrl('q') || ch == ctrl('c')) {
206  exited_ = true;
207  }
208  else if (ch == '\t') {
209  tab();
210  }
211  else if (ch == ctrl('s')) {
212  search_panel_->toggle();
213  if (search_panel_->focus()) {
214  unfocusOthers(search_panel_);
215  }
216  else {
217  focusNext(search_panel_);
218  }
219  refreshLayout();
220  }
221  else if (ch == ctrl('x')) {
222  search_panel_->clearSearch();
223  refreshLayout();
224  }
225  else if (ch == KEY_BACKSPACE) {
226  log_filter_.prevMatch();
227  log_panel_->forceRefresh();
228  }
229  else if (ch == KEY_ENTER_VAL) {
230  log_filter_.nextMatch();
231  log_panel_->forceRefresh();
232  }
233  else if (ch == ctrl('e')) {
234  exclude_panel_->hide(exclude_panel_->visible());
235  if (exclude_panel_->focus()) {
236  unfocusOthers(exclude_panel_);
237  }
238  else {
239  focusNext(exclude_panel_);
240  }
241  refreshLayout();
242  }
243  else if (ch == ctrl('f')) {
244  filter_panel_->hide(filter_panel_->visible());
245  if (filter_panel_->focus()) {
246  unfocusOthers(filter_panel_);
247  }
248  else {
249  focusNext(exclude_panel_);
250  }
251  refreshLayout();
252  }
253  else if (ch == ctrl('h')) {
254  help_panel_->hide(help_panel_->visible());
255  }
256  else if (ch == ctrl('n')) {
257  node_panel_->hide(node_panel_->visible());
258  if (node_panel_->focus()) {
259  unfocusOthers(node_panel_);
260  }
261  else {
262  focusNext(node_panel_);
263  }
264  }
265  else if (ch == KEY_F(1)) {
266  level_panel_->toggleDebug();
267  }
268  else if (ch == KEY_F(2)) {
269  level_panel_->toggleInfo();
270  }
271  else if (ch == KEY_F(3)) {
272  level_panel_->toggleWarn();
273  }
274  else if (ch == KEY_F(4)) {
275  level_panel_->toggleError();
276  }
277  else if (ch == KEY_F(5)) {
278  level_panel_->toggleFatal();
279  }
280  else if (ch == KEY_F(7)) {
281  level_panel_->toggleAllNodes();
282  }
283  }
284 
285  log_panel_->refresh();
286  if (log_scroll_ != log_panel_->scrollbar()) {
287  refreshLayout();
288  log_scroll_ = log_panel_->scrollbar();
289  }
290 
291  if (node_panel_->visible()) {
292  node_panel_->refresh();
293  }
294 
295  status_panel_->refresh();
296 
297  if (help_panel_->visible()) {
298  help_panel_->toTop();
299  }
300 
301  curs_set(0);
302  for (auto& panel: panels_) {
303  panel->setCursor();
304  }
305 
306  update_panels();
307  doupdate();
308 }
309 
310 void LogView::refreshLayout() {
311  status_panel_->resize(1, COLS, 0, 0);
312  log_panel_->resize(LINES - (2 + filter_panel_->visible() + exclude_panel_->visible() + search_panel_->visible()), COLS, 1, 0);
313  level_panel_->resize(1, COLS, LINES - (1 + filter_panel_->visible() + exclude_panel_->visible() + search_panel_->visible()), 0);
314  search_panel_->resize(1, COLS, LINES - (1 + exclude_panel_->visible() + filter_panel_->visible()), 0);
315  filter_panel_->resize(1, COLS, LINES - (1 + exclude_panel_->visible()), 0);
316  exclude_panel_->resize(1, COLS, LINES - 1, 0);
317  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());
318  help_panel_->resize(21, COLS - 8, 2, 4);
319 }
320 
321 void LogView::tab() {
322  int idx = -1;
323  for (size_t i = 0; i < panels_.size(); i++) {
324  if (panels_[i]->focus()) {
325  idx = i;
326  break;
327  }
328  }
329  if (idx == -1) {
330  return;
331  }
332 
333  panels_[idx]->setFocus(false);
334  for (size_t i = 1; i < panels_.size() + 1; i++) {
335  int next = (idx + i) % panels_.size();
336  if (panels_[next]->setFocus(true)) {
337  break;
338  }
339  }
340 }
341 
342 void LogView::unfocusOthers(const PanelInterfacePtr& focused) {
343  for (auto& panel: panels_) {
344  if (panel != focused) {
345  panel->setFocus(false);
346  }
347  }
348 }
349 
350 void LogView::focusNext(const PanelInterfacePtr& panel) {
351  int idx = -1;
352  for (size_t i = 0; i < panels_.size(); i++) {
353  if (panels_[i] == panel) {
354  idx = i;
355  break;
356  }
357  }
358 
359  if (idx < 0) {
360  return;
361  }
362 
363  for (size_t i = 1; i < panels_.size(); i++) {
364  int next = (idx + i) % panels_.size();
365  if (panels_[next]->setFocus(true)) {
366  break;
367  }
368  }
369 }
370 
371 } // namespace log_view
log_view::LogView::setRosTime
void setRosTime(const ros::Time &time)
Definition: log_view.cpp:121
log_view::ctrl
int ctrl(char key)
Definition: utils.cpp:121
log_view::LogView::init
void init()
Definition: log_view.cpp:50
log_view
Definition: datatypes.h:35
log_view::LogStorePtr
std::shared_ptr< LogStore > LogStorePtr
Definition: log_store.h:55
log_view.h
log_view::CP_RED
@ CP_RED
Definition: utils.h:38
log_view::LogView::logs_
LogStorePtr logs_
Definition: log_view.h:73
log_view::CP_GREY
@ CP_GREY
Definition: utils.h:38
log_view::LogView::setSystemTime
void setSystemTime(const ros::WallTime &time)
Definition: log_view.cpp:125
log_view::LogView::setConnected
void setConnected(bool connected)
Definition: log_view.cpp:117
log_view::LogView::refreshLayout
void refreshLayout()
Definition: log_view.cpp:310
log_view::LogView::status_panel_
StatusPanelPtr status_panel_
Definition: log_view.h:83
utils.h
log_view::LogFilter::idleProcess
void idleProcess()
Definition: log_filter.cpp:171
log_view::LogView::filter_panel_
FilterPanelPtr filter_panel_
Definition: log_view.h:86
log_view::LogView::log_filter_
LogFilter log_filter_
Definition: log_view.h:74
log_view::LogView::log_panel_
LogPanelPtr log_panel_
Definition: log_view.h:88
log_view::PanelInterfacePtr
std::shared_ptr< PanelInterface > PanelInterfacePtr
Definition: panel_interface.h:115
log_view::LogView::node_panel_
NodePanelPtr node_panel_
Definition: log_view.h:89
log_view::LogView::exited
bool exited() const
Definition: log_view.cpp:113
log_view::LogView::update
void update()
Definition: log_view.cpp:129
ros::WallTime
log_view::CP_DEFAULT
@ CP_DEFAULT
Definition: utils.h:38
log_view::LogView::~LogView
~LogView()
Definition: log_view.cpp:46
ros::Time
log_view::CP_YELLOW
@ CP_YELLOW
Definition: utils.h:38
KEY_ENTER_VAL
#define KEY_ENTER_VAL
Definition: panel_interface.h:37
log_view::LogView::LogView
LogView(LogStorePtr &logs)
Definition: log_view.cpp:39
log_view::LogView::exited_
bool exited_
Definition: log_view.h:76
log_view::LogView::close
void close()
Definition: log_view.cpp:108
log_view::LogView::search_panel_
SearchPanelPtr search_panel_
Definition: log_view.h:85
log_view::LogView::panels_
std::vector< PanelInterfacePtr > panels_
Definition: log_view.h:82
log_view::CP_DEFAULT_CYAN
@ CP_DEFAULT_CYAN
Definition: utils.h:38
log_view::LogView::exclude_panel_
ExcludePanelPtr exclude_panel_
Definition: log_view.h:87
COLOR_YELLOW
#define COLOR_YELLOW
log_view::LogFilter::update
void update()
Definition: log_filter.cpp:157
log_view::LogView::level_panel_
LevelPanelPtr level_panel_
Definition: log_view.h:84
log_view::CP_DEFAULT_GREY
@ CP_DEFAULT_GREY
Definition: utils.h:38
log_view::LogView::help_panel_
HelpPanelPtr help_panel_
Definition: log_view.h:90
COLOR_RED
#define COLOR_RED


log_view
Author(s): Marc Alban
autogenerated on Sat Sep 17 2022 02:22:53