From e0255721daee656c8f8434a8cc142ac8b34eafc6 Mon Sep 17 00:00:00 2001 From: Stojce Slavkovski Date: Tue, 24 Dec 2013 22:15:19 +0100 Subject: [PATCH] Search keyword highlighter --- interface/src/AbstractLoggerInterface.h | 2 +- interface/src/FileLogger.cpp | 27 +++----------------- interface/src/FileLogger.h | 4 +-- interface/src/ui/LogDialog.cpp | 34 ++++++++++++++++++++++--- interface/src/ui/LogDialog.h | 19 ++++++++++++++ 5 files changed, 57 insertions(+), 29 deletions(-) diff --git a/interface/src/AbstractLoggerInterface.h b/interface/src/AbstractLoggerInterface.h index d53ada6cca..36c0b73771 100644 --- a/interface/src/AbstractLoggerInterface.h +++ b/interface/src/AbstractLoggerInterface.h @@ -21,7 +21,7 @@ public: inline void setExtraDebugging(bool debugging) { _extraDebugging = debugging; }; virtual void addMessage(QString) = 0; - virtual QStringList getLogData(QString) = 0; + virtual QStringList getLogData() = 0; virtual void locateLog() = 0; signals: diff --git a/interface/src/FileLogger.cpp b/interface/src/FileLogger.cpp index 5f652ec0f2..d1ef1bf83b 100644 --- a/interface/src/FileLogger.cpp +++ b/interface/src/FileLogger.cpp @@ -14,41 +14,22 @@ #include #include -FileLogger::FileLogger() : _lines(NULL) { - QHostAddress clientAddress = QHostAddress(getHostOrderLocalAddress()); - QDateTime now = QDateTime::currentDateTime(); - +FileLogger::FileLogger() : _logData(NULL) { _fileName = QStandardPaths::writableLocation(QStandardPaths::DataLocation); QDir logDir(_fileName); if (!logDir.exists(_fileName)) { logDir.mkdir(_fileName); } + QHostAddress clientAddress = QHostAddress(getHostOrderLocalAddress()); + QDateTime now = QDateTime::currentDateTime(); _fileName.append(QString("/hifi-log_%1_%2.txt").arg(clientAddress.toString(), now.toString("yyyy-MM-dd_hh.mm.ss"))); - setExtraDebugging(false); -} - -QStringList FileLogger::getLogData(QString searchText) { - if (searchText.isEmpty()) { - return _lines; - } - - // wait for adding new log data while iterating over _lines - _mutex.lock(); - QStringList filteredList; - for (int i = 0; i < _lines.size(); ++i) { - if (_lines[i].contains(searchText, Qt::CaseInsensitive)) { - filteredList.append(_lines[i]); - } - } - _mutex.unlock(); - return filteredList; } void FileLogger::addMessage(QString message) { _mutex.lock(); emit logReceived(message); - _lines.append(message); + _logData.append(message); QFile file(_fileName); if (file.open(QIODevice::WriteOnly | QIODevice::Append | QIODevice::Text)) { diff --git a/interface/src/FileLogger.h b/interface/src/FileLogger.h index fffbc5fa91..e0cd0c5d5e 100644 --- a/interface/src/FileLogger.h +++ b/interface/src/FileLogger.h @@ -18,11 +18,11 @@ public: FileLogger(); virtual void addMessage(QString); - virtual QStringList getLogData(QString); + virtual QStringList getLogData() { return _logData; }; virtual void locateLog(); private: - QStringList _lines; + QStringList _logData; QString _fileName; QMutex _mutex; diff --git a/interface/src/ui/LogDialog.cpp b/interface/src/ui/LogDialog.cpp index 5d6a404c76..4b5ee7f80a 100644 --- a/interface/src/ui/LogDialog.cpp +++ b/interface/src/ui/LogDialog.cpp @@ -25,6 +25,7 @@ const int CHECKBOX_MARGIN = 12; const int CHECKBOX_WIDTH = 140; const int REVEAL_BUTTON_WIDTH = 122; const float INITIAL_HEIGHT_RATIO = 0.6f; +const QString HIGHLIGHT_COLOR = "#3366CC"; int qTextCursorMeta = qRegisterMetaType("QTextCursor"); int qTextBlockMeta = qRegisterMetaType("QTextBlock"); @@ -91,12 +92,13 @@ void LogDialog::initControls() { _logTextBox = new QPlainTextEdit(this); _logTextBox->setReadOnly(true); _logTextBox->show(); + _highlighter = new KeywordHighlighter(_logTextBox->document()); } void LogDialog::showEvent(QShowEvent*) { connect(_logger, SIGNAL(logReceived(QString)), this, SLOT(appendLogLine(QString))); - handleSearchTextChanged(""); + showLogData(); } void LogDialog::resizeEvent(QResizeEvent*) { @@ -110,7 +112,9 @@ void LogDialog::resizeEvent(QResizeEvent*) { void LogDialog::appendLogLine(QString logLine) { if (isVisible()) { pthread_mutex_lock(& _mutex); - _logTextBox->appendHtml(logLine.simplified()); + if (logLine.contains(_searchTerm, Qt::CaseInsensitive)) { + _logTextBox->appendPlainText(logLine.simplified()); + } pthread_mutex_unlock(& _mutex); _logTextBox->ensureCursorVisible(); } @@ -129,13 +133,37 @@ void LogDialog::handleExtraDebuggingCheckbox(const int state) { } void LogDialog::handleSearchTextChanged(const QString searchText) { + _searchTerm = searchText; + _highlighter->keyword = searchText; + showLogData(); +} +void LogDialog::showLogData() { _logTextBox->clear(); pthread_mutex_lock(& _mutex); - QStringList _logData = _logger->getLogData(searchText); + QStringList _logData = _logger->getLogData(); for (int i = 0; i < _logData.size(); ++i) { appendLogLine(_logData[i]); } pthread_mutex_unlock(& _mutex); } + +KeywordHighlighter::KeywordHighlighter(QTextDocument *parent) : QSyntaxHighlighter(parent), keywordFormat() { + keywordFormat.setForeground(QColor(HIGHLIGHT_COLOR)); +} + +void KeywordHighlighter::highlightBlock(const QString &text) { + + if (keyword.isNull() || keyword.isEmpty()) { + return; + } + + int index = text.indexOf(keyword, 0, Qt::CaseInsensitive); + int length = keyword.length(); + + while (index >= 0) { + setFormat(index, length, keywordFormat); + index = text.indexOf(keyword, index + length, Qt::CaseInsensitive); + } +} diff --git a/interface/src/ui/LogDialog.h b/interface/src/ui/LogDialog.h index ef3d125cb7..9a0481546e 100644 --- a/interface/src/ui/LogDialog.h +++ b/interface/src/ui/LogDialog.h @@ -14,9 +14,25 @@ #include #include #include +#include #include "AbstractLoggerInterface.h" +class KeywordHighlighter : public QSyntaxHighlighter { + Q_OBJECT + +public: + KeywordHighlighter(QTextDocument *parent = 0); + QString keyword; + +protected: + void highlightBlock(const QString &text); + +private: + QTextCharFormat keywordFormat; + +}; + class LogDialog : public QDialog { Q_OBJECT @@ -44,10 +60,13 @@ private: QPushButton* _revealLogButton; QPlainTextEdit* _logTextBox; pthread_mutex_t _mutex; + QString _searchTerm; + KeywordHighlighter* _highlighter; AbstractLoggerInterface* _logger; void initControls(); + void showLogData(); }; #endif