Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/core/filters/page_layout/Filter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@
namespace page_layout {
Filter::Filter(std::shared_ptr<ProjectPages> pages, const PageSelectionAccessor& pageSelectionAccessor)
: m_pages(std::move(pages)), m_settings(std::make_shared<Settings>()), m_selectedPageOrder(0) {
m_optionsWidget.reset(new OptionsWidget(m_settings, pageSelectionAccessor));
m_optionsWidget.reset(new OptionsWidget(m_settings, m_pages, pageSelectionAccessor));

const PageOrderOption::ProviderPtr defaultOrder;
const auto orderByWidth = std::make_shared<OrderByWidthProvider>(m_settings);
Expand Down
183 changes: 180 additions & 3 deletions src/core/filters/page_layout/OptionsWidget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,26 +3,34 @@

#include "OptionsWidget.h"

#include <ColorSchemeManager.h>
#include <UnitsProvider.h>
#include <core/IconProvider.h>

#include <QIntValidator>
#include <QLineEdit>
#include <QSettings>
#include <utility>

#include "../../Utils.h"
#include "ApplyDialog.h"
#include "ApplyMarginsDialog.h"
#include "ProjectPages.h"
#include "Settings.h"

using namespace core;

namespace page_layout {
OptionsWidget::OptionsWidget(std::shared_ptr<Settings> settings, const PageSelectionAccessor& pageSelectionAccessor)
OptionsWidget::OptionsWidget(std::shared_ptr<Settings> settings,
std::shared_ptr<ProjectPages> pages,
const PageSelectionAccessor& pageSelectionAccessor)
: m_settings(std::move(settings)),
m_pages(std::move(pages)),
m_pageSelectionAccessor(pageSelectionAccessor),
m_leftRightLinked(true),
m_topBottomLinked(true),
m_connectionManager(std::bind(&OptionsWidget::setupUiConnections, this)) {
m_connectionManager(std::bind(&OptionsWidget::setupUiConnections, this)),
m_sourceDpiFocusWidget(nullptr) {
{
QSettings appSettings;
m_leftRightLinked = appSettings.value("margins/leftRightLinked", true).toBool();
Expand All @@ -31,6 +39,7 @@ OptionsWidget::OptionsWidget(std::shared_ptr<Settings> settings, const PageSelec

setupUi(this);
setupIcons();
setupSourceDpiControls();

updateLinkDisplay(topBottomLink, m_topBottomLinked);
updateLinkDisplay(leftRightLink, m_leftRightLinked);
Expand All @@ -57,10 +66,14 @@ OptionsWidget::OptionsWidget(std::shared_ptr<Settings> settings, const PageSelec
OptionsWidget::~OptionsWidget() = default;

void OptionsWidget::preUpdateUI(const PageInfo& pageInfo, const Margins& marginsMm, const Alignment& alignment) {
commitSourceDpiIfValid();
m_sourceDpiFocusWidget = isSourceDpiFieldFocused() ? focusWidget() : nullptr;

auto block = m_connectionManager.getScopedBlock();

m_pageId = pageInfo.id();
m_dpi = pageInfo.metadata().dpi();
m_sourceImagePixelSize = pageInfo.metadata().size();
m_marginsMM = marginsMm;
m_alignment = alignment;

Expand Down Expand Up @@ -112,6 +125,7 @@ void OptionsWidget::preUpdateUI(const PageInfo& pageInfo, const Margins& margins

marginsGroup->setEnabled(false);
alignmentGroup->setEnabled(false);
keepSourceDpiFieldsEnabled();

onUnitsChanged(UnitsProvider::getInstance().getUnits());
} // OptionsWidget::preUpdateUI
Expand All @@ -124,6 +138,12 @@ void OptionsWidget::postUpdateUI() {

m_marginsMM = m_settings->getHardMarginsMM(m_pageId);
updateMarginsDisplay();
updateSourceDpiDisplay();

if (m_sourceDpiFocusWidget) {
m_sourceDpiFocusWidget->setFocus(Qt::OtherFocusReason);
m_sourceDpiFocusWidget = nullptr;
}
}

void OptionsWidget::marginsSetExternally(const Margins& marginsMm) {
Expand Down Expand Up @@ -447,6 +467,9 @@ void OptionsWidget::setupUiConnections() {
CONNECT(leftRightLink, SIGNAL(clicked()), this, SLOT(leftRightLinkClicked()));
CONNECT(applyMarginsBtn, SIGNAL(clicked()), this, SLOT(showApplyMarginsDialog()));
CONNECT(fixDpiBtn, SIGNAL(clicked()), this, SLOT(onFixDpiClicked()));
CONNECT(sourceDpiCombo, SIGNAL(activated(int)), this, SLOT(sourceDpiComboActivated(int)));
CONNECT(sourceXDpi, SIGNAL(editingFinished()), this, SLOT(sourceDpiEditingFinished()));
CONNECT(sourceYDpi, SIGNAL(editingFinished()), this, SLOT(sourceDpiEditingFinished()));
CONNECT(alignWithOthersCB, SIGNAL(toggled(bool)), this, SLOT(alignWithOthersToggled()));
CONNECT(applyAlignmentBtn, SIGNAL(clicked()), this, SLOT(showApplyAlignmentDialog()));
CONNECT(matchSizeToAllBtn, SIGNAL(clicked()), this, SLOT(matchSizeToAllPages()));
Expand Down Expand Up @@ -539,6 +562,160 @@ void OptionsWidget::setupIcons() {
}

void OptionsWidget::onFixDpiClicked() {
emit fixDpiRequested(); // MainWindow opens FixDpiDialog (issue #93).
emit fixDpiRequested();
}

void OptionsWidget::setupSourceDpiControls() {
sourceDpiCombo->addItem(tr("Custom"), QVariant());
sourceDpiCombo->addItem(QStringLiteral("300 x 300"), QSize(300, 300));
sourceDpiCombo->addItem(QStringLiteral("400 x 400"), QSize(400, 400));
sourceDpiCombo->addItem(QStringLiteral("600 x 600"), QSize(600, 600));
sourceDpiCombo->addItem(QStringLiteral("1200 x 1200"), QSize(1200, 1200));

sourceXDpi->setMaxLength(4);
sourceYDpi->setMaxLength(4);
sourceXDpi->setValidator(new QIntValidator(sourceXDpi));
sourceYDpi->setValidator(new QIntValidator(sourceYDpi));

m_sourceDpiNormalPalette = sourceXDpi->palette();
m_sourceDpiErrorPalette = m_sourceDpiNormalPalette;
const QColor errorColor(ColorSchemeManager::instance().getColorParam("FixDpiDialogErrorText", QColor(Qt::red)));
m_sourceDpiErrorPalette.setColor(QPalette::Text, errorColor);
}

void OptionsWidget::updateSourceDpiDisplay() {
auto block = m_connectionManager.getScopedBlock();

if (m_dpi.isNull()) {
sourceXDpi->clear();
sourceYDpi->clear();
} else {
sourceXDpi->setText(QString::number(m_dpi.horizontal()));
sourceYDpi->setText(QString::number(m_dpi.vertical()));
}

updateSourceDpiComboFromFields();

const ImageMetadata metadata(m_sourceImagePixelSize, m_dpi);
decorateSourceDpiField(sourceXDpi, metadata.horizontalDpiStatus());
decorateSourceDpiField(sourceYDpi, metadata.verticalDpiStatus());
}

void OptionsWidget::commitSourceDpiIfValid() {
if (m_pageId.isNull() || !m_pages) {
return;
}

bool xOk = false;
bool yOk = false;
const int horizontalDpi = sourceXDpi->text().toInt(&xOk);
const int verticalDpi = sourceYDpi->text().toInt(&yOk);
if (!xOk || !yOk) {
return;
}

const Dpi dpi(horizontalDpi, verticalDpi);
if (dpi == m_dpi) {
return;
}

const ImageMetadata updated(m_sourceImagePixelSize, dpi);
if (!updated.isDpiOK()) {
return;
}

m_pages->updateImageMetadata(m_pageId.imageId(), updated);
m_dpi = dpi;
emit invalidateAllThumbnails();
emit reloadRequested();
updateMarginsDisplay();
}

void OptionsWidget::decorateSourceDpiField(QLineEdit* field, const ImageMetadata::DpiStatus dpiStatus) {
if (dpiStatus == ImageMetadata::DPI_OK) {
field->setPalette(m_sourceDpiNormalPalette);
field->setToolTip(QString());
return;
}

field->setPalette(m_sourceDpiErrorPalette);
switch (dpiStatus) {
case ImageMetadata::DPI_TOO_LARGE:
field->setToolTip(tr("DPI is too large and most likely wrong."));
break;
case ImageMetadata::DPI_TOO_SMALL:
field->setToolTip(
tr("DPI is too small. Even if it's correct, you are not going to get acceptable results with it."));
break;
case ImageMetadata::DPI_TOO_SMALL_FOR_THIS_PIXEL_SIZE:
field->setToolTip(
tr("An extremely low DPI value. That might correspond to a very large paper size for the pixel size in "
"question."));
break;
default:
field->setToolTip(QString());
break;
}
}

void OptionsWidget::updateSourceDpiComboFromFields() {
bool xOk = false;
bool yOk = false;
const QSize dpi(sourceXDpi->text().toInt(&xOk), sourceYDpi->text().toInt(&yOk));

if (xOk && yOk) {
const int count = sourceDpiCombo->count();
for (int i = 0; i < count; ++i) {
const QVariant data(sourceDpiCombo->itemData(i));
if (data.isValid() && (dpi == data.toSize())) {
sourceDpiCombo->setCurrentIndex(i);
return;
}
}
}

sourceDpiCombo->setCurrentIndex(0);
}

void OptionsWidget::keepSourceDpiFieldsEnabled() {
sourceDpiLabel->setEnabled(true);
sourceDpiCombo->setEnabled(true);
sourceDpiTimesLabel->setEnabled(true);
sourceXDpi->setEnabled(true);
sourceYDpi->setEnabled(true);
fixDpiBtn->setEnabled(true);
}

bool OptionsWidget::isSourceDpiFieldFocused() const {
const QWidget* const focused = focusWidget();
return (focused == sourceXDpi) || (focused == sourceYDpi) || (focused == sourceDpiCombo);
}

void OptionsWidget::sourceDpiComboActivated(const int index) {
const QVariant data(sourceDpiCombo->itemData(index));
if (!data.isValid()) {
return;
}

const QSize dpi(data.toSize());
sourceXDpi->setText(QString::number(dpi.width()));
sourceYDpi->setText(QString::number(dpi.height()));
sourceDpiEditingFinished();
}

void OptionsWidget::sourceDpiEditingFinished() {
updateSourceDpiComboFromFields();

bool xOk = false;
bool yOk = false;
const int horizontalDpi = sourceXDpi->text().toInt(&xOk);
const int verticalDpi = sourceYDpi->text().toInt(&yOk);
if (xOk && yOk) {
const ImageMetadata metadata(m_sourceImagePixelSize, Dpi(horizontalDpi, verticalDpi));
decorateSourceDpiField(sourceXDpi, metadata.horizontalDpiStatus());
decorateSourceDpiField(sourceYDpi, metadata.verticalDpiStatus());
}

commitSourceDpiIfValid();
}
} // namespace page_layout
33 changes: 31 additions & 2 deletions src/core/filters/page_layout/OptionsWidget.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,28 +8,34 @@
#include <core/ConnectionManager.h>

#include <QIcon>
#include <list>
#include <QPalette>
#include <QSize>
#include <QWidget>
#include <memory>
#include <set>
#include <unordered_map>

#include "Alignment.h"
#include "FilterOptionsWidget.h"
#include "ImageMetadata.h"
#include "Margins.h"
#include "PageId.h"
#include "PageSelectionAccessor.h"
#include "ui_OptionsWidget.h"

class QToolButton;
class ProjectPages;
class QLineEdit;

namespace page_layout {
class Settings;

class OptionsWidget : public FilterOptionsWidget, public UnitsListener, private Ui::OptionsWidget {
Q_OBJECT
public:
OptionsWidget(std::shared_ptr<Settings> settings, const PageSelectionAccessor& pageSelectionAccessor);
OptionsWidget(std::shared_ptr<Settings> settings,
std::shared_ptr<ProjectPages> pages,
const PageSelectionAccessor& pageSelectionAccessor);

~OptionsWidget() override;

Expand Down Expand Up @@ -93,6 +99,10 @@ class OptionsWidget : public FilterOptionsWidget, public UnitsListener, private

void onFixDpiClicked();

void sourceDpiComboActivated(int index);

void sourceDpiEditingFinished();

void applyMargins(const std::set<PageId>& pages,
bool applyLeft = true,
bool applyRight = true,
Expand Down Expand Up @@ -122,13 +132,32 @@ class OptionsWidget : public FilterOptionsWidget, public UnitsListener, private

void setupIcons();

void setupSourceDpiControls();

void updateSourceDpiDisplay();

void commitSourceDpiIfValid();

void decorateSourceDpiField(QLineEdit* field, ImageMetadata::DpiStatus dpiStatus);

void updateSourceDpiComboFromFields();

void keepSourceDpiFieldsEnabled();

bool isSourceDpiFieldFocused() const;

std::shared_ptr<Settings> m_settings;
std::shared_ptr<ProjectPages> m_pages;
PageSelectionAccessor m_pageSelectionAccessor;
QIcon m_chainIcon;
QIcon m_brokenChainIcon;
AlignmentByButton m_alignmentByButton;
PageId m_pageId;
Dpi m_dpi;
QSize m_sourceImagePixelSize;
QPalette m_sourceDpiNormalPalette;
QPalette m_sourceDpiErrorPalette;
QWidget* m_sourceDpiFocusWidget;
Margins m_marginsMM;
Alignment m_alignment;
bool m_leftRightLinked;
Expand Down
43 changes: 42 additions & 1 deletion src/core/filters/page_layout/OptionsWidget.ui
Original file line number Diff line number Diff line change
Expand Up @@ -276,6 +276,47 @@ QToolButton:pressed {
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="sourceDpiLayout">
<item>
<widget class="QLabel" name="sourceDpiLabel">
<property name="text">
<string>Source DPI</string>
</property>
</widget>
</item>
<item>
<widget class="QComboBox" name="sourceDpiCombo"/>
</item>
<item>
<widget class="QLineEdit" name="sourceXDpi">
<property name="maximumSize">
<size>
<width>40</width>
<height>16777215</height>
</size>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="sourceDpiTimesLabel">
<property name="text">
<string notr="true">×</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="sourceYDpi">
<property name="maximumSize">
<size>
<width>40</width>
<height>16777215</height>
</size>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_5">
<item>
Expand All @@ -301,7 +342,7 @@ QToolButton:pressed {
<item>
<widget class="QPushButton" name="fixDpiBtn">
<property name="text">
<string>Fix DPI...</string>
<string>Fix all...</string>
</property>
</widget>
</item>
Expand Down