4 #include <QProgressDialog>
7 #include "cetlib/filepath_maker.h"
8 #include "fhiclcpp/make_ParameterSet.h"
9 #include "fhiclcpp/ParameterSet.h"
11 #include "mfextensions/Binaries/mvdlg.hh"
14 #if GCC_VERSION >= 701000 || defined(__clang__)
15 #pragma GCC diagnostic push
16 #pragma GCC diagnostic ignored "-Wimplicit-fallthrough"
21 #if GCC_VERSION >= 701000 || defined(__clang__)
22 #pragma GCC diagnostic pop
31 process_fname(std::string& fname)
33 size_t sub_start = fname.find(
"${");
34 size_t sub_end = fname.find(
"}");
36 const size_t npos = std::string::npos;
38 if ((sub_start == npos && sub_end != npos)
39 || (sub_start != npos && sub_end == npos)
40 || (sub_start > sub_end))
42 throw std::runtime_error(
"Unrecognized configuration file. Use default configuration instead.");
45 if (sub_start == npos)
return;
47 std::string env = std::string(getenv(fname.substr(sub_start + 2, sub_end - sub_start - 2).c_str()));
48 fname.replace(sub_start, sub_end - sub_start + 1, env);
53 static fhicl::ParameterSet
54 readConf(std::string
const& fname)
56 if (fname.empty())
return fhicl::ParameterSet();
58 std::string filename = fname;
59 process_fname(filename);
61 std::string env(
"FHICL_FILE_PATH=");
63 if (filename[0] ==
'/')
72 char* mfe_path = getenv(
"MFEXTENSIONS_DIR");
73 if (mfe_path) env.append(
":").append(mfe_path).append(
"/config");
75 putenv((
char *)env.c_str());
79 cet::filepath_lookup policy(
"FHICL_FILE_PATH");
82 fhicl::ParameterSet pset;
83 fhicl::make_ParameterSet(filename, policy, pset);
104 , sup_menu(new QMenu(this))
105 , thr_menu(new QMenu(this))
106 , receivers_(readConf(conf).get<fhicl::ParameterSet>(
"receivers", fhicl::ParameterSet()))
114 fhicl::ParameterSet pset = readConf(conf);
120 btnSuppression->setMenu(sup_menu);
121 btnThrottling->setMenu(thr_menu);
124 connect(btnPause, SIGNAL(clicked()),
this, SLOT(
pause()));
125 connect(btnExit, SIGNAL(clicked()),
this, SLOT(
exit()));
126 connect(btnClear, SIGNAL(clicked()),
this, SLOT(
clear()));
128 connect(btnRMode, SIGNAL(clicked()),
this, SLOT(renderMode()));
129 connect(btnDisplayMode, SIGNAL(clicked()),
this, SLOT(
shortMode()));
131 connect(btnSearch, SIGNAL(clicked()),
this, SLOT(searchMsg()));
132 connect(btnSearchClear,
133 SIGNAL(clicked()),
this, SLOT(searchClear()));
135 connect(btnFilter, SIGNAL(clicked()),
this, SLOT(setFilter()));
137 connect(btnError, SIGNAL(clicked()),
this, SLOT(setSevError()));
138 connect(btnWarning, SIGNAL(clicked()),
this, SLOT(setSevWarning()));
139 connect(btnInfo, SIGNAL(clicked()),
this, SLOT(setSevInfo()));
140 connect(btnDebug, SIGNAL(clicked()),
this, SLOT(setSevDebug()));
143 , SIGNAL(triggered(QAction*))
145 , SLOT(setSuppression(QAction*)));
148 , SIGNAL(triggered(QAction*))
150 , SLOT(setThrottling(QAction*)));
153 , SIGNAL(valueChanged(
int))
162 connect(tabWidget, SIGNAL(currentChanged(
int)),
this, SLOT(tabWidgetCurrentChanged(
int)));
163 connect(tabWidget, SIGNAL(tabCloseRequested(
int)),
this, SLOT(tabCloseRequested(
int)));
164 MsgFilterDisplay allMessages;
165 allMessages.txtDisplay = txtMessages;
166 msgFilters_.push_back(allMessages);
169 QTabBar *tabBar = tabWidget->findChild<QTabBar *>();
170 tabBar->setTabButton(0, QTabBar::RightSide, 0);
171 tabBar->setTabButton(0, QTabBar::LeftSide, 0);
173 if (simpleRender) btnRMode->setChecked(
true);
174 else btnRMode->setChecked(
false);
176 btnRMode->setEnabled(
false);
180 QTextDocument* doc =
new QTextDocument(txtMessages);
181 txtMessages->setDocument(doc);
186 msgViewerDlg::~msgViewerDlg()
192 static void str_to_suppress(std::vector<std::string>
const& vs, std::vector<suppress>& s, QMenu* menu)
198 act = menu->addAction(
"None");
199 act->setEnabled(
false);
203 s.reserve(vs.size());
205 for (
size_t i = 0; i < vs.size(); ++i)
208 act = menu->addAction(QString(vs[i].c_str()));
209 act->setCheckable(
true);
210 act->setChecked(
true);
211 QVariant v = qVariantFromValue((
void*)&s[i]);
216 static void pset_to_throttle(std::vector<fhicl::ParameterSet>
const& ps, std::vector<throttle>& t, QMenu* menu)
222 act = menu->addAction(
"None");
223 act->setEnabled(
false);
227 t.reserve(ps.size());
229 for (
size_t i = 0; i < ps.size(); ++i)
231 std::string name = ps[i].get<std::string>(
"name");
233 , ps[i].get<int>(
"limit", -1)
234 , ps[i].get<long>(
"timespan", -1)));
235 act = menu->addAction(QString(name.c_str()));
236 act->setCheckable(
true);
237 act->setChecked(
true);
238 QVariant v = qVariantFromValue((
void*)&t[i]);
243 void msgViewerDlg::parseConf(fhicl::ParameterSet
const& conf)
245 fhicl::ParameterSet nulp;
249 fhicl::ParameterSet sup = conf.get<fhicl::ParameterSet>(
"suppress", nulp);
251 auto sup_host = sup.get<std::vector<std::string>>(
"hosts", std::vector<std::string>());
252 auto sup_app = sup.get<std::vector<std::string>>(
"applications", std::vector<std::string>());
253 auto sup_cat = sup.get<std::vector<std::string>>(
"categories", std::vector<std::string>());
255 str_to_suppress(sup_host, e_sup_host, sup_menu);
256 sup_menu->addSeparator();
258 str_to_suppress(sup_app, e_sup_app, sup_menu);
259 sup_menu->addSeparator();
261 str_to_suppress(sup_cat, e_sup_cat, sup_menu);
264 auto thr = conf.get<fhicl::ParameterSet>(
"throttle", nulp);
266 auto thr_host = thr.get<std::vector<fhicl::ParameterSet>>(
"hosts", std::vector<fhicl::ParameterSet>());
267 auto thr_app = thr.get<std::vector<fhicl::ParameterSet>>(
"applications", std::vector<fhicl::ParameterSet>());
268 auto thr_cat = thr.get<std::vector<fhicl::ParameterSet>>(
"categories", std::vector<fhicl::ParameterSet>());
270 pset_to_throttle(thr_host, e_thr_host, thr_menu);
271 thr_menu->addSeparator();
273 pset_to_throttle(thr_app, e_thr_app, thr_menu);
274 thr_menu->addSeparator();
276 pset_to_throttle(thr_cat, e_thr_cat, thr_menu);
278 auto lvl = conf.get<std::string>(
"threshold",
"INFO");
279 if (lvl ==
"DEBUG" || lvl ==
"debug" || lvl ==
"0") { sevThresh = SDEBUG; }
280 if (lvl ==
"INFO" || lvl ==
"info" || lvl ==
"1") { sevThresh = SINFO; }
281 if (lvl ==
"WARN" || lvl ==
"warn" || lvl ==
"2") { sevThresh = SWARNING; }
282 if (lvl ==
"ERROR" || lvl ==
"error" || lvl ==
"3") { sevThresh = SERROR; }
285 bool msgViewerDlg::msg_throttled(
qt_mf_msg const& mfmsg)
291 for (
size_t i = 0; i < e_sup_host.size(); ++i)
292 if (e_sup_host[i].match(mfmsg.
host().toStdString()))
295 for (
size_t i = 0; i < e_sup_app.size(); ++i)
296 if (e_sup_app[i].match(mfmsg.
app().toStdString()))
299 for (
size_t i = 0; i < e_sup_cat.size(); ++i)
300 if (e_sup_cat[i].match(mfmsg.
cat().toStdString()))
309 for (
size_t i = 0; i < e_thr_host.size(); ++i)
310 if (e_thr_host[i].reach_limit(mfmsg.
host().toStdString(), mfmsg.
time()))
313 for (
size_t i = 0; i < e_thr_app.size(); ++i)
314 if (e_thr_app[i].reach_limit(mfmsg.
app().toStdString(), mfmsg.
time()))
317 for (
size_t i = 0; i < e_thr_cat.size(); ++i)
318 if (e_thr_cat[i].reach_limit(mfmsg.
cat().toStdString(), mfmsg.
time()))
326 void msgViewerDlg::writeSettings()
328 QSettings settings(
"ARTDAQ",
"MsgViewer");
330 settings.beginGroup(
"MainWindow");
331 settings.setValue(
"size", size());
332 settings.setValue(
"pos", pos());
336 void msgViewerDlg::readSettings()
338 QSettings settings(
"ARTDAQ",
"MsgViewer");
340 settings.beginGroup(
"MainWindow");
341 QPoint pos = settings.value(
"pos", QPoint(100, 100)).toPoint();
342 QSize size = settings.value(
"size", QSize(660, 760)).toSize();
348 void msgViewerDlg::onNewMsg(
qt_mf_msg const& mfmsg)
355 lcdMsgs->display(nMsgs);
358 if (msg_throttled(mfmsg))
360 lcdSuppressionCount->display(nSupMsgs);
361 lcdThrottlingCount->display(nThrMsgs);
366 msg_pool_.emplace_back(mfmsg);
367 msgs_t::iterator it = --msg_pool_.end();
370 unsigned int flag = update_index(it);
373 if (flag & LIST_APP) updateList<msg_iters_map_t>(lwApplication, app_msgs_);
374 if (flag & LIST_CAT) updateList<msg_iters_map_t>(lwCategory, cat_msgs_);
375 if (flag & LIST_HOST) updateList<msg_iters_map_t>(lwHost, host_msgs_);
377 for (
size_t d = 0; d < msgFilters_.size(); ++d)
379 bool hostMatch = msgFilters_[d].hostFilter.contains(it->host(), Qt::CaseInsensitive) || msgFilters_[d].hostFilter.size() == 0;
380 bool appMatch = msgFilters_[d].appFilter.contains(it->app(), Qt::CaseInsensitive) || msgFilters_[d].appFilter.size() == 0;
381 bool catMatch = msgFilters_[d].catFilter.contains(it->cat(), Qt::CaseInsensitive) || msgFilters_[d].catFilter.size() == 0;
384 if (hostMatch && appMatch && catMatch)
386 msgFilters_[d].msgs.push_back(it);
392 unsigned int msgViewerDlg::update_index(msgs_t::iterator it)
394 QString
const& app = it->app();
395 QString
const& cat = it->cat();
396 QString
const& host = it->host();
398 unsigned int update = 0x0;
400 if (cat_msgs_.find(cat) == cat_msgs_.end()) update |= LIST_CAT;
401 if (host_msgs_.find(host) == host_msgs_.end()) update |= LIST_HOST;
402 if (app_msgs_.find(app) == app_msgs_.end()) update |= LIST_APP;
404 cat_msgs_[cat].push_back(it);
405 host_msgs_[host].push_back(it);
406 app_msgs_[app].push_back(it);
412 void msgViewerDlg::displayMsg(msgs_t::const_iterator it,
int display)
414 if (it->sev() < sevThresh)
return;
416 msgFilters_[display].nDisplayMsgs++;
417 if (display == tabWidget->currentIndex())
419 lcdDisplayedMsgs->display(msgFilters_[display].nDisplayMsgs);
422 auto txt = it->text(shortMode_);
423 UpdateTextAreaDisplay(txt, msgFilters_[display].txtDisplay);
426 void msgViewerDlg::displayMsg(
int display)
429 msgFilters_[display].txtDisplay->clear();
430 msgFilters_[display].nDisplayMsgs = 0;
432 msg_iters_t::const_iterator it;
434 n = msgFilters_[display].msgs.size();
435 it = msgFilters_[display].msgs.begin();
436 QProgressDialog progress(
"Fetching data...",
"Cancel"
437 , 0, n / 1000,
this);
439 progress.setWindowModality(Qt::WindowModal);
440 progress.setMinimumDuration(2000);
447 for (; it != msgFilters_[display].msgs.end(); ++it, ++i)
449 if (it->get()->sev() >= sevThresh)
451 txt += it->get()->text(shortMode_);
452 ++msgFilters_[display].nDisplayMsgs;
459 progress.setValue(prog);
461 UpdateTextAreaDisplay(txt, msgFilters_[display].txtDisplay);
465 if (progress.wasCanceled())
469 if (display == tabWidget->currentIndex())
471 lcdDisplayedMsgs->display(msgFilters_[display].nDisplayMsgs);
474 UpdateTextAreaDisplay(txt, msgFilters_[display].txtDisplay);
480 void msgViewerDlg::UpdateTextAreaDisplay(QString text, QTextEdit* widget)
482 const QTextCursor old_cursor = widget->textCursor();
483 const int old_scrollbar_value = widget->verticalScrollBar()->value();
484 const bool is_scrolled_down = old_scrollbar_value >= widget->verticalScrollBar()->maximum() * 0.95;
487 widget->append(text);
489 if (old_cursor.hasSelection() || !is_scrolled_down)
492 widget->setTextCursor(old_cursor);
493 widget->verticalScrollBar()->setValue(old_scrollbar_value);
498 widget->moveCursor(QTextCursor::End);
499 widget->verticalScrollBar()->setValue(widget->verticalScrollBar()->maximum());
500 widget->horizontalScrollBar()->setValue(0);
504 void msgViewerDlg::updateDisplays()
506 for (
size_t ii = 0; ii < msgFilters_.size(); ++ii)
512 template <
typename M>
513 bool msgViewerDlg::updateList(QListWidget* lw, M
const& map)
515 bool nonSelectedBefore = (lw->currentRow() == -1);
516 bool nonSelectedAfter =
true;
518 QString item = nonSelectedBefore ?
"" : lw->currentItem()->text();
522 typename M::const_iterator it = map.begin();
524 while (it != map.end())
526 lw->addItem(it->first);
527 if (!nonSelectedBefore && nonSelectedAfter)
529 if (item == it->first)
531 lw->setCurrentRow(row);
532 nonSelectedAfter =
false;
539 if (!nonSelectedBefore && nonSelectedAfter)
return true;
544 msg_iters_t msgViewerDlg::list_intersect(msg_iters_t
const& l1, msg_iters_t
const& l2)
547 msg_iters_t::const_iterator it1 = l1.begin();
548 msg_iters_t::const_iterator it2 = l2.begin();
550 while (it1 != l1.end() && it2 != l2.end())
552 if (*it1 < *it2) { ++it1; }
553 else if (*it2 < *it1) { ++it2; }
556 output.push_back(*it1);
562 TLOG(10) <<
"list_intersect: output list has " << output.size() <<
" entries";
566 std::string sev_to_string(sev_code_t s)
582 void msgViewerDlg::setFilter()
584 auto hostFilter = toQStringList(lwHost->selectedItems());
585 auto appFilter = toQStringList(lwApplication->selectedItems());
586 auto catFilter = toQStringList(lwCategory->selectedItems());
588 lwHost->setCurrentRow(-1, QItemSelectionModel::Clear);
589 lwApplication->setCurrentRow(-1, QItemSelectionModel::Clear);
590 lwCategory->setCurrentRow(-1, QItemSelectionModel::Clear);
592 if (hostFilter.isEmpty()
593 && appFilter.isEmpty()
594 && catFilter.isEmpty())
600 QString catFilterExpression =
"";
601 QString hostFilterExpression =
"";
602 QString appFilterExpression =
"";
605 for (
auto app = 0; app < appFilter.size(); ++app)
607 msg_iters_map_t::const_iterator it = app_msgs_.find(appFilter[app]);
608 appFilterExpression += QString(first ?
"" :
" || ") + appFilter[app];
610 if (it != app_msgs_.end())
612 msg_iters_t temp(it->second);
613 TLOG(10) <<
"setFilter: app " << appFilter[app].toStdString() <<
" has " << temp.size() <<
" messages";
617 TLOG(10) <<
"setFilter: result contains %zu messages", result.size();
620 if (!hostFilter.isEmpty())
622 msg_iters_t hostResult;
623 for (
auto host = 0; host < hostFilter.size(); ++host)
625 hostFilterExpression += QString(first ?
"" :
" || ") + hostFilter[host];
627 msg_iters_map_t::const_iterator it = host_msgs_.find(hostFilter[host]);
628 if (it != host_msgs_.end())
630 msg_iters_t temp(it->second);
631 TLOG(10) <<
"setFilter: host " << hostFilter[host].toStdString() <<
" has " << temp.size() <<
" messages";
632 hostResult.merge(temp);
635 if (result.empty()) { result = hostResult; }
636 else { result = list_intersect(result, hostResult); }
637 TLOG(10) <<
"setFilter: result contains " << result.size() <<
" messages";
641 if (!catFilter.isEmpty())
643 msg_iters_t catResult;
644 for (
auto cat = 0; cat < catFilter.size(); ++cat)
646 catFilterExpression += QString(first ?
"" :
" || ") + catFilter[cat];
648 msg_iters_map_t::const_iterator it = cat_msgs_.find(catFilter[cat]);
649 if (it != cat_msgs_.end())
651 msg_iters_t temp(it->second);
652 TLOG(10) <<
"setFilter: cat " << catFilter[cat].toStdString() <<
" has " << temp.size() <<
" messages";
653 catResult.merge(temp);
656 if (result.empty()) { result = catResult; }
657 else { result = list_intersect(result, catResult); }
658 TLOG(10) <<
"setFilter: result contains " << result.size() <<
" messages";
662 auto nFilterExpressions = (appFilterExpression !=
"" ? 1 : 0) + (hostFilterExpression !=
"" ? 1 : 0) + (catFilterExpression !=
"" ? 1 : 0);
663 QString filterExpression =
"";
664 if (nFilterExpressions == 1)
666 filterExpression = catFilterExpression + hostFilterExpression + appFilterExpression;
670 filterExpression =
"(" + (catFilterExpression !=
"" ? catFilterExpression +
") && (" :
"")
671 + hostFilterExpression
672 + (hostFilterExpression !=
"" && appFilterExpression !=
"" ?
") && (" :
"")
673 + appFilterExpression +
")";
678 auto newTabTitle = QString(
"Filter ") + QString::number(++nFilters);
679 QWidget* newTab =
new QWidget();
681 QTextEdit* txtDisplay =
new QTextEdit(newTab);
682 QTextDocument* doc =
new QTextDocument(txtDisplay);
683 txtDisplay->setDocument(doc);
685 QVBoxLayout* layout =
new QVBoxLayout();
686 layout->addWidget(txtDisplay);
687 layout->setContentsMargins(0, 0, 0, 0);
688 newTab->setLayout(layout);
690 MsgFilterDisplay filteredMessages;
691 filteredMessages.msgs = result;
692 filteredMessages.hostFilter = hostFilter;
693 filteredMessages.appFilter = appFilter;
694 filteredMessages.catFilter = catFilter;
695 filteredMessages.txtDisplay = txtDisplay;
696 filteredMessages.nDisplayMsgs = result.size();
697 msgFilters_.push_back(filteredMessages);
699 tabWidget->addTab(newTab, newTabTitle);
700 tabWidget->setTabToolTip(tabWidget->count() - 1, filterExpression);
701 tabWidget->setCurrentIndex(tabWidget->count() - 1);
703 displayMsg(msgFilters_.size() - 1);
711 btnPause->setText(
"Resume");
717 btnPause->setText(
"Pause");
728 int ret = QMessageBox::question(
this, tr(
"Message Viewer"), tr(
"Are you sure you want to clear all received messages?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::No);
731 case QMessageBox::Yes:
739 updateList<msg_iters_map_t>(lwApplication, app_msgs_);
740 updateList<msg_iters_map_t>(lwCategory, cat_msgs_);
741 updateList<msg_iters_map_t>(lwHost, host_msgs_);
742 for (
auto& display : msgFilters_)
744 display.txtDisplay->clear();
745 display.msgs.clear();
746 display.nDisplayMsgs = 0;
749 lcdMsgs->display(nMsgs);
750 lcdDisplayedMsgs->display(0);
752 case QMessageBox::No:
763 btnDisplayMode->setText(
"Long View");
768 btnDisplayMode->setText(
"Compact View");
789 default: setSevDebug();
795 void msgViewerDlg::setSevError()
798 btnError->setChecked(
true);
799 btnWarning->setChecked(
false);
800 btnInfo->setChecked(
false);
801 btnDebug->setChecked(
false);
802 vsSeverity->setValue(sevThresh);
805 void msgViewerDlg::setSevWarning()
807 sevThresh = SWARNING;
808 btnError->setChecked(
false);
809 btnWarning->setChecked(
true);
810 btnInfo->setChecked(
false);
811 btnDebug->setChecked(
false);
812 vsSeverity->setValue(sevThresh);
815 void msgViewerDlg::setSevInfo()
818 btnError->setChecked(
false);
819 btnWarning->setChecked(
false);
820 btnInfo->setChecked(
true);
821 btnDebug->setChecked(
false);
822 vsSeverity->setValue(sevThresh);
825 void msgViewerDlg::setSevDebug()
828 btnError->setChecked(
false);
829 btnWarning->setChecked(
false);
830 btnInfo->setChecked(
false);
831 btnDebug->setChecked(
true);
832 vsSeverity->setValue(sevThresh);
835 void msgViewerDlg::renderMode()
837 simpleRender = !simpleRender;
841 btnRMode->setChecked(
true);
842 for (
auto display : msgFilters_)
844 display.txtDisplay->setPlainText(display.txtDisplay->toPlainText());
849 btnRMode->setChecked(
false);
854 void msgViewerDlg::searchMsg()
856 QString search = editSearch->text();
858 if (search.isEmpty())
861 auto display = tabWidget->currentIndex();
862 if (search != searchStr)
864 msgFilters_[display].txtDisplay->moveCursor(QTextCursor::Start);
865 if (!msgFilters_[display].txtDisplay->find(search))
867 msgFilters_[display].txtDisplay->moveCursor(QTextCursor::End);
875 if (!msgFilters_[display].txtDisplay->find(search))
877 msgFilters_[display].txtDisplay->moveCursor(QTextCursor::Start);
878 if (!msgFilters_[display].txtDisplay->find(search))
880 msgFilters_[display].txtDisplay->moveCursor(QTextCursor::End);
887 void msgViewerDlg::searchClear()
889 auto display = tabWidget->currentIndex();
890 editSearch->setText(
"");
892 msgFilters_[display].txtDisplay->find(
"");
893 msgFilters_[display].txtDisplay->moveCursor(QTextCursor::End);
896 void msgViewerDlg::setSuppression(QAction* act)
898 bool status = act->isChecked();
903 void msgViewerDlg::setThrottling(QAction* act)
905 bool status = act->isChecked();
910 void msgViewerDlg::tabWidgetCurrentChanged(
int newTab)
912 lcdDisplayedMsgs->display(msgFilters_[newTab].nDisplayMsgs);
914 lwHost->setCurrentRow(-1, QItemSelectionModel::Clear);
915 lwApplication->setCurrentRow(-1, QItemSelectionModel::Clear);
916 lwCategory->setCurrentRow(-1, QItemSelectionModel::Clear);
918 for (
auto host : msgFilters_[newTab].hostFilter)
920 auto items = lwHost->findItems(host, Qt::MatchExactly);
921 if (items.size() > 0)
923 items[0]->setSelected(
true);
926 for (
auto app : msgFilters_[newTab].appFilter)
928 auto items = lwApplication->findItems(app, Qt::MatchExactly);
929 if (items.size() > 0)
931 items[0]->setSelected(
true);
934 for (
auto cat : msgFilters_[newTab].catFilter)
936 auto items = lwCategory->findItems(cat, Qt::MatchExactly);
937 if (items.size() > 0)
939 items[0]->setSelected(
true);
944 void msgViewerDlg::tabCloseRequested(
int tabIndex)
946 if (tabIndex == 0 || static_cast<size_t>(tabIndex) >= msgFilters_.size())
return;
948 auto widget = tabWidget->widget(tabIndex);
949 tabWidget->removeTab(tabIndex);
952 msgFilters_.erase(msgFilters_.begin() + tabIndex);
960 QStringList msgViewerDlg::toQStringList(QList<QListWidgetItem *> in)
964 for (
auto i = 0; i < in.size(); ++i)
966 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.