3 #include <QProgressDialog>
7 #include "cetlib/filepath_maker.h"
8 #include "fhiclcpp/ParameterSet.h"
9 #include "fhiclcpp/make_ParameterSet.h"
11 #include "mfextensions/Binaries/mvdlg.hh"
13 #if GCC_VERSION >= 701000 || defined(__clang__)
14 #pragma GCC diagnostic push
15 #pragma GCC diagnostic ignored "-Wimplicit-fallthrough"
18 #define TRACE_NAME "MessageViewer"
21 #if GCC_VERSION >= 701000 || defined(__clang__)
22 #pragma GCC diagnostic pop
29 static void process_fname(std::string& fname)
31 size_t sub_start = fname.find(
"${");
32 size_t sub_end = fname.find(
"}");
34 const size_t npos = std::string::npos;
36 if ((sub_start == npos && sub_end != npos) || (sub_start != npos && sub_end == npos) || (sub_start > sub_end))
38 throw std::runtime_error(
"Unrecognized configuration file. Use default configuration instead.");
41 if (sub_start == npos)
return;
43 std::string env = std::string(getenv(fname.substr(sub_start + 2, sub_end - sub_start - 2).c_str()));
44 fname.replace(sub_start, sub_end - sub_start + 1, env);
49 static fhicl::ParameterSet readConf(std::string
const& fname)
51 if (fname.empty())
return fhicl::ParameterSet();
53 std::string filename = fname;
54 process_fname(filename);
56 std::string env(
"FHICL_FILE_PATH=");
58 if (filename[0] ==
'/')
67 char* mfe_path = getenv(
"MFEXTENSIONS_DIR");
68 if (mfe_path) env.append(
":").append(mfe_path).append(
"/config");
70 putenv((
char*)env.c_str());
74 cet::filepath_lookup policy(
"FHICL_FILE_PATH");
77 fhicl::ParameterSet pset;
78 fhicl::make_ParameterSet(filename, policy, pset);
84 : QDialog(parent), paused(false), shortMode_(false), nMsgs(0), nSupMsgs(0), nThrMsgs(0), nFilters(0), nDeleted(0), simpleRender(true), searchStr(
""), msg_pool_(), host_msgs_(), cat_msgs_(), app_msgs_(), sup_menu(new QMenu(this)), thr_menu(new QMenu(this)), receivers_(readConf(conf).get<fhicl::ParameterSet>(
"receivers", fhicl::ParameterSet()))
92 fhicl::ParameterSet pset = readConf(conf);
98 btnSuppression->setMenu(sup_menu);
99 btnThrottling->setMenu(thr_menu);
102 connect(btnPause, SIGNAL(clicked()),
this, SLOT(
pause()));
103 connect(btnScrollToBottom, SIGNAL(clicked()),
this, SLOT(scrollToBottom()));
104 connect(btnExit, SIGNAL(clicked()),
this, SLOT(
exit()));
105 connect(btnClear, SIGNAL(clicked()),
this, SLOT(
clear()));
107 connect(btnRMode, SIGNAL(clicked()),
this, SLOT(renderMode()));
108 connect(btnDisplayMode, SIGNAL(clicked()),
this, SLOT(
shortMode()));
110 connect(btnSearch, SIGNAL(clicked()),
this, SLOT(searchMsg()));
111 connect(btnSearchClear, SIGNAL(clicked()),
this, SLOT(searchClear()));
113 connect(btnFilter, SIGNAL(clicked()),
this, SLOT(setFilter()));
115 connect(btnError, SIGNAL(clicked()),
this, SLOT(setSevError()));
116 connect(btnWarning, SIGNAL(clicked()),
this, SLOT(setSevWarning()));
117 connect(btnInfo, SIGNAL(clicked()),
this, SLOT(setSevInfo()));
118 connect(btnDebug, SIGNAL(clicked()),
this, SLOT(setSevDebug()));
120 connect(sup_menu, SIGNAL(triggered(QAction*)),
this, SLOT(setSuppression(QAction*)));
122 connect(thr_menu, SIGNAL(triggered(QAction*)),
this, SLOT(setThrottling(QAction*)));
124 connect(vsSeverity, SIGNAL(valueChanged(
int)),
this, SLOT(
changeSeverity(
int)));
126 connect(&receivers_, SIGNAL(newMessage(
qt_mf_msg const&)),
this, SLOT(onNewMsg(
qt_mf_msg const&)));
128 connect(tabWidget, SIGNAL(currentChanged(
int)),
this, SLOT(tabWidgetCurrentChanged(
int)));
129 connect(tabWidget, SIGNAL(tabCloseRequested(
int)),
this, SLOT(tabCloseRequested(
int)));
130 MsgFilterDisplay allMessages;
131 allMessages.txtDisplay = txtMessages;
132 allMessages.nDisplayMsgs = 0;
133 allMessages.nDisplayedDeletedMsgs = 0;
134 allMessages.sevThresh = SINFO;
135 msgFilters_.push_back(allMessages);
138 QTabBar* tabBar = tabWidget->findChild<QTabBar*>();
139 tabBar->setTabButton(0, QTabBar::RightSide, 0);
140 tabBar->setTabButton(0, QTabBar::LeftSide, 0);
143 btnRMode->setChecked(
true);
145 btnRMode->setChecked(
false);
147 btnRMode->setEnabled(
false);
151 QTextDocument* doc =
new QTextDocument(txtMessages);
152 txtMessages->setDocument(doc);
157 msgViewerDlg::~msgViewerDlg()
163 static void str_to_suppress(std::vector<std::string>
const& vs, std::vector<suppress>& s, QMenu* menu)
169 act = menu->addAction(
"None");
170 act->setEnabled(
false);
174 s.reserve(vs.size());
176 for (
size_t i = 0; i < vs.size(); ++i)
179 act = menu->addAction(QString(vs[i].c_str()));
180 act->setCheckable(
true);
181 act->setChecked(
true);
182 QVariant v = qVariantFromValue((
void*)&s[i]);
187 static void pset_to_throttle(std::vector<fhicl::ParameterSet>
const& ps, std::vector<throttle>& t, QMenu* menu)
193 act = menu->addAction(
"None");
194 act->setEnabled(
false);
198 t.reserve(ps.size());
200 for (
size_t i = 0; i < ps.size(); ++i)
202 std::string name = ps[i].get<std::string>(
"name");
203 t.push_back(
throttle(name, ps[i].get<int>(
"limit", -1), ps[i].get<long>(
"timespan", -1)));
204 act = menu->addAction(QString(name.c_str()));
205 act->setCheckable(
true);
206 act->setChecked(
true);
207 QVariant v = qVariantFromValue((
void*)&t[i]);
212 void msgViewerDlg::parseConf(fhicl::ParameterSet
const& conf)
214 fhicl::ParameterSet nulp;
218 fhicl::ParameterSet sup = conf.get<fhicl::ParameterSet>(
"suppress", nulp);
220 auto sup_host = sup.get<std::vector<std::string>>(
"hosts", std::vector<std::string>());
221 auto sup_app = sup.get<std::vector<std::string>>(
"applications", std::vector<std::string>());
222 auto sup_cat = sup.get<std::vector<std::string>>(
"categories", std::vector<std::string>());
224 str_to_suppress(sup_host, e_sup_host, sup_menu);
225 sup_menu->addSeparator();
227 str_to_suppress(sup_app, e_sup_app, sup_menu);
228 sup_menu->addSeparator();
230 str_to_suppress(sup_cat, e_sup_cat, sup_menu);
233 auto thr = conf.get<fhicl::ParameterSet>(
"throttle", nulp);
235 auto thr_host = thr.get<std::vector<fhicl::ParameterSet>>(
"hosts", std::vector<fhicl::ParameterSet>());
236 auto thr_app = thr.get<std::vector<fhicl::ParameterSet>>(
"applications", std::vector<fhicl::ParameterSet>());
237 auto thr_cat = thr.get<std::vector<fhicl::ParameterSet>>(
"categories", std::vector<fhicl::ParameterSet>());
239 pset_to_throttle(thr_host, e_thr_host, thr_menu);
240 thr_menu->addSeparator();
242 pset_to_throttle(thr_app, e_thr_app, thr_menu);
243 thr_menu->addSeparator();
245 pset_to_throttle(thr_cat, e_thr_cat, thr_menu);
247 maxMsgs = conf.get<
size_t>(
"max_message_buffer_size", 100000);
248 maxDeletedMsgs = conf.get<
size_t>(
"max_displayed_deleted_messages", 100000);
251 bool msgViewerDlg::msg_throttled(
qt_mf_msg const& mfmsg)
257 for (
size_t i = 0; i < e_sup_host.size(); ++i)
258 if (e_sup_host[i].match(mfmsg.
host().toStdString()))
return true;
260 for (
size_t i = 0; i < e_sup_app.size(); ++i)
261 if (e_sup_app[i].match(mfmsg.
app().toStdString()))
return true;
263 for (
size_t i = 0; i < e_sup_cat.size(); ++i)
264 if (e_sup_cat[i].match(mfmsg.
cat().toStdString()))
return true;
272 for (
size_t i = 0; i < e_thr_host.size(); ++i)
273 if (e_thr_host[i].reach_limit(mfmsg.
host().toStdString(), mfmsg.
time()))
return true;
275 for (
size_t i = 0; i < e_thr_app.size(); ++i)
276 if (e_thr_app[i].reach_limit(mfmsg.
app().toStdString(), mfmsg.
time()))
return true;
278 for (
size_t i = 0; i < e_thr_cat.size(); ++i)
279 if (e_thr_cat[i].reach_limit(mfmsg.
cat().toStdString(), mfmsg.
time()))
return true;
286 void msgViewerDlg::writeSettings()
288 QSettings settings(
"ARTDAQ",
"MsgViewer");
290 settings.beginGroup(
"MainWindow");
291 settings.setValue(
"size", size());
292 settings.setValue(
"pos", pos());
296 void msgViewerDlg::readSettings()
298 QSettings settings(
"ARTDAQ",
"MsgViewer");
300 settings.beginGroup(
"MainWindow");
301 QPoint pos = settings.value(
"pos", QPoint(100, 100)).toPoint();
302 QSize size = settings.value(
"size", QSize(660, 760)).toSize();
308 void msgViewerDlg::onNewMsg(
qt_mf_msg const& mfmsg)
315 lcdMsgs->display(nMsgs);
318 if (msg_throttled(mfmsg))
320 lcdSuppressionCount->display(nSupMsgs);
321 lcdThrottlingCount->display(nThrMsgs);
326 msg_pool_.emplace_back(mfmsg);
328 while (maxMsgs > 0 && msg_pool_.size() > maxMsgs)
330 removeMsg(msg_pool_.begin());
333 msgs_t::iterator it = --msg_pool_.end();
336 unsigned int flag = update_index(it);
339 if (flag & LIST_APP) updateList<msg_iters_map_t>(lwApplication, app_msgs_);
340 if (flag & LIST_CAT) updateList<msg_iters_map_t>(lwCategory, cat_msgs_);
341 if (flag & LIST_HOST) updateList<msg_iters_map_t>(lwHost, host_msgs_);
343 for (
size_t d = 0; d < msgFilters_.size(); ++d)
346 msgFilters_[d].hostFilter.contains(it->host(), Qt::CaseInsensitive) || msgFilters_[d].hostFilter.size() == 0;
348 msgFilters_[d].appFilter.contains(it->app(), Qt::CaseInsensitive) || msgFilters_[d].appFilter.size() == 0;
350 msgFilters_[d].catFilter.contains(it->cat(), Qt::CaseInsensitive) || msgFilters_[d].catFilter.size() == 0;
353 if (hostMatch && appMatch && catMatch)
355 msgFilters_[d].msgs.push_back(it);
361 void msgViewerDlg::removeMsg(msgs_t::iterator it)
363 std::lock_guard<std::recursive_mutex> lk(updating_mutex_);
364 QString
const& app = it->app();
365 QString
const& cat = it->cat();
366 QString
const& host = it->host();
368 auto catIter = std::find(cat_msgs_[cat].begin(), cat_msgs_[cat].end(), it);
369 auto hostIter = std::find(host_msgs_[host].begin(), host_msgs_[host].end(), it);
370 auto appIter = std::find(app_msgs_[app].begin(), app_msgs_[app].end(), it);
371 if (catIter != cat_msgs_[cat].end()) cat_msgs_[cat].erase(catIter);
372 if (hostIter != host_msgs_[host].end()) host_msgs_[host].erase(hostIter);
373 if (appIter != app_msgs_[app].end()) app_msgs_[app].erase(appIter);
375 if (app_msgs_[app].size() == 0)
377 app_msgs_.erase(app);
378 updateList<msg_iters_map_t>(lwApplication, app_msgs_);
380 if (cat_msgs_[cat].size() == 0)
382 cat_msgs_.erase(cat);
383 updateList<msg_iters_map_t>(lwCategory, cat_msgs_);
385 if (host_msgs_[host].size() == 0)
387 host_msgs_.erase(host);
388 updateList<msg_iters_map_t>(lwHost, host_msgs_);
391 for (
size_t d = 0; d < msgFilters_.size(); ++d)
394 msgFilters_[d].hostFilter.contains(it->host(), Qt::CaseInsensitive) || msgFilters_[d].hostFilter.size() == 0;
396 msgFilters_[d].appFilter.contains(it->app(), Qt::CaseInsensitive) || msgFilters_[d].appFilter.size() == 0;
398 msgFilters_[d].catFilter.contains(it->cat(), Qt::CaseInsensitive) || msgFilters_[d].catFilter.size() == 0;
399 bool sevMatch = it->sev() >= msgFilters_[d].sevThresh;
402 if (hostMatch && appMatch && catMatch)
404 auto filterIt = std::find(msgFilters_[d].msgs.begin(), msgFilters_[d].msgs.end(), it);
405 if (filterIt != msgFilters_[d].msgs.end()) msgFilters_[d].msgs.erase(filterIt);
409 if (++msgFilters_[d].nDisplayedDeletedMsgs > static_cast<int>(maxDeletedMsgs) && maxDeletedMsgs > 0)
415 if ((
int)d == tabWidget->currentIndex())
417 lcdDisplayedDeleted->display(msgFilters_[d].nDisplayedDeletedMsgs);
423 lcdDeletedCount->display(nDeleted);
426 unsigned int msgViewerDlg::update_index(msgs_t::iterator it)
428 std::lock_guard<std::recursive_mutex> lk(updating_mutex_);
429 QString
const& app = it->app();
430 QString
const& cat = it->cat();
431 QString
const& host = it->host();
433 unsigned int update = 0x0;
435 if (cat_msgs_.find(cat) == cat_msgs_.end()) update |= LIST_CAT;
436 if (host_msgs_.find(host) == host_msgs_.end()) update |= LIST_HOST;
437 if (app_msgs_.find(app) == app_msgs_.end()) update |= LIST_APP;
439 cat_msgs_[cat].push_back(it);
440 host_msgs_[host].push_back(it);
441 app_msgs_[app].push_back(it);
446 void msgViewerDlg::displayMsg(msgs_t::const_iterator it,
int display)
448 if (it->sev() < msgFilters_[display].sevThresh)
return;
449 std::lock_guard<std::recursive_mutex> lk(updating_mutex_);
451 msgFilters_[display].nDisplayMsgs++;
452 if (display == tabWidget->currentIndex())
454 lcdDisplayedMsgs->display(msgFilters_[display].nDisplayMsgs);
457 auto txt = it->text(shortMode_);
460 UpdateTextAreaDisplay(txts, msgFilters_[display].txtDisplay);
463 void msgViewerDlg::displayMsg(
int display)
465 std::lock_guard<std::recursive_mutex> lk(updating_mutex_);
467 msgFilters_[display].txtDisplay->clear();
468 msgFilters_[display].nDisplayMsgs = 0;
469 msgFilters_[display].nDisplayedDeletedMsgs = 0;
471 msg_iters_t::const_iterator it;
473 n = msgFilters_[display].msgs.size();
474 it = msgFilters_[display].msgs.begin();
475 QProgressDialog progress(
"Fetching data...",
"Cancel", 0, n / 1000,
this);
477 progress.setWindowModality(Qt::WindowModal);
478 progress.setMinimumDuration(2000);
483 for (; it != msgFilters_[display].msgs.end(); ++it, ++i)
485 if (it->get()->sev() >= msgFilters_[display].sevThresh)
487 txts.push_back(it->get()->text(shortMode_));
488 ++msgFilters_[display].nDisplayMsgs;
495 progress.setValue(prog);
498 if (progress.wasCanceled())
break;
501 if (display == tabWidget->currentIndex())
503 lcdDisplayedMsgs->display(msgFilters_[display].nDisplayMsgs);
506 UpdateTextAreaDisplay(txts, msgFilters_[display].txtDisplay);
510 void msgViewerDlg::UpdateTextAreaDisplay(QStringList texts, QPlainTextEdit* widget)
512 const QTextCursor old_cursor = widget->textCursor();
513 const int old_scrollbar_value = widget->verticalScrollBar()->value();
514 const bool is_scrolled_down =
515 old_scrollbar_value >= widget->verticalScrollBar()->maximum() * 0.95;
517 if (!paused && !is_scrolled_down)
522 QTextCursor new_cursor = QTextCursor(widget->document());
524 new_cursor.beginEditBlock();
525 new_cursor.movePosition(QTextCursor::End);
527 for (
int i = 0; i < texts.size(); i++)
529 new_cursor.insertBlock();
530 new_cursor.insertHtml(texts.at(i));
531 if (!shortMode_) new_cursor.insertBlock();
533 new_cursor.endEditBlock();
535 if (old_cursor.hasSelection() || paused)
538 widget->setTextCursor(old_cursor);
539 widget->verticalScrollBar()->setValue(old_scrollbar_value);
544 widget->moveCursor(QTextCursor::End);
545 widget->verticalScrollBar()->setValue(widget->verticalScrollBar()->maximum());
546 widget->horizontalScrollBar()->setValue(0);
550 void msgViewerDlg::scrollToBottom()
552 int display = tabWidget->currentIndex();
553 msgFilters_[display].txtDisplay->moveCursor(QTextCursor::End);
554 msgFilters_[display].txtDisplay->verticalScrollBar()->setValue(
555 msgFilters_[display].txtDisplay->verticalScrollBar()->maximum());
556 msgFilters_[display].txtDisplay->horizontalScrollBar()->setValue(0);
559 void msgViewerDlg::updateDisplays()
561 for (
size_t ii = 0; ii < msgFilters_.size(); ++ii)
568 bool msgViewerDlg::updateList(QListWidget* lw, M
const& map)
570 bool nonSelectedBefore = (lw->currentRow() == -1);
571 bool nonSelectedAfter =
true;
573 QString item = nonSelectedBefore ?
"" : lw->currentItem()->text();
577 typename M::const_iterator it = map.begin();
579 while (it != map.end())
581 lw->addItem(it->first);
582 if (!nonSelectedBefore && nonSelectedAfter)
584 if (item == it->first)
586 lw->setCurrentRow(row);
587 nonSelectedAfter =
false;
594 if (!nonSelectedBefore && nonSelectedAfter)
return true;
599 msg_iters_t msgViewerDlg::list_intersect(msg_iters_t
const& l1, msg_iters_t
const& l2)
602 msg_iters_t::const_iterator it1 = l1.begin();
603 msg_iters_t::const_iterator it2 = l2.begin();
605 while (it1 != l1.end() && it2 != l2.end())
611 else if (*it2 < *it1)
617 output.push_back(*it1);
623 TLOG(10) <<
"list_intersect: output list has " << output.size() <<
" entries";
627 std::string sev_to_string(sev_code_t s)
643 void msgViewerDlg::setFilter()
645 auto hostFilter = toQStringList(lwHost->selectedItems());
646 auto appFilter = toQStringList(lwApplication->selectedItems());
647 auto catFilter = toQStringList(lwCategory->selectedItems());
649 lwHost->setCurrentRow(-1, QItemSelectionModel::Clear);
650 lwApplication->setCurrentRow(-1, QItemSelectionModel::Clear);
651 lwCategory->setCurrentRow(-1, QItemSelectionModel::Clear);
653 if (hostFilter.isEmpty() && appFilter.isEmpty() && catFilter.isEmpty())
659 QString catFilterExpression =
"";
660 QString hostFilterExpression =
"";
661 QString appFilterExpression =
"";
664 for (
auto app = 0; app < appFilter.size(); ++app)
666 msg_iters_map_t::const_iterator it = app_msgs_.find(appFilter[app]);
667 appFilterExpression += QString(first ?
"" :
" || ") + appFilter[app];
669 if (it != app_msgs_.end())
671 msg_iters_t temp(it->second);
672 TLOG(10) <<
"setFilter: app " << appFilter[app].toStdString() <<
" has " << temp.size() <<
" messages";
676 TLOG(10) <<
"setFilter: result contains %zu messages", result.size();
679 if (!hostFilter.isEmpty())
681 msg_iters_t hostResult;
682 for (
auto host = 0; host < hostFilter.size(); ++host)
684 hostFilterExpression += QString(first ?
"" :
" || ") + hostFilter[host];
686 msg_iters_map_t::const_iterator it = host_msgs_.find(hostFilter[host]);
687 if (it != host_msgs_.end())
689 msg_iters_t temp(it->second);
690 TLOG(10) <<
"setFilter: host " << hostFilter[host].toStdString() <<
" has " << temp.size() <<
" messages";
691 hostResult.merge(temp);
700 result = list_intersect(result, hostResult);
702 TLOG(10) <<
"setFilter: result contains " << result.size() <<
" messages";
706 if (!catFilter.isEmpty())
708 msg_iters_t catResult;
709 for (
auto cat = 0; cat < catFilter.size(); ++cat)
711 catFilterExpression += QString(first ?
"" :
" || ") + catFilter[cat];
713 msg_iters_map_t::const_iterator it = cat_msgs_.find(catFilter[cat]);
714 if (it != cat_msgs_.end())
716 msg_iters_t temp(it->second);
717 TLOG(10) <<
"setFilter: cat " << catFilter[cat].toStdString() <<
" has " << temp.size() <<
" messages";
718 catResult.merge(temp);
727 result = list_intersect(result, catResult);
729 TLOG(10) <<
"setFilter: result contains " << result.size() <<
" messages";
733 auto nFilterExpressions =
734 (appFilterExpression !=
"" ? 1 : 0) + (hostFilterExpression !=
"" ? 1 : 0) + (catFilterExpression !=
"" ? 1 : 0);
735 QString filterExpression =
"";
736 if (nFilterExpressions == 1)
738 filterExpression = catFilterExpression + hostFilterExpression + appFilterExpression;
742 filterExpression =
"(" + (catFilterExpression !=
"" ? catFilterExpression +
") && (" :
"") + hostFilterExpression +
743 (hostFilterExpression !=
"" && appFilterExpression !=
"" ?
") && (" :
"") + appFilterExpression +
749 auto newTabTitle = QString(
"Filter ") + QString::number(++nFilters);
750 QWidget* newTab =
new QWidget();
752 QPlainTextEdit* txtDisplay =
new QPlainTextEdit(newTab);
753 QTextDocument* doc =
new QTextDocument(txtDisplay);
754 txtDisplay->setDocument(doc);
756 QVBoxLayout* layout =
new QVBoxLayout();
757 layout->addWidget(txtDisplay);
758 layout->setContentsMargins(0, 0, 0, 0);
759 newTab->setLayout(layout);
761 MsgFilterDisplay filteredMessages;
762 filteredMessages.msgs = result;
763 filteredMessages.hostFilter = hostFilter;
764 filteredMessages.appFilter = appFilter;
765 filteredMessages.catFilter = catFilter;
766 filteredMessages.txtDisplay = txtDisplay;
767 filteredMessages.nDisplayMsgs = result.size();
768 filteredMessages.nDisplayedDeletedMsgs = 0;
769 filteredMessages.sevThresh = SINFO;
770 msgFilters_.push_back(filteredMessages);
772 tabWidget->addTab(newTab, newTabTitle);
773 tabWidget->setTabToolTip(tabWidget->count() - 1, filterExpression);
774 tabWidget->setCurrentIndex(tabWidget->count() - 1);
776 displayMsg(msgFilters_.size() - 1);
784 btnPause->setText(
"Resume Scrolling");
790 btnPause->setText(
"Pause Scrolling");
800 QMessageBox::question(
this, tr(
"Message Viewer"), tr(
"Are you sure you want to clear all received messages?"),
801 QMessageBox::Yes | QMessageBox::No, QMessageBox::No);
802 std::lock_guard<std::recursive_mutex> lk(updating_mutex_);
805 case QMessageBox::Yes:
814 updateList<msg_iters_map_t>(lwApplication, app_msgs_);
815 updateList<msg_iters_map_t>(lwCategory, cat_msgs_);
816 updateList<msg_iters_map_t>(lwHost, host_msgs_);
817 for (
auto& display : msgFilters_)
819 display.txtDisplay->clear();
820 display.msgs.clear();
821 display.nDisplayMsgs = 0;
822 display.nDisplayedDeletedMsgs = 0;
825 lcdMsgs->display(nMsgs);
826 lcdDisplayedMsgs->display(0);
828 case QMessageBox::No:
839 btnDisplayMode->setText(
"Long View");
844 btnDisplayMode->setText(
"Compact View");
851 auto display = tabWidget->currentIndex();
873 void msgViewerDlg::setSevError()
875 auto display = tabWidget->currentIndex();
876 msgFilters_[display].sevThresh = SERROR;
877 btnError->setChecked(
true);
878 btnWarning->setChecked(
false);
879 btnInfo->setChecked(
false);
880 btnDebug->setChecked(
false);
881 vsSeverity->setValue(SERROR);
884 void msgViewerDlg::setSevWarning()
886 auto display = tabWidget->currentIndex();
887 msgFilters_[display].sevThresh = SWARNING;
888 btnError->setChecked(
false);
889 btnWarning->setChecked(
true);
890 btnInfo->setChecked(
false);
891 btnDebug->setChecked(
false);
892 vsSeverity->setValue(SWARNING);
895 void msgViewerDlg::setSevInfo()
897 auto display = tabWidget->currentIndex();
898 msgFilters_[display].sevThresh = SINFO;
899 btnError->setChecked(
false);
900 btnWarning->setChecked(
false);
901 btnInfo->setChecked(
true);
902 btnDebug->setChecked(
false);
903 vsSeverity->setValue(SINFO);
906 void msgViewerDlg::setSevDebug()
908 auto display = tabWidget->currentIndex();
909 msgFilters_[display].sevThresh = SDEBUG;
910 btnError->setChecked(
false);
911 btnWarning->setChecked(
false);
912 btnInfo->setChecked(
false);
913 btnDebug->setChecked(
true);
914 vsSeverity->setValue(SDEBUG);
917 void msgViewerDlg::renderMode()
919 simpleRender = !simpleRender;
923 btnRMode->setChecked(
true);
924 for (
auto display : msgFilters_)
926 display.txtDisplay->setPlainText(display.txtDisplay->toPlainText());
931 btnRMode->setChecked(
false);
936 void msgViewerDlg::searchMsg()
938 QString search = editSearch->text();
940 if (search.isEmpty())
return;
942 auto display = tabWidget->currentIndex();
943 if (search != searchStr)
945 msgFilters_[display].txtDisplay->moveCursor(QTextCursor::Start);
946 if (!msgFilters_[display].txtDisplay->find(search))
948 msgFilters_[display].txtDisplay->moveCursor(QTextCursor::End);
956 if (!msgFilters_[display].txtDisplay->find(search))
958 msgFilters_[display].txtDisplay->moveCursor(QTextCursor::Start);
959 if (!msgFilters_[display].txtDisplay->find(search))
961 msgFilters_[display].txtDisplay->moveCursor(QTextCursor::End);
968 void msgViewerDlg::searchClear()
970 auto display = tabWidget->currentIndex();
971 editSearch->setText(
"");
973 msgFilters_[display].txtDisplay->find(
"");
974 msgFilters_[display].txtDisplay->moveCursor(QTextCursor::End);
977 void msgViewerDlg::setSuppression(QAction* act)
979 bool status = act->isChecked();
984 void msgViewerDlg::setThrottling(QAction* act)
986 bool status = act->isChecked();
991 void msgViewerDlg::tabWidgetCurrentChanged(
int newTab)
993 lcdDisplayedMsgs->display(msgFilters_[newTab].nDisplayMsgs);
995 lwHost->setCurrentRow(-1, QItemSelectionModel::Clear);
996 lwApplication->setCurrentRow(-1, QItemSelectionModel::Clear);
997 lwCategory->setCurrentRow(-1, QItemSelectionModel::Clear);
999 for (
auto host : msgFilters_[newTab].hostFilter)
1001 auto items = lwHost->findItems(host, Qt::MatchExactly);
1002 if (items.size() > 0)
1004 items[0]->setSelected(
true);
1007 for (
auto app : msgFilters_[newTab].appFilter)
1009 auto items = lwApplication->findItems(app, Qt::MatchExactly);
1010 if (items.size() > 0)
1012 items[0]->setSelected(
true);
1015 for (
auto cat : msgFilters_[newTab].catFilter)
1017 auto items = lwCategory->findItems(cat, Qt::MatchExactly);
1018 if (items.size() > 0)
1020 items[0]->setSelected(
true);
1024 switch (msgFilters_[newTab].sevThresh)
1041 void msgViewerDlg::tabCloseRequested(
int tabIndex)
1043 if (tabIndex == 0 || static_cast<size_t>(tabIndex) >= msgFilters_.size())
return;
1045 auto widget = tabWidget->widget(tabIndex);
1046 tabWidget->removeTab(tabIndex);
1049 msgFilters_.erase(msgFilters_.begin() + tabIndex);
1054 QStringList msgViewerDlg::toQStringList(QList<QListWidgetItem*> in)
1058 for (
auto i = 0; i < in.size(); ++i)
1060 out << in[i]->text();
QString const & app() const
Get the application of the message
void use(bool flag)
Enable or disable this throttle
timeval time() const
Get the message timestamp
void exit()
Exit the program.
void start()
Start all receivers
Qt wrapper around MessageFacility message
Suppress messages based on a regular expression
void clear()
Clear the message buffer.
QString const & host() const
Get the host from which the message came
void use(bool flag)
Set whether the suppression is active
Throttle messages based on name and time limits. Separate from MessageFacility limiting.
void stop()
Stop all receivers
void pause()
Pause message receiving.
void changeSeverity(int sev)
Change the severity threshold.
QString const & cat() const
Get the category of the message
void shortMode()
Switch to/from Short message mode.
void closeEvent(QCloseEvent *event)
Perform actions on window close.
msgViewerDlg(std::string const &conf, QDialog *parent=0)
Message Viewer Dialog Constructor.