Skip to content

Commit a83daf7

Browse files
committed
Preserve output imageview position on reload / params change
1 parent c1721b3 commit a83daf7

File tree

7 files changed

+120
-11
lines changed

7 files changed

+120
-11
lines changed

src/core/ImageViewBase.cpp

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1078,6 +1078,32 @@ ImageViewBase::setWidgetFocalPointWithoutMoving(QPointF const new_widget_fp)
10781078
);
10791079
}
10801080

1081+
ImageViewBase::Position
1082+
ImageViewBase::getPosition() const
1083+
{
1084+
QPointF const anchor_image(widgetToImage().map(rect().center()));
1085+
QPointF const anchor(
1086+
anchor_image.x() / m_image.width(),
1087+
anchor_image.y() / m_image.height()
1088+
);
1089+
1090+
return Position(m_zoom, anchor);
1091+
}
1092+
1093+
void
1094+
ImageViewBase::setPosition(Position const& position)
1095+
{
1096+
QPointF const anchor(position.anchor());
1097+
QPointF const anchor_image(
1098+
m_image.width() * anchor.x(),
1099+
m_image.height() * anchor.y()
1100+
);
1101+
QPointF const anchor_widget(imageToWidget().map(anchor_image));
1102+
1103+
setWidgetFocalPointWithoutMoving(anchor_widget);
1104+
setZoomLevel(position.zoom());
1105+
}
1106+
10811107
/**
10821108
* Returns true if m_hqPixmap is valid and up to date.
10831109
*/

src/core/ImageViewBase.h

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,29 @@ class ImageViewBase : public QAbstractScrollArea
6464
public:
6565
enum FocalPointMode { CENTER_IF_FITS, DONT_CENTER };
6666

67+
class Position
68+
{
69+
public:
70+
Position(double zoom, QPointF const& anchor)
71+
: m_zoom(zoom)
72+
, m_anchor(anchor)
73+
{
74+
}
75+
76+
double zoom() const
77+
{
78+
return m_zoom;
79+
}
80+
81+
QPointF anchor() const
82+
{
83+
return m_anchor;
84+
}
85+
private:
86+
double m_zoom;
87+
QPointF m_anchor;
88+
};
89+
6790
/**
6891
* \brief ImageViewBase constructor.
6992
*
@@ -226,6 +249,10 @@ class ImageViewBase : public QAbstractScrollArea
226249
*/
227250
void setWidgetFocalPointWithoutMoving(QPointF new_widget_fp);
228251

252+
Position getPosition() const;
253+
254+
void setPosition(Position const& position);
255+
229256
/**
230257
* \brief Updates image-to-virtual and recalculates
231258
* virtual-to-widget transformations.

src/core/filters/output/ImageView.cpp

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,25 +20,36 @@
2020

2121
#include "ImagePresentation.h"
2222
#include "OutputMargins.h"
23+
#include "Settings.h"
2324

2425
namespace output
2526
{
2627

27-
ImageView::ImageView(QImage const& image, QImage const& downscaled_image)
28-
: ImageViewBase(
29-
image, downscaled_image,
30-
ImagePresentation(QTransform(), QRectF(image.rect())),
31-
OutputMargins()
32-
),
33-
m_dragHandler(*this),
34-
m_zoomHandler(*this)
28+
ImageView::ImageView(IntrusivePtr<Settings> const& settings, PageId const& page_id,
29+
QImage const& image, QImage const& downscaled_image)
30+
: ImageViewBase(
31+
image, downscaled_image,
32+
ImagePresentation(QTransform(), QRectF(image.rect())),
33+
OutputMargins()
34+
)
35+
, m_ptrSettings(settings)
36+
, m_pageId(page_id)
37+
, m_dragHandler(*this)
38+
, m_zoomHandler(*this)
3539
{
3640
rootInteractionHandler().makeLastFollower(m_dragHandler);
3741
rootInteractionHandler().makeLastFollower(m_zoomHandler);
42+
43+
boost::optional<ImageViewBase::Position> const position = settings->getImageViewPosition(page_id);
44+
if (position)
45+
{
46+
setPosition(position.value());
47+
}
3848
}
3949

4050
ImageView::~ImageView()
4151
{
52+
m_ptrSettings->setImageViewPosition(m_pageId, getPosition());
4253
}
4354

4455
} // namespace output

src/core/filters/output/ImageView.h

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,21 +22,27 @@
2222
#include "ImageViewBase.h"
2323
#include "DragHandler.h"
2424
#include "ZoomHandler.h"
25-
#include <QColor>
25+
#include "IntrusivePtr.h"
26+
#include "PageId.h"
2627

2728
class ImageTransformation;
2829

2930
namespace output
3031
{
3132

33+
class Settings;
34+
3235
class ImageView : public ImageViewBase
3336
{
3437
Q_OBJECT
3538
public:
36-
ImageView(QImage const& image, QImage const& downscaled_image);
39+
ImageView(IntrusivePtr<Settings> const& settings, PageId const& page_id,
40+
QImage const& image, QImage const& downscaled_image);
3741

3842
virtual ~ImageView();
3943
private:
44+
IntrusivePtr<Settings> m_ptrSettings;
45+
PageId const m_pageId;
4046
DragHandler m_dragHandler;
4147
ZoomHandler m_zoomHandler;
4248
};

src/core/filters/output/Settings.cpp

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ Settings::clear()
5656
m_perPageOutputParams.clear();
5757
m_perPagePictureZones.clear();
5858
m_perPageFillZones.clear();
59+
m_perPageImageviewPositions.clear();
5960
}
6061

6162
void
@@ -67,6 +68,7 @@ Settings::performRelinking(AbstractRelinker const& relinker)
6768
PerPageOutputParams new_output_params;
6869
PerPageZones new_picture_zones;
6970
PerPageZones new_fill_zones;
71+
PerPageImageviewPositions new_imageview_positions;
7072

7173
for (PerPageParams::value_type const& kv : m_perPageParams) {
7274
RelinkablePath const old_path(kv.first.imageId().filePath(), RelinkablePath::File);
@@ -96,10 +98,18 @@ Settings::performRelinking(AbstractRelinker const& relinker)
9698
new_fill_zones.insert(PerPageZones::value_type(new_page_id, kv.second));
9799
}
98100

101+
for (PerPageImageviewPositions::value_type const& kv : m_perPageImageviewPositions) {
102+
RelinkablePath const old_path(kv.first.imageId().filePath(), RelinkablePath::File);
103+
PageId new_page_id(kv.first);
104+
new_page_id.imageId().setFilePath(relinker.substitutionPathFor(old_path));
105+
new_imageview_positions.insert(PerPageImageviewPositions::value_type(new_page_id, kv.second));
106+
}
107+
99108
m_perPageParams.swap(new_params);
100109
m_perPageOutputParams.swap(new_output_params);
101110
m_perPagePictureZones.swap(new_picture_zones);
102111
m_perPageFillZones.swap(new_fill_zones);
112+
m_perPageImageviewPositions.swap(new_imageview_positions);
103113
}
104114

105115
Params
@@ -289,4 +299,25 @@ Settings::initialFillZoneProps()
289299
return props;
290300
}
291301

302+
boost::optional<ImageViewBase::Position>
303+
Settings::getImageViewPosition(PageId const& page_id) const
304+
{
305+
QMutexLocker const locker(&m_mutex);
306+
307+
PerPageImageviewPositions::const_iterator const it(m_perPageImageviewPositions.find(page_id));
308+
if (it != m_perPageImageviewPositions.end()) {
309+
return it->second;
310+
}
311+
else {
312+
return boost::optional<ImageViewBase::Position>();
313+
}
314+
}
315+
316+
void
317+
Settings::setImageViewPosition(PageId const& page_id, ImageViewBase::Position const& imageview_position)
318+
{
319+
QMutexLocker const locker(&m_mutex);
320+
Utils::mapSetValue(m_perPageImageviewPositions, page_id, imageview_position);
321+
}
322+
292323
} // namespace output

src/core/filters/output/Settings.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,14 @@
2626
#include "ColorParams.h"
2727
#include "Params.h"
2828
#include "OutputParams.h"
29+
#include "ImageViewBase.h"
2930
#include "DespeckleLevel.h"
3031
#include "ZoneSet.h"
3132
#include "PropertySet.h"
3233
#include <QMutex>
3334
#include <map>
3435
#include <memory>
36+
#include <boost/optional.hpp>
3537
//begin of modified by monday2000
3638
//Picture_Shape
3739
#include "Params.h"
@@ -91,10 +93,15 @@ class Settings : public RefCountable
9193
void setDefaultPictureZoneProperties(PropertySet const& props);
9294

9395
void setDefaultFillZoneProperties(PropertySet const& props);
96+
97+
boost::optional<ImageViewBase::Position> getImageViewPosition(PageId const& page_id) const;
98+
99+
void setImageViewPosition(PageId const& page_id, ImageViewBase::Position const& imageview_position);
94100
private:
95101
typedef std::map<PageId, Params> PerPageParams;
96102
typedef std::map<PageId, OutputParams> PerPageOutputParams;
97103
typedef std::map<PageId, ZoneSet> PerPageZones;
104+
typedef std::map<PageId, boost::optional<ImageViewBase::Position> > PerPageImageviewPositions;
98105

99106
static PropertySet initialPictureZoneProps();
100107

@@ -105,6 +112,7 @@ class Settings : public RefCountable
105112
PerPageOutputParams m_perPageOutputParams;
106113
PerPageZones m_perPagePictureZones;
107114
PerPageZones m_perPageFillZones;
115+
PerPageImageviewPositions m_perPageImageviewPositions;
108116
PropertySet m_defaultPictureZoneProps;
109117
PropertySet m_defaultFillZoneProps;
110118
int m_compression;

src/core/filters/output/Task.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -618,7 +618,7 @@ Task::UiUpdater::updateUI(FilterUiInterface* ui)
618618
}
619619

620620
std::unique_ptr<ImageViewBase> image_view(
621-
new ImageView(m_outputImage, m_downscaledOutputImage)
621+
new ImageView(m_ptrSettings, m_pageId, m_outputImage, m_downscaledOutputImage)
622622
);
623623

624624
std::shared_ptr<QImage> alt_image_ptr;

0 commit comments

Comments
 (0)