37 #include <QVBoxLayout>
40 #include <QContextMenuEvent>
53 #include <QTableWidget>
55 #include <QHeaderView>
56 #include <QStackedLayout>
57 #include <QApplication>
60 #include <QPushButton>
100 if (event->key() == Qt::Key_C && (
event->modifiers() & Qt::ControlModifier))
102 QModelIndexList cells = selectedIndexes();
107 foreach (
const QModelIndex& cell, cells) {
108 if (text.length() == 0) {
110 }
else if (cell.row() != currentRow) {
117 currentRow = cell.row();
118 text += cell.data().toString();
121 QApplication::clipboard()->setText(text);
128 QTableWidget::keyPressEvent(event);
136 mScrollToBottomEnabled(true)
139 QVBoxLayout* layout =
new QVBoxLayout(
this);
140 layout->setMargin(0);
141 this->setLayout(layout);
142 layout->addWidget(
mTable);
144 mTable->setShowGrid(
false);
145 mTable->setTextElideMode(Qt::ElideLeft);
146 mTable->setWordWrap(
false);
148 mTable->setColumnCount(6);
150 mTable->setHorizontalHeaderLabels(QStringList() <<
"time" <<
"source" <<
"function" <<
"thread" <<
"level" <<
"description");
151 mTable->setSelectionBehavior(QAbstractItemView::SelectRows);
152 mTable->verticalHeader()->hide();
154 QFontMetrics metric(this->font());
155 mTable->setColumnWidth(0, metric.width(
"00:00:00.000xx"));
156 mTable->setColumnWidth(1, metric.width(
"cxSourceFile.cpp:333xx"));
157 mTable->setColumnWidth(2, metric.width(
"function()xx"));
158 mTable->setColumnWidth(3, metric.width(
"mainxx"));
159 mTable->setColumnWidth(4, metric.width(
"WARNINGxx"));
160 mTable->horizontalHeader()->setStretchLastSection(
true);
162 for (
int i=0; i<
mTable->horizontalHeader()->count(); ++i)
165 int value = headerItem.
readValue(
"-1").toInt();
168 mTable->setColumnWidth(i, value);
171 int textLineHeight = metric.lineSpacing();
172 mTable->verticalHeader()->setDefaultSectionSize(textLineHeight);
177 for (
int i=0; i<
mTable->horizontalHeader()->count(); ++i)
191 mTable->horizontalScrollBar()->setValue(
mTable->horizontalScrollBar()->minimum());
196 int row =
mTable->rowCount();
199 QTableWidgetItem* item = NULL;
201 QString timestamp = message.
getTimeStamp().toString(
"hh:mm:ss.zzz");
202 item = this->
addItem(0, timestamp, message);
207 item = this->
addItem(1, source, message);
211 item = this->
addItem(2,
function, message);
213 QString thread = message.
mThread;
214 item = this->
addItem(3, thread, message);
217 item = this->
addItem(4, level, message);
219 QString desc = message.
getText();
220 item = this->
addItem(5, desc, message);
233 mTable->horizontalHeader()->setVisible(on);
244 int row =
mTable->rowCount();
246 QTableWidgetItem* item =
new QTableWidgetItem(text);
247 item->setStatusTip(text);
248 item->setToolTip(text);
250 item->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
251 mTable->setItem(row-1, column, item);
261 mScrollToBottomEnabled(true)
265 mBrowser->setLineWrapMode(QTextEdit::NoWrap);
266 QVBoxLayout* layout =
new QVBoxLayout(
this);
267 layout->setMargin(0);
268 this->setLayout(layout);
270 this->scrollToBottom();
276 this->scrollToBottom();
281 mBrowser->horizontalScrollBar()->setValue(
mBrowser->horizontalScrollBar()->minimum());
290 this->scrollToBottom();
295 mScrollToBottomEnabled = on;
296 this->scrollToBottom();
299 void SimpleLogMessageDisplayWidget::scrollToBottom()
301 if (mScrollToBottomEnabled)
302 mBrowser->verticalScrollBar()->setValue(
mBrowser->verticalScrollBar()->maximum());
308 return message.
mText;
311 retval= QString(
"[%1] %2")
334 QVBoxLayout* layout =
new QVBoxLayout(
this);
335 layout->setMargin(0);
336 this->setLayout(layout);
340 mShowHeaderButton = expandButton;
341 this->setFixedSize(expandButton->sizeHint());
343 QAction* action =
new QAction(QIcon(
":icons/open_icon_library/layer-lower-3.png"),
"Controls",
this);
344 QString tip =
"Show Controls";
345 action->setStatusTip(tip);
346 action->setWhatsThis(tip);
347 action->setToolTip(tip);
348 connect(action, SIGNAL(triggered()),
this, SLOT(onTriggered()));
351 mShowHeaderButton->setDefaultAction(action);
352 layout->addWidget(mShowHeaderButton);
354 action->setCheckable(
true);
364 return mShowHeaderButton->isChecked();
367 void PopupButton::onTriggered()
370 mAction->setIcon(QIcon(
":icons/open_icon_library/layer-raise-3.png"));
372 mAction->setIcon(QIcon(
":icons/open_icon_library/layer-lower-3.png"));
384 mSeverityAction(NULL),
385 mMessagesWidget(NULL),
386 mMessagesLayout(NULL),
398 mSeverityAction(NULL),
399 mMessagesWidget(NULL),
400 mMessagesLayout(NULL),
403 mOptions =
profile()->getXmlSettings().descend(this->objectName());
412 if (!mMessagesLayout)
419 void ConsoleWidget::createUI()
421 mSeverityAction = NULL;
422 mMessagesWidget = NULL;
424 this->setToolTip(
"Display system information, warnings and errors.");
426 QVBoxLayout* layout =
new QVBoxLayout;
427 layout->setMargin(0);
428 layout->setSpacing(0);
429 this->setLayout(layout);
431 mControlLayout =
new QHBoxLayout;
432 mControlLayout->setMargin(0);
433 layout->addLayout(mControlLayout);
436 mControlLayout->addWidget(mShowControlsButton);
437 connect(mShowControlsButton, &
PopupButton::popup,
this, &ConsoleWidget::updateShowHeader);
439 this->createButtonWidget();
441 mControlLayout->addStretch(1);
443 mMessagesLayout =
new QVBoxLayout;
444 mMessagesLayout->setMargin(0);
445 layout->addLayout(mMessagesLayout);
449 mMessageListener->installFilter(mMessageFilter);
453 QString defVal = enum2string<LOG_SEVERITY>(
msINFO);
454 LOG_SEVERITY value = string2enum<LOG_SEVERITY>(this->option(
"showLevel").
readValue(defVal));
455 mMessageFilter->setLowestSeverity(value);
457 mMessageFilter->setActiveChannel(mChannelSelector->getValue());
458 mMessageListener->installFilter(mMessageFilter);
463 void ConsoleWidget::createButtonWidget()
465 mButtonWidget =
new QWidget(
this);
466 mControlLayout->addWidget(mButtonWidget);
468 QHBoxLayout* buttonLayout =
new QHBoxLayout;
469 buttonLayout->setMargin(0);
470 buttonLayout->setSpacing(0);
472 mButtonWidget->setLayout(buttonLayout);
474 this->addSeverityButtons(buttonLayout);
475 buttonLayout->addSpacing(8);
476 this->addDetailsButton(buttonLayout);
478 this->createChannelSelector();
480 LabeledComboBoxWidget* channelSelectorWidget =
new LabeledComboBoxWidget(
this, mChannelSelector);
481 channelSelectorWidget->showLabel(
false);
482 buttonLayout->addSpacing(8);
483 buttonLayout->addWidget(channelSelectorWidget);
484 buttonLayout->setStretch(buttonLayout->count()-1, 0);
486 buttonLayout->addStretch(1);
489 void ConsoleWidget::updateShowHeader()
494 mButtonWidget->setVisible(show);
498 mControlLayout->insertWidget(0, mShowControlsButton);
503 mControlLayout->removeWidget(mShowControlsButton);
504 mShowControlsButton->setParent(NULL);
505 mShowControlsButton->setParent(
this);
506 mShowControlsButton->setVisible(
true);
512 XmlOptionItem ConsoleWidget::option(QString name)
514 return XmlOptionItem(name, mOptions.
getElement());
522 QString levelString = enum2string<LOG_SEVERITY>(mMessageFilter->getLowestSeverity());
523 this->option(
"showLevel").
writeValue(levelString);
524 this->option(
"showDetails").
writeVariant(mDetailsAction->isChecked());
531 mDetailsAction->setChecked(on);
540 void ConsoleWidget::addSeverityButtons(QBoxLayout* buttonLayout)
543 QIcon(
":/icons/open_icon_library/zoom-in-3.png"),
544 "More",
"More detailed log output",
545 SLOT(onSeverityDown()),
548 this->addSeverityIndicator(buttonLayout);
551 QIcon(
":/icons/open_icon_library/zoom-out-3.png"),
552 "Less ",
"Less detailed log output",
553 SLOT(onSeverityUp()),
557 void ConsoleWidget::addSeverityIndicator(QBoxLayout* buttonLayout)
559 QAction* action =
new QAction(QIcon(
""),
"Severity",
this);
560 mSeverityAction = action;
561 QString help =
"Lowest displayed log severity";
562 action->setStatusTip(help);
563 action->setWhatsThis(help);
564 action->setToolTip(help);
566 button->setDefaultAction(action);
567 buttonLayout->addWidget(button);
570 void ConsoleWidget::updateSeverityIndicator()
572 LOG_SEVERITY severity = mMessageFilter->getLowestSeverity();
577 this->updateSeverityIndicator(
"window-close-3.png",
"error");
580 this->updateSeverityIndicator(
"dialog-warning-panel.png",
"warning");
583 this->updateSeverityIndicator(
"dialog-information-4.png",
"info");
586 this->updateSeverityIndicator(
"script-error.png",
"debug");
589 this->updateSeverityIndicator(
"script-error.png",
"");
594 void ConsoleWidget::updateSeverityIndicator(QString iconname, QString help)
596 QIcon icon(QString(
":/icons/message_levels/%1").arg(iconname));
597 mSeverityAction->setIcon(icon);
599 help = QString(
"Current log level is %1").arg(help);
600 mSeverityAction->setStatusTip(help);
601 mSeverityAction->setToolTip(help);
604 void ConsoleWidget::onSeverityUp()
606 this->onSeverityChange(-1);
609 void ConsoleWidget::onSeverityDown()
611 this->onSeverityChange(+1);
614 void ConsoleWidget::onSeverityChange(
int delta)
616 LOG_SEVERITY severity = mMessageFilter->getLowestSeverity();
617 int val = (int)severity + delta;
619 severity =
static_cast<LOG_SEVERITY
>(val);
621 mMessageFilter->setLowestSeverity(severity);
622 mMessageListener->installFilter(mMessageFilter);
626 void ConsoleWidget::createChannelSelector()
628 QString defval =
"console";
634 "",
"Log Channel to display",
637 mChannelSelector = retval;
640 void ConsoleWidget::addDetailsButton(QBoxLayout* buttonLayout)
642 QIcon icon(
":/icons/open_icon_library/system-run-5.png");
645 "Details",
"Show detailed info on each log entry",
648 action->setCheckable(
true);
650 bool value = this->option(
"showDetails").
readVariant(
false).toBool();
651 action->blockSignals(
true);
652 action->setChecked(value);
653 action->blockSignals(
false);
655 mDetailsAction = action;
658 void ConsoleWidget::updateUI()
660 this->updateSeverityIndicator();
662 this->setWindowTitle(
"Console: " + mChannelSelector->getValue());
663 this->selectMessagesWidget();
664 this->updateShowHeader();
667 QTimer::singleShot(0,
this, SLOT(clearTable()));
669 mMessageListener->restart();
672 void ConsoleWidget::selectMessagesWidget()
674 if (mMessagesWidget && (mMessagesWidget->
getType()==this->getDetailTypeFromButton()))
680 mMessagesLayout->takeAt(0);
681 delete mMessagesWidget;
684 if (this->getDetailTypeFromButton()==
"detail")
686 mMessagesWidget =
new DetailedLogMessageDisplayWidget(
this, mOptions);
690 mMessagesWidget =
new SimpleLogMessageDisplayWidget(
this);
693 mMessagesLayout->addWidget(mMessagesWidget);
696 QString ConsoleWidget::getDetailTypeFromButton()
const
698 if (mDetailsAction->isChecked())
704 void ConsoleWidget::clearTable()
707 mMessagesWidget->
clear();
710 void ConsoleWidget::onLoggingFolderChanged()
714 mMessageListener->installFilter(mMessageFilter);
718 void ConsoleWidget::onChannelSelectorChanged()
720 mChannelSelector->blockSignals(
true);
722 mMessageFilter->setActiveChannel(mChannelSelector->getValue());
723 mMessageListener->installFilter(mMessageFilter);
726 mChannelSelector->blockSignals(
false);
744 void ConsoleWidget::receivedChannel(QString channel)
746 if (!mChannels.count(channel))
748 mChannels.append(channel);
749 mChannelSelector->setValueRange(mChannels);
753 void ConsoleWidget::receivedMessage(
Message message)
755 this->receivedChannel(message.
mChannel);
762 this->printMessage(message);
765 void ConsoleWidget::printMessage(
const Message& message)
768 mMessagesWidget->
add(message);
static MessageListenerPtr create(LogPtr log=LogPtr())
cxResource_EXPORT ProfilePtr profile()
void newChannel(QString channel)
void writeVariant(const QVariant &val)
void loggingFolderChanged()
QString getText() const
The raw message.
QDomElement getElement()
return the current element
QDateTime getTimeStamp() const
The time at which the message was created.
MESSAGE_LEVEL mMessageLevel
Helper class for storing one string value in an xml document.
boost::shared_ptr< class StringProperty > StringPropertyPtr
boost::shared_ptr< class Log > LogPtr
double constrainValue(double val, double min, double max)
void changed()
emit when the underlying data value is changed: The user interface will be updated.
static StringPropertyPtr initialize(const QString &uid, QString name, QString help, QString value, QStringList range, QDomNode root=QDomNode())
void writeValue(const QString &val)
QVariant readVariant(const QVariant &defval=QVariant()) const
void newMessage(Message message)
MESSAGE_LEVEL getMessageLevel() const
The category of the message.
QString enum2string(const ENUM &val)
Helper class for xml files used to store ssc/cx data.
QString readValue(const QString &defval) const