25 #include <ArmarXCore/interface/core/ManagedIceObjectDefinitions.h>
27 #include <ArmarXGui/gui-plugins/LoggingPlugin/ui_FilterDialog.h>
37 #include <boost/algorithm/string/regex.hpp>
39 #include <QInputDialog>
40 #include <QMainWindow>
47 #define USERROLE_LOGTABLEID Qt::UserRole + 1
48 #define USERROLE_LOGTABLEPTR Qt::UserRole + 2
49 #define USERROLE_BASENAME Qt::UserRole + 3
50 #define REGEX_COLORS "\033\\[(\\d|\\w?)[;]?(\\d+)m"
51 #define ALL_MESSAGES_FILTER "All Messages"
58 qRegisterMetaType<Qt::Orientation>(
"Qt::Orientation");
59 qRegisterMetaType<std::string>(
"std::string");
62 for (
int i = 0; i < eLogLevelCount; i++)
67 ui.cbVerbosityLevel->setCurrentIndex(1);
69 ui.lvFilters->setCurrentItem(
ui.lvFilters->invisibleRootItem()->child(0));
70 ui.lvFilters->setSortingEnabled(
true);
71 ui.lvFilters->sortByColumn(0, Qt::AscendingOrder);
72 pendingEntriesTimer =
new QTimer(
getWidget());
73 pendingEntriesTimer->setInterval(50);
82 ui.splitter->setSizes(sizes);
95 qRegisterMetaType<LogMessage>(
"LogMessage");
103 connect(
ui.btnAddFilter, SIGNAL(clicked()),
this, SLOT(
addFilter()));
105 connect(
ui.btnPause, SIGNAL(toggled(
bool)),
this, SLOT(
pauseLogging(
bool)));
107 connect(
ui.btnClearAllLogs, SIGNAL(clicked()),
this, SLOT(
clearAllLogs()));
108 connect(
ui.lvFilters,
109 SIGNAL(currentItemChanged(QTreeWidgetItem*, QTreeWidgetItem*)),
112 connect(
ui.lvFilters,
113 SIGNAL(itemDoubleClicked(QTreeWidgetItem*,
int)),
122 ui.edtLiveFilter->hide();
123 ui.edtLiveSearch->setFocus();
134 ui.cbVerbosityLevel->setCurrentIndex(settings->value(
"verbosityLevel", 2).toInt());
135 ui.cbAutoComponentFilters->setChecked(settings->value(
"autoFilterAdding",
true).toBool());
142 settings->setValue(
"verbosityLevel", ui.cbVerbosityLevel->currentIndex());
144 settings->setValue(
"autoFilterAdding", ui.cbAutoComponentFilters->isChecked());
180 emit componentConnected();
194 LogViewer::loggingGroupNameToFilterName(
const QString& loggingGroupName)
const
196 return loggingGroupName.isEmpty() ?
"" : (
"_" + loggingGroupName);
207 const std::string& tag,
208 MessageType severity,
210 const std::string& file,
212 const std::string&
function,
223 msg.function =
function;
236 if (
ui.cbVerbosityLevel->currentIndex() <= msg.type)
238 std::unique_lock lock(pendingEntriesMutex);
239 pendingEntries.push_back(msg);
258 if (filterStr.length() == 0)
262 else if (filterStr.length() < 3)
270 lastLiveSearchEditChangeTime = IceUtil::Time::now();
276 if (searchStr.length() == 0)
279 ui.btnNextItem->setEnabled(
false);
280 ui.btnPreviousItem->setEnabled(
false);
292 ui.btnNextItem->setEnabled(
false);
293 ui.btnPreviousItem->setEnabled(
false);
297 ui.btnNextItem->setEnabled(
true);
298 ui.btnPreviousItem->setEnabled(
true);
315 std::map<QString, LogTable*>::iterator it = filterMap.begin();
317 for (; it != filterMap.end(); it++)
319 it->second->getModel()->clearData();
328 loggingPaused = pause;
336 QTreeWidgetItem* item =
new QTreeWidgetItem(
ui.lvFilters);
338 item->setText(0, standardFilterStr);
343 filterMap[standardFilterStr] = newLogTable;
344 ui.splitter->addWidget(newLogTable);
352 QString loggingGroup,
353 QString componentFilter,
355 MessageType minimumVerbosity,
356 QString messageFilter,
358 QString functionFilter)
361 if (filterMap.find(filterId) != filterMap.end())
363 QString msg =
"A filter with the id " + filterId +
" exists already";
371 if (loggingGroup.length())
374 loggingGroup.toStdString());
378 if (componentFilter.length())
381 componentFilter.toStdString());
384 if (tagFilter.length())
389 if (messageFilter.length())
394 if (fileFilter.length())
399 if (functionFilter.length())
402 functionFilter.toStdString());
406 QString::number(minimumVerbosity).toStdString());
408 QTreeWidgetItem* item =
new QTreeWidgetItem();
409 item->setText(0, filterName);
413 filterMap[filterId] = newLogTable;
414 Ice::StringSeq children;
415 for (
int i = 0; i <
ui.lvFilters->invisibleRootItem()->childCount(); i++)
417 children.push_back(
ui.lvFilters->invisibleRootItem()->child(i)->text(0).toStdString());
420 QTreeWidgetItem* grpItem = NULL;
421 auto grpFilterId = loggingGroupNameToFilterName(loggingGroup);
422 for (
int i = 0; i <
ui.lvFilters->invisibleRootItem()->childCount(); i++)
424 if (
ui.lvFilters->invisibleRootItem()
427 .toString() == grpFilterId)
429 grpItem =
ui.lvFilters->invisibleRootItem()->child(i);
435 grpItem->addChild(item);
441 ui.lvFilters->insertTopLevelItem(0, item);
445 ui.splitter->addWidget(newLogTable);
452 if (componentName.length() == 0 && loggingGroupName.length() == 0)
457 if (!
ui.cbAutoComponentFilters->isChecked())
461 QString filler = (loggingGroupName.length() > 0 && componentName.length() > 0) ?
"_" :
"";
462 auto filterId = loggingGroupNameToFilterName(loggingGroupName) + filler + componentName;
463 auto filterName = componentName.length() > 0
465 : loggingGroupNameToFilterName(loggingGroupName);
467 if (filterMap.count(filterId))
472 addFilter(filterId, filterName, loggingGroupName, componentName,
"", eDEBUG,
"",
"",
"");
481 if (!filterDialog.exec())
486 QString filterName = filterDialog.
ui->edtFilterName->text();
488 if (filterMap.find(filterName) != filterMap.end())
490 QString msg =
"A filter with this name already exists";
499 if (filterDialog.
ui->editComponent->text().length())
505 if (filterDialog.
ui->edtTag->text().length())
508 filterDialog.
ui->edtTag->text().toStdString());
511 if (filterDialog.
ui->edtMessage->text().length())
514 filterDialog.
ui->edtMessage->text().toStdString());
517 if (filterDialog.
ui->edtFile->text().length())
520 filterDialog.
ui->edtFile->text().toStdString());
523 if (filterDialog.
ui->edtFunction->text().length())
526 filterDialog.
ui->edtFunction->text().toStdString());
529 if (filterDialog.
ui->cbVerbosity->currentIndex() != -1)
533 QString::number(filterDialog.
ui->cbVerbosity->currentIndex()).toStdString());
536 QTreeWidgetItem* item =
new QTreeWidgetItem();
537 item->setText(0, filterName);
541 filterMap[filterName] = newLogTable;
542 ui.lvFilters->insertTopLevelItem(
ui.lvFilters->invisibleRootItem()->childCount(), item);
544 ui.splitter->addWidget(newLogTable);
554 if (filterMap.find(filterId) == filterMap.end())
568 for (
unsigned int i = 0; i <
logTable->
getModel()->getFilters().size(); i++)
575 filterDialog.
ui->editComponent->setText(filter.c_str());
579 filterDialog.
ui->edtTag->setText(filter.c_str());
584 filterDialog.
ui->cbVerbosity->setCurrentIndex(QString(filter.c_str()).toInt());
588 filterDialog.
ui->edtMessage->setText(filter.c_str());
592 filterDialog.
ui->edtFile->setText(filter.c_str());
596 filterDialog.
ui->edtFunction->setText(filter.c_str());
601 if (!filterDialog.exec())
605 item->setText(0, filterDialog.
ui->edtFilterName->text());
609 if (filterDialog.
ui->editComponent->text().length())
612 filterDialog.
ui->editComponent->text().toStdString());
615 if (filterDialog.
ui->edtTag->text().length())
618 filterDialog.
ui->edtTag->text().toStdString());
621 if (filterDialog.
ui->edtMessage->text().length())
624 filterDialog.
ui->edtMessage->text().toStdString());
627 if (filterDialog.
ui->edtFile->text().length())
630 filterDialog.
ui->edtFile->text().toStdString());
633 if (filterDialog.
ui->edtFunction->text().length())
636 filterDialog.
ui->edtFunction->text().toStdString());
639 if (filterDialog.
ui->cbVerbosity->currentIndex() != -1)
643 QString::number(filterDialog.
ui->cbVerbosity->currentIndex()).toStdString());
653 if (
ui.lvFilters->invisibleRootItem()->childCount() == 1)
658 auto item =
ui.lvFilters->currentItem();
670 std::map<QString, LogTable*>::iterator it =
673 if (it == filterMap.end())
677 QList<QTreeWidgetItem*> itemsToDelete, iterationList({item});
678 while (!iterationList.isEmpty())
680 auto curItem = iterationList.front();
681 itemsToDelete << curItem;
682 iterationList.pop_front();
683 iterationList << curItem->takeChildren();
685 ui.lvFilters->setCurrentItem(
ui.lvFilters->invisibleRootItem()->child(0));
686 for (
auto& item : itemsToDelete)
688 auto parent = item->parent();
691 parent->removeChild(item);
695 ui.lvFilters->invisibleRootItem()->removeChild(item);
697 std::map<QString, LogTable*>::iterator it =
701 if (it == filterMap.end())
723 item->setFont(0, font);
725 if (filterMap.find(filterId) == filterMap.end())
754 QList<QTreeWidgetItem*> itemsToUpdate, iterationList({
ui.lvFilters->invisibleRootItem()});
755 while (!iterationList.isEmpty())
757 auto curItem = iterationList.front();
758 itemsToUpdate << curItem;
759 iterationList.pop_front();
760 for (
int i = 0; i < curItem->childCount(); ++i)
762 iterationList << curItem->child(i);
766 for (
auto item : itemsToUpdate)
769 LogTable* curLogtable = filterMap.find(filterId)->second;
779 item->setFont(0, font);
781 item->setBackgroundColor(0,
ui.lvFilters->palette().base().color());
786 item->setFont(0, font);
792 item->setBackgroundColor(0, QColor(216, 120, 50));
796 item->setBackgroundColor(0, QColor(255, 90, 80));
800 item->setBackgroundColor(0, QColor(255, 60, 50));
804 item->setBackgroundColor(0,
ui.lvFilters->palette().base().color());
808 item->setText(0, newContent);
809 item->setToolTip(0, newContent);
816 throw LocalException() <<
"Not yet implemented";
823 if (
getState() >= eManagedIceObjectExiting)
828 std::vector<LogMessage> pendingEntriesTemp;
830 std::unique_lock lock(pendingEntriesMutex);
831 pendingEntriesTemp.swap(pendingEntries);
835 unsigned int size = pendingEntriesTemp.size();
838 for (
unsigned int i = 0; i < size; i++)
840 LogMessage& msg = pendingEntriesTemp[i];
841 msg.what = boost::regex_replace(msg.what, re,
"");
843 if (!
getWidget() ||
ui.cbVerbosityLevel->currentIndex() > msg.type)
850 std::map<QString, LogTable*>::iterator it = filterMap.begin();
852 for (; it != filterMap.end(); ++it)
858 std::cerr <<
"log ptr is NULL" << std::endl;
863 bool autoScroll =
false;
865 if (log->verticalScrollBar()->value() == log->verticalScrollBar()->maximum())
874 log->scrollToBottom();
881 bool autoScroll =
false;
883 if (
logTable->verticalScrollBar()->value() ==
logTable->verticalScrollBar()->maximum())
888 std::map<QString, LogTable*>::iterator it = filterMap.begin();
890 for (; it != filterMap.end(); ++it)
900 for (r = row; r < count; r++)
905 bool autoScroll =
false;
907 if (log->verticalScrollBar()->value() == log->verticalScrollBar()->maximum())
915 log->scrollToBottom();
933 ui.edtLiveSearch->show();
934 ui.btnPreviousItem->show();
935 ui.btnNextItem->show();
936 ui.edtLiveFilter->hide();
940 ui.edtLiveSearch->hide();
941 ui.btnPreviousItem->hide();
942 ui.btnNextItem->hide();
943 ui.edtLiveFilter->show();
981 if (parent != customToolbar->parent())
983 customToolbar->setParent(parent);
986 return customToolbar;
989 customToolbar =
new QToolBar(parent);
990 customToolbar->setIconSize(QSize(16, 16));
991 customToolbar->addAction(
994 return customToolbar;