console_window.cpp
Go to the documentation of this file.
1 // *****************************************************************************
2 //
3 // Copyright (c) 2015, Southwest Research Institute® (SwRI®)
4 // All rights reserved.
5 //
6 // Redistribution and use in source and binary forms, with or without
7 // modification, are permitted provided that the following conditions are met:
8 // * Redistributions of source code must retain the above copyright
9 // notice, this list of conditions and the following disclaimer.
10 // * Redistributions in binary form must reproduce the above copyright
11 // notice, this list of conditions and the following disclaimer in the
12 // documentation and/or other materials provided with the distribution.
13 // * Neither the name of Southwest Research Institute® (SwRI®) nor the
14 // names of its contributors may be used to endorse or promote products
15 // derived from this software without specific prior written permission.
16 //
17 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
18 // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20 // ARE DISCLAIMED. IN NO EVENT SHALL Southwest Research Institute® BE LIABLE
21 // FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22 // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
23 // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
24 // CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 // LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26 // OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
27 // DAMAGE.
28 //
29 // *****************************************************************************
30 
31 #include <stdint.h>
32 #include <stdio.h>
33 #include <set>
34 
35 #include <rosgraph_msgs/Log.h>
36 #include <ros/master.h> // required for getURI, VCM 12 April 2017
37 
38 
44 
45 #include <QColorDialog>
46 #include <QRegExp>
47 #include <QApplication>
48 #include <QClipboard>
49 #include <QDateTime>
50 #include <QFileDialog>
51 #include <QDir>
52 #include <QScrollBar>
53 #include <QMenu>
54 #include <QSettings>
55 
56 using namespace Qt;
57 
58 namespace swri_console {
59 
60 ConsoleWindow::ConsoleWindow(LogDatabase *db)
61  :
62  QMainWindow(),
63  db_(db),
64  db_proxy_(new LogDatabaseProxyModel(db)),
65  node_list_model_(new NodeListModel(db)),
66  node_click_handler_(new NodeClickHandler())
67 {
68  ui.setupUi(this);
69 
70  QObject::connect(ui.action_NewWindow, SIGNAL(triggered(bool)),
71  this, SIGNAL(createNewWindow()));
72 
73  QObject::connect(ui.action_Copy, SIGNAL(triggered()),
74  this, SLOT(copyLogs()));
75 
76  QObject::connect(ui.action_CopyExtended, SIGNAL(triggered()),
77  this, SLOT(copyExtendedLogs()));
78 
79  QObject::connect(ui.action_SelectAll, SIGNAL(triggered()),
80  this, SLOT(selectAllLogs()));
81 
82  QObject::connect(ui.action_ReadBagFile, SIGNAL(triggered(bool)),
83  this, SIGNAL(readBagFile()));
84 
85  QObject::connect(ui.action_ReadLogFile, SIGNAL(triggered(bool)),
86  this, SIGNAL(readLogFile()));
87 
88  QObject::connect(ui.action_ReadLogDirectory, SIGNAL(triggered(bool)),
89  this, SIGNAL(readLogDirectory()));
90 
91  QObject::connect(ui.action_SaveLogs, SIGNAL(triggered(bool)),
92  this, SLOT(saveLogs()));
93 
94  QObject::connect(ui.action_AbsoluteTimestamps, SIGNAL(toggled(bool)),
95  db_proxy_, SLOT(setAbsoluteTime(bool)));
96 
97  QObject::connect(ui.action_ShowTimestamps, SIGNAL(toggled(bool)),
98  db_proxy_, SLOT(setDisplayTime(bool)));
99 
100  QObject::connect(ui.action_RegularExpressions, SIGNAL(toggled(bool)),
101  db_proxy_, SLOT(setUseRegularExpressions(bool)));
102 
103  QObject::connect(ui.action_RegularExpressions, SIGNAL(toggled(bool)),
104  this, SLOT(updateIncludeLabel()));
105 
106  QObject::connect(ui.action_RegularExpressions, SIGNAL(toggled(bool)),
107  this, SLOT(updateExcludeLabel()));
108 
109  QObject::connect(ui.action_SelectFont, SIGNAL(triggered(bool)),
110  this, SIGNAL(selectFont()));
111 
112  QObject::connect(ui.action_ColorizeLogs, SIGNAL(toggled(bool)),
113  db_proxy_, SLOT(setColorizeLogs(bool)));
114 
115  QObject::connect(ui.debugColorWidget, SIGNAL(clicked(bool)),
116  this, SLOT(setDebugColor()));
117  QObject::connect(ui.infoColorWidget, SIGNAL(clicked(bool)),
118  this, SLOT(setInfoColor()));
119  QObject::connect(ui.warnColorWidget, SIGNAL(clicked(bool)),
120  this, SLOT(setWarnColor()));
121  QObject::connect(ui.errorColorWidget, SIGNAL(clicked(bool)),
122  this, SLOT(setErrorColor()));
123  QObject::connect(ui.fatalColorWidget, SIGNAL(clicked(bool)),
124  this, SLOT(setFatalColor()));
125 
126  ui.nodeList->setModel(node_list_model_);
127  ui.messageList->setModel(db_proxy_);
128  ui.messageList->setUniformItemSizes(true);
129 
130  QObject::connect(
131  ui.nodeList->selectionModel(),
132  SIGNAL(selectionChanged(const QItemSelection &,
133  const QItemSelection &)),
134  this,
135  SLOT(nodeSelectionChanged()));
136 
137  ui.nodeList->installEventFilter(node_click_handler_);
138 
139  QObject::connect(
140  ui.checkDebug, SIGNAL(toggled(bool)),
141  this, SLOT(setSeverityFilter()));
142  QObject::connect(
143  ui.checkInfo, SIGNAL(toggled(bool)),
144  this, SLOT(setSeverityFilter()));
145  QObject::connect(
146  ui.checkWarn, SIGNAL(toggled(bool)),
147  this, SLOT(setSeverityFilter()));
148  QObject::connect(
149  ui.checkError, SIGNAL(toggled(bool)),
150  this, SLOT(setSeverityFilter()));
151  QObject::connect(
152  ui.checkFatal, SIGNAL(toggled(bool)),
153  this, SLOT(setSeverityFilter()));
154  QObject::connect(
155  db_proxy_, SIGNAL(messagesAdded()),
156  this, SLOT(messagesAdded()));
157  QObject::connect(ui.checkFollowNewest, SIGNAL(toggled(bool)),
158  this, SLOT(setFollowNewest(bool)));
159 
160  // Right-click menu for the message list
161  QObject::connect(ui.messageList, SIGNAL(customContextMenuRequested(const QPoint&)),
162  this, SLOT(showLogContextMenu(const QPoint&)));
163 
164  QObject::connect(ui.clearAllButton, SIGNAL(clicked()),
165  this, SLOT(clearAll()));
166  QObject::connect(ui.clearMessagesButton, SIGNAL(clicked()),
167  this, SLOT(clearMessages()));
168 
169  QObject::connect(
170  ui.messageList->verticalScrollBar(), SIGNAL(valueChanged(int)),
171  this, SLOT(userScrolled(int)));
172 
173  QObject::connect(
174  ui.includeText, SIGNAL(textChanged(const QString &)),
175  this, SLOT(includeFilterUpdated(const QString &)));
176 
177  QObject::connect(
178  ui.excludeText, SIGNAL(textChanged(const QString &)),
179  this, SLOT(excludeFilterUpdated(const QString &)));
180 
181  // Connect 'Search' text modification to searchIndex, VCM 13 April 2017
182  QObject::connect(
183  ui.searchText, SIGNAL(textChanged(const QString &)),
184  this, SLOT(searchIndex()));
185  // Connect pushPrev to prevIndex()
186  QObject::connect(ui.pushPrev, SIGNAL(clicked()),
187  this, SLOT(prevIndex()));
188  // Connect pushNext to nextIndex()
189  QObject::connect(ui.pushNext, SIGNAL(clicked()),
190  this, SLOT(nextIndex()));
191 
192 
193  QList<int> sizes;
194  sizes.append(100);
195  sizes.append(1000);
196  ui.splitter->setSizes(sizes);
197 
198  loadSettings();
199 }
200 
202 {
203  delete db_proxy_;
204 }
205 
207 {
208  db_->clear();
210  db_proxy_->clearSearchFailure(); // resets failed search variables, VCM 27 April 2017
211 }
212 
214 {
215  db_->clear();
216  db_proxy_->clearSearchFailure(); // resets failed search variables, VCM 27 April 2017
217 }
218 
220 {
221  QString defaultname = QDateTime::currentDateTime().toString(Qt::ISODate) + ".bag";
222  QString filename = QFileDialog::getSaveFileName(this,
223  "Save Logs",
224  QDir::homePath() + QDir::separator() + defaultname,
225  tr("Bag Files (*.bag);;Text Files (*.txt)"));
226  if (filename != NULL && !filename.isEmpty()) {
227  db_proxy_->saveToFile(filename);
228  }
229 }
230 
232 {
233  if (connected) {
234  // When connected, display current URL along with status in the status bar, VCM 4/12/2017
235  QString currentUrl = QString::fromStdString(ros::master::getURI());
236  statusBar()->showMessage("Connected to ROS Master. URL: "+currentUrl);
237  } else {
238  statusBar()->showMessage("Disconnected from ROS Master.");
239  }
240 }
241 
242 void ConsoleWindow::closeEvent(QCloseEvent *event)
243 {
244  QMainWindow::closeEvent(event);
245 }
246 
248 {
249  db_proxy_->clearSearchFailure(); // clear search failure criteria, VCM 26 April 2017
250  QModelIndexList selection = ui.nodeList->selectionModel()->selectedIndexes();
251  std::set<std::string> nodes;
252  QStringList node_names;
253 
254  for (int i = 0; i < selection.size(); i++) {
255  std::string name = node_list_model_->nodeName(selection[i]);
256  nodes.insert(name);
257  node_names.append(name.c_str());
258  }
259 
260  db_proxy_->setNodeFilter(nodes);
261 
262  for (int i = 0; i < node_names.size(); i++) {
263  node_names[i] = node_names[i].split("/", QString::SkipEmptyParts).last();
264  }
265 
266  setWindowTitle(QString("SWRI Console (") + node_names.join(", ") + ")");
267 }
268 
270 {
271  uint8_t mask = 0;
272 
273  if (ui.checkDebug->isChecked()) {
274  mask |= rosgraph_msgs::Log::DEBUG;
275  }
276  if (ui.checkInfo->isChecked()) {
277  mask |= rosgraph_msgs::Log::INFO;
278  }
279  if (ui.checkWarn->isChecked()) {
280  mask |= rosgraph_msgs::Log::WARN;
281  }
282  if (ui.checkError->isChecked()) {
283  mask |= rosgraph_msgs::Log::ERROR;
284  }
285  if (ui.checkFatal->isChecked()) {
286  mask |= rosgraph_msgs::Log::FATAL;
287  }
288 
289  QSettings settings;
290  settings.setValue(SettingsKeys::SHOW_DEBUG, ui.checkDebug->isChecked());
291  settings.setValue(SettingsKeys::SHOW_INFO, ui.checkInfo->isChecked());
292  settings.setValue(SettingsKeys::SHOW_WARN, ui.checkWarn->isChecked());
293  settings.setValue(SettingsKeys::SHOW_ERROR, ui.checkError->isChecked());
294  settings.setValue(SettingsKeys::SHOW_FATAL, ui.checkFatal->isChecked());
295 
297  db_proxy_->clearSearchFailure(); // resets search failure variables, VCM 27 April 2017
298 }
299 
301 {
302  if (ui.checkFollowNewest->isChecked()) {
303  ui.messageList->scrollToBottom();
304  }
305 }
306 
307 
308 void ConsoleWindow::showLogContextMenu(const QPoint& point)
309 {
310  QMenu contextMenu(tr("Context menu"), ui.messageList);
311 
312  QAction select_all(tr("Select All"), ui.messageList);
313  connect(&select_all, SIGNAL(triggered()), this, SLOT(selectAllLogs()));
314 
315  QAction copy(tr("Copy"), ui.messageList);
316  connect(&copy, SIGNAL(triggered()), this, SLOT(copyLogs()));
317 
318  QAction copy_extended(tr("Copy Extended"), ui.messageList);
319  connect(&copy_extended, SIGNAL(triggered()), this, SLOT(copyExtendedLogs()));
320 
321  QAction alternate_row_colors(tr("Alternate Row Colors"), ui.messageList);
322  alternate_row_colors.setCheckable(true);
323  alternate_row_colors.setChecked(ui.messageList->alternatingRowColors());
324  connect(&alternate_row_colors, SIGNAL(toggled(bool)),
325  this, SLOT(toggleAlternateRowColors(bool)));
326 
327  contextMenu.addAction(&select_all);
328  contextMenu.addAction(&copy);
329  contextMenu.addAction(&copy_extended);
330  contextMenu.addAction(&alternate_row_colors);
331 
332  contextMenu.exec(ui.messageList->mapToGlobal(point));
333 }
334 
336 {
337  if (value != ui.messageList->verticalScrollBar()->maximum()) {
338  ui.checkFollowNewest->setChecked(false);
339  } else {
340  ui.checkFollowNewest->setChecked(true);
341  }
342 }
343 
344 
346 {
347  if (ui.nodeList->hasFocus()) {
348  ui.nodeList->selectAll();
349  } else {
350  ui.messageList->selectAll();
351  }
352 }
353 
355 {
356  QStringList buffer;
357  foreach(const QModelIndex &index, ui.messageList->selectionModel()->selectedIndexes())
358  {
359  buffer << db_proxy_->data(index, Qt::DisplayRole).toString();
360  }
361  QApplication::clipboard()->setText(buffer.join(tr("\n")));
362 }
363 
365 {
366  QStringList buffer;
367  foreach(const QModelIndex &index, ui.messageList->selectionModel()->selectedIndexes())
368  {
369  buffer << db_proxy_->data(index, LogDatabaseProxyModel::ExtendedLogRole).toString();
370  }
371  QApplication::clipboard()->setText(buffer.join(tr("\n\n")));
372 }
373 
375 {
376  QSettings settings;
377  settings.setValue(SettingsKeys::FOLLOW_NEWEST, follow);
378 }
379 
380 void ConsoleWindow::includeFilterUpdated(const QString &text)
381 {
382  QStringList items = text.split(";", QString::SkipEmptyParts);
383  QStringList filtered;
384 
385  for (int i = 0; i < items.size(); i++) {
386  QString x = items[i].trimmed();
387  if (!x.isEmpty()) {
388  filtered.append(x);
389  }
390  }
391 
392  db_proxy_->setIncludeFilters(filtered);
394  db_proxy_->clearSearchFailure(); // resets failed search variables, VCM 27 April 2017
396 }
397 
398 void ConsoleWindow::excludeFilterUpdated(const QString &text)
399 {
400  QStringList items = text.split(";", QString::SkipEmptyParts);
401  QStringList filtered;
402 
403  for (int i = 0; i < items.size(); i++) {
404  QString x = items[i].trimmed();
405  if (!x.isEmpty()) {
406  filtered.append(x);
407  }
408  }
409 
410  db_proxy_->setExcludeFilters(filtered);
412  db_proxy_->clearSearchFailure(); // resets failed search variables, VCM 27 April 2017
414 }
415 
416 // Slot called when 'Search' text modified, 13 April 2017 VCM
418 {
420 }
421 // Slot called when 'Previous' button pushed, 13 April 2017 VCM
423 {
425 }
426 // Slot called when 'Next' button pushed, 13 April 2017 VCM
428 {
430 }
431 
432 // Search Function sF Definitions:
433 // 1)search - user modified 'Search' text
434 // 2)next - user pressed 'Next' button
435 // 3)prev - user pressed 'Previous' button
436 // Locates and selects the next item based on search criteria, VCM 26 April 2017
438 {
439  int rowSearchStart = ui.messageList->currentIndex().row(); // retrieve current index
440  int increment = 1; // used for search/next/prev; prev(ious) increment will change to -1
441  QString searchText = ui.searchText->text(); // actual text to search for
442  searchText = searchText.toUpper().trimmed(); // remove lowercase and lead/trailing spaces.
443  // next button pushed
444  if(sF == NEXT){
445  rowSearchStart++; // start search row after current.
446  }
447  // Previous button pushed
448  else if(sF== PREV){
449  rowSearchStart--; // start search row before current
450  increment=-1; // -1 to move search up instead of down
451  }
452  // search text modified
453  else if(sF==SEARCH )
454  {
455  if (rowSearchStart==-1){
456  rowSearchStart =0; // for search, no selection (-1) index change to 0
457  }
458  }
459  else
460  {
461  // should not end up here
462  printf("Invalid string passed to ConsoleWindow::nextIndex");
463  return;
464  }
465  // calls getItemIndex in log_database_proxy_m, returns new index
466  int newRowIndex = db_proxy_->getItemIndex(searchText,rowSearchStart, increment);
467  ui.messageList->clearSelection(); // clear current selection
468  if(newRowIndex == -1) // indicates no match.
469  {
470  return;
471  }
472 
473  QModelIndex index = ui.messageList->model()->index(newRowIndex,0); // defines desired index
474  ui.messageList->setCurrentIndex(index); // sets desired index, re-centers screen on new index
475  ui.checkFollowNewest->setChecked(false); // stops scrolling if search found
476 
477 
478 }
479 
480 
482 {
483  if (db_proxy_->isIncludeValid()) {
484  ui.includeLabel->setText("Include");
485  } else {
486  ui.includeLabel->setText("<font color='red'>Include</font>");
487  }
488 }
489 
491 {
492  if (db_proxy_->isExcludeValid()) {
493  ui.excludeLabel->setText("Exclude");
494  } else {
495  ui.excludeLabel->setText("<font color='red'>Exclude</font>");
496  }
497 }
498 
499 void ConsoleWindow::setFont(const QFont &font)
500 {
501  ui.messageList->setFont(font);
502  ui.nodeList->setFont(font);
503 }
504 
506 {
507  chooseButtonColor(ui.debugColorWidget);
508 }
509 
511 {
512  chooseButtonColor(ui.infoColorWidget);
513 }
514 
516 {
517  chooseButtonColor(ui.warnColorWidget);
518 }
519 
521 {
522  chooseButtonColor(ui.errorColorWidget);
523 }
524 
526 {
527  chooseButtonColor(ui.fatalColorWidget);
528 }
529 
530 void ConsoleWindow::chooseButtonColor(QPushButton* widget)
531 {
532  QColor old_color = getButtonColor(widget);
533  QColor color = QColorDialog::getColor(old_color, this);
534  if (color.isValid()) {
535  updateButtonColor(widget, color);
536  }
537 }
538 
539 QColor ConsoleWindow::getButtonColor(const QPushButton* button) const
540 {
541  QString ss = button->styleSheet();
542  QRegExp re("background: (#\\w*);");
543  QColor old_color;
544  if (re.indexIn(ss) >= 0) {
545  old_color = QColor(re.cap(1));
546  }
547  return old_color;
548 }
549 
550 void ConsoleWindow::updateButtonColor(QPushButton* widget, const QColor& color)
551 {
552  QString s("background: #"
553  + QString(color.red() < 16? "0" : "") + QString::number(color.red(),16)
554  + QString(color.green() < 16? "0" : "") + QString::number(color.green(),16)
555  + QString(color.blue() < 16? "0" : "") + QString::number(color.blue(),16) + ";");
556  widget->setStyleSheet(s);
557  widget->update();
558 
559  if (widget == ui.debugColorWidget) {
560  db_proxy_->setDebugColor(color);
561  }
562  else if (widget == ui.infoColorWidget) {
563  db_proxy_->setInfoColor(color);
564  }
565  else if (widget == ui.warnColorWidget) {
566  db_proxy_->setWarnColor(color);
567  }
568  else if (widget == ui.errorColorWidget) {
569  db_proxy_->setErrorColor(color);
570  }
571  else if (widget == ui.fatalColorWidget) {
572  db_proxy_->setFatalColor(color);
573  }
574  else {
575  qWarning("Unexpected widget passed to ConsoleWindow::updateButtonColor.");
576  }
577 }
578 
579 void ConsoleWindow::loadColorButtonSetting(const QString& key, QPushButton* button)
580 {
581  QSettings settings;
582  QColor defaultColor;
583  // The color buttons don't have a default value set in the .ui file, so we need to
584  // supply defaults for them here in case the appropriate setting isn't found.
585  if (button == ui.debugColorWidget) {
586  defaultColor = Qt::gray;
587  }
588  else if (button == ui.infoColorWidget) {
589  defaultColor = Qt::black;
590  }
591  else if (button == ui.warnColorWidget) {
592  defaultColor = QColor(255, 127, 0);
593  }
594  else if (button == ui.errorColorWidget) {
595  defaultColor = Qt::red;
596  }
597  else if (button == ui.fatalColorWidget) {
598  defaultColor = Qt::magenta;
599  }
600  QColor color = settings.value(key, defaultColor).value<QColor>();
601  updateButtonColor(button, color);
602 }
603 
605 {
606  ui.messageList->setAlternatingRowColors(checked);
607 
608  QSettings settings;
609  settings.setValue(SettingsKeys::ALTERNATE_LOG_ROW_COLORS, checked);
610 }
611 
613 {
614  // First, load all the boolean settings...
616  loadBooleanSetting(SettingsKeys::ABSOLUTE_TIMESTAMPS, ui.action_AbsoluteTimestamps);
617  loadBooleanSetting(SettingsKeys::USE_REGEXPS, ui.action_RegularExpressions);
618  loadBooleanSetting(SettingsKeys::COLORIZE_LOGS, ui.action_ColorizeLogs);
620 
621  // The severity level has to be handled a little differently, since they're all combined
622  // into a single integer mask under the hood. First they have to be loaded from the settings,
623  // then set in the UI, then the mask has to actually be applied.
624  QSettings settings;
625  bool showDebug = settings.value(SettingsKeys::SHOW_DEBUG, true).toBool();
626  bool showInfo = settings.value(SettingsKeys::SHOW_INFO, true).toBool();
627  bool showWarn = settings.value(SettingsKeys::SHOW_WARN, true).toBool();
628  bool showError = settings.value(SettingsKeys::SHOW_ERROR, true).toBool();
629  bool showFatal = settings.value(SettingsKeys::SHOW_FATAL, true).toBool();
630  ui.checkDebug->setChecked(showDebug);
631  ui.checkInfo->setChecked(showInfo);
632  ui.checkWarn->setChecked(showWarn);
633  ui.checkError->setChecked(showError);
634  ui.checkFatal->setChecked(showFatal);
636 
637  // Load button colors.
643 
644  // Finally, load the filter contents.
645  QString includeFilter = settings.value(SettingsKeys::INCLUDE_FILTER, "").toString();
646  ui.includeText->setText(includeFilter);
647  QString excludeFilter = settings.value(SettingsKeys::EXCLUDE_FILTER, "").toString();
648  ui.excludeText->setText(excludeFilter);
649 
650  bool alternate_row_colors = settings.value(SettingsKeys::ALTERNATE_LOG_ROW_COLORS, true).toBool();
651  ui.messageList->setAlternatingRowColors(alternate_row_colors);
652 }
653 } // namespace swri_console
654 
static const QString INFO_COLOR
Definition: settings_keys.h:60
void showLogContextMenu(const QPoint &point)
static const QString DISPLAY_TIMESTAMPS
Definition: settings_keys.h:47
ROSCPP_DECL const std::string & getURI()
void setFatalColor(const QColor &fatal_color)
static const QString FATAL_COLOR
Definition: settings_keys.h:63
void setIncludeFilters(const QStringList &list)
static const QString USE_REGEXPS
Definition: settings_keys.h:49
NodeListModel * node_list_model_
static const QString SHOW_WARN
Definition: settings_keys.h:54
static const QString ALTERNATE_LOG_ROW_COLORS
Definition: settings_keys.h:65
virtual QVariant data(const QModelIndex &index, int role) const
static const QString WARN_COLOR
Definition: settings_keys.h:61
XmlRpcServer s
void closeEvent(QCloseEvent *event)
QColor getButtonColor(const QPushButton *button) const
LogDatabaseProxyModel * db_proxy_
void setInfoColor(const QColor &info_color)
void setSeverityFilter(uint8_t severity_mask)
void loadColorButtonSetting(const QString &key, QPushButton *button)
void setWarnColor(const QColor &warn_color)
std::string nodeName(const QModelIndex &index) const
static const QString FOLLOW_NEWEST
Definition: settings_keys.h:57
void setErrorColor(const QColor &error_color)
void setExcludeFilters(const QStringList &list)
static const QString EXCLUDE_FILTER
Definition: settings_keys.h:51
static const QString DEBUG_COLOR
Definition: settings_keys.h:59
void saveToFile(const QString &filename) const
void loadBooleanSetting(const QString &key, T *element)
static const QString COLORIZE_LOGS
Definition: settings_keys.h:64
void setNodeFilter(const std::set< std::string > &names)
int getItemIndex(const QString searchText, int index, int increment)
void updateButtonColor(QPushButton *widget, const QColor &color)
static const QString ABSOLUTE_TIMESTAMPS
Definition: settings_keys.h:48
NodeClickHandler * node_click_handler_
void setFont(const QFont &font)
static const QString SHOW_INFO
Definition: settings_keys.h:53
void setDebugColor(const QColor &debug_color)
static const QString ERROR_COLOR
Definition: settings_keys.h:62
static const QString INCLUDE_FILTER
Definition: settings_keys.h:50
static const QString SHOW_DEBUG
Definition: settings_keys.h:52
void setExcludeRegexpPattern(const QString &pattern)
static const QString SHOW_ERROR
Definition: settings_keys.h:55
void excludeFilterUpdated(const QString &)
void includeFilterUpdated(const QString &)
void updateCurrentIndex(function sF)
void chooseButtonColor(QPushButton *widget)
static const QString SHOW_FATAL
Definition: settings_keys.h:56
void setIncludeRegexpPattern(const QString &pattern)


swri_console
Author(s):
autogenerated on Wed Jun 5 2019 21:25:59