Skip to content

Commit 66e0944

Browse files
committed
save - restore page type and overlay
1 parent 67769c5 commit 66e0944

File tree

3 files changed

+56
-5
lines changed

3 files changed

+56
-5
lines changed

src/Archive.cpp

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,15 @@ extern QMainWindow* mainWindow;
1212

1313
class ArchiveStorage {
1414
public:
15+
QString config = "";
1516
void add(const QString& path, const QImage& image) {
1617
values[path] = image;
1718
}
1819

20+
void setConfig(QString cfg){
21+
config = cfg;
22+
}
23+
1924
void create(const QString& archiveFileName) {
2025
// Open the archive file
2126
struct archive* ar = archive_write_new();
@@ -24,15 +29,14 @@ class ArchiveStorage {
2429
archive_write_open_filename(ar, archiveFileName.toStdString().c_str());
2530
// write config
2631
struct archive_entry* entry = archive_entry_new();
27-
QString config = QString::number(mainWindow->geometry().width()) + "x" + QString::number(mainWindow->geometry().height());
2832
archive_entry_set_pathname(entry, "config");
2933
archive_entry_set_filetype(entry, AE_IFREG);
3034
archive_entry_set_perm(entry, 0644);
3135
archive_entry_set_size(entry, config.size());
3236
archive_write_header(ar, entry);
3337
archive_write_data(ar, config.toStdString().c_str(), config.size());
3438
archive_entry_free(entry);
35-
39+
3640
for (auto it = values.begin(); it != values.end(); ++it) {
3741
QString path = it.key();
3842
QImage image = it.value();
@@ -52,10 +56,12 @@ class ArchiveStorage {
5256
// Clean up
5357
archive_write_close(ar);
5458
archive_write_free(ar);
59+
values.clear();
5560
}
5661

5762
QMap<QString, QImage> load(const QString& archiveFileName) {
5863
QMap<QString, QImage> values;
64+
config = "";
5965
// Open the archive file
6066
struct archive *ar;
6167
struct archive_entry *entry;
@@ -89,9 +95,16 @@ class ArchiveStorage {
8995
}
9096
printf("Decompress:%s %ld\n", entryName, total_size);
9197
if(strcmp(entryName, "config") == 0){
92-
QStringList res = QString::fromUtf8(*imageData).split("x");
93-
width = res[0].toInt();
94-
height = res[1].toInt();
98+
config = QString::fromUtf8(*imageData);
99+
QStringList list = config.split("\n");
100+
for (const auto &str : std::as_const(list)) {
101+
if(str.startsWith("width=")){
102+
width = str.split("=")[1].toInt();
103+
} else if(str.startsWith("height=")){
104+
height = str.split("=")[1].toInt();
105+
}
106+
107+
}
95108
continue;
96109
}
97110
QImage image = QImage(reinterpret_cast<const uchar*>(imageData->data()), width, height, QImage::Format_ARGB32);
@@ -121,6 +134,13 @@ void archive_add(const QString& path, const QImage& image){
121134
archive.add(path, image);
122135
}
123136

137+
void archive_set_config(const QString& cfg){
138+
archive.setConfig(cfg);
139+
}
140+
QString archive_get_config(){
141+
return archive.config;
142+
}
143+
124144
void archive_create(const QString& archiveFileName){
125145
archive.create(archiveFileName);
126146
}

src/Archive.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
#include <QString>
55
void archive_add(const QString& path, const QImage& image);
66
void archive_create(const QString& archiveFileName);
7+
void archive_set_config(const QString& cfg);
8+
QString archive_get_config();
79
QMap<QString, QImage> archive_load(const QString& archiveFileName) ;
810

911
#endif

src/DrawingWidget.cpp

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,17 +187,27 @@ class PageStorage {
187187
}
188188
#ifdef LIBARCHIVE
189189
void saveAll(const QString& filename){
190+
images.overlayType = board->getOverlayType();
191+
images.pageType = board->getType();
190192
values[last_page_num] = images;
193+
QString cfg = "[main]\n";
194+
cfg += "width="+QString::number(mainWindow->geometry().width())+"\n";
195+
cfg += "height="+QString::number(mainWindow->geometry().height())+"\n";
191196
for(int i=0;i<=page_count;i++){
197+
cfg += "[page"+QString::number(i)+"]\n";
198+
cfg += "overlay="+QString::number(loadValue(i).overlayType)+"\n";
199+
cfg += "page="+QString::number(loadValue(i).pageType)+"\n";
192200
for(int j=1+loadValue(i).removed;j<=loadValue(i).image_count;j++){
193201
archive_add(QString::number(i)+"/"+QString::number(j-1-loadValue(i).removed), values[i].loadValue(j));
194202
}
195203
}
204+
archive_set_config(cfg);
196205
archive_create(filename);
197206
}
198207

199208
void loadArchive(const QString& filename){
200209
QMap<QString, QImage> archive = archive_load(filename);
210+
QString cfg = archive_get_config();
201211
clear();
202212
for (auto it = archive.begin(); it != archive.end(); ++it) {
203213
QString path = it.key();
@@ -219,7 +229,26 @@ class PageStorage {
219229
values[page].image_count++;
220230
values[page].last_image_num = values[page].image_count;
221231
}
232+
QStringList list = cfg.split("\n");
233+
QString area = "main";
234+
int page = 0;
235+
for (const auto &str : std::as_const(list)) {
236+
if(str.startsWith("[") && str.endsWith("]")) {
237+
area = str.mid(1,str.length()-2);
238+
if(area.startsWith("page")){
239+
page = area.mid(4,str.length()-1).toInt();
240+
}
241+
} else if(str.startsWith("overlay")){
242+
values[page].overlayType = str.split("=")[1].toInt();
243+
printf("Load: page: %d overlay %d\n", page, values[page].overlayType);
244+
} else if(str.startsWith("page")){
245+
values[page].pageType = str.split("=")[1].toInt();
246+
printf("Load: page: %d page %d\n", page, values[page].pageType);
247+
}
248+
}
222249
images = values[0];
250+
board->setType(images.pageType);
251+
board->setOverlayType(images.overlayType);
223252
drawing->loadImage(images.last_image_num);
224253
drawing->update();
225254
updateGoBackButtons();

0 commit comments

Comments
 (0)