Skip to content

Commit

Permalink
Add support for zoom level constraints (Any, OneOrMore, Fixed)
Browse files Browse the repository at this point in the history
  • Loading branch information
c-koi committed Jul 6, 2018
1 parent f425b7c commit 0ce0751
Show file tree
Hide file tree
Showing 16 changed files with 315 additions and 113 deletions.
1 change: 1 addition & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -326,6 +326,7 @@ set (gmic_qt_SRCS
src/Widgets/SearchFieldWidget.h
src/Widgets/LanguageSelectionWidget.h
src/Widgets/ProgressInfoWindow.h
src/ZoomConstraint.h

${GMIC_PATH}/gmic.h
${GMIC_PATH}/CImg.h
Expand Down
5 changes: 3 additions & 2 deletions gmic_qt.pro
Original file line number Diff line number Diff line change
Expand Up @@ -260,6 +260,7 @@ HEADERS += \
src/ImageConverter.h \
src/ImageTools.h \
src/InputOutputState.h \
src/KeypointList.h \
src/LayersExtentProxy.h \
src/Logger.h \
src/MainWindow.h \
Expand All @@ -268,6 +269,7 @@ HEADERS += \
src/TimeLogger.h \
src/Updater.h \
src/Utils.h \
src/ZoomConstraint.h \
src/FilterSelector/FiltersView/FilterTreeFolder.h \
src/FilterSelector/FiltersView/FilterTreeItem.h \
src/FilterSelector/FavesModel.h \
Expand All @@ -281,8 +283,7 @@ HEADERS += \
src/Widgets/ZoomLevelSelector.h \
src/Widgets/SearchFieldWidget.h \
src/Widgets/LanguageSelectionWidget.h \
src/Widgets/ProgressInfoWindow.h \
src/KeypointList.h
src/Widgets/ProgressInfoWindow.h


HEADERS += $$GMIC_PATH/gmic.h
Expand Down
19 changes: 18 additions & 1 deletion src/DialogSettings.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ bool DialogSettings::_logosAreVisible;
MainWindow::PreviewPosition DialogSettings::_previewPosition;
int DialogSettings::_updatePeriodicity;
GmicQt::OutputMessageMode DialogSettings::_outputMessageMode;
bool DialogSettings::_previewZoomAlwaysEnabled = false;

const QColor DialogSettings::CheckBoxBaseColor(83, 83, 83);
const QColor DialogSettings::CheckBoxTextColor(255, 255, 255);
Expand Down Expand Up @@ -106,6 +107,8 @@ DialogSettings::DialogSettings(QWidget * parent) : QDialog(parent), ui(new Ui::D
ui->cbShowLogos->setChecked(_logosAreVisible);
ui->sbPreviewTimeout->setValue(_previewTimeout);

ui->cbPreviewZoom->setChecked(_previewZoomAlwaysEnabled);

connect(ui->pbOk, SIGNAL(clicked()), this, SLOT(onOk()));
connect(ui->rbLeftPreview, SIGNAL(toggled(bool)), this, SLOT(onRadioLeftPreviewToggled(bool)));
connect(ui->pbUpdate, SIGNAL(clicked(bool)), this, SLOT(onUpdateClicked()));
Expand All @@ -123,6 +126,8 @@ DialogSettings::DialogSettings(QWidget * parent) : QDialog(parent), ui(new Ui::D

connect(ui->cbShowLogos, SIGNAL(toggled(bool)), this, SLOT(onLogosVisibleToggled(bool)));

connect(ui->cbPreviewZoom, SIGNAL(toggled(bool)), this, SLOT(onPreviewZoomToggled(bool)));

connect(ui->sbPreviewTimeout, SIGNAL(valueChanged(int)), this, SLOT(onPreviewTimeoutChange(int)));

connect(ui->outputMessages, SIGNAL(currentIndexChanged(int)), this, SLOT(onOutputMessageModeChanged(int)));
Expand All @@ -133,6 +138,7 @@ DialogSettings::DialogSettings(QWidget * parent) : QDialog(parent), ui(new Ui::D
p.setColor(QPalette::Text, DialogSettings::CheckBoxTextColor);
p.setColor(QPalette::Base, DialogSettings::CheckBoxBaseColor);
ui->cbNativeColorDialogs->setPalette(p);
ui->cbPreviewZoom->setPalette(p);
ui->cbUpdatePeriodicity->setPalette(p);
ui->rbDarkTheme->setPalette(p);
ui->rbDefaultTheme->setPalette(p);
Expand Down Expand Up @@ -164,11 +170,17 @@ void DialogSettings::loadSettings()
FileParameterDefaultPath = settings.value("FileParameterDefaultPath", QDir::homePath()).toString();
_logosAreVisible = settings.value("LogosAreVisible", true).toBool();
_previewTimeout = settings.value("PreviewTimeout", 16).toInt();
_previewZoomAlwaysEnabled = settings.value("AlwaysEnablePreviewZoom", false).toBool();
_outputMessageMode = static_cast<GmicQt::OutputMessageMode>(settings.value("OutputMessageMode", GmicQt::DefaultOutputMessageMode).toInt());
AddIcon = LOAD_ICON("list-add");
RemoveIcon = LOAD_ICON("list-remove");
}

bool DialogSettings::previewZoomAlwaysEnabled()
{
return _previewZoomAlwaysEnabled;
}

int DialogSettings::previewTimeout()
{
return _previewTimeout;
Expand All @@ -189,7 +201,7 @@ void DialogSettings::saveSettings(QSettings & settings)
settings.setValue("LogosAreVisible", _logosAreVisible);
settings.setValue("PreviewTimeout", _previewTimeout);
settings.setValue("OutputMessageMode", _outputMessageMode);

settings.setValue("AlwaysEnablePreviewZoom", _previewZoomAlwaysEnabled);
// Remove obsolete keys (2.0.0 pre-release)
settings.remove("Config/UseFaveInputMode");
settings.remove("Config/UseFaveOutputMode");
Expand Down Expand Up @@ -237,6 +249,11 @@ void DialogSettings::onOutputMessageModeChanged(int)
Logger::setMode(_outputMessageMode);
}

void DialogSettings::onPreviewZoomToggled(bool on)
{
_previewZoomAlwaysEnabled = on;
}

void DialogSettings::enableUpdateButton()
{
ui->pbUpdate->setEnabled(true);
Expand Down
4 changes: 4 additions & 0 deletions src/DialogSettings.h
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ class DialogSettings : public QDialog {
static bool nativeColorDialogs();
static void saveSettings(QSettings &);
static void loadSettings();
static bool previewZoomAlwaysEnabled();
static const QColor CheckBoxTextColor;
static const QColor CheckBoxBaseColor;
static QColor UnselectedFilterTextColor;
Expand All @@ -61,6 +62,7 @@ class DialogSettings : public QDialog {
static GmicQt::OutputMessageMode outputMessageMode();
static QIcon AddIcon;
static QIcon RemoveIcon;

public slots:
void onRadioLeftPreviewToggled(bool);
void onUpdateClicked();
Expand All @@ -73,6 +75,7 @@ public slots:
void onLogosVisibleToggled(bool);
void onPreviewTimeoutChange(int);
void onOutputMessageModeChanged(int);
void onPreviewZoomToggled(bool);

private:
Ui::DialogSettings * ui;
Expand All @@ -84,6 +87,7 @@ public slots:
static bool _logosAreVisible;
static int _previewTimeout;
static GmicQt::OutputMessageMode _outputMessageMode;
static bool _previewZoomAlwaysEnabled;
};

#endif // _GMIC_QT_DIALOGSETTINGS_H_
4 changes: 2 additions & 2 deletions src/Host/None/host_none.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -48,13 +48,13 @@
//#define DEFAULT_IMAGE "local/space-shuttle-transp.png"
//#define DEFAULT_IMAGE "local/bug.jpg"
//#define DEFAULT_IMAGE "local/bug2.jpg"
//#define DEFAULT_IMAGE "local/crop_inktober.jpg"
#define DEFAULT_IMAGE "local/crop_inktober.jpg"
//#define DEFAULT_IMAGE "local/lena.png"
//#define DEFAULT_IMAGE "local/lena_border.png"
//#define DEFAULT_IMAGE "local/transp.png"
//#define DEFAULT_IMAGE "local/small_lena.png"
//#define DEFAULT_IMAGE "local/ken.jpg"
#define DEFAULT_IMAGE "local/ferrari.jpg"
//#define DEFAULT_IMAGE "local/ferrari.jpg"
//#define DEFAULT_IMAGE "local/audio-speakers.png"
//#define DEFAULT_IMAGE "local/audio-speakers-top.png"
#endif
Expand Down
65 changes: 40 additions & 25 deletions src/MainWindow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -70,15 +70,10 @@ MainWindow::MainWindow(QWidget * parent) : QWidget(parent), ui(new Ui::MainWindo
tsp.append(QString("/usr/share/icons/gnome"));
QIcon::setThemeSearchPaths(tsp);

_filterUpdateWidgets = {ui->previewWidget, ui->tbZoomIn, ui->tbZoomOut, ui->tbZoomReset, ui->zoomLevelSelector, ui->filtersView, ui->filterParams,
ui->tbUpdateFilters, ui->pbFullscreen, ui->pbSettings, ui->pbOk, ui->pbApply, ui->inOutSelector, ui->tbResetParameters,
ui->searchField, ui->cbPreview, ui->tbAddFave, ui->tbRemoveFave, ui->tbRenameFave, ui->tbExpandCollapse, ui->tbSelectionMode};
_filterUpdateWidgets = {ui->previewWidget, ui->zoomLevelSelector, ui->filtersView, ui->filterParams, ui->tbUpdateFilters, ui->pbFullscreen, ui->pbSettings,
ui->pbOk, ui->pbApply, ui->inOutSelector, ui->tbResetParameters, ui->searchField, ui->cbPreview, ui->tbAddFave,
ui->tbRemoveFave, ui->tbRenameFave, ui->tbExpandCollapse, ui->tbSelectionMode};

ui->tbZoomIn->setToolTip(tr("Zoom in"));
ui->tbZoomOut->setToolTip(tr("Zoom out"));
ui->tbZoomReset->setToolTip(tr("Reset zoom"));

ui->labelWarning->setToolTip(tr("Warning: Preview may be inaccurate (zoom factor has been modified)"));
ui->tbAddFave->setToolTip(tr("Add fave"));

ui->tbResetParameters->setToolTip(tr("Reset parameters to default values"));
Expand Down Expand Up @@ -189,9 +184,6 @@ void MainWindow::setIcons()
ui->tbRenameFave->setIcon(QIcon(":/resources/rename.png"));
ui->pbSettings->setIcon(LOAD_ICON("package_settings"));
ui->pbFullscreen->setIcon(LOAD_ICON("view-fullscreen"));
ui->tbZoomOut->setIcon(LOAD_ICON("zoom-out"));
ui->tbZoomIn->setIcon(LOAD_ICON("zoom-in"));
ui->tbZoomReset->setIcon(LOAD_ICON("view-refresh"));
ui->tbUpdateFilters->setIcon(LOAD_ICON("view-refresh"));
ui->pbApply->setIcon(LOAD_ICON("system-run"));
ui->pbOk->setIcon(LOAD_ICON("insert-image"));
Expand All @@ -204,8 +196,6 @@ void MainWindow::setIcons()
_collapseIcon = LOAD_ICON("draw-arrow-up");
_expandCollapseIcon = &_expandIcon;
ui->tbExpandCollapse->setIcon(_expandIcon);

ui->labelWarning->setPixmap(QPixmap(":/images/no_warning.png"));
}

void MainWindow::setDarkTheme()
Expand Down Expand Up @@ -385,11 +375,7 @@ void MainWindow::onZoomOut()
void MainWindow::showZoomWarningIfNeeded()
{
const FiltersPresenter::Filter & currentFilter = _filtersPresenter->currentFilter();
if (!currentFilter.hash.isEmpty() && !currentFilter.isAccurateIfZoomed && !ui->previewWidget->isAtDefaultZoom()) {
ui->labelWarning->setPixmap(QPixmap(":/images/warning.png"));
} else {
ui->labelWarning->setPixmap(QPixmap(":/images/no_warning.png"));
}
ui->zoomLevelSelector->showWarning(!currentFilter.hash.isEmpty() && !currentFilter.isAccurateIfZoomed && !ui->previewWidget->isAtDefaultZoom());
}

void MainWindow::updateZoomLabel(double zoom)
Expand Down Expand Up @@ -495,9 +481,9 @@ void MainWindow::makeConnections()
connect(ui->previewWidget, SIGNAL(previewUpdateRequested()), this, SLOT(onPreviewUpdateRequested()));
connect(ui->previewWidget, SIGNAL(keypointPositionsChanged(unsigned int, unsigned long)), this, SLOT(onPreviewKeypointsEvent(unsigned int, unsigned long)));

connect(ui->tbZoomIn, SIGNAL(clicked(bool)), this, SLOT(onZoomIn()));
connect(ui->tbZoomOut, SIGNAL(clicked(bool)), this, SLOT(onZoomOut()));
connect(ui->tbZoomReset, SIGNAL(clicked(bool)), this, SLOT(onPreviewZoomReset()));
connect(ui->zoomLevelSelector, SIGNAL(zoomIn()), this, SLOT(onZoomIn()));
connect(ui->zoomLevelSelector, SIGNAL(zoomOut()), this, SLOT(onZoomOut()));
connect(ui->zoomLevelSelector, SIGNAL(zoomReset()), this, SLOT(onPreviewZoomReset()));

connect(ui->tbAddFave, SIGNAL(clicked(bool)), this, SLOT(onAddFave()));
connect(_filtersPresenter, SIGNAL(faveAdditionRequested(QString)), this, SLOT(onAddFave()));
Expand Down Expand Up @@ -665,6 +651,23 @@ void MainWindow::onInputModeChanged(GmicQt::InputMode mode)
ui->previewWidget->sendUpdateRequest();
}

void MainWindow::setZoomConstraint()
{
const FiltersPresenter::Filter & currentFilter = _filtersPresenter->currentFilter();

ZoomConstraint constraint;
if (currentFilter.hash.isEmpty() || currentFilter.isAccurateIfZoomed || DialogSettings::previewZoomAlwaysEnabled() || (currentFilter.previewFactor == GmicQt::PreviewFactorAny)) {
constraint = ZoomConstraint::Any;
} else if (currentFilter.previewFactor == GmicQt::PreviewFactorActualSize) {
constraint = ZoomConstraint::OneOrMore;
} else {
constraint = ZoomConstraint::Fixed;
}
showZoomWarningIfNeeded();
ui->zoomLevelSelector->setZoomConstraint(constraint);
ui->previewWidget->setZoomConstraint(constraint);
}

void MainWindow::onFullImageProcessingDone()
{
ui->progressInfoWidget->stopAnimationAndHide();
Expand Down Expand Up @@ -772,7 +775,7 @@ void MainWindow::onPreviewZoomReset()
if (!_filtersPresenter->currentFilter().hash.isEmpty()) {
ui->previewWidget->setPreviewFactor(_filtersPresenter->currentFilter().previewFactor, true);
ui->previewWidget->sendUpdateRequest();
ui->labelWarning->setPixmap(QPixmap(":/images/no_warning.png"));
ui->zoomLevelSelector->showWarning(false);
}
}

Expand Down Expand Up @@ -836,7 +839,6 @@ void MainWindow::saveSettings()
void MainWindow::loadSettings()
{
QSettings settings;
DialogSettings::loadSettings();
_filtersPresenter->loadSettings(settings);

_lastExecutionOK = settings.value("LastExecution/ExitedNormally", true).toBool();
Expand Down Expand Up @@ -1002,7 +1004,7 @@ void MainWindow::activateFilter(bool resetZoom)
ui->filterName->setVisible(true);
ui->tbAddFave->setEnabled(true);
ui->previewWidget->setPreviewFactor(filter.previewFactor, resetZoom);
showZoomWarningIfNeeded();
setZoomConstraint();
_okButtonShouldApply = true;
ui->tbResetParameters->setVisible(true);
ui->tbRemoveFave->setEnabled(filter.isAFave);
Expand All @@ -1020,7 +1022,7 @@ void MainWindow::setNoFilter()
ui->filterName->setVisible(false);
ui->tbAddFave->setEnabled(false);
ui->tbResetParameters->setVisible(false);
ui->labelWarning->setPixmap(QPixmap(":/images/no_warning.png"));
ui->zoomLevelSelector->showWarning(false);
_okButtonShouldApply = false;

ui->tbRemoveFave->setEnabled(false);
Expand Down Expand Up @@ -1161,6 +1163,19 @@ void MainWindow::onSettingsClicked()
if (shouldUpdatePreview) {
ui->previewWidget->sendUpdateRequest();
}
// Manage zoom constraints
setZoomConstraint();
if (!DialogSettings::previewZoomAlwaysEnabled()) {
const FiltersPresenter::Filter & filter = _filtersPresenter->currentFilter();
if (((ui->previewWidget->zoomConstraint() == ZoomConstraint::Fixed) && (ui->previewWidget->defaultZoomFactor() != ui->previewWidget->currentZoomFactor())) ||
((ui->previewWidget->zoomConstraint() == ZoomConstraint::OneOrMore) && (ui->previewWidget->currentZoomFactor() < 1.0))) {
ui->previewWidget->setPreviewFactor(filter.previewFactor, true);
if (ui->cbPreview->isChecked()) {
ui->previewWidget->sendUpdateRequest();
}
}
}
showZoomWarningIfNeeded();
}

bool MainWindow::confirmAbortProcessingOnCloseRequest()
Expand Down
1 change: 1 addition & 0 deletions src/MainWindow.h
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,7 @@ private slots:
void onInputModeChanged(GmicQt::InputMode);

private:
void setZoomConstraint();
bool filtersSelectionMode();
void clearMessage();
void showMessage(QString text, int ms = 2000);
Expand Down
22 changes: 19 additions & 3 deletions src/Widgets/PreviewWidget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@ PreviewWidget::PreviewWidget(QWidget * parent) : QWidget(parent)
_pendingResize = false;
_previewEnabled = true;
_currentZoomFactor = 1.0;
_zoomConstraint = ZoomConstraint::Any;
_timerID = 0;
_savedPreviewIsValid = false;
_paintOriginalImage = true;
Expand Down Expand Up @@ -476,7 +477,6 @@ void PreviewWidget::leaveEvent(QEvent *)
void PreviewWidget::wheelEvent(QWheelEvent * event)
{
double degrees = event->angleDelta().y() / 8.0;
// int steps = static_cast<int>(std::fabs(degrees) / 15.0);
int steps = static_cast<int>(std::fabs(degrees) / 15.0);
if (degrees > 0.0) {
zoomIn(event->pos() - _imagePosition.topLeft(), steps);
Expand Down Expand Up @@ -685,7 +685,7 @@ void PreviewWidget::zoomFullImage()

void PreviewWidget::zoomIn(QPoint p, int steps)
{
if (_fullImageSize.isNull()) {
if (_fullImageSize.isNull() || (_zoomConstraint == ZoomConstraint::Fixed)) {
return;
}
double previousZoomFactor = _currentZoomFactor;
Expand Down Expand Up @@ -714,14 +714,17 @@ void PreviewWidget::zoomIn(QPoint p, int steps)

void PreviewWidget::zoomOut(QPoint p, int steps)
{
if (isAtFullZoom() || _fullImageSize.isNull()) {
if ((_zoomConstraint == ZoomConstraint::Fixed) || ((_zoomConstraint == ZoomConstraint::OneOrMore) && (_currentZoomFactor <= 1.0)) || isAtFullZoom() || _fullImageSize.isNull()) {
return;
}
double mouseX = p.x() / (_currentZoomFactor * _fullImageSize.width()) + _visibleRect.x;
double mouseY = p.y() / (_currentZoomFactor * _fullImageSize.height()) + _visibleRect.y;
while (steps--) {
_currentZoomFactor /= 1.2;
}
if ((_zoomConstraint == ZoomConstraint::OneOrMore) && (_currentZoomFactor <= 1.0)) {
_currentZoomFactor = 1.0;
}
updateVisibleRect();
if (isAtFullZoom()) {
_currentZoomFactor = std::min(width() / (double)_fullImageSize.width(), height() / (double)_fullImageSize.height());
Expand All @@ -739,6 +742,9 @@ void PreviewWidget::setZoomLevel(double zoom)
if ((zoom == _currentZoomFactor) || _fullImageSize.isNull()) {
return;
}
if ((_zoomConstraint == ZoomConstraint::OneOrMore) && (zoom <= 1.0)) {
zoom = 1.0;
}
if ((zoom > PREVIEW_MAX_ZOOM_FACTOR) || (isAtFullZoom() && (zoom < _currentZoomFactor))) {
emit zoomChanged(_currentZoomFactor);
return;
Expand Down Expand Up @@ -883,6 +889,16 @@ void PreviewWidget::setKeypoints(const KeypointList & keypoints)
update();
}

void PreviewWidget::setZoomConstraint(ZoomConstraint constraint)
{
_zoomConstraint = constraint;
}

ZoomConstraint PreviewWidget::zoomConstraint() const
{
return _zoomConstraint;
}

void PreviewWidget::invalidateSavedPreview()
{
_savedPreviewIsValid = false;
Expand Down
Loading

0 comments on commit 0ce0751

Please sign in to comment.