|
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 } |