/*
Copyright © 2015 Hasan Yavuz Özderya
This file is part of serialplot.
serialplot is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
serialplot is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with serialplot. If not, see .
*/
#include
#include
#include "commandedit.h"
class HexCommandValidator : public QRegExpValidator
{
public:
explicit HexCommandValidator(QObject* parent = 0);
QValidator::State validate(QString & input, int & pos) const;
};
HexCommandValidator::HexCommandValidator(QObject* parent) :
QRegExpValidator(parent)
{
QRegExp regExp("^(?:(?:[0-9A-F]{2}[ ])+(?:[0-9A-F]{2}))|(?:[0-9A-F]{2})$");
setRegExp(regExp);
}
QValidator::State HexCommandValidator::validate(QString & input, int & pos) const
{
input = input.toUpper();
// don't let pos to be altered at this stage
int orgPos = pos;
auto r = QRegExpValidator::validate(input, pos);
pos = orgPos;
// try fixing up spaces
if (r != QValidator::Acceptable)
{
input = input.replace(" ", "");
input.replace(QRegExp("([0-9A-F]{2}(?!$))"), "\\1 ");
if (pos == input.size()-1) pos = input.size();
r = QRegExpValidator::validate(input, pos);
}
return r;
}
CommandEdit::CommandEdit(QWidget *parent) :
QLineEdit(parent)
{
hexValidator = new HexCommandValidator(this);
asciiValidator = new QRegExpValidator(QRegExp("[\\x0000-\\x007F]+"));
ascii_mode = true;
setValidator(asciiValidator);
}
CommandEdit::~CommandEdit()
{
delete hexValidator;
}
void CommandEdit::setMode(bool ascii)
{
ascii_mode = ascii;
if (ascii)
{
setValidator(asciiValidator);
auto hexText = text().remove(" ");
// try patching HEX string in case of missing nibble so that
// input doesn't turn into gibberish
if (hexText.size() % 2 == 1)
{
hexText.replace(hexText.size()-1, 1, "3F"); // 0x3F = '?'
qWarning() << "Broken byte in hex command is replaced. Check your command!";
}
setText(QByteArray::fromHex(hexText.toLatin1()));
}
else
{
setValidator(hexValidator);
setText(text().toLatin1().toHex());
}
}
void CommandEdit::keyPressEvent(QKeyEvent * event)
{
if (ascii_mode)
{
QLineEdit::keyPressEvent(event);
return;
}
if (event->key() == Qt::Key_Backspace && !hasSelectedText())
{
int cursor = cursorPosition();
if (cursor != 0 && text()[cursor-1] == ' ')
{
setCursorPosition(cursor-1);
}
}
QLineEdit::keyPressEvent(event);
}