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");
76 cet::filepath_lookup policy(
"FHICL_FILE_PATH");
79 fhicl::ParameterSet pset;
80 fhicl::make_ParameterSet(filename, policy, pset);
86 : 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()))
94 fhicl::ParameterSet pset = readConf(conf);
100 btnSuppression->setMenu(sup_menu);
101 btnThrottling->setMenu(thr_menu);
104 connect(btnPause, SIGNAL(clicked()),
this, SLOT(
pause()));
105 connect(btnScrollToBottom, SIGNAL(clicked()),
this, SLOT(scrollToBottom()));
106 connect(btnExit, SIGNAL(clicked()),
this, SLOT(
exit()));
107 connect(btnClear, SIGNAL(clicked()),
this, SLOT(
clear()));
109 connect(btnRMode, SIGNAL(clicked()),
this, SLOT(renderMode()));
110 connect(btnDisplayMode, SIGNAL(clicked()),
this, SLOT(
shortMode()));
112 connect(btnSearch, SIGNAL(clicked()),
this, SLOT(searchMsg()));
113 connect(btnSearchClear, SIGNAL(clicked()),
this, SLOT(searchClear()));
115 connect(btnFilter, SIGNAL(clicked()),
this, SLOT(setFilter()));
117 connect(btnError, SIGNAL(clicked()),
this, SLOT(setSevError()));
118 connect(btnWarning, SIGNAL(clicked()),
this, SLOT(setSevWarning()));
119 connect(btnInfo, SIGNAL(clicked()),
this, SLOT(setSevInfo()));
120 connect(btnDebug, SIGNAL(clicked()),
this, SLOT(setSevDebug()));
122 connect(sup_menu, SIGNAL(triggered(QAction*)),
this, SLOT(setSuppression(QAction*)));
124 connect(thr_menu, SIGNAL(triggered(QAction*)),
this, SLOT(setThrottling(QAction*)));
126 connect(vsSeverity, SIGNAL(valueChanged(
int)),
this, SLOT(
changeSeverity(
int)));
128 connect(&receivers_, SIGNAL(newMessage(msg_ptr_t)),
this, SLOT(onNewMsg(msg_ptr_t)));
130 connect(tabWidget, SIGNAL(currentChanged(
int)),
this, SLOT(tabWidgetCurrentChanged(
int)));
131 connect(tabWidget, SIGNAL(tabCloseRequested(
int)),
this, SLOT(tabCloseRequested(
int)));
132 MsgFilterDisplay allMessages;
133 allMessages.txtDisplay = txtMessages;
134 allMessages.nDisplayMsgs = 0;
135 allMessages.filterExpression =
"";
136 allMessages.nDisplayedDeletedMsgs = 0;
137 allMessages.sevThresh = SINFO;
138 msgFilters_.push_back(allMessages);
141 auto tabBar = tabWidget->findChild<QTabBar*>();
142 tabBar->setTabButton(0, QTabBar::RightSide,
nullptr);
143 tabBar->setTabButton(0, QTabBar::LeftSide,
nullptr);
146 btnRMode->setChecked(
true);
148 btnRMode->setChecked(
false);
150 btnRMode->setEnabled(
false);
154 auto doc =
new QTextDocument(txtMessages);
155 txtMessages->setDocument(doc);
160 msgViewerDlg::~msgViewerDlg()
166 static void str_to_suppress(std::vector<std::string>
const& vs, std::vector<suppress>& s, QMenu* menu)
172 act = menu->addAction(
"None");
173 act->setEnabled(
false);
177 s.reserve(vs.size());
179 for (
size_t i = 0; i < vs.size(); ++i)
181 s.emplace_back(vs[i]);
182 act = menu->addAction(QString(vs[i].c_str()));
183 act->setCheckable(
true);
184 act->setChecked(
true);
185 QVariant v = qVariantFromValue(static_cast<void*>(&s[i]));
190 static void pset_to_throttle(std::vector<fhicl::ParameterSet>
const& ps, std::vector<throttle>& t, QMenu* menu)
196 act = menu->addAction(
"None");
197 act->setEnabled(
false);
201 t.reserve(ps.size());
203 for (
size_t i = 0; i < ps.size(); ++i)
205 auto name = ps[i].get<std::string>(
"name");
206 t.emplace_back(name, ps[i].get<int>(
"limit", -1), ps[i].get<int64_t>(
"timespan", -1));
207 act = menu->addAction(QString(name.c_str()));
208 act->setCheckable(
true);
209 act->setChecked(
true);
210 QVariant v = qVariantFromValue(static_cast<void*>(&t[i]));
215 void msgViewerDlg::parseConf(fhicl::ParameterSet
const& conf)
217 fhicl::ParameterSet nulp;
221 auto sup = conf.get<fhicl::ParameterSet>(
"suppress", nulp);
223 auto sup_host = sup.get<std::vector<std::string>>(
"hosts", std::vector<std::string>());
224 auto sup_app = sup.get<std::vector<std::string>>(
"applications", std::vector<std::string>());
225 auto sup_cat = sup.get<std::vector<std::string>>(
"categories", std::vector<std::string>());
227 str_to_suppress(sup_host, e_sup_host, sup_menu);
228 sup_menu->addSeparator();
230 str_to_suppress(sup_app, e_sup_app, sup_menu);
231 sup_menu->addSeparator();
233 str_to_suppress(sup_cat, e_sup_cat, sup_menu);
236 auto thr = conf.get<fhicl::ParameterSet>(
"throttle", nulp);
238 auto thr_host = thr.get<std::vector<fhicl::ParameterSet>>(
"hosts", std::vector<fhicl::ParameterSet>());
239 auto thr_app = thr.get<std::vector<fhicl::ParameterSet>>(
"applications", std::vector<fhicl::ParameterSet>());
240 auto thr_cat = thr.get<std::vector<fhicl::ParameterSet>>(
"categories", std::vector<fhicl::ParameterSet>());
242 pset_to_throttle(thr_host, e_thr_host, thr_menu);
243 thr_menu->addSeparator();
245 pset_to_throttle(thr_app, e_thr_app, thr_menu);
246 thr_menu->addSeparator();
248 pset_to_throttle(thr_cat, e_thr_cat, thr_menu);
250 maxMsgs = conf.get<
size_t>(
"max_message_buffer_size", 100000);
251 maxDeletedMsgs = conf.get<
size_t>(
"max_displayed_deleted_messages", 100000);
254 bool msgViewerDlg::msg_throttled(msg_ptr_t
const& msg)
260 for (
size_t i = 0; i < e_sup_host.size(); ++i)
261 if (e_sup_host[i].match(msg->host().toStdString()))
return true;
263 for (
size_t i = 0; i < e_sup_app.size(); ++i)
264 if (e_sup_app[i].match(msg->app().toStdString()))
return true;
266 for (
size_t i = 0; i < e_sup_cat.size(); ++i)
267 if (e_sup_cat[i].match(msg->cat().toStdString()))
return true;
275 for (
size_t i = 0; i < e_thr_host.size(); ++i)
276 if (e_thr_host[i].reach_limit(msg->host().toStdString(), msg->time()))
return true;
278 for (
size_t i = 0; i < e_thr_app.size(); ++i)
279 if (e_thr_app[i].reach_limit(msg->app().toStdString(), msg->time()))
return true;
281 for (
size_t i = 0; i < e_thr_cat.size(); ++i)
282 if (e_thr_cat[i].reach_limit(msg->cat().toStdString(), msg->time()))
return true;
289 void msgViewerDlg::writeSettings()
291 QSettings settings(
"ARTDAQ",
"MsgViewer");
293 settings.beginGroup(
"MainWindow");
294 settings.setValue(
"size", size());
295 settings.setValue(
"pos", pos());
299 void msgViewerDlg::readSettings()
301 QSettings settings(
"ARTDAQ",
"MsgViewer");
303 settings.beginGroup(
"MainWindow");
304 QPoint pos = settings.value(
"pos", QPoint(100, 100)).toPoint();
305 QSize size = settings.value(
"size", QSize(660, 760)).toSize();
311 void msgViewerDlg::onNewMsg(msg_ptr_t
const& msg)
318 lcdMsgs->display(nMsgs);
321 if (msg_throttled(msg))
323 lcdSuppressionCount->display(nSupMsgs);
324 lcdThrottlingCount->display(nThrMsgs);
331 std::lock_guard<std::mutex> lk(msg_pool_mutex_);
332 msg_pool_.emplace_back(msg);
340 for (
size_t d = 0; d < msgFilters_.size(); ++d)
343 msgFilters_[d].hostFilter.contains(msg->host(), Qt::CaseInsensitive) || msgFilters_[d].hostFilter.empty();
345 msgFilters_[d].appFilter.contains(msg->app(), Qt::CaseInsensitive) || msgFilters_[d].appFilter.empty();
347 msgFilters_[d].catFilter.contains(msg->cat(), Qt::CaseInsensitive) || msgFilters_[d].catFilter.empty();
350 if (hostMatch && appMatch && catMatch)
352 std::lock_guard<std::mutex> lk(filter_mutex_);
353 msgFilters_[d].msgs.push_back(msg);
354 if ((
int)d == tabWidget->currentIndex())
360 void msgViewerDlg::trim_msg_pool()
362 bool host_list_update =
false;
363 bool app_list_update =
false;
364 bool cat_list_update =
false;
366 std::lock_guard<std::mutex> lk(msg_pool_mutex_);
367 while (maxMsgs > 0 && msg_pool_.size() > maxMsgs)
369 QString
const& app = msg_pool_.front()->app();
370 QString
const& cat = msg_pool_.front()->cat();
371 QString
const& host = msg_pool_.front()->host();
375 auto catIter = std::find(cat_msgs_[cat].begin(), cat_msgs_[cat].end(), msg_pool_.front());
376 auto hostIter = std::find(host_msgs_[host].begin(), host_msgs_[host].end(), msg_pool_.front());
377 auto appIter = std::find(app_msgs_[app].begin(), app_msgs_[app].end(), msg_pool_.front());
378 if (catIter != cat_msgs_[cat].end()) cat_msgs_[cat].erase(catIter);
379 if (hostIter != host_msgs_[host].end()) host_msgs_[host].erase(hostIter);
380 if (appIter != app_msgs_[app].end()) app_msgs_[app].erase(appIter);
382 if (app_msgs_[app].empty())
384 app_msgs_.erase(app);
385 app_list_update =
true;
387 if (cat_msgs_[cat].empty())
389 cat_msgs_.erase(cat);
390 cat_list_update =
true;
392 if (host_msgs_[host].empty())
394 host_msgs_.erase(host);
395 host_list_update =
true;
400 msg_pool_.erase(msg_pool_.begin());
405 std::lock_guard<std::mutex> lk(msg_classification_mutex_);
406 if (host_list_update)
407 updateList(lwHost, host_msgs_);
409 updateList(lwApplication, app_msgs_);
411 updateList(lwCategory, cat_msgs_);
414 for (
size_t d = 0; d < msgFilters_.size(); ++d)
417 std::lock_guard<std::mutex> lk(filter_mutex_);
418 while (msgFilters_[d].msgs.size() > maxMsgs)
420 if ((*msgFilters_[d].msgs.begin())->sev() >= msgFilters_[d].sevThresh)
421 msgFilters_[d].nDisplayedDeletedMsgs++;
422 msgFilters_[d].msgs.erase(msgFilters_[d].msgs.begin());
426 if ((
int)d == tabWidget->currentIndex())
428 if (maxDeletedMsgs > 0 && msgFilters_[d].nDisplayedDeletedMsgs > static_cast<int>(maxDeletedMsgs))
432 lcdDisplayedDeleted->display(msgFilters_[d].nDisplayedDeletedMsgs);
436 lcdDeletedCount->display(nDeleted);
439 void msgViewerDlg::update_index(msg_ptr_t
const& it)
441 std::lock_guard<std::mutex> lk(msg_classification_mutex_);
442 QString
const& app = it->app();
443 QString
const& cat = it->cat();
444 QString
const& host = it->host();
446 if (cat_msgs_.find(cat) == cat_msgs_.end())
448 cat_msgs_[cat].push_back(it);
449 updateList(lwCategory, cat_msgs_);
453 cat_msgs_[cat].push_back(it);
456 if (host_msgs_.find(host) == host_msgs_.end())
458 host_msgs_[host].push_back(it);
459 updateList(lwHost, host_msgs_);
463 host_msgs_[host].push_back(it);
466 if (app_msgs_.find(app) == app_msgs_.end())
468 app_msgs_[app].push_back(it);
469 updateList(lwApplication, app_msgs_);
473 app_msgs_[app].push_back(it);
477 void msgViewerDlg::displayMsg(msg_ptr_t
const& it,
int display)
479 if (it->sev() < msgFilters_[display].sevThresh)
return;
481 msgFilters_[display].nDisplayMsgs++;
482 if (display == tabWidget->currentIndex())
484 lcdDisplayedMsgs->display(msgFilters_[display].nDisplayMsgs);
487 auto txt = it->text(shortMode_);
490 UpdateTextAreaDisplay(txts, msgFilters_[display].txtDisplay);
493 void msgViewerDlg::displayMsgs(
int display)
496 msgFilters_[display].txtDisplay->clear();
497 msgFilters_[display].nDisplayMsgs = 0;
498 msgFilters_[display].nDisplayedDeletedMsgs = 0;
502 std::lock_guard<std::mutex> lk(filter_mutex_);
503 n = msgFilters_[display].msgs.size();
505 QProgressDialog progress(
"Fetching data...",
"Cancel", 0, n / 1000,
this);
507 progress.setWindowModality(Qt::WindowModal);
508 progress.setMinimumDuration(2000);
512 for (
auto it = msgFilters_[display].msgs.begin(); it != msgFilters_[display].msgs.end(); ++it, ++i)
514 if ((*it)->sev() >= msgFilters_[display].sevThresh)
516 txts.push_back((*it)->text(shortMode_));
517 ++msgFilters_[display].nDisplayMsgs;
524 progress.setValue(prog);
527 if (progress.wasCanceled())
break;
530 if (display == tabWidget->currentIndex())
532 lcdDisplayedMsgs->display(msgFilters_[display].nDisplayMsgs);
535 UpdateTextAreaDisplay(txts, msgFilters_[display].txtDisplay);
539 void msgViewerDlg::UpdateTextAreaDisplay(QStringList
const& texts, QPlainTextEdit* widget)
541 const QTextCursor old_cursor = widget->textCursor();
542 const int old_scrollbar_value = widget->verticalScrollBar()->value();
543 const bool is_scrolled_down =
544 old_scrollbar_value >= widget->verticalScrollBar()->maximum() * 0.95;
546 if (!paused && !is_scrolled_down)
551 QTextCursor new_cursor = QTextCursor(widget->document());
553 new_cursor.beginEditBlock();
554 new_cursor.movePosition(QTextCursor::End);
556 for (
int i = 0; i < texts.size(); i++)
558 new_cursor.insertBlock();
559 new_cursor.insertHtml(texts.at(i));
560 if (!shortMode_) new_cursor.insertBlock();
562 new_cursor.endEditBlock();
564 if (old_cursor.hasSelection() || paused)
567 widget->setTextCursor(old_cursor);
568 widget->verticalScrollBar()->setValue(old_scrollbar_value);
573 widget->moveCursor(QTextCursor::End);
574 widget->verticalScrollBar()->setValue(widget->verticalScrollBar()->maximum());
575 widget->horizontalScrollBar()->setValue(0);
579 void msgViewerDlg::scrollToBottom()
581 int display = tabWidget->currentIndex();
582 msgFilters_[display].txtDisplay->moveCursor(QTextCursor::End);
583 msgFilters_[display].txtDisplay->verticalScrollBar()->setValue(
584 msgFilters_[display].txtDisplay->verticalScrollBar()->maximum());
585 msgFilters_[display].txtDisplay->horizontalScrollBar()->setValue(0);
588 void msgViewerDlg::updateDisplays()
590 for (
size_t ii = 0; ii < msgFilters_.size(); ++ii)
596 bool msgViewerDlg::updateList(QListWidget* lw, msgs_map_t
const& map)
598 bool nonSelectedBefore = (lw->currentRow() == -1);
599 bool nonSelectedAfter =
true;
601 QString item = nonSelectedBefore ?
"" : lw->currentItem()->text();
605 auto it = map.begin();
607 while (it != map.end())
609 lw->addItem(it->first);
610 if (!nonSelectedBefore && nonSelectedAfter)
612 if (item == it->first)
614 lw->setCurrentRow(row);
615 nonSelectedAfter =
false;
622 if (!nonSelectedBefore && nonSelectedAfter)
return true;
627 msgs_t msgViewerDlg::list_intersect(msgs_t
const& l1, msgs_t
const& l2)
630 auto it1 = l1.begin();
631 auto it2 = l2.begin();
633 while (it1 != l1.end() && it2 != l2.end())
639 else if (*it2 < *it1)
645 output.push_back(*it1);
651 TLOG(10) <<
"list_intersect: output list has " << output.size() <<
" entries";
655 std::string sev_to_string(sev_code_t s)
671 void msgViewerDlg::setFilter()
673 auto hostFilter = toQStringList(lwHost->selectedItems());
674 auto appFilter = toQStringList(lwApplication->selectedItems());
675 auto catFilter = toQStringList(lwCategory->selectedItems());
677 lwHost->setCurrentRow(-1, QItemSelectionModel::Clear);
678 lwApplication->setCurrentRow(-1, QItemSelectionModel::Clear);
679 lwCategory->setCurrentRow(-1, QItemSelectionModel::Clear);
681 if (hostFilter.isEmpty() && appFilter.isEmpty() && catFilter.isEmpty())
687 QString catFilterExpression =
"";
688 QString hostFilterExpression =
"";
689 QString appFilterExpression =
"";
692 for (
auto app = 0; app < appFilter.size(); ++app)
694 appFilterExpression += QString(first ?
"" :
" || ") + appFilter[app];
697 TLOG(10) <<
"setFilter: result contains %zu messages", result.size();
700 if (!hostFilter.isEmpty())
703 for (
auto host = 0; host < hostFilter.size(); ++host)
705 hostFilterExpression += QString(first ?
"" :
" || ") + hostFilter[host];
711 if (!catFilter.isEmpty())
714 for (
auto cat = 0; cat < catFilter.size(); ++cat)
716 catFilterExpression += QString(first ?
"" :
" || ") + catFilter[cat];
722 auto nFilterExpressions =
723 (appFilterExpression !=
"" ? 1 : 0) + (hostFilterExpression !=
"" ? 1 : 0) + (catFilterExpression !=
"" ? 1 : 0);
724 QString filterExpression =
"";
725 if (nFilterExpressions == 1)
727 filterExpression = catFilterExpression + hostFilterExpression + appFilterExpression;
731 filterExpression =
"(" + (catFilterExpression !=
"" ? catFilterExpression +
") && (" :
"") + hostFilterExpression +
732 (hostFilterExpression !=
"" && appFilterExpression !=
"" ?
") && (" :
"") + appFilterExpression +
736 for (
size_t d = 0; d < msgFilters_.size(); ++d) {
737 if (msgFilters_[d].filterExpression == filterExpression)
739 tabWidget->setCurrentIndex(d);
745 std::lock_guard<std::mutex> lk(msg_classification_mutex_);
746 for (
auto app = 0; app < appFilter.size(); ++app)
748 auto it = app_msgs_.find(appFilter[app]);
749 if (it != app_msgs_.end())
751 msgs_t temp(it->second);
752 TLOG(10) <<
"setFilter: app " << appFilter[app].toStdString() <<
" has " << temp.size() <<
" messages";
756 TLOG(10) <<
"setFilter: result contains %zu messages", result.size();
758 if (!hostFilter.isEmpty())
761 for (
auto host = 0; host < hostFilter.size(); ++host)
763 auto it = host_msgs_.find(hostFilter[host]);
764 if (it != host_msgs_.end())
766 msgs_t temp(it->second);
767 TLOG(10) <<
"setFilter: host " << hostFilter[host].toStdString() <<
" has " << temp.size() <<
" messages";
768 hostResult.merge(temp);
777 result = list_intersect(result, hostResult);
779 TLOG(10) <<
"setFilter: result contains " << result.size() <<
" messages";
782 if (!catFilter.isEmpty())
785 for (
auto cat = 0; cat < catFilter.size(); ++cat)
787 auto it = cat_msgs_.find(catFilter[cat]);
788 if (it != cat_msgs_.end())
790 msgs_t temp(it->second);
791 TLOG(10) <<
"setFilter: cat " << catFilter[cat].toStdString() <<
" has " << temp.size() <<
" messages";
792 catResult.merge(temp);
801 result = list_intersect(result, catResult);
803 TLOG(10) <<
"setFilter: result contains " << result.size() <<
" messages";
809 auto newTabTitle = QString(
"Filter ") + QString::number(++nFilters);
810 auto newTab =
new QWidget();
812 auto txtDisplay =
new QPlainTextEdit(newTab);
813 auto doc =
new QTextDocument(txtDisplay);
814 txtDisplay->setDocument(doc);
816 auto layout =
new QVBoxLayout();
817 layout->addWidget(txtDisplay);
818 layout->setContentsMargins(0, 0, 0, 0);
819 newTab->setLayout(layout);
821 MsgFilterDisplay filteredMessages;
822 filteredMessages.msgs = result;
823 filteredMessages.hostFilter = hostFilter;
824 filteredMessages.appFilter = appFilter;
825 filteredMessages.catFilter = catFilter;
826 filteredMessages.filterExpression = filterExpression;
827 filteredMessages.txtDisplay = txtDisplay;
828 filteredMessages.nDisplayMsgs = result.size();
829 filteredMessages.nDisplayedDeletedMsgs = 0;
830 filteredMessages.sevThresh = SINFO;
832 std::lock_guard<std::mutex> lk(filter_mutex_);
833 msgFilters_.push_back(filteredMessages);
835 tabWidget->addTab(newTab, newTabTitle);
836 tabWidget->setTabToolTip(tabWidget->count() - 1, filterExpression);
837 tabWidget->setCurrentIndex(tabWidget->count() - 1);
839 displayMsgs(msgFilters_.size() - 1);
847 btnPause->setText(
"Resume Scrolling");
853 btnPause->setText(
"Pause Scrolling");
863 QMessageBox::question(
this, tr(
"Message Viewer"), tr(
"Are you sure you want to clear all received messages?"),
864 QMessageBox::Yes | QMessageBox::No, QMessageBox::No);
867 case QMessageBox::Yes:
873 std::lock_guard<std::mutex> lk(msg_pool_mutex_);
877 std::lock_guard<std::mutex> lk(msg_classification_mutex_);
881 updateList(lwApplication, app_msgs_);
882 updateList(lwCategory, cat_msgs_);
883 updateList(lwHost, host_msgs_);
885 for (
auto& display : msgFilters_)
887 std::lock_guard<std::mutex> lk(filter_mutex_);
888 display.txtDisplay->clear();
889 display.msgs.clear();
890 display.nDisplayMsgs = 0;
891 display.nDisplayedDeletedMsgs = 0;
894 lcdMsgs->display(nMsgs);
895 lcdDisplayedMsgs->display(0);
897 case QMessageBox::No:
908 btnDisplayMode->setText(
"Long View");
913 btnDisplayMode->setText(
"Compact View");
920 auto display = tabWidget->currentIndex();
939 displayMsgs(display);
942 void msgViewerDlg::setSevError()
944 auto display = tabWidget->currentIndex();
945 msgFilters_[display].sevThresh = SERROR;
946 btnError->setChecked(
true);
947 btnWarning->setChecked(
false);
948 btnInfo->setChecked(
false);
949 btnDebug->setChecked(
false);
950 vsSeverity->setValue(SERROR);
953 void msgViewerDlg::setSevWarning()
955 auto display = tabWidget->currentIndex();
956 msgFilters_[display].sevThresh = SWARNING;
957 btnError->setChecked(
false);
958 btnWarning->setChecked(
true);
959 btnInfo->setChecked(
false);
960 btnDebug->setChecked(
false);
961 vsSeverity->setValue(SWARNING);
964 void msgViewerDlg::setSevInfo()
966 auto display = tabWidget->currentIndex();
967 msgFilters_[display].sevThresh = SINFO;
968 btnError->setChecked(
false);
969 btnWarning->setChecked(
false);
970 btnInfo->setChecked(
true);
971 btnDebug->setChecked(
false);
972 vsSeverity->setValue(SINFO);
975 void msgViewerDlg::setSevDebug()
977 auto display = tabWidget->currentIndex();
978 msgFilters_[display].sevThresh = SDEBUG;
979 btnError->setChecked(
false);
980 btnWarning->setChecked(
false);
981 btnInfo->setChecked(
false);
982 btnDebug->setChecked(
true);
983 vsSeverity->setValue(SDEBUG);
986 void msgViewerDlg::renderMode()
988 simpleRender = !simpleRender;
992 btnRMode->setChecked(
true);
993 for (
auto display : msgFilters_)
995 display.txtDisplay->setPlainText(display.txtDisplay->toPlainText());
1000 btnRMode->setChecked(
false);
1005 void msgViewerDlg::searchMsg()
1007 QString search = editSearch->text();
1009 if (search.isEmpty())
return;
1011 auto display = tabWidget->currentIndex();
1012 if (search != searchStr)
1014 msgFilters_[display].txtDisplay->moveCursor(QTextCursor::Start);
1015 if (!msgFilters_[display].txtDisplay->find(search))
1017 msgFilters_[display].txtDisplay->moveCursor(QTextCursor::End);
1025 if (!msgFilters_[display].txtDisplay->find(search))
1027 msgFilters_[display].txtDisplay->moveCursor(QTextCursor::Start);
1028 if (!msgFilters_[display].txtDisplay->find(search))
1030 msgFilters_[display].txtDisplay->moveCursor(QTextCursor::End);
1037 void msgViewerDlg::searchClear()
1039 auto display = tabWidget->currentIndex();
1040 editSearch->setText(
"");
1042 msgFilters_[display].txtDisplay->find(
"");
1043 msgFilters_[display].txtDisplay->moveCursor(QTextCursor::End);
1046 void msgViewerDlg::setSuppression(QAction* act)
1048 bool status = act->isChecked();
1049 auto sup =
static_cast<suppress*
>(act->data().value<
void*>());
1053 void msgViewerDlg::setThrottling(QAction* act)
1055 bool status = act->isChecked();
1056 auto thr =
static_cast<throttle*
>(act->data().value<
void*>());
1060 void msgViewerDlg::tabWidgetCurrentChanged(
int newTab)
1062 displayMsgs(newTab);
1063 lcdDisplayedMsgs->display(msgFilters_[newTab].nDisplayMsgs);
1065 lwHost->setCurrentRow(-1, QItemSelectionModel::Clear);
1066 lwApplication->setCurrentRow(-1, QItemSelectionModel::Clear);
1067 lwCategory->setCurrentRow(-1, QItemSelectionModel::Clear);
1069 for (
auto const& host : msgFilters_[newTab].hostFilter)
1071 auto items = lwHost->findItems(host, Qt::MatchExactly);
1074 items[0]->setSelected(
true);
1077 for (
auto const& app : msgFilters_[newTab].appFilter)
1079 auto items = lwApplication->findItems(app, Qt::MatchExactly);
1082 items[0]->setSelected(
true);
1085 for (
auto const& cat : msgFilters_[newTab].catFilter)
1087 auto items = lwCategory->findItems(cat, Qt::MatchExactly);
1090 items[0]->setSelected(
true);
1094 switch (msgFilters_[newTab].sevThresh)
1111 void msgViewerDlg::tabCloseRequested(
int tabIndex)
1113 if (tabIndex == 0 || static_cast<size_t>(tabIndex) >= msgFilters_.size())
return;
1115 auto widget = tabWidget->widget(tabIndex);
1116 tabWidget->removeTab(tabIndex);
1119 msgFilters_.erase(msgFilters_.begin() + tabIndex);
1124 QStringList msgViewerDlg::toQStringList(QList<QListWidgetItem*> in)
1128 for (
auto i = 0; i < in.size(); ++i)
1130 out << in[i]->text();
void use(bool flag)
Enable or disable this throttle
void exit()
Exit the program.
void start()
Start all receivers
Suppress messages based on a regular expression
void clear()
Clear the message buffer.
void use(bool flag)
Set whether the suppression is active
Throttle messages based on name and time limits. Separate from MessageFacility limiting.
msgViewerDlg(std::string const &conf, QDialog *parent=nullptr)
Message Viewer Dialog Constructor.
void stop()
Stop all receivers
void pause()
Pause message receiving.
void changeSeverity(int sev)
Change the severity threshold.
void shortMode()
Switch to/from Short message mode.
void closeEvent(QCloseEvent *event)
Perform actions on window close.