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::unique_lock<std::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)
416 if ((
int)d == tabWidget->currentIndex())
418 lcdDisplayedDeleted->display(msgFilters_[d].nDisplayedDeletedMsgs);
424 lcdDeletedCount->display(nDeleted);
427 unsigned int msgViewerDlg::update_index(msgs_t::iterator it)
429 std::unique_lock<std::mutex> lk(updating_mutex_);
430 QString
const& app = it->app();
431 QString
const& cat = it->cat();
432 QString
const& host = it->host();
434 unsigned int update = 0x0;
436 if (cat_msgs_.find(cat) == cat_msgs_.end()) update |= LIST_CAT;
437 if (host_msgs_.find(host) == host_msgs_.end()) update |= LIST_HOST;
438 if (app_msgs_.find(app) == app_msgs_.end()) update |= LIST_APP;
440 cat_msgs_[cat].push_back(it);
441 host_msgs_[host].push_back(it);
442 app_msgs_[app].push_back(it);
447 void msgViewerDlg::displayMsg(msgs_t::const_iterator it,
int display)
449 if (it->sev() < msgFilters_[display].sevThresh)
return;
450 std::unique_lock<std::mutex> lk(updating_mutex_);
452 msgFilters_[display].nDisplayMsgs++;
453 if (display == tabWidget->currentIndex())
455 lcdDisplayedMsgs->display(msgFilters_[display].nDisplayMsgs);
458 auto txt = it->text(shortMode_);
459 UpdateTextAreaDisplay(txt, msgFilters_[display].txtDisplay);
462 void msgViewerDlg::displayMsg(
int display)
464 std::unique_lock<std::mutex> lk(updating_mutex_);
466 msgFilters_[display].txtDisplay->clear();
467 msgFilters_[display].nDisplayMsgs = 0;
468 msgFilters_[display].nDisplayedDeletedMsgs = 0;
470 msg_iters_t::const_iterator it;
472 n = msgFilters_[display].msgs.size();
473 it = msgFilters_[display].msgs.begin();
474 QProgressDialog progress(
"Fetching data...",
"Cancel", 0, n / 1000,
this);
476 progress.setWindowModality(Qt::WindowModal);
477 progress.setMinimumDuration(2000);
482 for (; it != msgFilters_[display].msgs.end(); ++it, ++i)
484 if (it->get()->sev() >= msgFilters_[display].sevThresh)
486 txt += it->get()->text(shortMode_);
487 ++msgFilters_[display].nDisplayMsgs;
494 progress.setValue(prog);
498 UpdateTextAreaDisplay(txt, msgFilters_[display].txtDisplay);
503 if (progress.wasCanceled())
break;
506 if (display == tabWidget->currentIndex())
508 lcdDisplayedMsgs->display(msgFilters_[display].nDisplayMsgs);
511 UpdateTextAreaDisplay(txt, msgFilters_[display].txtDisplay);
515 void msgViewerDlg::UpdateTextAreaDisplay(QString text, QTextEdit* widget)
517 const QTextCursor old_cursor = widget->textCursor();
518 const int old_scrollbar_value = widget->verticalScrollBar()->value();
519 const bool is_scrolled_down =
520 old_scrollbar_value >= widget->verticalScrollBar()->maximum() * 0.95;
522 if (!paused && !is_scrolled_down)
528 widget->append(text);
530 if (old_cursor.hasSelection() || paused)
533 widget->setTextCursor(old_cursor);
534 widget->verticalScrollBar()->setValue(old_scrollbar_value);
539 widget->moveCursor(QTextCursor::End);
540 widget->verticalScrollBar()->setValue(widget->verticalScrollBar()->maximum());
541 widget->horizontalScrollBar()->setValue(0);
545 void msgViewerDlg::scrollToBottom()
547 int display = tabWidget->currentIndex();
548 msgFilters_[display].txtDisplay->moveCursor(QTextCursor::End);
549 msgFilters_[display].txtDisplay->verticalScrollBar()->setValue(
550 msgFilters_[display].txtDisplay->verticalScrollBar()->maximum());
551 msgFilters_[display].txtDisplay->horizontalScrollBar()->setValue(0);
554 void msgViewerDlg::updateDisplays()
556 for (
size_t ii = 0; ii < msgFilters_.size(); ++ii)
563 bool msgViewerDlg::updateList(QListWidget* lw, M
const& map)
565 bool nonSelectedBefore = (lw->currentRow() == -1);
566 bool nonSelectedAfter =
true;
568 QString item = nonSelectedBefore ?
"" : lw->currentItem()->text();
572 typename M::const_iterator it = map.begin();
574 while (it != map.end())
576 lw->addItem(it->first);
577 if (!nonSelectedBefore && nonSelectedAfter)
579 if (item == it->first)
581 lw->setCurrentRow(row);
582 nonSelectedAfter =
false;
589 if (!nonSelectedBefore && nonSelectedAfter)
return true;
594 msg_iters_t msgViewerDlg::list_intersect(msg_iters_t
const& l1, msg_iters_t
const& l2)
597 msg_iters_t::const_iterator it1 = l1.begin();
598 msg_iters_t::const_iterator it2 = l2.begin();
600 while (it1 != l1.end() && it2 != l2.end())
606 else if (*it2 < *it1)
612 output.push_back(*it1);
618 TLOG(10) <<
"list_intersect: output list has " << output.size() <<
" entries";
622 std::string sev_to_string(sev_code_t s)
638 void msgViewerDlg::setFilter()
640 auto hostFilter = toQStringList(lwHost->selectedItems());
641 auto appFilter = toQStringList(lwApplication->selectedItems());
642 auto catFilter = toQStringList(lwCategory->selectedItems());
644 lwHost->setCurrentRow(-1, QItemSelectionModel::Clear);
645 lwApplication->setCurrentRow(-1, QItemSelectionModel::Clear);
646 lwCategory->setCurrentRow(-1, QItemSelectionModel::Clear);
648 if (hostFilter.isEmpty() && appFilter.isEmpty() && catFilter.isEmpty())
654 QString catFilterExpression =
"";
655 QString hostFilterExpression =
"";
656 QString appFilterExpression =
"";
659 for (
auto app = 0; app < appFilter.size(); ++app)
661 msg_iters_map_t::const_iterator it = app_msgs_.find(appFilter[app]);
662 appFilterExpression += QString(first ?
"" :
" || ") + appFilter[app];
664 if (it != app_msgs_.end())
666 msg_iters_t temp(it->second);
667 TLOG(10) <<
"setFilter: app " << appFilter[app].toStdString() <<
" has " << temp.size() <<
" messages";
671 TLOG(10) <<
"setFilter: result contains %zu messages", result.size();
674 if (!hostFilter.isEmpty())
676 msg_iters_t hostResult;
677 for (
auto host = 0; host < hostFilter.size(); ++host)
679 hostFilterExpression += QString(first ?
"" :
" || ") + hostFilter[host];
681 msg_iters_map_t::const_iterator it = host_msgs_.find(hostFilter[host]);
682 if (it != host_msgs_.end())
684 msg_iters_t temp(it->second);
685 TLOG(10) <<
"setFilter: host " << hostFilter[host].toStdString() <<
" has " << temp.size() <<
" messages";
686 hostResult.merge(temp);
695 result = list_intersect(result, hostResult);
697 TLOG(10) <<
"setFilter: result contains " << result.size() <<
" messages";
701 if (!catFilter.isEmpty())
703 msg_iters_t catResult;
704 for (
auto cat = 0; cat < catFilter.size(); ++cat)
706 catFilterExpression += QString(first ?
"" :
" || ") + catFilter[cat];
708 msg_iters_map_t::const_iterator it = cat_msgs_.find(catFilter[cat]);
709 if (it != cat_msgs_.end())
711 msg_iters_t temp(it->second);
712 TLOG(10) <<
"setFilter: cat " << catFilter[cat].toStdString() <<
" has " << temp.size() <<
" messages";
713 catResult.merge(temp);
722 result = list_intersect(result, catResult);
724 TLOG(10) <<
"setFilter: result contains " << result.size() <<
" messages";
728 auto nFilterExpressions =
729 (appFilterExpression !=
"" ? 1 : 0) + (hostFilterExpression !=
"" ? 1 : 0) + (catFilterExpression !=
"" ? 1 : 0);
730 QString filterExpression =
"";
731 if (nFilterExpressions == 1)
733 filterExpression = catFilterExpression + hostFilterExpression + appFilterExpression;
737 filterExpression =
"(" + (catFilterExpression !=
"" ? catFilterExpression +
") && (" :
"") + hostFilterExpression +
738 (hostFilterExpression !=
"" && appFilterExpression !=
"" ?
") && (" :
"") + appFilterExpression +
744 auto newTabTitle = QString(
"Filter ") + QString::number(++nFilters);
745 QWidget* newTab =
new QWidget();
747 QTextEdit* txtDisplay =
new QTextEdit(newTab);
748 QTextDocument* doc =
new QTextDocument(txtDisplay);
749 txtDisplay->setDocument(doc);
751 QVBoxLayout* layout =
new QVBoxLayout();
752 layout->addWidget(txtDisplay);
753 layout->setContentsMargins(0, 0, 0, 0);
754 newTab->setLayout(layout);
756 MsgFilterDisplay filteredMessages;
757 filteredMessages.msgs = result;
758 filteredMessages.hostFilter = hostFilter;
759 filteredMessages.appFilter = appFilter;
760 filteredMessages.catFilter = catFilter;
761 filteredMessages.txtDisplay = txtDisplay;
762 filteredMessages.nDisplayMsgs = result.size();
763 filteredMessages.nDisplayedDeletedMsgs = 0;
764 filteredMessages.sevThresh = SINFO;
765 msgFilters_.push_back(filteredMessages);
767 tabWidget->addTab(newTab, newTabTitle);
768 tabWidget->setTabToolTip(tabWidget->count() - 1, filterExpression);
769 tabWidget->setCurrentIndex(tabWidget->count() - 1);
771 displayMsg(msgFilters_.size() - 1);
779 btnPause->setText(
"Resume Scrolling");
785 btnPause->setText(
"Pause Scrolling");
795 QMessageBox::question(
this, tr(
"Message Viewer"), tr(
"Are you sure you want to clear all received messages?"),
796 QMessageBox::Yes | QMessageBox::No, QMessageBox::No);
797 std::unique_lock<std::mutex> lk(updating_mutex_);
800 case QMessageBox::Yes:
809 updateList<msg_iters_map_t>(lwApplication, app_msgs_);
810 updateList<msg_iters_map_t>(lwCategory, cat_msgs_);
811 updateList<msg_iters_map_t>(lwHost, host_msgs_);
812 for (
auto& display : msgFilters_)
814 display.txtDisplay->clear();
815 display.msgs.clear();
816 display.nDisplayMsgs = 0;
817 display.nDisplayedDeletedMsgs = 0;
820 lcdMsgs->display(nMsgs);
821 lcdDisplayedMsgs->display(0);
823 case QMessageBox::No:
834 btnDisplayMode->setText(
"Long View");
839 btnDisplayMode->setText(
"Compact View");
846 auto display = tabWidget->currentIndex();
868 void msgViewerDlg::setSevError()
870 auto display = tabWidget->currentIndex();
871 msgFilters_[display].sevThresh = SERROR;
872 btnError->setChecked(
true);
873 btnWarning->setChecked(
false);
874 btnInfo->setChecked(
false);
875 btnDebug->setChecked(
false);
876 vsSeverity->setValue(SERROR);
879 void msgViewerDlg::setSevWarning()
881 auto display = tabWidget->currentIndex();
882 msgFilters_[display].sevThresh = SWARNING;
883 btnError->setChecked(
false);
884 btnWarning->setChecked(
true);
885 btnInfo->setChecked(
false);
886 btnDebug->setChecked(
false);
887 vsSeverity->setValue(SWARNING);
890 void msgViewerDlg::setSevInfo()
892 auto display = tabWidget->currentIndex();
893 msgFilters_[display].sevThresh = SINFO;
894 btnError->setChecked(
false);
895 btnWarning->setChecked(
false);
896 btnInfo->setChecked(
true);
897 btnDebug->setChecked(
false);
898 vsSeverity->setValue(SINFO);
901 void msgViewerDlg::setSevDebug()
903 auto display = tabWidget->currentIndex();
904 msgFilters_[display].sevThresh = SDEBUG;
905 btnError->setChecked(
false);
906 btnWarning->setChecked(
false);
907 btnInfo->setChecked(
false);
908 btnDebug->setChecked(
true);
909 vsSeverity->setValue(SDEBUG);
912 void msgViewerDlg::renderMode()
914 simpleRender = !simpleRender;
918 btnRMode->setChecked(
true);
919 for (
auto display : msgFilters_)
921 display.txtDisplay->setPlainText(display.txtDisplay->toPlainText());
926 btnRMode->setChecked(
false);
931 void msgViewerDlg::searchMsg()
933 QString search = editSearch->text();
935 if (search.isEmpty())
return;
937 auto display = tabWidget->currentIndex();
938 if (search != searchStr)
940 msgFilters_[display].txtDisplay->moveCursor(QTextCursor::Start);
941 if (!msgFilters_[display].txtDisplay->find(search))
943 msgFilters_[display].txtDisplay->moveCursor(QTextCursor::End);
951 if (!msgFilters_[display].txtDisplay->find(search))
953 msgFilters_[display].txtDisplay->moveCursor(QTextCursor::Start);
954 if (!msgFilters_[display].txtDisplay->find(search))
956 msgFilters_[display].txtDisplay->moveCursor(QTextCursor::End);
963 void msgViewerDlg::searchClear()
965 auto display = tabWidget->currentIndex();
966 editSearch->setText(
"");
968 msgFilters_[display].txtDisplay->find(
"");
969 msgFilters_[display].txtDisplay->moveCursor(QTextCursor::End);
972 void msgViewerDlg::setSuppression(QAction* act)
974 bool status = act->isChecked();
979 void msgViewerDlg::setThrottling(QAction* act)
981 bool status = act->isChecked();
986 void msgViewerDlg::tabWidgetCurrentChanged(
int newTab)
988 lcdDisplayedMsgs->display(msgFilters_[newTab].nDisplayMsgs);
990 lwHost->setCurrentRow(-1, QItemSelectionModel::Clear);
991 lwApplication->setCurrentRow(-1, QItemSelectionModel::Clear);
992 lwCategory->setCurrentRow(-1, QItemSelectionModel::Clear);
994 for (
auto host : msgFilters_[newTab].hostFilter)
996 auto items = lwHost->findItems(host, Qt::MatchExactly);
997 if (items.size() > 0)
999 items[0]->setSelected(
true);
1002 for (
auto app : msgFilters_[newTab].appFilter)
1004 auto items = lwApplication->findItems(app, Qt::MatchExactly);
1005 if (items.size() > 0)
1007 items[0]->setSelected(
true);
1010 for (
auto cat : msgFilters_[newTab].catFilter)
1012 auto items = lwCategory->findItems(cat, Qt::MatchExactly);
1013 if (items.size() > 0)
1015 items[0]->setSelected(
true);
1019 switch (msgFilters_[newTab].sevThresh)
1036 void msgViewerDlg::tabCloseRequested(
int tabIndex)
1038 if (tabIndex == 0 || static_cast<size_t>(tabIndex) >= msgFilters_.size())
return;
1040 auto widget = tabWidget->widget(tabIndex);
1041 tabWidget->removeTab(tabIndex);
1044 msgFilters_.erase(msgFilters_.begin() + tabIndex);
1049 QStringList msgViewerDlg::toQStringList(QList<QListWidgetItem*> in)
1053 for (
auto i = 0; i < in.size(); ++i)
1055 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.