11015
+ − 1
#include <QByteArray>
+ − 2
#include <QFile>
+ − 3
#include <QFileDialog>
+ − 4
#include <QtEndian>
+ − 5
#include <QRegExp>
+ − 6
+ − 7
#include "mainwindow.h"
+ − 8
#include "ui_mainwindow.h"
+ − 9
+ − 10
MainWindow::MainWindow(QWidget *parent) :
+ − 11
QMainWindow(parent),
+ − 12
ui(new Ui::MainWindow)
+ − 13
{
+ − 14
ui->setupUi(this);
+ − 15
}
+ − 16
+ − 17
MainWindow::~MainWindow()
+ − 18
{
+ − 19
delete ui;
+ − 20
}
+ − 21
+ − 22
void MainWindow::on_pbLoad_clicked()
+ − 23
{
+ − 24
QString fileName = QFileDialog::getOpenFileName(this, QString(), QString(), "Hedgewars drawn maps (*.hwmap);;All files (*.*)");
+ − 25
+ − 26
if(!fileName.isEmpty())
+ − 27
{
+ − 28
QFile f(fileName);
+ − 29
+ − 30
if(f.open(QFile::ReadOnly))
+ − 31
{
+ − 32
QByteArray data = qUncompress(QByteArray::fromBase64(f.readAll()));
+ − 33
+ − 34
QStringList decoded;
+ − 35
+ − 36
bool isSpecial = true;
+ − 37
while(data.size() >= 5)
+ − 38
{
+ − 39
qint16 px = qFromBigEndian(*(qint16 *)data.data());
+ − 40
data.remove(0, 2);
+ − 41
qint16 py = qFromBigEndian(*(qint16 *)data.data());
+ − 42
data.remove(0, 2);
+ − 43
quint8 flags = *(quint8 *)data.data();
+ − 44
data.remove(0, 1);
+ − 45
+ − 46
if(flags & 0x80)
+ − 47
{
+ − 48
if(isSpecial && !decoded.isEmpty())
+ − 49
decoded << "// drawings";
+ − 50
+ − 51
isSpecial = false;
+ − 52
+ − 53
quint8 penWidth = flags & 0x3f;
+ − 54
bool isErasing = flags & 0x40;
+ − 55
decoded << QString("%1 %2 %3 %4")
+ − 56
.arg(px, 5).arg(py, 6)
+ − 57
.arg(isErasing ? "e" : "s")
+ − 58
.arg(penWidth, 2);
+ − 59
} else
+ − 60
if(isSpecial)
+ − 61
{
+ − 62
if(decoded.isEmpty())
+ − 63
decoded << "// special points (these are always before all drawings!)";
+ − 64
+ − 65
decoded << QString("%1 %2 %3")
+ − 66
.arg(px, 5).arg(py, 6)
+ − 67
.arg(flags);
+ − 68
} else
+ − 69
{
+ − 70
decoded << QString("%1 %2")
+ − 71
.arg(px, 5).arg(py, 6);
+ − 72
}
+ − 73
}
+ − 74
+ − 75
ui->textEdit->setPlainText(decoded.join("\n"));
+ − 76
ui->statusBar->showMessage("Load OK");
+ − 77
} else
+ − 78
ui->statusBar->showMessage(QString("Can't open file %1").arg(fileName));
+ − 79
}
+ − 80
}
+ − 81
+ − 82
void MainWindow::on_pbSave_clicked()
+ − 83
{
+ − 84
QRegExp rxSP("^\\s*(-?\\d+)\\s*(-?\\d+)\\s*(\\d+)\\s*$");
+ − 85
QRegExp rxLS("^\\s*(-?\\d+)\\s*(-?\\d+)\\s*([es])\\s*(\\d+)\\s*$");
+ − 86
QRegExp rxP("^\\s*(-?\\d+)\\s*(-?\\d+)\\s*$");
+ − 87
+ − 88
QString fileName = QFileDialog::getSaveFileName(this, QString(), QString(), "Hedgewars drawn maps (*.hwmap);;All files (*.*)");
+ − 89
+ − 90
QFile file(fileName);
+ − 91
if(file.open(QFile::WriteOnly))
+ − 92
{
+ − 93
QByteArray b;
+ − 94
QStringList sl = ui->textEdit->toPlainText().split('\n');
+ − 95
bool isSpecial = true;
+ − 96
+ − 97
foreach(const QString & line, sl)
+ − 98
if(!line.startsWith("//"))
+ − 99
{
+ − 100
if(rxLS.indexIn(line) != -1)
+ − 101
{
+ − 102
isSpecial = false;
+ − 103
qint16 px = qToBigEndian((qint16)rxLS.cap(1).toInt());
+ − 104
qint16 py = qToBigEndian((qint16)rxLS.cap(2).toInt());
+ − 105
quint8 flags = 0x80;
+ − 106
if(rxLS.cap(3) == "e") flags |= 0x40;
+ − 107
flags = flags + rxLS.cap(4).toUInt();
+ − 108
b.append((const char *)&px, 2);
+ − 109
b.append((const char *)&py, 2);
+ − 110
b.append((const char *)&flags, 1);
+ − 111
} else
+ − 112
if(isSpecial && (rxSP.indexIn(line) != -1))
+ − 113
{
+ − 114
qint16 px = qToBigEndian((qint16)rxSP.cap(1).toInt());
+ − 115
qint16 py = qToBigEndian((qint16)rxSP.cap(2).toInt());
+ − 116
quint8 flags = rxSP.cap(3).toUInt();
+ − 117
+ − 118
b.append((const char *)&px, 2);
+ − 119
b.append((const char *)&py, 2);
+ − 120
b.append((const char *)&flags, 1);
+ − 121
} else
+ − 122
if(rxP.indexIn(line) != -1)
+ − 123
{
+ − 124
isSpecial = false;
+ − 125
qint16 px = qToBigEndian((qint16)rxP.cap(1).toInt());
+ − 126
qint16 py = qToBigEndian((qint16)rxP.cap(2).toInt());
+ − 127
quint8 flags = 0;
+ − 128
b.append((const char *)&px, 2);
+ − 129
b.append((const char *)&py, 2);
+ − 130
b.append((const char *)&flags, 1);
+ − 131
} else
+ − 132
ui->statusBar->showMessage(QString("Can't parse or misplaced special point: %1").arg(line));
+ − 133
}
+ − 134
+ − 135
file.write(qCompress(b).toBase64());
+ − 136
}
+ − 137
}