yacreader/YACReader/options_dialog.cpp
2025-05-04 09:51:17 +02:00

414 lines
15 KiB
C++

#include "options_dialog.h"
#include "configuration.h"
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QFileDialog>
#include <QGroupBox>
#include <QRadioButton>
#include <QTabWidget>
#include <QSlider>
#include <QLineEdit>
#include <QPushButton>
#include <QLabel>
#include <QColorDialog>
#include <QCheckBox>
#include "yacreader_spin_slider_widget.h"
#include "yacreader_flow_config_widget.h"
#ifndef NO_OPENGL
#include "yacreader_gl_flow_config_widget.h"
#endif
OptionsDialog::OptionsDialog(QWidget *parent)
: YACReaderOptionsDialog(parent)
{
auto tabWidget = new QTabWidget();
auto layout = new QVBoxLayout(this);
// GENERAL -------------------------------------------
QWidget *pageGeneral = new QWidget();
auto layoutGeneral = new QVBoxLayout();
QGroupBox *pathBox = new QGroupBox(tr("My comics path"));
auto path = new QHBoxLayout();
path->addWidget(pathEdit = new QLineEdit());
path->addWidget(pathFindButton = new QPushButton(QIcon(":/images/find_folder.png"), ""));
pathBox->setLayout(path);
connect(pathFindButton, &QAbstractButton::clicked, this, &OptionsDialog::findFolder);
QGroupBox *slideSizeBox = new QGroupBox(tr("\"Go to flow\" size"));
// slideSizeLabel = new QLabel(,this);
slideSize = new QSlider(this);
slideSize->setMinimum(125);
slideSize->setMaximum(350);
slideSize->setPageStep(5);
slideSize->setOrientation(Qt::Horizontal);
auto slideLayout = new QHBoxLayout();
slideLayout->addWidget(slideSize);
slideSizeBox->setLayout(slideLayout);
auto colorSelection = new QHBoxLayout;
backgroundColor = new QLabel();
QPalette pal = backgroundColor->palette();
pal.setColor(backgroundColor->backgroundRole(), Qt::black);
backgroundColor->setPalette(pal);
backgroundColor->setAutoFillBackground(true);
QGroupBox *colorBox = new QGroupBox(tr("Background color"));
// backgroundColor->setMinimumWidth(100);
colorSelection->addWidget(backgroundColor);
colorSelection->addWidget(selectBackgroundColorButton = new QPushButton(tr("Choose")));
colorSelection->setStretchFactor(backgroundColor, 1);
colorSelection->setStretchFactor(selectBackgroundColorButton, 0);
// colorSelection->addStretch();
connect(selectBackgroundColorButton, &QAbstractButton::clicked, this, &OptionsDialog::showColorDialog);
colorBox->setLayout(colorSelection);
auto scrollBox = new QGroupBox(tr("Scroll behaviour"));
auto scrollLayout = new QVBoxLayout;
disableScrollAnimations = new QCheckBox(tr("Disable scroll animations and smooth scrolling"));
doNotTurnPageOnScroll = new QCheckBox(tr("Do not turn page using scroll"));
useSingleScrollStepToTurnPage = new QCheckBox(tr("Use single scroll step to turn page"));
scrollLayout->addWidget(disableScrollAnimations);
scrollLayout->addWidget(doNotTurnPageOnScroll);
scrollLayout->addWidget(useSingleScrollStepToTurnPage);
scrollBox->setLayout(scrollLayout);
auto mouseModeBox = new QGroupBox(tr("Mouse mode"));
auto mouseModeLayout = new QVBoxLayout();
normalMouseModeRadioButton = new QRadioButton(tr("Only Back/Forward buttons can turn pages"));
leftRightNavigationMouseModeRadioButton = new QRadioButton(tr("Use the Left/Right buttons to turn pages."));
hotAreasMouseModeRadioButton = new QRadioButton(tr("Click left or right half of the screen to turn pages."));
mouseModeLayout->addWidget(normalMouseModeRadioButton);
mouseModeLayout->addWidget(leftRightNavigationMouseModeRadioButton);
mouseModeLayout->addWidget(hotAreasMouseModeRadioButton);
mouseModeBox->setLayout(mouseModeLayout);
layoutGeneral->addWidget(pathBox);
layoutGeneral->addWidget(slideSizeBox);
// layoutGeneral->addWidget(fitBox);
layoutGeneral->addWidget(colorBox);
layoutGeneral->addWidget(scrollBox);
layoutGeneral->addWidget(mouseModeBox);
layoutGeneral->addWidget(shortcutsBox);
layoutGeneral->addStretch();
// GENERAL END ---------------------------------------
// PAGE FLOW -----------------------------------------
QWidget *pageFlow = new QWidget();
auto layoutFlow = new QVBoxLayout();
quickNavi = new QCheckBox(tr("Quick Navigation Mode"));
disableShowOnMouseOver = new QCheckBox(tr("Disable mouse over activation"));
layoutFlow->addWidget(sw);
#ifndef NO_OPENGL
layoutFlow->addWidget(gl);
layoutFlow->addWidget(useGL);
#endif
layoutFlow->addWidget(quickNavi);
layoutFlow->addWidget(disableShowOnMouseOver);
layoutFlow->addStretch();
// disable vSyncCheck
#ifndef NO_OPENGL
gl->vSyncCheck->hide();
#endif
// PAGE FLOW END -------------------------------------
// IMAGE ADJUSTMENTS ---------------------------------
QWidget *pageImage = new QWidget();
auto layoutImageV = new QVBoxLayout();
auto layoutImage = new QGridLayout();
brightnessS = new YACReaderSpinSliderWidget(this, true);
brightnessS->setRange(0, 100);
// brightnessS->setText(tr("Brightness"));
brightnessS->setTracking(false);
connect(brightnessS, &YACReaderSpinSliderWidget::valueChanged, this, &OptionsDialog::brightnessChanged);
contrastS = new YACReaderSpinSliderWidget(this, true);
contrastS->setRange(0, 250);
// contrastS->setText(tr("Contrast"));
contrastS->setTracking(false);
connect(contrastS, &YACReaderSpinSliderWidget::valueChanged, this, &OptionsDialog::contrastChanged);
gammaS = new YACReaderSpinSliderWidget(this, true);
gammaS->setRange(0, 250);
// gammaS->setText(tr("Gamma"));
gammaS->setTracking(false);
connect(gammaS, &YACReaderSpinSliderWidget::valueChanged, this, &OptionsDialog::gammaChanged);
// connect(brightnessS,SIGNAL(valueChanged(int)),this,SIGNAL(changedOptions()));
layoutImage->addWidget(new QLabel(tr("Brightness")), 0, 0);
layoutImage->addWidget(new QLabel(tr("Contrast")), 1, 0);
layoutImage->addWidget(new QLabel(tr("Gamma")), 2, 0);
layoutImage->addWidget(brightnessS, 0, 1);
layoutImage->addWidget(contrastS, 1, 1);
layoutImage->addWidget(gammaS, 2, 1);
QPushButton *pushButton = new QPushButton(tr("Reset"));
connect(pushButton, &QAbstractButton::pressed, this, &OptionsDialog::resetImageConfig);
layoutImage->addWidget(pushButton, 3, 0);
layoutImage->setColumnStretch(1, 1);
QGroupBox *imageBox = new QGroupBox(tr("Image options"));
imageBox->setLayout(layoutImage);
layoutImageV->addWidget(imageBox);
auto scaleBox = new QGroupBox(tr("Fit options"));
auto scaleLayout = new QVBoxLayout();
scaleCheckbox = new QCheckBox(tr("Enlarge images to fit width/height"));
connect(scaleCheckbox, &QCheckBox::clicked, scaleCheckbox,
[=](bool checked) {
Configuration::getConfiguration().setEnlargeImages(checked);
emit changedImageOptions();
});
scaleLayout->addWidget(scaleCheckbox);
scaleBox->setLayout(scaleLayout);
layoutImageV->addWidget(scaleBox);
auto doublePageBox = new QGroupBox(tr("Double Page options"));
auto doublePageBoxLayout = new QVBoxLayout();
coverSPCheckBox = new QCheckBox(tr("Show covers as single page"));
connect(coverSPCheckBox, &QCheckBox::clicked, coverSPCheckBox,
[=](bool checked) {
settings->setValue(COVER_IS_SP, checked);
emit changedImageOptions();
});
doublePageBoxLayout->addWidget(coverSPCheckBox);
doublePageBox->setLayout(doublePageBoxLayout);
layoutImageV->addWidget(doublePageBox);
layoutImageV->addStretch();
// IMAGE ADJUSTMENTS END -----------------------------
pageGeneral->setLayout(layoutGeneral);
pageFlow->setLayout(layoutFlow);
pageImage->setLayout(layoutImageV);
tabWidget->addTab(pageGeneral, tr("General"));
tabWidget->addTab(pageFlow, tr("Page Flow"));
tabWidget->addTab(pageImage, tr("Image adjustment"));
layout->addWidget(tabWidget);
auto buttons = new QHBoxLayout();
buttons->addStretch();
buttons->addWidget(new QLabel(tr("Restart is needed")));
buttons->addWidget(accept);
buttons->addWidget(cancel);
layout->addLayout(buttons);
setLayout(layout);
setModal(true);
setWindowTitle(tr("Options"));
this->layout()->setSizeConstraint(QLayout::SetFixedSize);
}
void OptionsDialog::findFolder()
{
QString s = QFileDialog::getExistingDirectory(nullptr, tr("Comics directory"), ".");
if (!s.isEmpty()) {
pathEdit->setText(s);
}
}
void OptionsDialog::showColorDialog()
{
auto color = QColorDialog::getColor(currentColor, this);
updateColor(color);
}
void OptionsDialog::saveOptions()
{
settings->setValue(GO_TO_FLOW_SIZE, QSize(static_cast<int>(slideSize->sliderPosition() / SLIDE_ASPECT_RATIO), slideSize->sliderPosition()));
if (sw->radio1->isChecked())
settings->setValue(FLOW_TYPE_SW, 0);
if (sw->radio2->isChecked())
settings->setValue(FLOW_TYPE_SW, 1);
if (sw->radio3->isChecked())
settings->setValue(FLOW_TYPE_SW, 2);
settings->setValue(PATH, pathEdit->text());
settings->setValue(BACKGROUND_COLOR, currentColor);
// settings->setValue(FIT_TO_WIDTH_RATIO,fitToWidthRatioS->sliderPosition()/100.0);
settings->setValue(QUICK_NAVI_MODE, quickNavi->isChecked());
settings->setValue(DISABLE_MOUSE_OVER_GOTO_FLOW, disableShowOnMouseOver->isChecked());
settings->setValue(DO_NOT_TURN_PAGE_ON_SCROLL, doNotTurnPageOnScroll->isChecked());
settings->setValue(USE_SINGLE_SCROLL_STEP_TO_TURN_PAGE, useSingleScrollStepToTurnPage->isChecked());
settings->setValue(DISABLE_SCROLL_ANIMATION, disableScrollAnimations->isChecked());
// get checked radio button to get the mouse mode
YACReader::MouseMode mouseMode = Normal;
if (normalMouseModeRadioButton->isChecked()) {
mouseMode = Normal;
;
} else if (leftRightNavigationMouseModeRadioButton->isChecked()) {
mouseMode = LeftRightNavigation;
} else if (hotAreasMouseModeRadioButton->isChecked()) {
mouseMode = HotAreas;
}
Configuration::getConfiguration().setMouseMode(mouseMode);
YACReaderOptionsDialog::saveOptions();
}
void OptionsDialog::restoreOptions(QSettings *settings)
{
YACReaderOptionsDialog::restoreOptions(settings);
slideSize->setSliderPosition(settings->value(GO_TO_FLOW_SIZE).toSize().height());
switch (settings->value(FLOW_TYPE_SW).toInt()) {
case 0:
sw->radio1->setChecked(true);
break;
case 1:
sw->radio2->setChecked(true);
break;
case 2:
sw->radio3->setChecked(true);
break;
default:
sw->radio1->setChecked(true);
break;
}
pathEdit->setText(settings->value(PATH).toString());
updateColor(settings->value(BACKGROUND_COLOR).value<QColor>());
// fitToWidthRatioS->setSliderPosition(settings->value(FIT_TO_WIDTH_RATIO).toFloat()*100);
quickNavi->setChecked(settings->value(QUICK_NAVI_MODE).toBool());
disableShowOnMouseOver->setChecked(settings->value(DISABLE_MOUSE_OVER_GOTO_FLOW).toBool());
brightnessS->setValue(settings->value(BRIGHTNESS, 0).toInt());
contrastS->setValue(settings->value(CONTRAST, 100).toInt());
gammaS->setValue(settings->value(GAMMA, 100).toInt());
scaleCheckbox->setChecked(settings->value(ENLARGE_IMAGES, true).toBool());
coverSPCheckBox->setChecked(settings->value(COVER_IS_SP, true).toBool());
doNotTurnPageOnScroll->setChecked(settings->value(DO_NOT_TURN_PAGE_ON_SCROLL, false).toBool());
useSingleScrollStepToTurnPage->setChecked(settings->value(USE_SINGLE_SCROLL_STEP_TO_TURN_PAGE, false).toBool());
#ifdef Q_OS_MACOS
auto defaultDisableScrollAnimationsValue = true;
#else
auto defaultDisableScrollAnimationsValue = false;
#endif
disableScrollAnimations->setChecked(settings->value(DISABLE_SCROLL_ANIMATION, defaultDisableScrollAnimationsValue).toBool());
auto mouseMode = Configuration::getConfiguration().getMouseMode();
switch (mouseMode) {
case Normal:
normalMouseModeRadioButton->setChecked(true);
break;
case LeftRightNavigation:
leftRightNavigationMouseModeRadioButton->setChecked(true);
break;
case HotAreas:
hotAreasMouseModeRadioButton->setChecked(true);
break;
}
}
void OptionsDialog::updateColor(const QColor &color)
{
QPalette pal = backgroundColor->palette();
pal.setColor(backgroundColor->backgroundRole(), color);
backgroundColor->setPalette(pal);
backgroundColor->setAutoFillBackground(true);
currentColor = color;
settings->setValue(BACKGROUND_COLOR, color);
emit changedOptions();
}
void OptionsDialog::brightnessChanged(int value)
{
QSettings settings(YACReader::getSettingsPath() + "/YACReader.ini", QSettings::IniFormat);
settings.setValue(BRIGHTNESS, value);
emit changedFilters(brightnessS->getValue(), contrastS->getValue(), gammaS->getValue());
// emit(changedImageOptions());
}
void OptionsDialog::contrastChanged(int value)
{
QSettings settings(YACReader::getSettingsPath() + "/YACReader.ini", QSettings::IniFormat);
settings.setValue(CONTRAST, value);
emit changedFilters(brightnessS->getValue(), contrastS->getValue(), gammaS->getValue());
/// emit(changedImageOptions());
}
void OptionsDialog::gammaChanged(int value)
{
QSettings settings(YACReader::getSettingsPath() + "/YACReader.ini", QSettings::IniFormat);
settings.setValue(GAMMA, value);
emit changedFilters(brightnessS->getValue(), contrastS->getValue(), gammaS->getValue());
// emit(changedImageOptions());
}
void OptionsDialog::resetImageConfig()
{
brightnessS->setValue(0);
contrastS->setValue(100);
gammaS->setValue(100);
QSettings settings(YACReader::getSettingsPath() + "/YACReader.ini", QSettings::IniFormat);
settings.setValue(BRIGHTNESS, 0);
settings.setValue(CONTRAST, 100);
settings.setValue(GAMMA, 100);
emit changedFilters(brightnessS->getValue(), contrastS->getValue(), gammaS->getValue());
// emit(changedImageOptions());
}
void OptionsDialog::show()
{
// TODO solucionar el tema de las settings, esto sólo debería aparecer en una única línea de código
QSettings *s = new QSettings(YACReader::getSettingsPath() + "/YACReader.ini", QSettings::IniFormat);
// fitToWidthRatioS->disconnect();
// fitToWidthRatioS->setSliderPosition(settings->value(FIT_TO_WIDTH_RATIO).toFloat()*100);
// connect(fitToWidthRatioS,SIGNAL(valueChanged(int)),this,SLOT(fitToWidthRatio(int)));
QDialog::show();
delete s;
}
void OptionsDialog::setFilters(int brightness, int contrast, int gamma)
{
if (brightness != -1)
brightnessS->setValue(brightness);
else
brightnessS->setValue(0);
if (contrast != -1)
contrastS->setValue(contrast);
else
contrastS->setValue(100);
if (gamma != -1)
gammaS->setValue(gamma);
else
gammaS->setValue(100);
}