From 6c6f8b581c7088b45cf0d18b8871dffe25395fac Mon Sep 17 00:00:00 2001 From: Fournier Gabriel <> Date: Sun, 13 Dec 2020 21:55:03 +0100 Subject: [PATCH] saving --- apps/reader/list_book_controller.cpp | 27 +++++++++++++++++++++++ apps/reader/list_book_controller.h | 2 ++ apps/reader/read_book_controller.cpp | 33 ++++++++++++++++++++++++++++ apps/reader/read_book_controller.h | 4 ++++ apps/reader/word_wrap_view.cpp | 10 +++++++++ apps/reader/word_wrap_view.h | 3 ++- 6 files changed, 78 insertions(+), 1 deletion(-) diff --git a/apps/reader/list_book_controller.cpp b/apps/reader/list_book_controller.cpp index a963ad0ba..d2635129c 100644 --- a/apps/reader/list_book_controller.cpp +++ b/apps/reader/list_book_controller.cpp @@ -16,6 +16,7 @@ ListBookController::ListBookController(Responder * parentResponder): m_readBookController(this) { m_nbFiles = filesWithExtension(".txt", m_files, NB_FILES); + cleanRemovedBookRecord(); } int ListBookController::numberOfRows() const @@ -72,4 +73,30 @@ bool ListBookController::handleEvent(Ion::Events::Event event) return false; } + +bool ListBookController::hasBook(const char* filename) const +{ + for(int i=0;inumberOfRecordsWithExtension("txt"); + for(int i=0; irecordWithExtensionAtIndex("txt", i); + if(!hasBook(r.fullName())) + { + r.destroy(); + } + } +} + } \ No newline at end of file diff --git a/apps/reader/list_book_controller.h b/apps/reader/list_book_controller.h index 9fdd11262..82eecf207 100644 --- a/apps/reader/list_book_controller.h +++ b/apps/reader/list_book_controller.h @@ -22,6 +22,8 @@ public: void willDisplayCellForIndex(HighlightCell * cell, int index) override; void didBecomeFirstResponder() override; bool handleEvent(Ion::Events::Event event) override; + bool hasBook(const char* filename) const; + void cleanRemovedBookRecord(); private: SelectableTableView m_tableView; diff --git a/apps/reader/read_book_controller.cpp b/apps/reader/read_book_controller.cpp index 522491bfb..7bdd9380e 100644 --- a/apps/reader/read_book_controller.cpp +++ b/apps/reader/read_book_controller.cpp @@ -15,6 +15,8 @@ View * ReadBookController::view() void ReadBookController::setBook(const External::Archive::File& file) { + m_file = &file; + loadPosition(); m_readerView.setText(reinterpret_cast(file.data), file.dataLength); } @@ -30,7 +32,38 @@ bool ReadBookController::handleEvent(Ion::Events::Event event) m_readerView.previousPage(); return true; } + if(event == Ion::Events::Back || event == Ion::Events::Home) + { + savePosition(); + } return false; } +void ReadBookController::savePosition() const +{ + int pageOffset = m_readerView.getPageOffset(); + Ion::Storage::Record::ErrorStatus status = Ion::Storage::sharedStorage()->createRecordWithFullName(m_file->name, &pageOffset, sizeof(pageOffset)); + if(Ion::Storage::Record::ErrorStatus::NameTaken == status) + { + Ion::Storage::Record::Data data; + data.buffer = &pageOffset; + data.size = sizeof(pageOffset); + status = Ion::Storage::sharedStorage()->recordNamed(m_file->name).setValue(data); + } +} + +void ReadBookController::loadPosition() +{ + Ion::Storage::Record r = Ion::Storage::sharedStorage()->recordNamed(m_file->name); + if(Ion::Storage::sharedStorage()->hasRecord(r)) + { + int pageOffset = *(static_cast(r.value().buffer)); + m_readerView.setPageOffset(pageOffset); + } + else + { + m_readerView.setPageOffset(0); + } +} + } \ No newline at end of file diff --git a/apps/reader/read_book_controller.h b/apps/reader/read_book_controller.h index d83be7f6e..c4349be4e 100644 --- a/apps/reader/read_book_controller.h +++ b/apps/reader/read_book_controller.h @@ -14,8 +14,12 @@ public: void setBook(const External::Archive::File& file); bool handleEvent(Ion::Events::Event event) override; + + void savePosition() const; + void loadPosition(); private: WordWrapTextView m_readerView; + const External::Archive::File* m_file; }; } diff --git a/apps/reader/word_wrap_view.cpp b/apps/reader/word_wrap_view.cpp index 9f4ed284f..610b57128 100644 --- a/apps/reader/word_wrap_view.cpp +++ b/apps/reader/word_wrap_view.cpp @@ -146,4 +146,14 @@ void WordWrapTextView::drawRect(KDContext * ctx, KDRect rect) const m_nextPageOffset = startOfWord - text(); } +int WordWrapTextView::getPageOffset() const +{ + return m_pageOffset; +} + +void WordWrapTextView::setPageOffset(int o) +{ + m_pageOffset = o; +} + } \ No newline at end of file diff --git a/apps/reader/word_wrap_view.h b/apps/reader/word_wrap_view.h index d71fcb15e..4075ff4e2 100644 --- a/apps/reader/word_wrap_view.h +++ b/apps/reader/word_wrap_view.h @@ -12,7 +12,8 @@ public: void setText(const char*, int length); void nextPage(); void previousPage(); - + int getPageOffset() const; + void setPageOffset(int o); protected: int m_pageOffset = 0; mutable int m_nextPageOffset = 0;