diff --git a/alert.cpp b/alert.cpp
index 327f7e5..277a2fa 100644
--- a/alert.cpp
+++ b/alert.cpp
@@ -19,10 +19,6 @@ alert::alert(QWidget *parent) :
float stdIconWidth = sW / 1.7;
float stdIconHeight = sH / 1.7;
- QPixmap pixmap(":/resources/alert.png");
- QPixmap scaledPixmap = pixmap.scaled(stdIconWidth, stdIconHeight, Qt::KeepAspectRatio);
- ui->alertIconLabel->setPixmap(scaledPixmap);
-
// General stylesheet
QFile stylesheetFile(":/resources/eink_dark.qss");
stylesheetFile.open(QFile::ReadOnly);
@@ -31,19 +27,31 @@ alert::alert(QWidget *parent) :
// Checking if the update's signature is untrusted. The signature error will always take precedence over the downgrade one (c.f. update.sh script)
if(checkconfig("/external_root/boot/flags/ALERT_SIGN") == true) {
+ QPixmap pixmap(":/resources/alert.png");
+ QPixmap scaledPixmap = pixmap.scaled(stdIconWidth, stdIconHeight, Qt::KeepAspectRatio);
+ ui->alertIconLabel->setPixmap(scaledPixmap);
+
signatureError = true;
ui->securityLabel->setText("Failed to update InkBox.");
ui->messageLabel->setText("The digital signature of the update is untrusted.\nFor security reasons, it cannot be installed.");
ui->stackedWidget->setCurrentIndex(1);
}
if(checkconfig("/external_root/boot/flags/ALERT_DOWNGRADE") == true) {
+ QPixmap pixmap(":/resources/alert.png");
+ QPixmap scaledPixmap = pixmap.scaled(stdIconWidth, stdIconHeight, Qt::KeepAspectRatio);
+ ui->alertIconLabel->setPixmap(scaledPixmap);
+
downgradeError = true;
ui->securityLabel->setText("Failed to update InkBox.");
ui->messageLabel->setText("An error occured during the update process.\nThe update package's version is lower than the actual installed version.");
ui->stackedWidget->setCurrentIndex(1);
}
- if(global_static::battery::showCriticalBatteryAlert == true) {
- global_static::battery::showCriticalBatteryAlert = false;
+ if(global::battery::showCriticalBatteryAlert == true) {
+ QPixmap pixmap(":/resources/battery_alert.png");
+ QPixmap scaledPixmap = pixmap.scaled(stdIconWidth, stdIconHeight, Qt::KeepAspectRatio);
+ ui->alertIconLabel->setPixmap(scaledPixmap);
+
+ global::battery::showCriticalBatteryAlert = false;
criticalBattery = true;
ui->securityLabel->setText("Please charge your eReader.");
ui->messageLabel->setText("The battery level is very low. To prevent damage to the filesystem, your device has been turned off.\nPlease consider charging it.");
diff --git a/eink.qrc b/eink.qrc
index 39d03d2..4c3eec1 100644
--- a/eink.qrc
+++ b/eink.qrc
@@ -37,5 +37,6 @@
resources/check.png
resources/minus.png
resources/plus.png
+ resources/battery_alert.png
diff --git a/functions.h b/functions.h
index ae53e0e..ed64041 100644
--- a/functions.h
+++ b/functions.h
@@ -9,15 +9,21 @@
#include
#include
-// WoW, static variables and namespaces are awesome
-namespace global_static {
+// WoW, global variables and namespaces are awesome
+namespace global {
namespace battery {
- static bool showLowBatteryDialog = true;
- static bool showCriticalBatteryAlert = false;
+ inline bool showLowBatteryDialog;
+ inline bool showCriticalBatteryAlert;
+ inline bool batteryAlertLock;
}
namespace reader {
- static int pageNumber;
- static bool skipOpenDialog = false;
+ inline int pageNumber;
+ inline int bookNumber;
+ inline bool skipOpenDialog;
+ }
+ namespace mainwindow {
+ inline bool updateDialog;
+ inline bool lowBatteryDialog;
}
}
diff --git a/generaldialog.cpp b/generaldialog.cpp
index d0c9df1..cdb611c 100644
--- a/generaldialog.cpp
+++ b/generaldialog.cpp
@@ -70,7 +70,7 @@ generalDialog::generalDialog(QWidget *parent) :
this->adjustSize();
string_writeconfig("/inkbox/settingsRebootDialog", "false");
}
- if(mainwindow_static::lowBatteryDialog == true) {
+ if(global::mainwindow::lowBatteryDialog == true) {
lowBatteryDialog = true;
ui->stackedWidget->setCurrentIndex(1);
get_battery_level();
@@ -155,9 +155,9 @@ void generalDialog::on_acceptBtn_clicked()
generalDialog::close();
if(lowBatteryDialog == true) {
- mainwindow_static::lowBatteryDialog = false;
- reader_static::batteryAlertLock = false;
- global_static::battery::showLowBatteryDialog = false;
+ global::mainwindow::lowBatteryDialog = false;
+ global::battery::batteryAlertLock = false;
+ global::battery::showLowBatteryDialog = false;
}
if(settingsRebootDialog == true) {
diff --git a/inkbox.pro b/inkbox.pro
index 4857804..3919623 100644
--- a/inkbox.pro
+++ b/inkbox.pro
@@ -2,7 +2,7 @@ QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
-CONFIG += c++11
+CONFIG += c++11 c++17
QMAKE_CXXFLAGS += -Wno-unused-function -Wno-unused-parameter
diff --git a/mainwindow.cpp b/mainwindow.cpp
index 8c044af..e8281a1 100644
--- a/mainwindow.cpp
+++ b/mainwindow.cpp
@@ -247,8 +247,7 @@ MainWindow::MainWindow(QWidget *parent)
// Reading from the config files and tweaking the program according to the options set
// Safety mesure; /inkbox is a tmpfs
- checked_box = false;
- writeconfig("/inkbox/skip_opendialog", "SkipOpenDialog=");
+ global::reader::skipOpenDialog = false;
// Demo setting, changes "Welcome to InkBox" label to "InkBox"
if(checkconfig(".config/01-demo/config") == true) {
@@ -453,7 +452,7 @@ MainWindow::~MainWindow()
}
void MainWindow::openUpdateDialog() {
- mainwindow_static::updateDialog = true;
+ global::mainwindow::updateDialog = true;
// We write to a temporary file to show a "Reset" prompt
string_writeconfig("/inkbox/updateDialog", "true");
@@ -465,7 +464,7 @@ void MainWindow::openUpdateDialog() {
}
void MainWindow::openLowBatteryDialog() {
- mainwindow_static::lowBatteryDialog = true;
+ global::mainwindow::lowBatteryDialog = true;
generalDialogWindow = new generalDialog(this);
generalDialogWindow->setAttribute(Qt::WA_DeleteOnClose);
@@ -511,10 +510,8 @@ void MainWindow::on_quitBtn_clicked()
void MainWindow::on_book1Btn_clicked()
{
- checked_box = true;
- writeconfig("/inkbox/skip_opendialog", "SkipOpenDialog=");
-
- string_writeconfig("/inkbox/book_number", "1");
+ global::reader::skipOpenDialog = true;
+ global::reader::bookNumber = 1;
readerWindow = new reader();
readerWindow->setAttribute(Qt::WA_DeleteOnClose);
@@ -523,10 +520,8 @@ void MainWindow::on_book1Btn_clicked()
void MainWindow::on_book2Btn_clicked()
{
- checked_box = true;
- writeconfig("/inkbox/skip_opendialog", "SkipOpenDialog=");
-
- string_writeconfig("/inkbox/book_number", "2");
+ global::reader::skipOpenDialog = true;
+ global::reader::bookNumber = 2;
readerWindow = new reader();
readerWindow->setAttribute(Qt::WA_DeleteOnClose);
@@ -535,10 +530,8 @@ void MainWindow::on_book2Btn_clicked()
void MainWindow::on_book3Btn_clicked()
{
- checked_box = true;
- writeconfig("/inkbox/skip_opendialog", "SkipOpenDialog=");
-
- string_writeconfig("/inkbox/book_number", "3");
+ global::reader::skipOpenDialog = true;
+ global::reader::bookNumber = 3;
readerWindow = new reader();
readerWindow->setAttribute(Qt::WA_DeleteOnClose);
@@ -547,10 +540,8 @@ void MainWindow::on_book3Btn_clicked()
void MainWindow::on_book4Btn_clicked()
{
- checked_box = true;
- writeconfig("/inkbox/skip_opendialog", "SkipOpenDialog=");
-
- string_writeconfig("/inkbox/book_number", "4");
+ global::reader::skipOpenDialog = true;
+ global::reader::bookNumber = 4;
readerWindow = new reader();
readerWindow->setAttribute(Qt::WA_DeleteOnClose);
diff --git a/mainwindow.h b/mainwindow.h
index 31f72e7..1a45894 100644
--- a/mainwindow.h
+++ b/mainwindow.h
@@ -12,11 +12,6 @@
#include "generaldialog.h"
using namespace std;
-namespace mainwindow_static {
- static bool updateDialog = false;
- static bool lowBatteryDialog = false;
-}
-
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
diff --git a/reader.cpp b/reader.cpp
index 597628b..afc3425 100644
--- a/reader.cpp
+++ b/reader.cpp
@@ -213,12 +213,12 @@ reader::reader(QWidget *parent) :
get_battery_level();
ui->batteryLabel->setText(batt_level);
ui->timeLabel->setText(time);
- if(global_static::battery::showLowBatteryDialog != true) {
+ if(global::battery::showLowBatteryDialog != true) {
// Do nothing, since a dialog should already have been displayed and (probably) dismissed
;
}
else {
- if(reader_static::batteryAlertLock == true) {
+ if(global::battery::batteryAlertLock == true) {
;
}
else {
@@ -243,12 +243,12 @@ reader::reader(QWidget *parent) :
get_battery_level();
ui->batteryLabel->setText(batt_level);
ui->timeLabel->setText(time);
- if(global_static::battery::showLowBatteryDialog != true) {
+ if(global::battery::showLowBatteryDialog != true) {
// Do nothing, since a dialog should already have been displayed and (probably) dismissed
;
}
else {
- if(reader_static::batteryAlertLock == true) {
+ if(global::battery::batteryAlertLock == true) {
;
}
else {
@@ -305,7 +305,7 @@ reader::reader(QWidget *parent) :
} );
select_t->start();
- if(checkconfig("/inkbox/skip_opendialog") == true) {
+ if(global::reader::skipOpenDialog == true) {
// We have to get the file's path
if(checkconfig("/tmp/suspendBook") == true) {
wakeFromSleep = true;
@@ -314,20 +314,19 @@ reader::reader(QWidget *parent) :
book_file = "/inkbox/book/book.txt";
}
else {
- string_checkconfig("/inkbox/book_number");
- if(checkconfig_str_val == "1") {
+ if(global::reader::bookNumber == 1) {
string_checkconfig(".config/08-recent_books/1");
book_file = checkconfig_str_val;
}
- if(checkconfig_str_val == "2") {
+ if(global::reader::bookNumber == 2) {
string_checkconfig(".config/08-recent_books/2");
book_file = checkconfig_str_val;
}
- if(checkconfig_str_val == "3") {
+ if(global::reader::bookNumber == 3) {
string_checkconfig(".config/08-recent_books/3");
book_file = checkconfig_str_val;
}
- if(checkconfig_str_val == "4") {
+ if(global::reader::bookNumber == 4) {
string_checkconfig(".config/08-recent_books/4");
book_file = checkconfig_str_val;
}
@@ -486,6 +485,102 @@ reader::~reader()
delete ui;
}
+int reader::setup_book(QString book, int i, bool run_parser) {
+ // Parse ebook
+ if(remount != false) {
+ QString mount_prog ("sh");
+ QStringList mount_args;
+ mount_args << "split.sh";
+ QProcess *mount_proc = new QProcess();
+ mount_proc->start(mount_prog, mount_args);
+ mount_proc->waitForFinished();
+ remount = false;
+ }
+ else {
+ string_writeconfig("/inkbox/remount", "false");
+ QString mount_prog ("sh");
+ QStringList mount_args;
+ mount_args << "split.sh";
+ QProcess *mount_proc = new QProcess();
+ mount_proc->start(mount_prog, mount_args);
+ mount_proc->waitForFinished();
+ }
+
+ if(booktostr_ran != true) {
+ if(epub_file_match(book) == true) {
+ // Parsing ePUBs with epub2txt, thanks to GitHub:kevinboone
+ QString epubProg ("sh");
+ QStringList epubArgs;
+ epubArgs << "/mnt/onboard/.adds/inkbox/epub.sh" << book;
+ QProcess *epubProc = new QProcess();
+ epubProc->start(epubProg, epubArgs);
+ epubProc->waitForFinished();
+
+ is_epub = true;
+ booktostr_ran = true;
+ }
+ else {
+ // This is likely not an ePUB.
+ // Copying book specified in the function call
+ QFile::copy(book, "/inkbox/book/book.txt");
+
+ is_epub = false;
+ booktostr_ran = true;
+ }
+ }
+
+ // Checking if the user has defined an option for the number of words per page; if not, then setting the default.
+ QDir::setCurrent("/mnt/onboard/.adds/inkbox");
+ string_checkconfig(".config/07-words_number/config");
+ if(checkconfig_str_val == "") {
+ string_writeconfig(".config/07-words_number/config", "100");
+ string_checkconfig(".config/07-words_number/config");
+ }
+
+ // Parsing file
+ if(parser_ran != true) {
+ if(is_epub == true) {
+ QString parse_prog ("python3");
+ QStringList parse_args;
+ parse_args << "split.py" << checkconfig_str_val;
+ QProcess *parse_proc = new QProcess();
+ parse_proc->start(parse_prog, parse_args);
+ parse_proc->waitForFinished();
+ parser_ran = true;
+ }
+ else {
+ QString parse_prog ("python3");
+ QStringList parse_args;
+ parse_args << "split-txt.py" << checkconfig_str_val;
+ QProcess *parse_proc = new QProcess();
+ parse_proc->start(parse_prog, parse_args);
+ parse_proc->waitForFinished();
+ parser_ran = true;
+ }
+ }
+
+ // Changing current working directory
+ QDir::setCurrent("/inkbox/book");
+
+ // Reading file
+ if(run_parser == true) {
+ QDirIterator it("/inkbox/book/split");
+ while (it.hasNext()) {
+ QFile f(it.next());
+ f.open(QIODevice::ReadOnly);
+ content << f.readAll();
+ f.close();
+ }
+ return content.size();
+ QDir::setCurrent("/mnt/onboard/.adds/inkbox");
+ }
+ else {
+ ittext = content[i];
+ QDir::setCurrent("/mnt/onboard/.adds/inkbox");
+ }
+ return 0;
+}
+
void reader::on_nextBtn_clicked()
{
if(split_total - 1 == 1 or split_total - 1 == 0) {
@@ -908,7 +1003,7 @@ void reader::batteryWatchdog() {
}
void reader::openLowBatteryDialog() {
- reader_static::batteryAlertLock = true;
+ global::battery::batteryAlertLock = true;
generalDialogWindow = new generalDialog(this);
generalDialogWindow->setAttribute(Qt::WA_DeleteOnClose);
@@ -917,7 +1012,7 @@ void reader::openLowBatteryDialog() {
}
void reader::openCriticalBatteryAlertWindow() {
- global_static::battery::showCriticalBatteryAlert = true;
+ global::battery::showCriticalBatteryAlert = true;
alertWindow = new alert(this);
alertWindow->setAttribute(Qt::WA_DeleteOnClose);
diff --git a/reader.h b/reader.h
index e49a7b6..b71a881 100644
--- a/reader.h
+++ b/reader.h
@@ -15,10 +15,6 @@
using namespace std;
-namespace reader_static {
- static bool batteryAlertLock = false;
-}
-
namespace Ui {
class reader;
}
@@ -67,7 +63,8 @@ public:
QList content;
explicit reader(QWidget *parent = nullptr);
~reader();
- int setup_book(QString book, int i, bool run_parser) {
+ int setup_book(QString book, int i, bool run_parser);
+ /*int setup_book(QString book, int i, bool run_parser) {
// Parse ebook
if(remount != false) {
QString mount_prog ("sh");
@@ -161,7 +158,7 @@ public:
QDir::setCurrent("/mnt/onboard/.adds/inkbox");
}
return 0;
- }
+ }*/
void checkwords() {
QFile words_list(".config/06-words/config");
words_list.open(QIODevice::ReadWrite);
diff --git a/resources/battery_alert.png b/resources/battery_alert.png
new file mode 100644
index 0000000..341e75f
Binary files /dev/null and b/resources/battery_alert.png differ