This commit is contained in:
Nathanaël Restori 2014-08-20 20:10:25 +02:00
parent 36a6956c79
commit 7f1526d313
4 changed files with 661 additions and 289 deletions

View File

@ -20,3 +20,5 @@ HEADERS += qbrainfuck.h \
decoderthread.h
FORMS += qbrainfuck.ui
LIBS += -lqrencode

View File

@ -17,6 +17,8 @@ QBrainfuck::~QBrainfuck()
delete ui;
}
/********** Text part **********/
void QBrainfuck::on_encodeButton_clicked()
{
QByteArray text = ui->textTextEdit->document()->toPlainText().toLatin1();
@ -111,8 +113,58 @@ void QBrainfuck::on_encodeButton_clicked()
}
ui->programTextEdit->setPlainText(program);
ui->tabWidget->setCurrentIndex(1);
}
void QBrainfuck::on_textLoadButton_clicked()
{
QFileDialog dialog(this);
dialog.setFileMode(QFileDialog::AnyFile);
dialog.setNameFilter("Txt Files (*.txt)");
dialog.setDefaultSuffix("txt");
dialog.setAcceptMode(QFileDialog::AcceptOpen);
if (dialog.exec()) {
QFile loadFile(dialog.selectedFiles().first());
if (!loadFile.open(QIODevice::ReadOnly)) {
return;
}
ui->textTextEdit->document()->setPlainText(loadFile.readAll());
loadFile.close();
}
}
void QBrainfuck::on_textSaveButton_clicked()
{
QFileDialog dialog(this);
dialog.setFileMode(QFileDialog::AnyFile);
dialog.setNameFilter("Txt Files (*.txt)");
dialog.setDefaultSuffix("txt");
dialog.setAcceptMode(QFileDialog::AcceptSave);
if (dialog.exec()) {
QFile saveFile(dialog.selectedFiles().first());
if (!saveFile.open(QIODevice::WriteOnly)) {
return;
}
saveFile.write(ui->textTextEdit->document()->toPlainText().toUtf8());
saveFile.close();
}
}
void QBrainfuck::on_textTextEdit_textChanged()
{
ui->textLabel->setText("Text length: " + QString().setNum(ui->textTextEdit->document()->toPlainText().length()));
}
/********** Program part **********/
void QBrainfuck::on_decodeButton_clicked()
{
ui->textTextEdit->setPlainText("");
@ -121,8 +173,58 @@ void QBrainfuck::on_decodeButton_clicked()
QByteArray input = ui->inputLineEdit->text().toLatin1();
decoder->decode(program, input);
ui->tabWidget->setCurrentIndex(0);
}
void QBrainfuck::on_programLoadButton_clicked()
{
QFileDialog dialog(this);
dialog.setFileMode(QFileDialog::AnyFile);
dialog.setNameFilter("Bf Files (*.bf)");
dialog.setDefaultSuffix("bf");
dialog.setAcceptMode(QFileDialog::AcceptOpen);
if (dialog.exec()) {
QFile loadFile(dialog.selectedFiles().first());
if (!loadFile.open(QIODevice::ReadOnly)) {
return;
}
ui->programTextEdit->document()->setPlainText(loadFile.readAll());
loadFile.close();
}
}
void QBrainfuck::on_programSaveButton_clicked()
{
QFileDialog dialog(this);
dialog.setFileMode(QFileDialog::AnyFile);
dialog.setNameFilter("Bf Files (*.bf)");
dialog.setDefaultSuffix("bf");
dialog.setAcceptMode(QFileDialog::AcceptSave);
if (dialog.exec()) {
QFile saveFile(dialog.selectedFiles().first());
if (!saveFile.open(QIODevice::WriteOnly)) {
return;
}
saveFile.write(ui->programTextEdit->document()->toPlainText().toUtf8());
saveFile.close();
}
}
void QBrainfuck::on_programTextEdit_textChanged()
{
ui->programLabel->setText("Program length: " + QString().setNum(ui->programTextEdit->document()->toPlainText().count(QRegExp(">|<|\\+|-|\\.|,|\\[|\\]"))));
}
/********** Motif part **********/
void QBrainfuck::on_motifButton_clicked()
{
QString motif = ui->motifTextEdit->document()->toPlainText();
@ -155,16 +257,48 @@ void QBrainfuck::on_motifButton_clicked()
}
ui->resultTextEdit->setPlainText(motif);
ui->tabWidget->setCurrentIndex(3);
}
void QBrainfuck::on_textTextEdit_textChanged()
void QBrainfuck::on_motifLoadButton_clicked()
{
ui->textLabel->setText("Text length: " + QString().setNum(ui->textTextEdit->document()->toPlainText().length()));
QFileDialog dialog(this);
dialog.setFileMode(QFileDialog::AnyFile);
dialog.setNameFilter("Txt Files (*.txt)");
dialog.setDefaultSuffix("txt");
dialog.setAcceptMode(QFileDialog::AcceptOpen);
if (dialog.exec()) {
QFile loadFile(dialog.selectedFiles().first());
if (!loadFile.open(QIODevice::ReadOnly)) {
return;
}
void QBrainfuck::on_programTextEdit_textChanged()
ui->motifTextEdit->document()->setPlainText(loadFile.readAll());
loadFile.close();
}
}
void QBrainfuck::on_motifSaveButton_clicked()
{
ui->programLabel->setText("Program length: " + QString().setNum(ui->programTextEdit->document()->toPlainText().count(QRegExp(">|<|\\+|-|\\.|,|\\[|\\]"))));
QFileDialog dialog(this);
dialog.setFileMode(QFileDialog::AnyFile);
dialog.setNameFilter("Txt Files (*.txt)");
dialog.setDefaultSuffix("txt");
dialog.setAcceptMode(QFileDialog::AcceptSave);
if (dialog.exec()) {
QFile saveFile(dialog.selectedFiles().first());
if (!saveFile.open(QIODevice::WriteOnly)) {
return;
}
saveFile.write(ui->motifTextEdit->document()->toPlainText().toUtf8());
saveFile.close();
}
}
void QBrainfuck::on_motifTextEdit_textChanged()
@ -177,47 +311,48 @@ void QBrainfuck::on_regexLineEdit_textChanged(const QString &arg1)
on_motifTextEdit_textChanged();
}
void QBrainfuck::on_saveButton_clicked()
/********** Result part **********/
void QBrainfuck::on_qrcodeButton_clicked()
{
char* text = new char[ui->resultTextEdit->document()->toPlainText().toLatin1().size() + 1];
strcpy(text, ui->resultTextEdit->document()->toPlainText().toLatin1().data());
QRcode *qrCode=QRcode_encodeString(text, 0, QR_ECLEVEL_L, QR_MODE_8, 1);
if(qrCode) {
int width = qrCode->width;
QImage image((width + 4)*8, (width + 4)*8, QImage::Format_RGB32);;
QPainter painter(&image);
QLinearGradient linearGrad(QPointF(2*8, 2*8), QPointF((width + 2)*8, (width + 2)*8));
linearGrad.setColorAt(0, Qt::black);
linearGrad.setColorAt(1, Qt::black);
painter.fillRect(0, 0, (width + 4)*8, (width + 4)*8, Qt::white);
painter.fillRect(2*8, 2*8, width*8, width*8, linearGrad);
for (int i = 0; i < width*width; ++i) {
if (!(qrCode->data[i] &0x01)) {
int col = i % width;
int row = (i - col) / width;
painter.fillRect((col + 2)*8, (row + 2)*8, 8, 8, Qt::white);
}
}
ui->qrcodeLabel->setPixmap(QPixmap::fromImage(image));
ui->tabWidget->setCurrentIndex(4);
}
}
void QBrainfuck::on_resultLoadButton_clicked()
{
QFileDialog dialog(this);
dialog.setFileMode(QFileDialog::AnyFile);
dialog.setNameFilter("Json Files (*.json);;Txt Files (*.txt)");
dialog.setDefaultSuffix("json");
dialog.setAcceptMode(QFileDialog::AcceptSave);
if (dialog.exec()) {
QFile saveFile(dialog.selectedFiles().first());
if (!saveFile.open(QIODevice::WriteOnly)) {
return;
}
if (dialog.selectedNameFilter() == "Json Files (*.json)") {
QJsonObject jsonObject;
jsonObject["text"] = ui->textTextEdit->document()->toPlainText();
jsonObject["program"] = ui->programTextEdit->document()->toPlainText();
jsonObject["motif"] = ui->motifTextEdit->document()->toPlainText();
jsonObject["result"] = ui->resultTextEdit->document()->toPlainText();
QJsonDocument jsonDoc(jsonObject);
saveFile.write(jsonDoc.toJson());
} else {
saveFile.write(ui->textTextEdit->document()->toPlainText().toUtf8() + "\n\n");
saveFile.write(ui->programTextEdit->document()->toPlainText().toUtf8() + "\n\n");
saveFile.write(ui->motifTextEdit->document()->toPlainText().toUtf8() + "\n\n");
saveFile.write(ui->resultTextEdit->document()->toPlainText().toUtf8() + "\n\n");
}
}
}
void QBrainfuck::on_loadButton_clicked()
{
QFileDialog dialog(this);
dialog.setFileMode(QFileDialog::AnyFile);
dialog.setNameFilter("Json Files (*.json)");
dialog.setDefaultSuffix("json");
dialog.setNameFilter("Txt Files (*.txt)");
dialog.setDefaultSuffix("txt");
dialog.setAcceptMode(QFileDialog::AcceptOpen);
if (dialog.exec()) {
@ -227,18 +362,54 @@ void QBrainfuck::on_loadButton_clicked()
return;
}
QByteArray saveData = loadFile.readAll();
ui->resultTextEdit->document()->setPlainText(loadFile.readAll());
QJsonDocument jsonDoc(QJsonDocument::fromJson(saveData));
QJsonObject jsonObject = jsonDoc.object();
ui->textTextEdit->setPlainText(jsonObject["text"].toString());
ui->programTextEdit->setPlainText(jsonObject["program"].toString());
ui->motifTextEdit->setPlainText(jsonObject["motif"].toString());
ui->resultTextEdit->setPlainText(jsonObject["result"].toString());
loadFile.close();
}
}
void QBrainfuck::on_resultSaveButton_clicked()
{
QFileDialog dialog(this);
dialog.setFileMode(QFileDialog::AnyFile);
dialog.setNameFilter("Txt Files (*.txt)");
dialog.setDefaultSuffix("txt");
dialog.setAcceptMode(QFileDialog::AcceptSave);
if (dialog.exec()) {
QFile saveFile(dialog.selectedFiles().first());
if (!saveFile.open(QIODevice::WriteOnly)) {
return;
}
saveFile.write(ui->resultTextEdit->document()->toPlainText().toUtf8());
saveFile.close();
}
}
void QBrainfuck::on_resultTextEdit_textChanged()
{
ui->resultLabel->setText("Result length: " + QString().setNum(ui->resultTextEdit->document()->toPlainText().length()));
}
/********** QRCode part **********/
void QBrainfuck::on_qrcodeSaveButton_clicked()
{
QFileDialog dialog(this);
dialog.setFileMode(QFileDialog::AnyFile);
dialog.setNameFilter("PNG Files (*.png)");
dialog.setDefaultSuffix("png");
dialog.setAcceptMode(QFileDialog::AcceptSave);
if (dialog.exec()) {
ui->qrcodeLabel->pixmap()->toImage().save(dialog.selectedFiles().first(), "PNG");
}
}
/*******************************/
void QBrainfuck::setText(QString text) {
ui->textTextEdit->setPlainText(text);
}
@ -246,3 +417,87 @@ void QBrainfuck::setText(QString text) {
void QBrainfuck::errorMessage(QString message) {
QMessageBox::critical(this, "QBrainfuck error", "Error: " + message);
}
void QBrainfuck::on_saveAllButton_clicked()
{
QFileDialog dialog(this);
dialog.setFileMode(QFileDialog::Directory);
dialog.setAcceptMode(QFileDialog::AcceptSave);
if (dialog.exec()) {
QString saveDir(dialog.selectedFiles().first());
QFile textFile(saveDir + "/text.txt");
if (!textFile.open(QIODevice::WriteOnly)) {
return;
}
textFile.write(ui->textTextEdit->document()->toPlainText().toUtf8());
textFile.close();
QFile programFile(saveDir + "/program.bf");
if (!programFile.open(QIODevice::WriteOnly)) {
return;
}
programFile.write(ui->programTextEdit->document()->toPlainText().toUtf8());
programFile.close();
QFile motifFile(saveDir + "/motif.txt");
if (!motifFile.open(QIODevice::WriteOnly)) {
return;
}
motifFile.write(ui->motifTextEdit->document()->toPlainText().toUtf8());
motifFile.close();
QFile resultFile(saveDir + "/result.txt");
if (!resultFile.open(QIODevice::WriteOnly)) {
return;
}
resultFile.write(ui->resultTextEdit->document()->toPlainText().toUtf8());
resultFile.close();
ui->qrcodeLabel->pixmap()->toImage().save(saveDir + "/qrcode.png", "PNG");
}
}
void QBrainfuck::on_loadAllButton_clicked()
{
QFileDialog dialog(this);
dialog.setFileMode(QFileDialog::Directory);
dialog.setAcceptMode(QFileDialog::AcceptOpen);
if (dialog.exec()) {
QString saveDir(dialog.selectedFiles().first());
QFile textFile(saveDir + "/text.txt");
if (!textFile.open(QIODevice::ReadOnly)) {
return;
}
ui->textTextEdit->document()->setPlainText(textFile.readAll());
textFile.close();
QFile programFile(saveDir + "/program.bf");
if (!programFile.open(QIODevice::ReadOnly)) {
return;
}
ui->programTextEdit->document()->setPlainText(programFile.readAll());
programFile.close();
QFile motifFile(saveDir + "/motif.txt");
if (!motifFile.open(QIODevice::ReadOnly)) {
return;
}
ui->motifTextEdit->document()->setPlainText(motifFile.readAll());
motifFile.close();
QFile resultFile(saveDir + "/result.txt");
if (!resultFile.open(QIODevice::ReadOnly)) {
return;
}
ui->resultTextEdit->document()->setPlainText(resultFile.readAll());
resultFile.close();
QImage image;
image.load(saveDir + "/qrcode.png", "PNG");
ui->qrcodeLabel->setPixmap(QPixmap::fromImage(image));
}
}

View File

@ -4,9 +4,8 @@
#include <QMainWindow>
#include <QMessageBox>
#include <QFileDialog>
#include <QJsonObject>
#include <QJsonDocument>
#include <QStack>
#include <QPainter>
#include <qrencode.h>
#include "decoderthread.h"
namespace Ui {
@ -36,14 +35,36 @@ private slots:
void on_regexLineEdit_textChanged(const QString &arg1);
void on_saveButton_clicked();
void on_loadButton_clicked();
void setText(QString text);
void errorMessage(QString message);
void on_textLoadButton_clicked();
void on_textSaveButton_clicked();
void on_programLoadButton_clicked();
void on_programSaveButton_clicked();
void on_motifLoadButton_clicked();
void on_motifSaveButton_clicked();
void on_resultSaveButton_clicked();
void on_resultLoadButton_clicked();
void on_qrcodeButton_clicked();
void on_resultTextEdit_textChanged();
void on_qrcodeSaveButton_clicked();
void on_saveAllButton_clicked();
void on_loadAllButton_clicked();
private:
Ui::QBrainfuck *ui;
DecoderThread *decoder;

View File

@ -6,7 +6,7 @@
<rect>
<x>0</x>
<y>0</y>
<width>1194</width>
<width>1189</width>
<height>634</height>
</rect>
</property>
@ -14,227 +14,38 @@
<string>QBrainfuck</string>
</property>
<widget class="QWidget" name="centralWidget">
<layout class="QGridLayout" name="gridLayout_3">
<item row="0" column="0">
<layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="0" colspan="6">
<widget class="QTabWidget" name="tabWidget">
<property name="currentIndex">
<number>0</number>
</property>
<widget class="QWidget" name="tab">
<widget class="QWidget" name="textTab">
<attribute name="title">
<string>Main</string>
<string>Plain Text</string>
</attribute>
<layout class="QGridLayout" name="gridLayout_4">
<item row="0" column="2">
<widget class="QGroupBox" name="programGroupBox">
<property name="title">
<string>Brainfuck program</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<widget class="QPlainTextEdit" name="programTextEdit">
<property name="font">
<font>
<family>Monospace</family>
</font>
</property>
<property name="lineWrapMode">
<enum>QPlainTextEdit::NoWrap</enum>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="programLabel">
<layout class="QGridLayout" name="gridLayout">
<item row="6" column="1" colspan="2">
<widget class="QPushButton" name="textSaveButton">
<property name="text">
<string>Program length: 0</string>
<string>Save to file ...</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="decodeButton">
<property name="text">
<string>Decode</string>
<item row="2" column="1" colspan="2">
<spacer name="textVerticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
</widget>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
</item>
<item row="3" column="0">
<widget class="QGroupBox" name="motifGoupBox">
<property name="title">
<string>Motif</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_3">
<item>
<widget class="QPlainTextEdit" name="motifTextEdit">
<property name="font">
<font>
<family>Monospace</family>
</font>
</property>
<property name="lineWrapMode">
<enum>QPlainTextEdit::NoWrap</enum>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="motifLabel">
<property name="text">
<string>Motif length: 0</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="motifButton">
<property name="text">
<string>Motif</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item row="3" column="2">
<widget class="QGroupBox" name="resultGroupBox">
<property name="title">
<string>Result</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_4">
<item>
<widget class="QPlainTextEdit" name="resultTextEdit">
<property name="font">
<font>
<family>Monospace</family>
</font>
</property>
<property name="lineWrapMode">
<enum>QPlainTextEdit::NoWrap</enum>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="saveButton">
<property name="text">
<string>Save</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="loadButton">
<property name="text">
<string>Load</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item row="0" column="0" rowspan="3" colspan="2">
<widget class="QGroupBox" name="textGroupBox">
<property name="title">
<string>Plain text</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QPlainTextEdit" name="textTextEdit">
<property name="font">
<font>
<family>Monospace</family>
</font>
</property>
<property name="lineWrapMode">
<enum>QPlainTextEdit::NoWrap</enum>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="textLabel">
<property name="text">
<string>Text length: 0</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="encodeButton">
<property name="text">
<string>Encode</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item row="4" column="0" colspan="3">
<widget class="QGroupBox" name="optionsGroupBox">
<property name="title">
<string>Options</string>
</property>
<layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="2">
<layout class="QFormLayout" name="formLayout_3">
<property name="fieldGrowthPolicy">
<enum>QFormLayout::ExpandingFieldsGrow</enum>
</property>
<item row="1" column="0">
<widget class="QLabel" name="inputLabel">
<property name="text">
<string>Input</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QLineEdit" name="inputLineEdit"/>
</item>
<item row="0" column="1">
<widget class="QLineEdit" name="regexLineEdit">
<property name="text">
<string>#</string>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="regexLabel">
<property name="text">
<string>Motif regex</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="0" column="1">
<layout class="QFormLayout" name="formLayout_2">
<property name="fieldGrowthPolicy">
<enum>QFormLayout::ExpandingFieldsGrow</enum>
</property>
<item row="0" column="0">
<widget class="QLabel" name="maxSignsLabel">
<property name="text">
<string>Max signs (+/-)</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QSpinBox" name="maxSignsSpinBox">
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
<number>255</number>
</property>
<property name="value">
<number>10</number>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="decadesLabel">
<property name="text">
<string>Decades size</string>
</property>
</widget>
</item>
<item row="1" column="1">
<item row="1" column="2">
<widget class="QSpinBox" name="decadesSpinBox">
<property name="minimum">
<number>1</number>
@ -247,37 +58,320 @@
</property>
</widget>
</item>
</layout>
</item>
</layout>
<item row="0" column="1">
<widget class="QLabel" name="maxSignsLabel">
<property name="text">
<string>Max signs (+/-)</string>
</property>
</widget>
</item>
</layout>
<zorder>textGroupBox</zorder>
<zorder>programGroupBox</zorder>
<zorder>motifGoupBox</zorder>
<zorder>resultGroupBox</zorder>
<zorder>optionsGroupBox</zorder>
<item row="1" column="1">
<widget class="QLabel" name="decadesLabel">
<property name="text">
<string>Decades size</string>
</property>
</widget>
<widget class="QWidget" name="tab_2">
<attribute name="title">
<string>Debug</string>
</attribute>
<layout class="QVBoxLayout" name="verticalLayout_6">
<item>
<widget class="QTextEdit" name="debugTextEdit">
</item>
<item row="0" column="2">
<widget class="QSpinBox" name="maxSignsSpinBox">
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
<number>255</number>
</property>
<property name="value">
<number>10</number>
</property>
</widget>
</item>
<item row="5" column="1" colspan="2">
<widget class="QPushButton" name="textLoadButton">
<property name="text">
<string>Load from file ...</string>
</property>
</widget>
</item>
<item row="0" column="0" rowspan="8">
<widget class="QPlainTextEdit" name="textTextEdit">
<property name="font">
<font>
<family>Monospace</family>
</font>
</property>
<property name="lineWrapMode">
<enum>QTextEdit::NoWrap</enum>
<enum>QPlainTextEdit::NoWrap</enum>
</property>
</widget>
</item>
<item row="4" column="1" colspan="2">
<widget class="QPushButton" name="encodeButton">
<property name="text">
<string>Encode</string>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="programTab">
<attribute name="title">
<string>Brainfuck program</string>
</attribute>
<layout class="QGridLayout" name="gridLayout_5">
<item row="4" column="1">
<widget class="QLineEdit" name="inputLineEdit"/>
</item>
<item row="2" column="3">
<widget class="QPushButton" name="programLoadButton">
<property name="text">
<string>Load from file ...</string>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="inputLabel">
<property name="text">
<string>Input</string>
</property>
</widget>
</item>
<item row="1" column="3">
<widget class="QPushButton" name="decodeButton">
<property name="text">
<string>Decode</string>
</property>
</widget>
</item>
<item row="0" column="3">
<spacer name="programVerticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item row="3" column="3">
<widget class="QPushButton" name="programSaveButton">
<property name="text">
<string>Save to file ...</string>
</property>
</widget>
</item>
<item row="0" column="0" rowspan="4" colspan="2">
<widget class="QPlainTextEdit" name="programTextEdit">
<property name="font">
<font>
<family>Monospace</family>
</font>
</property>
<property name="lineWrapMode">
<enum>QPlainTextEdit::NoWrap</enum>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="motifTab">
<attribute name="title">
<string>Motif</string>
</attribute>
<layout class="QGridLayout" name="gridLayout_6">
<item row="5" column="1">
<widget class="QLineEdit" name="regexLineEdit">
<property name="text">
<string>#</string>
</property>
</widget>
</item>
<item row="2" column="2">
<widget class="QPushButton" name="motifButton">
<property name="text">
<string>Motif</string>
</property>
</widget>
</item>
<item row="5" column="0">
<widget class="QLabel" name="regexLabel">
<property name="text">
<string>Motif regex</string>
</property>
</widget>
</item>
<item row="3" column="2">
<widget class="QPushButton" name="motifLoadButton">
<property name="text">
<string>Load from file...</string>
</property>
</widget>
</item>
<item row="0" column="2">
<spacer name="motifVerticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item row="4" column="2">
<widget class="QPushButton" name="motifSaveButton">
<property name="text">
<string>Save to file ...</string>
</property>
</widget>
</item>
<item row="0" column="0" rowspan="5" colspan="2">
<widget class="QPlainTextEdit" name="motifTextEdit">
<property name="font">
<font>
<family>Monospace</family>
</font>
</property>
<property name="lineWrapMode">
<enum>QPlainTextEdit::NoWrap</enum>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="resultTab">
<attribute name="title">
<string>Result</string>
</attribute>
<layout class="QGridLayout" name="gridLayout_7">
<item row="3" column="2">
<widget class="QPushButton" name="resultSaveButton">
<property name="text">
<string>Save to file ...</string>
</property>
</widget>
</item>
<item row="2" column="2">
<widget class="QPushButton" name="resultLoadButton">
<property name="text">
<string>Load from file ...</string>
</property>
</widget>
</item>
<item row="0" column="2">
<spacer name="resultVerticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item row="0" column="0" rowspan="5">
<widget class="QPlainTextEdit" name="resultTextEdit">
<property name="font">
<font>
<family>Monospace</family>
</font>
</property>
<property name="lineWrapMode">
<enum>QPlainTextEdit::NoWrap</enum>
</property>
</widget>
</item>
<item row="1" column="2">
<widget class="QPushButton" name="qrcodeButton">
<property name="text">
<string>QRCode</string>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="qrcodeTab">
<attribute name="title">
<string>QRCode</string>
</attribute>
<layout class="QGridLayout" name="gridLayout_3">
<item row="1" column="1">
<widget class="QPushButton" name="qrcodeSaveButton">
<property name="text">
<string>Save to file ...</string>
</property>
</widget>
</item>
<item row="0" column="1">
<spacer name="qrcodeVerticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item row="0" column="0" rowspan="2">
<widget class="QLabel" name="qrcodeLabel">
<property name="text">
<string>QRCode</string>
</property>
</widget>
</item>
</layout>
</widget>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="textLabel">
<property name="text">
<string>Text length: 0</string>
</property>
</widget>
</item>
<item row="1" column="2">
<widget class="QLabel" name="motifLabel">
<property name="text">
<string>Motif length: 0</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QLabel" name="programLabel">
<property name="text">
<string>Program length: 0</string>
</property>
</widget>
</item>
<item row="1" column="3">
<widget class="QLabel" name="resultLabel">
<property name="text">
<string>Result length: 0</string>
</property>
</widget>
</item>
<item row="1" column="5">
<widget class="QPushButton" name="saveAllButton">
<property name="text">
<string>Save All</string>
</property>
</widget>
</item>
<item row="1" column="4">
<widget class="QPushButton" name="loadAllButton">
<property name="text">
<string>Load All</string>
</property>
</widget>
</item>
</layout>