Issue #59: Use optionally logical pixels when zooming

This commit is contained in:
Jakub Melka
2023-07-13 20:14:52 +02:00
parent aec5483690
commit fe1bf16597
4 changed files with 67 additions and 32 deletions

View File

@ -29,6 +29,8 @@
#include <QTimer> #include <QTimer>
#include <QPainter> #include <QPainter>
#include <QFontMetrics> #include <QFontMetrics>
#include <QScreen>
#include <QGuiApplication>
namespace pdf namespace pdf
{ {
@ -535,10 +537,23 @@ void PDFDrawWidgetProxy::update()
Q_ASSERT(m_verticalScrollbar); Q_ASSERT(m_verticalScrollbar);
QWidget* widget = m_widget->getDrawWidget()->getWidget(); QWidget* widget = m_widget->getDrawWidget()->getWidget();
QScreen* primaryScreen = QGuiApplication::primaryScreen();
// First, we must calculate pixel per mm ratio to obtain DPMM (device pixel per mm), // First, we must calculate pixel per mm ratio to obtain DPMM (device pixel per mm),
// we also assume, that zoom is correctly set. // we also assume, that zoom is correctly set.
m_pixelPerMM = static_cast<PDFReal>(widget->width()) / static_cast<PDFReal>(widget->widthMM()); QSizeF physicalSize = primaryScreen->physicalSize();
QSizeF pixelSize = primaryScreen->size();
m_pixelPerMM = pixelSize.width() / physicalSize.width();
// Are we using logical pixels instead of physical ones?
if (m_features.testFlag(PDFRenderer::LogicalSizeZooming))
{
qreal ldpi = primaryScreen->logicalDotsPerInch();
qreal pdpi = primaryScreen->physicalDotsPerInch();
qreal ratioLogicalToPhysical = ldpi / pdpi;
m_pixelPerMM *= ratioLogicalToPhysical;
}
Q_ASSERT(m_zoom > 0.0); Q_ASSERT(m_zoom > 0.0);
Q_ASSERT(m_pixelPerMM > 0.0); Q_ASSERT(m_pixelPerMM > 0.0);

View File

@ -88,6 +88,7 @@ public:
InvertColors = 0x0100, ///< Invert colors InvertColors = 0x0100, ///< Invert colors
DenyExtraGraphics = 0x0200, ///< Do not display additional graphics, for example from tools DenyExtraGraphics = 0x0200, ///< Do not display additional graphics, for example from tools
DisplayAnnotations = 0x0400, ///< Display annotations DisplayAnnotations = 0x0400, ///< Display annotations
LogicalSizeZooming = 0x0800, ///< Use logical pixel resolution instead of physical one when zooming
}; };
Q_DECLARE_FLAGS(Features, Feature) Q_DECLARE_FLAGS(Features, Feature)

View File

@ -329,6 +329,7 @@ void PDFViewerSettingsDialog::loadData()
ui->maximumUndoStepsEdit->setValue(m_settings.m_maximumUndoSteps); ui->maximumUndoStepsEdit->setValue(m_settings.m_maximumUndoSteps);
ui->maximumRedoStepsEdit->setValue(m_settings.m_maximumRedoSteps); ui->maximumRedoStepsEdit->setValue(m_settings.m_maximumRedoSteps);
ui->developerModeCheckBox->setChecked(m_settings.m_allowDeveloperMode); ui->developerModeCheckBox->setChecked(m_settings.m_allowDeveloperMode);
ui->logicalPixelZoomCheckBox->setChecked(m_settings.m_features.testFlag(pdf::PDFRenderer::LogicalSizeZooming));
// CMS // CMS
ui->cmsTypeComboBox->setCurrentIndex(ui->cmsTypeComboBox->findData(int(m_cmsSettings.system))); ui->cmsTypeComboBox->setCurrentIndex(ui->cmsTypeComboBox->findData(int(m_cmsSettings.system)));
@ -602,6 +603,10 @@ void PDFViewerSettingsDialog::saveData()
{ {
m_settings.m_maximumRedoSteps = ui->maximumRedoStepsEdit->value(); m_settings.m_maximumRedoSteps = ui->maximumRedoStepsEdit->value();
} }
else if (sender == ui->logicalPixelZoomCheckBox)
{
m_settings.m_features.setFlag(pdf::PDFRenderer::LogicalSizeZooming, ui->logicalPixelZoomCheckBox->isChecked());
}
else if (sender == ui->signatureVerificationEnableCheckBox) else if (sender == ui->signatureVerificationEnableCheckBox)
{ {
m_settings.m_signatureVerificationEnabled = ui->signatureVerificationEnableCheckBox->isChecked(); m_settings.m_signatureVerificationEnabled = ui->signatureVerificationEnableCheckBox->isChecked();

View File

@ -35,7 +35,7 @@
<item> <item>
<widget class="QStackedWidget" name="stackedWidget"> <widget class="QStackedWidget" name="stackedWidget">
<property name="currentIndex"> <property name="currentIndex">
<number>10</number> <number>7</number>
</property> </property>
<widget class="QWidget" name="enginePage"> <widget class="QWidget" name="enginePage">
<layout class="QVBoxLayout" name="enginePageLayout"> <layout class="QVBoxLayout" name="enginePageLayout">
@ -901,6 +901,30 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="1" column="0">
<widget class="QLabel" name="magnifierSizeLabel">
<property name="text">
<string>Magnifier size</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QSpinBox" name="maximumRecentFileCountEdit"/>
</item>
<item row="3" column="1">
<widget class="QSpinBox" name="maximumUndoStepsEdit">
<property name="maximum">
<number>20</number>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="maximumUndoStepsLabel">
<property name="text">
<string>Maximum undo steps</string>
</property>
</widget>
</item>
<item row="4" column="1"> <item row="4" column="1">
<widget class="QSpinBox" name="maximumRedoStepsEdit"> <widget class="QSpinBox" name="maximumRedoStepsEdit">
<property name="maximum"> <property name="maximum">
@ -908,6 +932,16 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="2" column="1">
<widget class="QDoubleSpinBox" name="magnifierZoomEdit">
<property name="minimum">
<double>1.000000000000000</double>
</property>
<property name="maximum">
<double>10.000000000000000</double>
</property>
</widget>
</item>
<item row="4" column="0"> <item row="4" column="0">
<widget class="QLabel" name="maximumRedoStepsLabel"> <widget class="QLabel" name="maximumRedoStepsLabel">
<property name="text"> <property name="text">
@ -915,17 +949,17 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="1" column="0"> <item row="6" column="1">
<widget class="QLabel" name="magnifierSizeLabel"> <widget class="QCheckBox" name="developerModeCheckBox">
<property name="text"> <property name="text">
<string>Magnifier size</string> <string>Enable</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="3" column="1"> <item row="6" column="0">
<widget class="QSpinBox" name="maximumUndoStepsEdit"> <widget class="QLabel" name="developerModeLabel">
<property name="maximum"> <property name="text">
<number>20</number> <string>Developer mode</string>
</property> </property>
</widget> </widget>
</item> </item>
@ -949,37 +983,17 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="0" column="1">
<widget class="QSpinBox" name="maximumRecentFileCountEdit"/>
</item>
<item row="3" column="0">
<widget class="QLabel" name="maximumUndoStepsLabel">
<property name="text">
<string>Maximum undo steps</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QDoubleSpinBox" name="magnifierZoomEdit">
<property name="minimum">
<double>1.000000000000000</double>
</property>
<property name="maximum">
<double>10.000000000000000</double>
</property>
</widget>
</item>
<item row="5" column="1"> <item row="5" column="1">
<widget class="QCheckBox" name="developerModeCheckBox"> <widget class="QCheckBox" name="logicalPixelZoomCheckBox">
<property name="text"> <property name="text">
<string>Enable</string> <string>Enable</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="5" column="0"> <item row="5" column="0">
<widget class="QLabel" name="developerModeLabel"> <widget class="QLabel" name="logicalPixelZoomLabel">
<property name="text"> <property name="text">
<string>Developer mode</string> <string>Use logical pixels when zooming</string>
</property> </property>
</widget> </widget>
</item> </item>