Scroom 0.14-49-gb7ae7a6d
Loading...
Searching...
No Matches
view.hh
Go to the documentation of this file.
1/*
2 * Scroom - Generic viewer for 2D data
3 * Copyright (C) 2009-2026 Kees-Jan Dijkzeul
4 *
5 * SPDX-License-Identifier: LGPL-2.1
6 */
7
8#pragma once
9
10#include <cmath>
11#include <cstdlib>
12#include <map>
13#include <optional>
14#include <string>
15#include <vector>
16
17#include <gdk/gdk.h>
18#include <gtk/gtk.h>
19
20#include <cairo.h>
21
22#include <scroom/logger.hh>
25#include <scroom/stuff.hh>
26#include <scroom/tweak-view.hh>
27#include <scroom/utilities.hh>
29
30#include "progressbarmanager.hh"
31#include "ruler.hh"
32#include "sidebarmanager.hh"
33
42template <typename T>
44{
45public:
46 using value_type = T;
48
49private:
51 unsigned locked{0};
52
53public:
54 Freezable() = default;
55
57 : value(std::move(v))
58 {
59 }
60
61 [[nodiscard]] const value_type& get() const { return value; }
62
64 {
65 if(!locked)
66 {
67 value = std::move(v);
68 }
69 return locked;
70 }
71
72 void lock() { locked++; }
73
74 void unlock()
75 {
76 require(locked > 0);
77 locked--;
78 }
79 [[nodiscard]] bool is_locked() const { return locked; }
80
81 operator const value_type&() const { return value; } // NOLINT(hicpp-explicit-conversions)
83 {
84 set(std::move(v));
85 return *this;
86 }
87 const value_type* operator*() const { return &value; }
88 const value_type* operator->() const { return &value; }
89 Me& operator+=(value_type v) { return operator=(value + v); }
90 Me& operator-=(value_type v) { return operator=(value - v); }
91};
92
93class View
94 : public ViewInterface
95 , virtual public Scroom::Utils::Base
96{
97public:
98 using Ptr = std::shared_ptr<View>;
99
100private:
101 GtkBuilder* scroomXml;
104 GtkWindow* window;
105 GtkWidget* menubar;
106 GtkWidget* drawingArea;
109 GtkScrollbar* vscrollbar;
110 GtkScrollbar* hscrollbar;
111 GtkAdjustment* vscrollbaradjustment;
112 GtkAdjustment* hscrollbaradjustment;
113 GtkDrawingArea* hruler_area;
114 GtkDrawingArea* vruler_area;
117
118 GtkComboBox* zoomBox;
119 GtkListStore* zoomItems;
120 GtkProgressBar* progressBar;
121 GtkStatusbar* statusBar;
122 GtkToolbar* toolBar;
123 GtkToolItem* toolBarSeparator;
124 GtkEntry* xTextBox;
125 GtkEntry* yTextBox;
126 GtkWidget* statusArea;
127 GtkWidget* toolbarArea;
128 unsigned toolBarCount;
130 int zoom{0};
132 std::optional<Selection> selection;
133 std::vector<SelectionListener::Ptr> selectionListeners;
134 std::vector<PostRenderer::Ptr> postRenderers;
135 std::map<GtkToggleButton*, ToolStateListener::Ptr> tools;
136 std::shared_ptr<Scroom::Utils::ITweakPresentationPosition> tweakPresentationPosition;
137 std::shared_ptr<Scroom::Utils::ITweakPositionTextBox> tweakPositionTextBox;
138 std::shared_ptr<Scroom::Utils::ITweakRulers> tweakRulers;
140
143
145
147
148private:
150
151private:
158
159private:
160 explicit View(GtkBuilder* scroomXml);
161
162public:
163 static Ptr create(GtkBuilder* scroomXml, const PresentationInterface::Ptr& presentation);
164
165 ~View() override;
166 View(const View&) = delete;
167 View(View&&) = delete;
168 View operator=(const View&) = delete;
169 View operator=(View&&) = delete;
170
171 void redraw(cairo_t* cr);
172 void hide();
173 bool hasPresentation();
175 void clearPresentation();
176
177 static void updateScrollbar(
178 GtkAdjustment* adj,
179 int zoom,
180 double value,
181 double presentationStart,
182 double presentationSize,
183 double windowSize
184 );
185 void updateScrollbars();
186 void updateZoom();
187 void updateRulers();
188 void updateTextbox();
189 void toolButtonToggled(GtkToggleButton* button);
190
192 // Scroom events
193
194 void on_newPresentationInterfaces_update(const std::map<NewPresentationInterface::Ptr, std::string>& newPresentationInterfaces);
197 void on_configure();
199 void on_zoombox_changed();
200 void on_textbox_value_changed(GtkEditable* editable);
201 void on_scrollbar_value_changed(GtkAdjustment* adjustment);
202 void on_scrollwheel(GdkEventScroll* event);
203 void on_buttonPress(GdkEventButton* event);
204 void on_buttonRelease(GdkEventButton* event);
205 void on_motion_notify(GdkEventMotion* event);
206 void setFullScreen();
207 void unsetFullScreen();
208
210 // ViewInterface
211
212 void invalidate() override;
214 void addSideWidget(std::string title, GtkWidget* w) override;
215 void removeSideWidget(GtkWidget* w) override;
216 void addToToolbar(GtkToolItem* ti) override;
217 void removeFromToolbar(GtkToolItem* ti) override;
219 void registerPostRenderer(PostRenderer::Ptr renderer) override;
220 void setStatusMessage(const std::string& message) override;
222 void addToolButton(GtkToggleButton* /*button*/, ToolStateListener::Ptr /*callback*/) override;
223
225 // Helpers
226
227private:
228 void updateTweaks();
232 void updateNewWindowMenu();
233 void on_zoombox_changed(int newzoom, const Scroom::Utils::Point<double>& mousePos);
234 void updateXY(const Scroom::Utils::Point<double>& newPos, const LocationChangeCause& source);
235};
#define require(expr)
Definition assertions.hh:30
const uint8_t value
Definition blob-tests.cc:114
Definition view.hh:44
bool set(value_type v)
Definition view.hh:63
void lock()
Definition view.hh:72
value_type value
Definition view.hh:50
Me & operator=(value_type v)
Definition view.hh:82
bool is_locked() const
Definition view.hh:79
Freezable(value_type v)
Definition view.hh:56
const value_type & get() const
Definition view.hh:61
void unlock()
Definition view.hh:74
unsigned locked
Definition view.hh:51
Me & operator-=(value_type v)
Definition view.hh:90
Me & operator+=(value_type v)
Definition view.hh:89
const value_type * operator->() const
Definition view.hh:88
T value_type
Definition view.hh:46
const value_type * operator*() const
Definition view.hh:87
Freezable()=default
std::shared_ptr< PostRenderer > Ptr
Definition viewinterface.hh:81
std::shared_ptr< PresentationInterface > Ptr
Definition presentationinterface.hh:73
std::shared_ptr< ProgressBarManager > Ptr
Definition progressbarmanager.hh:17
std::shared_ptr< ProgressInterface > Ptr
Definition progressinterface.hh:20
std::shared_ptr< Ruler > Ptr
Definition ruler.hh:19
Definition logger.hh:49
Definition utilities.hh:34
std::map< std::string, ITweakSelection::Ptr > Map
Definition tweak-view.hh:45
Definition point.hh:28
Definition rectangle.hh:29
std::shared_ptr< SelectionListener > Ptr
Definition viewinterface.hh:118
Definition sidebarmanager.hh:16
std::shared_ptr< ToolStateListener > Ptr
Definition viewinterface.hh:164
Definition viewinterface.hh:191
Definition view.hh:96
GtkDrawingArea * hruler_area
Definition view.hh:113
~View() override
Definition view.cc:137
void on_buttonRelease(GdkEventButton *event)
Definition view.cc:541
bool hasPresentation()
Definition view.cc:171
void clearPresentation()
Definition view.cc:173
void setFullScreen()
Definition view.cc:590
void on_presentation_destroyed()
Definition view.cc:402
void toolButtonToggled(GtkToggleButton *button)
Definition view.cc:346
void updateScrollbars()
Definition view.cc:256
static Ptr create(GtkBuilder *scroomXml, const PresentationInterface::Ptr &presentation)
Definition view.cc:124
void on_buttonPress(GdkEventButton *event)
Definition view.cc:519
std::optional< Selection > selection
Definition view.hh:132
std::shared_ptr< View > Ptr
Definition view.hh:98
View operator=(View &&)=delete
Scroom::Utils::ITweakSelection::Map tweakSelection
Definition view.hh:139
PresentationInterface::Ptr presentation
Definition view.hh:102
void updateTweaks()
Definition view.cc:178
GtkScrollbar * hscrollbar
Definition view.hh:110
GtkWidget * menubar
Definition view.hh:105
GtkWidget * statusArea
Definition view.hh:126
GtkBuilder * scroomXml
Definition view.hh:101
Scroom::Utils::Point< double > cachedPoint
Definition view.hh:142
Scroom::Logger logger
Definition view.hh:149
ProgressInterface::Ptr getProgressInterface() override
Definition view.cc:609
void addToToolbar(GtkToolItem *ti) override
Definition view.cc:615
void setStatusMessage(const std::string &message) override
Definition view.cc:646
void registerSelectionListener(SelectionListener::Ptr listener) override
Definition view.cc:642
void updateTextbox()
Definition view.cc:274
void updateZoom()
Definition view.cc:293
void on_configure()
Definition view.cc:404
GtkDrawingArea * vruler_area
Definition view.hh:114
void addSideWidget(std::string title, GtkWidget *w) override
Definition view.cc:611
void unsetFullScreen()
Definition view.cc:597
Freezable< Scroom::Utils::Point< double > > position
Definition view.hh:131
GtkComboBox * zoomBox
Definition view.hh:118
Ruler::Ptr hruler
Definition view.hh:116
GtkWindow * window
Definition view.hh:104
void on_scrollwheel(GdkEventScroll *event)
Definition view.cc:433
GtkAdjustment * hscrollbaradjustment
Definition view.hh:112
unsigned toolBarCount
Definition view.hh:128
GtkWidget * toolbarArea
Definition view.hh:127
std::vector< PostRenderer::Ptr > postRenderers
Definition view.hh:134
void redraw(cairo_t *cr)
Definition view.cc:143
Scroom::Utils::Point< double > tweakedPosition() const
Definition view.cc:804
PresentationInterface::Ptr getCurrentPresentation() override
Definition view.cc:652
int zoom
Definition view.hh:130
void registerPostRenderer(PostRenderer::Ptr renderer) override
Definition view.cc:644
std::shared_ptr< Scroom::Utils::ITweakRulers > tweakRulers
Definition view.hh:138
void removeSideWidget(GtkWidget *w) override
Definition view.cc:613
static void updateScrollbar(GtkAdjustment *adj, int zoom, double value, double presentationStart, double presentationSize, double windowSize)
Definition view.cc:231
void invalidate() override
Definition view.cc:607
void on_newPresentationInterfaces_update(const std::map< NewPresentationInterface::Ptr, std::string > &newPresentationInterfaces)
Definition view.cc:367
std::shared_ptr< Scroom::Utils::ITweakPresentationPosition > tweakPresentationPosition
Definition view.hh:136
Scroom::Utils::Point< int > drawingAreaSize
Definition view.hh:107
void on_window_size_changed(const Scroom::Utils::Point< int > &newSize)
Definition view.cc:421
GtkListStore * zoomItems
Definition view.hh:119
void on_zoombox_changed()
Definition view.cc:460
GtkEntry * xTextBox
Definition view.hh:124
ProgressBarManager::Ptr progressBarManager
Definition view.hh:144
std::shared_ptr< Scroom::Utils::ITweakPositionTextBox > tweakPositionTextBox
Definition view.hh:137
GtkEntry * yTextBox
Definition view.hh:125
GtkStatusbar * statusBar
Definition view.hh:121
View(const View &)=delete
Scroom::Utils::Point< double > windowPointToPresentationPoint(Scroom::Utils::Point< double > wp) const
Definition view.cc:687
Ruler::Ptr vruler
Definition view.hh:115
GtkToolItem * toolBarSeparator
Definition view.hh:123
GtkToolbar * toolBar
Definition view.hh:122
Scroom::Utils::Point< double > presentationPointToWindowPoint(Scroom::Utils::Point< double > presentationpoint) const
Definition view.cc:692
void on_presentation_created(const PresentationInterface::Ptr &p)
Definition view.cc:396
gint modifiermove
Definition view.hh:141
void on_textbox_value_changed(GtkEditable *editable)
Definition view.cc:489
GtkProgressBar * progressBar
Definition view.hh:120
GtkWidget * drawingArea
Definition view.hh:106
void updateXY(const Scroom::Utils::Point< double > &newPos, const LocationChangeCause &source)
Definition view.cc:779
void updateRulers()
Definition view.cc:335
Scroom::Utils::Rectangle< double > presentationRect
Definition view.hh:108
Scroom::Utils::WeakKeyMap< PresentationInterface::WeakPtr, GtkWidget * > presentations
Definition view.hh:146
void updateNewWindowMenu()
Definition view.cc:697
void on_scrollbar_value_changed(GtkAdjustment *adjustment)
Definition view.cc:503
void hide()
Definition view.cc:169
SidebarManager sidebarManager
Definition view.hh:103
View operator=(const View &)=delete
LocationChangeCause
Definition view.hh:153
@ SCROLLBAR
Definition view.hh:154
@ TEXTBOX
Definition view.hh:155
@ OTHER
Definition view.hh:156
void setPresentation(PresentationInterface::Ptr presentation)
Definition view.cc:190
void removeFromToolbar(GtkToolItem *ti) override
Definition view.cc:630
int statusBarContextId
Definition view.hh:129
void on_motion_notify(GdkEventMotion *event)
Definition view.cc:564
std::map< GtkToggleButton *, ToolStateListener::Ptr > tools
Definition view.hh:135
View(View &&)=delete
GtkScrollbar * vscrollbar
Definition view.hh:109
void addToolButton(GtkToggleButton *, ToolStateListener::Ptr) override
Definition view.cc:656
GtkAdjustment * vscrollbaradjustment
Definition view.hh:111
std::vector< SelectionListener::Ptr > selectionListeners
Definition view.hh:133
PresentationInterfaceStub::Ptr const p
Definition determine-size-test.cc:172
std::pair< GSourceFunc, gpointer > const w
Definition gtkhelper-tests.cc:42
std::map< K, V, std::owner_less< K > > WeakKeyMap
Definition utilities.hh:118
STL namespace.
cairo_t * cr
Definition transformpresentation_test.cc:72