From 94e0319576f91fadd4810da9c657502e3badd25e Mon Sep 17 00:00:00 2001 From: Nicolas Mailloux Date: Wed, 1 Sep 2021 22:07:30 -0400 Subject: [PATCH] Working on PDF zoom/scale --- eink.qrc | 2 + mainwindow.cpp | 4 +- reader.cpp | 109 ++++++++++++++++++++++++++++++++++++++++- reader.h | 8 +++ reader.ui | 94 +++++++++++++++++++++++++++++++++++ resources/zoom-in.png | Bin 0 -> 11332 bytes resources/zoom-out.png | Bin 0 -> 10819 bytes 7 files changed, 214 insertions(+), 3 deletions(-) create mode 100644 resources/zoom-in.png create mode 100644 resources/zoom-out.png diff --git a/eink.qrc b/eink.qrc index 25d1780..0f36504 100644 --- a/eink.qrc +++ b/eink.qrc @@ -60,5 +60,7 @@ resources/wifi-connected.png resources/wifi-off.png resources/wifi-standby.png + resources/zoom-in.png + resources/zoom-out.png diff --git a/mainwindow.cpp b/mainwindow.cpp index 6ccae4d..c5f34b9 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -875,7 +875,9 @@ int MainWindow::testPing() { QProcess *pingProcess = new QProcess(); pingProcess->start(pingProg, pingArgs); pingProcess->waitForFinished(); - return pingProcess->exitCode(); + int exitCode = pingProcess->exitCode(); + pingProcess->deleteLater(); + return exitCode; } void MainWindow::updateWifiIcon(int mode) { diff --git a/reader.cpp b/reader.cpp index 45f2b4d..50c70b2 100644 --- a/reader.cpp +++ b/reader.cpp @@ -56,6 +56,8 @@ reader::reader(QWidget *parent) : ui->nightModeBtn->setProperty("type", "borderless"); ui->searchBtn->setProperty("type", "borderless"); ui->gotoBtn->setProperty("type", "borderless"); + ui->increaseScaleBtn->setProperty("type", "borderless"); + ui->decreaseScaleBtn->setProperty("type", "borderless"); // Icons ui->alignLeftBtn->setText(""); @@ -84,6 +86,10 @@ reader::reader(QWidget *parent) : ui->aboutBtn->setIcon(QIcon(":/resources/info.png")); ui->searchBtn->setText(""); ui->searchBtn->setIcon(QIcon(":/resources/search.png")); + ui->increaseScaleBtn->setText(""); + ui->increaseScaleBtn->setIcon(QIcon(":/resources/zoom-in.png")); + ui->decreaseScaleBtn->setText(""); + ui->decreaseScaleBtn->setIcon(QIcon(":/resources/zoom-out.png")); // Style misc. ui->bookInfoLabel->setStyleSheet("font-style: italic"); @@ -258,6 +264,7 @@ reader::reader(QWidget *parent) : ui->brightnessWidget->setVisible(false); ui->menuBarWidget->setVisible(false); ui->buttonsBarWidget->setVisible(false); + ui->pdfScaleWidget->setVisible(false); ui->wordWidget->setVisible(false); if(checkconfig(".config/11-menubar/sticky") == true) { ui->menuWidget->setVisible(true); @@ -1283,6 +1290,11 @@ void reader::menubar_show() { if(is_pdf == false) { ui->menuBarWidget->setVisible(true); } + else { + ui->pdfScaleWidget->setVisible(true); + ui->graphicsView->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded); + ui->graphicsView->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded); + } ui->buttonsBarWidget->setVisible(true); ui->statusBarWidget->setVisible(true); ui->pageWidget->setVisible(true); @@ -1312,6 +1324,17 @@ void reader::menubar_hide() { if(is_pdf == false) { ui->menuBarWidget->setVisible(false); } + else { + ui->pdfScaleWidget->setVisible(false); + if(checkconfig(".config/14-reader_scrollbar/config") == true) { + ui->graphicsView->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded); + ui->graphicsView->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded); + } + else { + ui->graphicsView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + ui->graphicsView->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + } + } ui->buttonsBarWidget->setVisible(false); ui->pageWidget->setVisible(false); if(checkconfig(".config/11-menubar/sticky") == true) { @@ -1539,6 +1562,12 @@ void reader::convertMuPdfVars(int fileType) { * 0: ePUB * 1: PDF */ + bool convertRelativeValuesNative; + if(mupdf::convertRelativeValues == true) { + // Safer approach; local bool gets destroyed when getting out of scope + convertRelativeValuesNative = true; + mupdf::convertRelativeValues = false; + } if(fileType == 0) { setPageStyle(0); mupdf::epub::fontSize = 12; @@ -1561,8 +1590,16 @@ void reader::convertMuPdfVars(int fileType) { setPageStyle(1); mupdf::pdf::width = defaultPdfPageWidth; mupdf::pdf::height = defaultPdfPageHeight; - mupdf::pdf::width_qstr = QString::number(mupdf::pdf::width); - mupdf::pdf::height_qstr = QString::number(mupdf::pdf::height); + if(convertRelativeValuesNative == true) { + // For scaling + mupdf::pdf::width_qstr = QString::number(mupdf::pdf::relativeHeight); + mupdf::pdf::height_qstr = QString::number(mupdf::pdf::relativeWidth); + } + else { + // Default + mupdf::pdf::width_qstr = QString::number(mupdf::pdf::width); + mupdf::pdf::height_qstr = QString::number(mupdf::pdf::height); + } if(global::reader::globalReadingSettings == false) { if(goToSavedPageDone == false) { string_checkconfig_ro(".config/A-page_number/config"); @@ -1949,3 +1986,71 @@ void reader::getTotalPdfPagesNumber() { string_checkconfig_ro("/run/pdf_total_pages_number"); totalPagesInt = checkconfig_str_val.toInt(); } + +void reader::on_pdfScaleSlider_valueChanged(int value) +{ + if(value == 1) { + mupdf::pdf::relativeWidth = 1 * mupdf::pdf::width; + mupdf::pdf::relativeHeight = 1 * mupdf::pdf::height; + } + else if(value == 2) { + mupdf::pdf::relativeWidth = 1.50 * mupdf::pdf::width; + mupdf::pdf::relativeHeight = 1.50 * mupdf::pdf::height; + } + else if(value == 3) { + mupdf::pdf::relativeWidth = 2 * mupdf::pdf::width; + mupdf::pdf::relativeHeight = 2 * mupdf::pdf::height; + } + else if(value == 4) { + mupdf::pdf::relativeWidth = 2.50 * mupdf::pdf::width; + mupdf::pdf::relativeHeight = 2.50 * mupdf::pdf::height; + } + + if(value != 1) { + ui->graphicsView->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded); + ui->graphicsView->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded); + } + else { + if(checkconfig(".config/14-reader_scrollbar/config") == true) { + ui->graphicsView->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded); + ui->graphicsView->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded); + } + else { + ui->graphicsView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + ui->graphicsView->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + } + } + + mupdf::pdf::pdfPageNumber = mupdf::pdf::pdfPageNumber + 1; + setup_book(book_file, mupdf::pdf::pdfPageNumber, true); + setupPng(); +} + +void reader::on_decreaseScaleBtn_clicked() +{ + int sliderCurrentValue; + int sliderWantedValue; + sliderCurrentValue = ui->pdfScaleSlider->value(); + sliderWantedValue = sliderCurrentValue - 1; + if(sliderWantedValue < ui->pdfScaleSlider->QAbstractSlider::minimum()) { + showToast("Minimum scale reached"); + } + else { + ui->pdfScaleSlider->setValue(sliderWantedValue); + } +} + + +void reader::on_increaseScaleBtn_clicked() +{ + int sliderCurrentValue; + int sliderWantedValue; + sliderCurrentValue = ui->pdfScaleSlider->value(); + sliderWantedValue = sliderCurrentValue + 1; + if(sliderWantedValue > ui->pdfScaleSlider->QAbstractSlider::maximum()) { + showToast("Maximum scale reached"); + } + else { + ui->pdfScaleSlider->setValue(sliderWantedValue); + } +} diff --git a/reader.h b/reader.h index 33e039b..82d59f4 100644 --- a/reader.h +++ b/reader.h @@ -13,6 +13,7 @@ using namespace std; // ePUB scaling namespace mupdf { + inline bool convertRelativeValues; namespace epub { inline int fontSize; inline int width; @@ -26,6 +27,8 @@ namespace mupdf { namespace pdf { inline int width; inline int height; + inline int relativeWidth; + inline int relativeHeight; inline int pdfPageNumber; inline QString width_qstr; inline QString height_qstr; @@ -150,6 +153,11 @@ private slots: void saveReadingSettings(); void setupLocalSettingsEnvironment(); void setupPng(); + void on_pdfScaleSlider_valueChanged(int value); + + void on_decreaseScaleBtn_clicked(); + + void on_increaseScaleBtn_clicked(); private: Ui::reader * ui; diff --git a/reader.ui b/reader.ui index 2a4d457..c3fa415 100644 --- a/reader.ui +++ b/reader.ui @@ -674,6 +674,100 @@ + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + + + 0 + + + + + Increase scale + + + + + + + Decrease scale + + + + + + + + Chivo + true + + + + Scale + + + Qt::AlignCenter + + + + + + + 1 + + + 4 + + + 1 + + + Qt::Horizontal + + + + + + + + + QFrame::Plain + + + Qt::Horizontal + + + + + + + Qt::Horizontal + + + + + + + + diff --git a/resources/zoom-in.png b/resources/zoom-in.png new file mode 100644 index 0000000000000000000000000000000000000000..25575f86ed41f092c0afd33008ed775bb4105dfc GIT binary patch literal 11332 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 literal 0 HcmV?d00001