mirror of
https://github.com/Quill-OS/quill.git
synced 2024-12-26 23:57:22 -08:00
Local library: Basic setup working
A local books database is maintained at `/data/onboard/.inkbox/LocalLibrary.db`. It contains compressed JSON read by the GUI. URGENT TODO: Fix `*** Error in '/mnt/onboard/.adds/inkbox/inkbox-bin': double free or corruption (out): 0x00648708 ***` error whenever we try to delete localLibraryWidget
This commit is contained in:
parent
8bfc529498
commit
4a104522f5
8 changed files with 193 additions and 22 deletions
10
functions.h
10
functions.h
|
@ -282,6 +282,16 @@ namespace {
|
|||
return quoteNumber;
|
||||
return 0;
|
||||
}
|
||||
void writeFile(QString filename, QString content) {
|
||||
QFile file(filename);
|
||||
if(file.open(QIODevice::ReadWrite)) {
|
||||
QTextStream stream(&file);
|
||||
stream << content;
|
||||
}
|
||||
else {
|
||||
QString function = __func__; log(function + ": Failed to write string '" + content + "' to file '" + filename + "'", "functions");
|
||||
}
|
||||
}
|
||||
void string_writeconfig(std::string file, std::string config_option) {
|
||||
std::ofstream fhandler;
|
||||
fhandler.open(file);
|
||||
|
|
|
@ -12,6 +12,12 @@ localLibraryWidget::localLibraryWidget(QWidget *parent) :
|
|||
ui->setupUi(this);
|
||||
this->setFont(QFont("u001"));
|
||||
|
||||
ui->previousPageBtn->setProperty("type", "borderless");
|
||||
ui->nextPageBtn->setProperty("type", "borderless");
|
||||
ui->previousPageBtn->setIcon(QIcon(":/resources/chevron-left.png"));
|
||||
ui->nextPageBtn->setIcon(QIcon(":/resources/chevron-right.png"));
|
||||
ui->pageNumberLabel->setFont(QFont("Source Serif Pro"));
|
||||
|
||||
if(global::deviceID == "n705\n" or global::deviceID == "n905\n") {
|
||||
buttonsNumber = 4;
|
||||
}
|
||||
|
@ -53,19 +59,22 @@ localLibraryWidget::localLibraryWidget(QWidget *parent) :
|
|||
|
||||
// Book icon label
|
||||
bookIconArray[i] = new QLabel(this);
|
||||
bookIconArray[i]->setStyleSheet("padding: 20px");
|
||||
bookIconArray[i]->setStyleSheet("padding: 10px");
|
||||
|
||||
// Book button
|
||||
bookBtnArray[i] = new QClickableLabel(this);
|
||||
bookBtnArray[i]->setObjectName(QString::number(i));
|
||||
connect(bookBtnArray[i], SIGNAL(bookID(int)), SLOT(btnOpenBook(int)));
|
||||
bookBtnArray[i]->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding);
|
||||
bookBtnArray[i]->setStyleSheet("color: black; background-color: white; border-radius: 10px; padding: 20px");
|
||||
bookBtnArray[i]->setStyleSheet("color: black; background-color: white; border-radius: 10px; padding: 10px");
|
||||
bookBtnArray[i]->setFont(QFont("u001"));
|
||||
|
||||
horizontalLayout->addWidget(bookIconArray[i]);
|
||||
horizontalLayout->addWidget(bookBtnArray[i]);
|
||||
ui->booksVerticalLayout->addLayout(horizontalLayout);
|
||||
}
|
||||
setupBooksList();
|
||||
setupDatabase();
|
||||
setupBooksList(currentPageNumber);
|
||||
}
|
||||
|
||||
localLibraryWidget::~localLibraryWidget()
|
||||
|
@ -73,10 +82,99 @@ localLibraryWidget::~localLibraryWidget()
|
|||
delete ui;
|
||||
}
|
||||
|
||||
void localLibraryWidget::setupBooksList() {
|
||||
for(int i = 1; i <= buttonsNumber; i++) {
|
||||
QPixmap pixmap(":/resources/starred_star.png");
|
||||
bookIconArray[i]->setPixmap(pixmap.scaled(stdIconWidth, stdIconHeight));
|
||||
bookBtnArray[i]->setText("<b>Book " + QString::number(i) + "</b><br>Description");
|
||||
void localLibraryWidget::setupDatabase() {
|
||||
QString localLibraryDatabasePath = "/mnt/onboard/onboard/.inkbox/LocalLibrary.db";
|
||||
setDefaultWorkDir();
|
||||
if(!QFile::exists(localLibraryDatabasePath)) {
|
||||
QStringList booksList;
|
||||
QDir dir("/mnt/onboard/onboard");
|
||||
|
||||
QDirIterator dirIt(dir, QDirIterator::Subdirectories);
|
||||
while(dirIt.hasNext()) {
|
||||
dirIt.next();
|
||||
if(QFileInfo(dirIt.filePath()).isFile()) {
|
||||
QString suffix = QFileInfo(dirIt.filePath()).suffix();
|
||||
if(suffix == "epub" || suffix == "EPUB") {
|
||||
booksList << dirIt.filePath();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
QString prog("sh");
|
||||
QStringList args;
|
||||
args << "explore_local_library.sh" << booksList;
|
||||
QProcess *proc = new QProcess();
|
||||
proc->setEnvironment((QStringList() << "EXTRACT_COVER=1"));
|
||||
proc->start(prog, args);
|
||||
proc->waitForFinished();
|
||||
QJsonDocument jsonDocument = QJsonDocument::fromJson(proc->readAllStandardOutput());
|
||||
proc->deleteLater();
|
||||
|
||||
// Write database in compressed form, encoded in Base64 format
|
||||
writeFile(localLibraryDatabasePath, qCompress(jsonDocument.toJson()).toBase64());
|
||||
}
|
||||
|
||||
// Read library database from file
|
||||
QFile database(localLibraryDatabasePath);
|
||||
QByteArray data;
|
||||
if(database.open(QIODevice::ReadOnly)) {
|
||||
data = database.readAll();
|
||||
database.close();
|
||||
}
|
||||
else {
|
||||
QString function = __func__; log(function + ": Failed to open local library database file for reading at '" + database.fileName() + "'", className);
|
||||
}
|
||||
|
||||
// Uncompress data from Base64 encoding
|
||||
databaseJsonDocument = QJsonDocument::fromJson(qUncompress(QByteArray::fromBase64(data)));
|
||||
// Parse JSON data
|
||||
databaseJsonObject = databaseJsonDocument.object();
|
||||
databaseJsonArrayList = databaseJsonObject["database"].toArray();
|
||||
}
|
||||
|
||||
void localLibraryWidget::setupBooksList(int pageNumber) {
|
||||
idList->clear();
|
||||
int in = 1;
|
||||
for(int i = (1 * pageNumber * buttonsNumber) - (buttonsNumber - 1); i <= (1 * pageNumber * buttonsNumber); i++) {
|
||||
// Read database info for each book and display the corresponding information on each button
|
||||
QJsonObject jsonObject = databaseJsonArrayList.at(i - 1).toObject();
|
||||
QString bookTitle = jsonObject["Title"].toString();
|
||||
QString bookAuthor = jsonObject["Author"].toString();
|
||||
QString coverPath = jsonObject["CoverPath"].toString();
|
||||
QString bookID = jsonObject["BookID"].toString();
|
||||
if(!coverPath.isEmpty()) {
|
||||
QPixmap pixmap(coverPath);
|
||||
bookIconArray[in]->setPixmap(pixmap);
|
||||
}
|
||||
idList->append(bookID.toInt());
|
||||
bookBtnArray[in]->setText("<b>" + bookTitle + "</b>" + "<br>" + bookAuthor);
|
||||
in++;
|
||||
}
|
||||
ui->pageNumberLabel->setText("Page " + QString::number(pageNumber) + " <i>of</i> " + "10");
|
||||
}
|
||||
|
||||
void localLibraryWidget::on_previousPageBtn_clicked()
|
||||
{
|
||||
currentPageNumber--;
|
||||
setupBooksList(currentPageNumber);
|
||||
}
|
||||
|
||||
|
||||
void localLibraryWidget::on_nextPageBtn_clicked()
|
||||
{
|
||||
currentPageNumber++;
|
||||
setupBooksList(currentPageNumber);
|
||||
}
|
||||
|
||||
void localLibraryWidget::openBook(int bookID) {
|
||||
QJsonObject jsonObject = databaseJsonArrayList.at(bookID - 1).toObject();
|
||||
QString bookPath = jsonObject["BookPath"].toString();
|
||||
log("Opening book with ID " + QString::number(bookID) + ", path '" + bookPath + "'", className);
|
||||
emit openBookSignal(bookPath, false);
|
||||
}
|
||||
|
||||
void localLibraryWidget::btnOpenBook(int buttonNumber) {
|
||||
int id = idList->at(buttonNumber - 1);
|
||||
openBook(id);
|
||||
// localLibraryWidget::close();
|
||||
}
|
||||
|
|
|
@ -24,14 +24,27 @@ public:
|
|||
int sH;
|
||||
int stdIconWidth;
|
||||
int stdIconHeight;
|
||||
QJsonDocument databaseJsonDocument;
|
||||
QJsonObject databaseJsonObject;
|
||||
QJsonArray databaseJsonArrayList;
|
||||
int currentPageNumber = 1;
|
||||
QList<int> idList[4];
|
||||
|
||||
private slots:
|
||||
void setupBooksList();
|
||||
void setupDatabase();
|
||||
void setupBooksList(int pageNumber);
|
||||
void on_previousPageBtn_clicked();
|
||||
void on_nextPageBtn_clicked();
|
||||
void openBook(int id);
|
||||
void btnOpenBook(int buttonNumber);
|
||||
|
||||
private:
|
||||
Ui::localLibraryWidget * ui;
|
||||
QLabel * bookIconArray[10];
|
||||
QClickableLabel * bookBtnArray[10];
|
||||
QLabel * bookIconArray[4];
|
||||
QClickableLabel * bookBtnArray[4];
|
||||
|
||||
signals:
|
||||
void openBookSignal(QString bookFile, bool relativePath);
|
||||
};
|
||||
|
||||
#endif // LOCALLIBRARYWIDGET_H
|
||||
|
|
|
@ -33,12 +33,50 @@
|
|||
<number>0</number>
|
||||
</property>
|
||||
<item>
|
||||
<layout class="QGridLayout" name="gridLayout">
|
||||
<item row="0" column="3">
|
||||
<widget class="QLabel" name="pageNumberLabel">
|
||||
<property name="text">
|
||||
<string>Page</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="0">
|
||||
<widget class="QLabel" name="localLibraryLabel">
|
||||
<property name="text">
|
||||
<string><b>Local library</b></string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="2">
|
||||
<widget class="QPushButton" name="previousPageBtn">
|
||||
<property name="text">
|
||||
<string/>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="1">
|
||||
<spacer name="horizontalSpacer">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item row="0" column="4">
|
||||
<widget class="QPushButton" name="nextPageBtn">
|
||||
<property name="text">
|
||||
<string/>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QVBoxLayout" name="booksVerticalLayout">
|
||||
<property name="sizeConstraint">
|
||||
|
|
|
@ -934,7 +934,7 @@ void MainWindow::on_libraryButton_clicked()
|
|||
ui->libraryButton->setIcon(QIcon(":/resources/online-library-inverted.png"));
|
||||
|
||||
// Create widget
|
||||
libraryWidgetWindow = new libraryWidget();
|
||||
libraryWidget * libraryWidgetWindow = new libraryWidget();
|
||||
connect(libraryWidgetWindow, SIGNAL(destroyed(QObject*)), SLOT(resetFullWindow()));
|
||||
libraryWidgetWindow->setAttribute(Qt::WA_DeleteOnClose);
|
||||
ui->stackedWidget->insertWidget(3, libraryWidgetWindow);
|
||||
|
@ -996,8 +996,9 @@ void MainWindow::resetWifiIconClickedWhileReconnecting() {
|
|||
}
|
||||
|
||||
void MainWindow::setupLocalLibraryWidget() {
|
||||
localLibraryWidgetWindow = new localLibraryWidget();
|
||||
libraryWidgetWindow->setAttribute(Qt::WA_DeleteOnClose);
|
||||
localLibraryWidget * localLibraryWidgetWindow = new localLibraryWidget();
|
||||
connect(localLibraryWidgetWindow, SIGNAL(openBookSignal(QString, bool)), SLOT(openBookFile(QString, bool)));
|
||||
localLibraryWidgetWindow->setAttribute(Qt::WA_DeleteOnClose);
|
||||
ui->homeStackedWidget->insertWidget(1, localLibraryWidgetWindow);
|
||||
ui->homeStackedWidget->setCurrentIndex(1);
|
||||
}
|
||||
|
|
|
@ -9,10 +9,11 @@ QClickableLabel::~QClickableLabel() {}
|
|||
|
||||
void QClickableLabel::mousePressEvent(QMouseEvent * event) {
|
||||
emit clicked();
|
||||
QClickableLabel::setStyleSheet("color: white; background-color: black; border-radius: 10px; padding: 20px");
|
||||
QClickableLabel::setStyleSheet("color: white; background-color: black; border-radius: 10px; padding: 10px");
|
||||
}
|
||||
|
||||
void QClickableLabel::mouseReleaseEvent(QMouseEvent * event) {
|
||||
emit unclicked();
|
||||
QClickableLabel::setStyleSheet("color: black; background-color: white; border-radius: 10px; padding: 20px");
|
||||
emit bookID(objectName().toInt());
|
||||
QClickableLabel::setStyleSheet("color: black; background-color: white; border-radius: 10px; padding: 10px");
|
||||
}
|
||||
|
|
|
@ -15,6 +15,7 @@ public:
|
|||
signals:
|
||||
void clicked();
|
||||
void unclicked();
|
||||
void bookID(int id);
|
||||
|
||||
protected:
|
||||
void mousePressEvent(QMouseEvent * event);
|
||||
|
|
11
settings.cpp
11
settings.cpp
|
@ -822,9 +822,18 @@ void settings::on_showSystemInfoBtn_clicked()
|
|||
// Show a system info dialog
|
||||
log("Showing system info dialog", className);
|
||||
generalDialogWindow = new generalDialog();
|
||||
if(global::deviceID == "n306\n") {
|
||||
if(global::deviceID == "n705\n" or global::deviceID == "n905\n") {
|
||||
generalDialogWindow->yIncrease = 2;
|
||||
}
|
||||
else if(global::deviceID == "n613\n" or global::deviceID == "n236\n" or global::deviceID == "n306\n") {
|
||||
generalDialogWindow->yIncrease = 2.6;
|
||||
}
|
||||
else if(global::deviceID == "n437\n" or global::deviceID == "n873\n") {
|
||||
generalDialogWindow->yIncrease = 3;
|
||||
}
|
||||
else {
|
||||
generalDialogWindow->yIncrease = 2;
|
||||
}
|
||||
generalDialogWindow->increaseSize();
|
||||
generalDialogWindow->setAttribute(Qt::WA_DeleteOnClose);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue