51 setlocale(LC_ALL,
"");
66 mousemask(ALL_MOUSE_EVENTS | REPORT_MOUSE_POSITION, NULL);
67 printf(
"\033[?1003h\n");
96 help_panel_ = std::make_shared<HelpPanel>(21, COLS - 8, 2, 4);
109 printf(
"\033[?1003l\n");
135 bool key_used =
false;
136 if (ch == KEY_MOUSE) {
138 if (getmouse(&event) == OK) {
139 if (event.bstate & BUTTON4_PRESSED) {
146 bool pressed =
event.bstate & (BUTTON1_PRESSED | BUTTON2_PRESSED | BUTTON3_PRESSED);
148 for (
size_t i = 0; i <
panels_.size(); i++) {
149 size_t idx =
panels_.size() - (i + 1);
151 if (panel->handleMouse(event)) {
158 panel->handleMouse(event);
168 key_used = panel->handleKey(ch);
175 if (!key_used && panel->focus()) {
176 key_used = panel->handleInput(ch);
178 if (!panel->focus()) {
182 if (!panel->visible()) {
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);
194 level_panel_->refresh();
200 if (!key_used && !mouse_down_) {
201 if (ch == KEY_RESIZE)
205 else if (ch ==
ctrl(
'q') || ch ==
ctrl(
'c')) {
208 else if (ch ==
'\t') {
211 else if (ch ==
ctrl(
's')) {
212 search_panel_->toggle();
213 if (search_panel_->focus()) {
214 unfocusOthers(search_panel_);
217 focusNext(search_panel_);
221 else if (ch ==
ctrl(
'x')) {
222 search_panel_->clearSearch();
225 else if (ch == KEY_BACKSPACE) {
226 log_filter_.prevMatch();
227 log_panel_->forceRefresh();
230 log_filter_.nextMatch();
231 log_panel_->forceRefresh();
233 else if (ch ==
ctrl(
'e')) {
234 exclude_panel_->hide(exclude_panel_->visible());
235 if (exclude_panel_->focus()) {
236 unfocusOthers(exclude_panel_);
239 focusNext(exclude_panel_);
243 else if (ch ==
ctrl(
'f')) {
244 filter_panel_->hide(filter_panel_->visible());
245 if (filter_panel_->focus()) {
246 unfocusOthers(filter_panel_);
249 focusNext(exclude_panel_);
253 else if (ch ==
ctrl(
'h')) {
254 help_panel_->hide(help_panel_->visible());
256 else if (ch ==
ctrl(
'n')) {
257 node_panel_->hide(node_panel_->visible());
258 if (node_panel_->focus()) {
259 unfocusOthers(node_panel_);
262 focusNext(node_panel_);
265 else if (ch == KEY_F(1)) {
266 level_panel_->toggleDebug();
268 else if (ch == KEY_F(2)) {
269 level_panel_->toggleInfo();
271 else if (ch == KEY_F(3)) {
272 level_panel_->toggleWarn();
274 else if (ch == KEY_F(4)) {
275 level_panel_->toggleError();
277 else if (ch == KEY_F(5)) {
278 level_panel_->toggleFatal();
280 else if (ch == KEY_F(7)) {
281 level_panel_->toggleAllNodes();
285 log_panel_->refresh();
286 if (log_scroll_ != log_panel_->scrollbar()) {
288 log_scroll_ = log_panel_->scrollbar();
291 if (node_panel_->visible()) {
292 node_panel_->refresh();
295 status_panel_->refresh();
297 if (help_panel_->visible()) {
298 help_panel_->toTop();
302 for (
auto& panel: panels_) {
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);
321 void LogView::tab() {
323 for (
size_t i = 0; i < panels_.size(); i++) {
324 if (panels_[i]->focus()) {
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)) {
343 for (
auto& panel: panels_) {
344 if (panel != focused) {
345 panel->setFocus(
false);
352 for (
size_t i = 0; i < panels_.size(); i++) {
353 if (panels_[i] == panel) {
363 for (
size_t i = 1; i < panels_.size(); i++) {
364 int next = (idx + i) % panels_.size();
365 if (panels_[next]->setFocus(
true)) {