Skip to content

Commit

Permalink
highlighting found text
Browse files Browse the repository at this point in the history
  merge in the latest changes from DataDisplayTester
  • Loading branch information
Meinhard Ritscher committed Dec 11, 2016
1 parent b15474d commit e280a62
Show file tree
Hide file tree
Showing 9 changed files with 280 additions and 94 deletions.
2 changes: 1 addition & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ find_package(Qt5Gui REQUIRED)
qt5_wrap_ui(uiHeaders controlpanel.ui mainwindow.ui statusbar.ui sessionmanager.ui searchpanel.ui)
set(cutecomSrcs main.cpp mainwindow.cpp controlpanel.cpp devicecombo.cpp
serialdevicelistmodel.cpp settings.cpp statusbar.cpp sessionmanager.cpp
datadisplay.cpp searchpanel.cpp timeview.cpp)
datadisplay.cpp datahighlighter.cpp searchpanel.cpp timeview.cpp)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
# C++14: set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++1y")
Expand Down
2 changes: 2 additions & 0 deletions CuteCom.pro
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ SOURCES += main.cpp\
statusbar.cpp \
sessionmanager.cpp \
datadisplay.cpp \
datahighlighter.cpp \
searchpanel.cpp \
timeview.cpp

Expand All @@ -43,6 +44,7 @@ HEADERS += mainwindow.h \
statusbar.h \
sessionmanager.h \
datadisplay.h \
datahighlighter.h \
searchpanel.h \
timeview.h

Expand Down
153 changes: 77 additions & 76 deletions datadisplay.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@
* Copyright (C) 2004-2009 Alexander Neundorf <neundorf@kde.org> (code used from original CuteCom)
* Copyright (c) 2015-2016 Meinhard Ritscher <cyc1ingsir@gmail.com>
* Copyright (c) 2015 Antoine Calando <acalando@free.fr> (displaying Ctrl-characters and ascii for hex)
* Copyright (c) 2016 Pauli Sundberg <https://github.com/susundberg> (Make several non-printable characters to be
*grouped)
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
Expand All @@ -24,6 +26,7 @@
#include "datadisplay.h"
#include "timeview.h"
#include "searchpanel.h"
#include "datahighlighter.h"

#include <QScrollBar>
#include <QPainter>
Expand All @@ -34,16 +37,15 @@ DataDisplay::DataDisplay(QWidget *parent)
: QWidget(parent)
, m_dataDisplay(new DataDisplayPrivate(this))
, m_searchPanel(new SearchPanel(this))
, m_searchAreaHeight(0)
, m_hexBytes(0)
, m_hexLeftOver(0)
, m_displayHex(false)
, m_displayCtrlCharacters(false)
, m_previous_ended_with_nl(true)
{
setupTextFormats();
m_dataDisplay->setPrefixFormat(m_format_prefix);
m_timestamps = m_dataDisplay->timestamps();
m_highlighter = new DataHighlighter(m_dataDisplay->document());

QVBoxLayout *layout = new QVBoxLayout(this);
// to remove any margin around the layout
Expand All @@ -54,13 +56,8 @@ DataDisplay::DataDisplay(QWidget *parent)
layout->addWidget(m_searchPanel);
m_searchPanel->hide();

findAction = new QAction(this);
findAction->setShortcut(QKeySequence::Find);
this->addAction(findAction);
connect(findAction, &QAction::triggered, [=]() { showSearchPanel(true); });
connect(m_searchPanel, &SearchPanel::closing, [=]() { showSearchPanel(false); });
connect(m_searchPanel, &SearchPanel::findNext, m_dataDisplay,
static_cast<bool (QPlainTextEdit::*)(const QString &, QTextDocument::FindFlags)>(&QPlainTextEdit::find));
connect(m_searchPanel, &SearchPanel::findNext, this, &DataDisplay::find);
connect(m_searchPanel, &SearchPanel::textEntered, m_highlighter, &DataHighlighter::setSearchString);
}

void DataDisplay::clear()
Expand All @@ -74,8 +71,6 @@ void DataDisplay::setReadOnly(bool readonly) { m_dataDisplay->setReadOnly(readon

void DataDisplay::setUndoRedoEnabled(bool enable) { m_dataDisplay->setUndoRedoEnabled(enable); }

void DataDisplay::showSearchPanel() { m_searchPanel->showPanel(true); }

/*!
* Prepare data and finally append it to the end of text edit's
* view port.
Expand Down Expand Up @@ -145,18 +140,13 @@ void DataDisplay::displayData(const QByteArray &data)

if (m_displayHex) {
m_dataDisplay->moveCursor(QTextCursor::End);
m_dataDisplay->textCursor().insertText(line.prefix, *m_format_prefix);

m_dataDisplay->moveCursor(QTextCursor::End);
m_dataDisplay->textCursor().insertText(line.data, *m_format_hex);

m_dataDisplay->moveCursor(QTextCursor::End);
m_dataDisplay->textCursor().insertText(line.trailer, *m_format_ascii);
} else {
if (line.prefix.size() > 0) {
m_dataDisplay->moveCursor(QTextCursor::End);
m_dataDisplay->textCursor().insertText(line.prefix, *m_format_prefix);
}
m_dataDisplay->moveCursor(QTextCursor::End);
m_dataDisplay->textCursor().insertText(line.data, *m_format_data);
}
Expand Down Expand Up @@ -205,43 +195,54 @@ void DataDisplay::constructDisplayLine(const QByteArray &inData)
}

} else {
// Check if we have multiple zeros here -- concatenate them to a single printe
int nbreaks = 0;

QString to_print;

if (b == '\0') {
to_print="break";
}
else {
to_print = QString("0x%1").arg(b & 0xff, 2, 16, QChar('0'));
}

for ( int nbreaks_loop = i; nbreaks_loop < inData.size(); nbreaks_loop++) {
if ( inData.at( nbreaks_loop ) != (int)b )
break;

nbreaks += 1;
if ( nbreaks > 999 ) { // make sure our padding to 3 characters dont go over
line.data += QString("<%1 x %2>\n").arg( to_print ).arg( 999, 3, 10, QChar('0') );
nbreaks -= 999;
}

}

if ( nbreaks == 1 ) {
// Nice single '<break>' print
line.data += QString("<%1>\n").arg( to_print );
}
else {
// and multi print when needed
line.data += QString("<%1 x %2>\n").arg( to_print ).arg( nbreaks, 3, 10, QChar('0') );
i += (nbreaks - 1);
/* testcases:
* 0
* 0000
* 0x999
* 0x1024
* abc0 plus all above (2-3) with leading abc
* 0z plus all above (2-3) with trailing z
* abc0z plus all above (2-3) with leading abc and trailing z
*/

if (b == '\0') {
// Check if we have multiple zeros here -- concatenate them to a single printe
int nbreaks = 0;

for (int nbreaks_loop = i; nbreaks_loop < inData.size(); nbreaks_loop++) {
if (inData.at(nbreaks_loop) != (int)b)
break;

nbreaks += 1;
if (nbreaks > 999) { // make sure our padding to 3 characters dont go over
line.data += QString("<break x %2>\n").arg(999, 3, 10, QChar('0'));
m_data.append(line);
line = DisplayLine();
m_timestamps->append(m_timestamp);
nbreaks -= 999;
i += 999;
}
}

if (nbreaks == 1) {
// Nice single '<break>' print
line.data += QString("<break>\n");
} else {
// and multi print when needed
line.data += QString("<break x %2>\n").arg(nbreaks, 3, 10, QChar('0'));
i += (nbreaks - 1);
}

if (i < (inData.size() - 1)) {
// append line as there are trailing characters after the break
m_data.append(line);
line = DisplayLine();
m_timestamps->append(m_timestamp);
}
} else {
line.data += QString("<0x%1>").arg(b & 0xff, 2, 16, QChar('0'));
}

m_previous_ended_with_nl = true;
m_data.append(line);
line = DisplayLine();
}
}
if (!line.data.isEmpty()) {
Expand Down Expand Up @@ -286,20 +287,22 @@ void DataDisplay::setDisplayCtrlCharacters(bool displayCtrlCharacters)
m_displayCtrlCharacters = displayCtrlCharacters;
}

QTextDocument *DataDisplay::getTextDocument() { return m_dataDisplay->document(); }

/*!
* \brief DataDisplay::showSearchPanel
* \param visible
* \brief DataDisplay::find
*/
void DataDisplay::showSearchPanel(bool visible)
void DataDisplay::find(const QString &text, QTextDocument::FindFlags flags)
{
if (visible) {
m_searchAreaHeight = m_searchPanel->height();
} else {
m_searchAreaHeight = 0;
}
m_searchPanel->showPanel(visible);
bool found = m_dataDisplay->find(text, flags);
m_searchPanel->setPatternFound(found);
}

/*!
* \brief DataDisplay::startSearch
*/
void DataDisplay::startSearch() { m_searchPanel->showPanel(true); }

/*!
* Setting up different formats for displaying
* different sections of the data differently
Expand All @@ -320,10 +323,9 @@ void DataDisplay::setupTextFormats()
m_format_data = new QTextCharFormat(format);
// qDebug() << m_format_data->foreground();

col = QColor(120, 180, 200);
col = QColor(100, 100, 200);
format.setForeground(col);
m_format_prefix = new QTextCharFormat(format);
// qDebug() << m_format_prefix->foreground();
m_dataDisplay->setTimeFormat(new QTextCharFormat(format));

col = QColor(Qt::black);
format.setForeground(col);
Expand Down Expand Up @@ -408,8 +410,7 @@ bool DataDisplay::formatHexData(const QByteArray &inData)
asciiText.insert(8, QStringLiteral(" "));

DisplayLine line;
line.prefix = QString("%1 ").arg(m_hexBytes, 8, 10, QChar('0'));
line.data = QString("%1\t").arg(hexJunk, -50);
line.data = QString("%1 %2\t").arg(m_hexBytes, 8, 10, QChar('0')).arg(hexJunk, -50);
line.trailer = QString(asciiText);
if (!redisplay || pos > 0)
m_timestamps->append(m_timestamp);
Expand Down Expand Up @@ -440,7 +441,7 @@ bool DataDisplay::formatHexData(const QByteArray &inData)
DataDisplayPrivate::DataDisplayPrivate(DataDisplay *parent)
: QPlainTextEdit(parent)
, m_timestampFormat(QStringLiteral("HH:mm:ss:zzz"))
, m_prefix_width(0)
, m_time_width(0)
, m_timeView(new TimeView(this))
{
m_timestamps = new QVector<QTime>();
Expand All @@ -457,7 +458,7 @@ void DataDisplayPrivate::resizeEvent(QResizeEvent *event)
QPlainTextEdit::resizeEvent(event);

QRect cr = contentsRect();
m_timeView->setGeometry(QRect(cr.left(), cr.top(), m_prefix_width, cr.height()));
m_timeView->setGeometry(QRect(cr.left(), cr.top(), m_time_width, cr.height()));
}

/*!
Expand All @@ -469,9 +470,9 @@ void DataDisplayPrivate::resizeEvent(QResizeEvent *event)
void DataDisplayPrivate::timeViewPaintEvent(QPaintEvent *event)
{
QPainter painter(m_timeView);
painter.fillRect(event->rect(), QColor(233,233,233));
painter.setPen(m_format_prefix->foreground().color());
painter.setFont(m_format_prefix->font());
painter.fillRect(event->rect(), QColor(233, 233, 233));
painter.setPen(m_format_time->foreground().color());
painter.setFont(m_format_time->font());
QTextBlock block = firstVisibleBlock();
int blockNumber = block.blockNumber();
int top = (int)blockBoundingGeometry(block).translated(contentOffset()).top();
Expand Down Expand Up @@ -510,7 +511,7 @@ void DataDisplayPrivate::updateTimeView(const QRect &rect, int dy)
// setViewportMargins(m_prefix_width,0,0,0);
}

int DataDisplayPrivate::timeViewWidth() { return m_prefix_width; }
int DataDisplayPrivate::timeViewWidth() { return m_time_width; }

/*!
* \brief OutputTerminal::setDisplayTime
Expand All @@ -519,17 +520,17 @@ int DataDisplayPrivate::timeViewWidth() { return m_prefix_width; }
void DataDisplayPrivate::setDisplayTime(bool displayTime)
{
if (displayTime) {
QFontMetrics *metric = new QFontMetrics(m_format_prefix->font());
m_prefix_width = 3 + metric->width(QStringLiteral("00:00:00:000"));
QFontMetrics *metric = new QFontMetrics(m_format_time->font());
m_time_width = 3 + metric->width(QStringLiteral("00:00:00:000"));
} else {
m_prefix_width = 0;
m_time_width = 0;
}
setViewportMargins(m_prefix_width, 0, 0, 0);
setViewportMargins(m_time_width, 0, 0, 0);
}

QVector<QTime> *DataDisplayPrivate::timestamps() { return m_timestamps; }

void DataDisplayPrivate::setPrefixFormat(QTextCharFormat *format_prefix) { m_format_prefix = format_prefix; }
void DataDisplayPrivate::setTimeFormat(QTextCharFormat *format_time) { m_format_time = format_time; }

/*!
* \brief OutputTerminal::setTimestampFormat
Expand Down
18 changes: 9 additions & 9 deletions datadisplay.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,14 +29,14 @@ class TimeView;
class SearchPanel;
class DataDisplayPrivate;
class QAction;
class DataHighlighter;

class DataDisplay : public QWidget
{
Q_OBJECT

struct DisplayLine
{
QString prefix;
QString data;
QString trailer;
};
Expand All @@ -50,7 +50,7 @@ class DataDisplay : public QWidget

void setUndoRedoEnabled(bool enabled);

void showSearchPanel();
void startSearch();

void displayData(const QByteArray &data);

Expand All @@ -60,8 +60,10 @@ class DataDisplay : public QWidget

void setDisplayCtrlCharacters(bool displayCtrlCharacters);

QTextDocument *getTextDocument();

private:
void showSearchPanel(bool visible);
void find(const QString &, QTextDocument::FindFlags);
void insertSpaces(QString &data, unsigned int step = 1);
bool formatHexData(const QByteArray &inData);
void constructDisplayLine(const QByteArray &inData);
Expand All @@ -73,8 +75,6 @@ class DataDisplay : public QWidget

int m_searchAreaHeight;

QAction *findAction;

/**
* @brief m_timestamp
*/
Expand Down Expand Up @@ -116,12 +116,12 @@ class DataDisplay : public QWidget

bool m_previous_ended_with_nl;

QTextCharFormat *m_format_prefix;
QTextCharFormat *m_format_data;
QTextCharFormat *m_format_hex;
QTextCharFormat *m_format_ascii;

QVector<QTime> *m_timestamps;
DataHighlighter *m_highlighter;
};

class DataDisplayPrivate : public QPlainTextEdit
Expand All @@ -137,7 +137,7 @@ class DataDisplayPrivate : public QPlainTextEdit

void setTimestampFormat(const QString &timestampFormat);

void setPrefixFormat(QTextCharFormat *format_prefix);
void setTimeFormat(QTextCharFormat *format_time);

QVector<QTime> *timestamps();

Expand All @@ -148,14 +148,14 @@ class DataDisplayPrivate : public QPlainTextEdit
void updateTimeView(const QRect &, int);

private:
QTextCharFormat *m_format_prefix;
QTextCharFormat *m_format_time;

/**
* @brief m_timestampFormat
*/
QString m_timestampFormat;

int m_prefix_width;
int m_time_width;
TimeView *m_timeView;
QVector<QTime> *m_timestamps;
};
Expand Down
Loading

0 comments on commit e280a62

Please sign in to comment.