Scroom 0.14-49-gb7ae7a6d
Loading...
Searching...
No Matches
View Class Reference

#include <view.hh>

Inheritance diagram for View:
Inheritance graph
Collaboration diagram for View:
Collaboration graph

Public Types

using Ptr = std::shared_ptr< View >
 
- Public Types inherited from ViewInterface
using Ptr = std::shared_ptr< ViewInterface >
 
using WeakPtr = std::weak_ptr< ViewInterface >
 

Public Member Functions

 ~View () override
 
 View (const View &)=delete
 
 View (View &&)=delete
 
View operator= (const View &)=delete
 
View operator= (View &&)=delete
 
void redraw (cairo_t *cr)
 
void hide ()
 
bool hasPresentation ()
 
void setPresentation (PresentationInterface::Ptr presentation)
 
void clearPresentation ()
 
void updateScrollbars ()
 
void updateZoom ()
 
void updateRulers ()
 
void updateTextbox ()
 
void toolButtonToggled (GtkToggleButton *button)
 
void on_newPresentationInterfaces_update (const std::map< NewPresentationInterface::Ptr, std::string > &newPresentationInterfaces)
 
void on_presentation_created (const PresentationInterface::Ptr &p)
 
void on_presentation_destroyed ()
 
void on_configure ()
 
void on_window_size_changed (const Scroom::Utils::Point< int > &newSize)
 
void on_zoombox_changed ()
 
void on_textbox_value_changed (GtkEditable *editable)
 
void on_scrollbar_value_changed (GtkAdjustment *adjustment)
 
void on_scrollwheel (GdkEventScroll *event)
 
void on_buttonPress (GdkEventButton *event)
 
void on_buttonRelease (GdkEventButton *event)
 
void on_motion_notify (GdkEventMotion *event)
 
void setFullScreen ()
 
void unsetFullScreen ()
 
void invalidate () override
 
ProgressInterface::Ptr getProgressInterface () override
 
void addSideWidget (std::string title, GtkWidget *w) override
 
void removeSideWidget (GtkWidget *w) override
 
void addToToolbar (GtkToolItem *ti) override
 
void removeFromToolbar (GtkToolItem *ti) override
 
void registerSelectionListener (SelectionListener::Ptr listener) override
 
void registerPostRenderer (PostRenderer::Ptr renderer) override
 
void setStatusMessage (const std::string &message) override
 
PresentationInterface::Ptr getCurrentPresentation () override
 
void addToolButton (GtkToggleButton *, ToolStateListener::Ptr) override
 
- Public Member Functions inherited from Scroom::Utils::Base
 Base ()=default
 
 Base (const Base &)=delete
 
 Base (Base &&)=delete
 
Baseoperator= (const Base &)=delete
 
Baseoperator= (Base &&)=delete
 
virtual ~Base ()=default
 
template<typename R >
std::shared_ptr< R > shared_from_this ()
 
template<typename R >
std::shared_ptr< R const > shared_from_this () const
 

Static Public Member Functions

static Ptr create (GtkBuilder *scroomXml, const PresentationInterface::Ptr &presentation)
 
static void updateScrollbar (GtkAdjustment *adj, int zoom, double value, double presentationStart, double presentationSize, double windowSize)
 

Private Types

enum  LocationChangeCause { SCROLLBAR , TEXTBOX , OTHER }
 

Private Member Functions

 View (GtkBuilder *scroomXml)
 
void updateTweaks ()
 
Scroom::Utils::Point< double > windowPointToPresentationPoint (Scroom::Utils::Point< double > wp) const
 
Scroom::Utils::Point< double > presentationPointToWindowPoint (Scroom::Utils::Point< double > presentationpoint) const
 
Scroom::Utils::Point< double > tweakedPosition () const
 
void updateNewWindowMenu ()
 
void on_zoombox_changed (int newzoom, const Scroom::Utils::Point< double > &mousePos)
 
void updateXY (const Scroom::Utils::Point< double > &newPos, const LocationChangeCause &source)
 

Private Attributes

GtkBuilder * scroomXml
 
PresentationInterface::Ptr presentation
 
SidebarManager sidebarManager
 
GtkWindow * window
 
GtkWidget * menubar
 
GtkWidget * drawingArea
 
Scroom::Utils::Point< int > drawingAreaSize
 
Scroom::Utils::Rectangle< double > presentationRect
 
GtkScrollbar * vscrollbar
 
GtkScrollbar * hscrollbar
 
GtkAdjustment * vscrollbaradjustment
 
GtkAdjustment * hscrollbaradjustment
 
GtkDrawingArea * hruler_area
 
GtkDrawingArea * vruler_area
 
Ruler::Ptr vruler
 
Ruler::Ptr hruler
 
GtkComboBox * zoomBox
 
GtkListStore * zoomItems
 
GtkProgressBar * progressBar
 
GtkStatusbar * statusBar
 
GtkToolbar * toolBar
 
GtkToolItem * toolBarSeparator
 
GtkEntry * xTextBox
 
GtkEntry * yTextBox
 
GtkWidget * statusArea
 
GtkWidget * toolbarArea
 
unsigned toolBarCount
 
int statusBarContextId
 
int zoom {0}
 
Freezable< Scroom::Utils::Point< double > > position
 
std::optional< Selectionselection
 
std::vector< SelectionListener::PtrselectionListeners
 
std::vector< PostRenderer::PtrpostRenderers
 
std::map< GtkToggleButton *, ToolStateListener::Ptrtools
 
std::shared_ptr< Scroom::Utils::ITweakPresentationPositiontweakPresentationPosition
 
std::shared_ptr< Scroom::Utils::ITweakPositionTextBoxtweakPositionTextBox
 
std::shared_ptr< Scroom::Utils::ITweakRulerstweakRulers
 
Scroom::Utils::ITweakSelection::Map tweakSelection
 
gint modifiermove {0}
 
Scroom::Utils::Point< double > cachedPoint
 
ProgressBarManager::Ptr progressBarManager
 
Scroom::Utils::WeakKeyMap< PresentationInterface::WeakPtr, GtkWidget * > presentations
 
Scroom::Logger logger
 

Member Typedef Documentation

◆ Ptr

using View::Ptr = std::shared_ptr<View>

Member Enumeration Documentation

◆ LocationChangeCause

Enumerator
SCROLLBAR 
TEXTBOX 
OTHER 
153 {
154 SCROLLBAR,
155 TEXTBOX,
156 OTHER
157 };
@ SCROLLBAR
Definition view.hh:154
@ TEXTBOX
Definition view.hh:155
@ OTHER
Definition view.hh:156

Constructor & Destructor Documentation

◆ View() [1/3]

View::View ( GtkBuilder *  scroomXml)
explicitprivate
73 : scroomXml(scroomXml_)
78{
80 window = GTK_WINDOW(GTK_WIDGET(gtk_builder_get_object(scroomXml_, "scroom")));
81 drawingArea = GTK_WIDGET(gtk_builder_get_object(scroomXml_, "drawingarea"));
82 vscrollbar = GTK_SCROLLBAR(GTK_WIDGET(gtk_builder_get_object(scroomXml_, "vscrollbar")));
83 hscrollbar = GTK_SCROLLBAR(GTK_WIDGET(gtk_builder_get_object(scroomXml_, "hscrollbar")));
84 vscrollbaradjustment = gtk_range_get_adjustment(GTK_RANGE(vscrollbar));
85 hscrollbaradjustment = gtk_range_get_adjustment(GTK_RANGE(hscrollbar));
86 vruler_area = GTK_DRAWING_AREA(GTK_WIDGET(gtk_builder_get_object(scroomXml_, "vruler_area")));
87 hruler_area = GTK_DRAWING_AREA(GTK_WIDGET(gtk_builder_get_object(scroomXml_, "hruler_area")));
88 xTextBox = GTK_ENTRY(GTK_WIDGET(gtk_builder_get_object(scroomXml_, "x_textbox")));
89 yTextBox = GTK_ENTRY(GTK_WIDGET(gtk_builder_get_object(scroomXml_, "y_textbox")));
90
91 // Create rulers and attach ruler areas to them
94
95 menubar = GTK_WIDGET(gtk_builder_get_object(scroomXml_, "menubar"));
96 statusArea = GTK_WIDGET(gtk_builder_get_object(scroomXml_, "status_area"));
97 toolbarArea = GTK_WIDGET(gtk_builder_get_object(scroomXml_, "toolbar_area"));
98
99 zoomBox = GTK_COMBO_BOX(GTK_WIDGET(gtk_builder_get_object(scroomXml_, "zoomboxcombo")));
100 zoomItems = gtk_list_store_new(N_COLUMNS, G_TYPE_STRING, G_TYPE_INT);
101
102 gtk_combo_box_set_model(zoomBox, GTK_TREE_MODEL(zoomItems));
103 GtkCellRenderer* txt = GTK_CELL_RENDERER(gtk_cell_renderer_text_new());
104 gtk_cell_layout_pack_end(GTK_CELL_LAYOUT(zoomBox), txt, true);
105 gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(zoomBox), txt, "text", COLUMN_TEXT, NULL);
106
107 progressBar = GTK_PROGRESS_BAR(GTK_WIDGET(gtk_builder_get_object(scroomXml_, "progressbar")));
109 statusBar = GTK_STATUSBAR(GTK_WIDGET(gtk_builder_get_object(scroomXml_, "statusbar")));
110 statusBarContextId = gtk_statusbar_get_context_id(statusBar, "View");
111
112 GtkWidget* panelWindow = GTK_WIDGET(gtk_builder_get_object(scroomXml_, "panelWindow"));
113 GtkBox* panel = GTK_BOX(GTK_WIDGET(gtk_builder_get_object(scroomXml_, "panel")));
114 sidebarManager.setWidgets(panelWindow, panel);
115 toolBar = GTK_TOOLBAR(GTK_WIDGET(gtk_builder_get_object(scroomXml_, "toolbar")));
116 toolBarSeparator = nullptr;
117 toolBarCount = 0;
118
119 on_newPresentationInterfaces_update(pluginManager->getNewPresentationInterfaces());
121 on_configure();
122}
std::shared_ptr< PluginManager > Ptr
Definition pluginmanager.hh:45
static PluginManager::Ptr getInstance()
Definition pluginmanager.cc:334
static Ptr create(GtkProgressBar *progressBar=nullptr)
Definition progressbarmanager.cc:116
static Ptr create(Orientation orientation, GtkWidget *drawArea)
Definition ruler.cc:12
@ VERTICAL
Definition ruler.hh:24
@ HORIZONTAL
Definition ruler.hh:23
void setWidgets(GtkWidget *panelWindow, GtkBox *panel)
Definition sidebarmanager.cc:15
GtkDrawingArea * hruler_area
Definition view.hh:113
Scroom::Utils::ITweakSelection::Map tweakSelection
Definition view.hh:139
GtkScrollbar * hscrollbar
Definition view.hh:110
GtkWidget * menubar
Definition view.hh:105
GtkWidget * statusArea
Definition view.hh:126
GtkBuilder * scroomXml
Definition view.hh:101
void on_configure()
Definition view.cc:404
GtkDrawingArea * vruler_area
Definition view.hh:114
GtkComboBox * zoomBox
Definition view.hh:118
Ruler::Ptr hruler
Definition view.hh:116
GtkWindow * window
Definition view.hh:104
GtkAdjustment * hscrollbaradjustment
Definition view.hh:112
unsigned toolBarCount
Definition view.hh:128
GtkWidget * toolbarArea
Definition view.hh:127
std::shared_ptr< Scroom::Utils::ITweakRulers > tweakRulers
Definition view.hh:138
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
GtkListStore * zoomItems
Definition view.hh:119
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
Ruler::Ptr vruler
Definition view.hh:115
GtkToolItem * toolBarSeparator
Definition view.hh:123
GtkToolbar * toolBar
Definition view.hh:122
GtkProgressBar * progressBar
Definition view.hh:120
GtkWidget * drawingArea
Definition view.hh:106
void updateNewWindowMenu()
Definition view.cc:697
SidebarManager sidebarManager
Definition view.hh:103
int statusBarContextId
Definition view.hh:129
GtkScrollbar * vscrollbar
Definition view.hh:109
GtkAdjustment * vscrollbaradjustment
Definition view.hh:111
ITweakRulers::Ptr getDefaultTweakRulers()
Definition tweak-view.cc:209
ITweakSelection::Map getDefaultTweakSelectionMap()
Definition tweak-view.cc:211
ITweakPositionTextBox::Ptr getDefaultTweakPositionTextBox()
Definition tweak-view.cc:215
ITweakPresentationPosition::Ptr getDefaultTweakPresentationPosition()
Definition tweak-view.cc:205
static PluginManager::Ptr pluginManager
Definition pluginmanager.cc:29
@ N_COLUMNS
Definition view.cc:46
@ COLUMN_TEXT
Definition view.cc:44
Here is the call graph for this function:

◆ ~View()

View::~View ( )
override
138{
139 logger->debug("Destroying view...");
140 gtk_widget_destroy(GTK_WIDGET(window));
141}
Scroom::Logger logger
Definition view.hh:149

◆ View() [2/3]

View::View ( const View )
delete

◆ View() [3/3]

View::View ( View &&  )
delete

Member Function Documentation

◆ addSideWidget()

void View::addSideWidget ( std::string  title,
GtkWidget *  w 
)
overridevirtual

Request that the given widget be added to the sidebar.

Precondition
Should be called from within a Gdk critical section (i.e. between gdk_threads_enter() and gdk_threads_leave() calls)

Implements ViewInterface.

611{ sidebarManager.addSideWidget(title, w); }
void addSideWidget(const std::string &title, GtkWidget *w)
Definition sidebarmanager.cc:21
std::pair< GSourceFunc, gpointer > const w
Definition gtkhelper-tests.cc:42
Here is the call graph for this function:

◆ addToolButton()

void View::addToolButton ( GtkToggleButton *  ,
ToolStateListener::Ptr   
)
overridevirtual

Adds a new tool button to the toolbar. The given ToolStateListener will be informed when the tool is turned on or off. Only one tool will be active at the same time.

See also
ToolStateListener

Implements ViewInterface.

657{
659 [=, this]
660 {
661 GtkToolItem* toolItem = gtk_tool_item_new();
662 gtk_container_add(GTK_CONTAINER(toolItem), GTK_WIDGET(button));
663 gtk_widget_set_visible(GTK_WIDGET(button), true);
664 g_signal_connect(static_cast<gpointer>(button), "toggled", G_CALLBACK(tool_button_toggled), this);
665
666 addToToolbar(toolItem);
667
668 tools[button] = callback;
669 if(tools.size() == 1)
670 {
671 gtk_toggle_button_set_active(button, true);
672 gtk_widget_set_sensitive(GTK_WIDGET(button), false);
673 callback->onEnable();
674 }
675 else
676 {
677 gtk_toggle_button_set_active(button, false);
678 gtk_widget_set_sensitive(GTK_WIDGET(button), true);
679 }
680 }
681 );
682}
void addToToolbar(GtkToolItem *ti) override
Definition view.cc:615
std::map< GtkToggleButton *, ToolStateListener::Ptr > tools
Definition view.hh:135
void sync_on_ui_thread(T f)
Definition gtk-helpers.hh:59
static void tool_button_toggled(GtkToggleButton *button, gpointer data)
Definition view.cc:654
Here is the call graph for this function:

◆ addToToolbar()

void View::addToToolbar ( GtkToolItem *  ti)
overridevirtual

Request that the given tool item be added to the toolbar.

Precondition
Should be called from within a Gdk critical section (i.e. between gdk_threads_enter() and gdk_threads_leave() calls)

Implements ViewInterface.

616{
617 if(toolBarCount == 0)
618 {
619 toolBarSeparator = gtk_separator_tool_item_new();
620 g_object_set(G_OBJECT(toolBarSeparator), "visible", true, "draw", true, NULL);
621 gtk_toolbar_insert(toolBar, toolBarSeparator, -1);
622 }
623
624 g_object_set(G_OBJECT(ti), "visible", true, NULL);
625
626 gtk_toolbar_insert(toolBar, ti, -1);
627 toolBarCount++;
628}

Referenced by addToolButton().

Here is the caller graph for this function:

◆ clearPresentation()

void View::clearPresentation ( )
174{
176}
std::shared_ptr< PresentationInterface > Ptr
Definition presentationinterface.hh:73
void setPresentation(PresentationInterface::Ptr presentation)
Definition view.cc:190

Referenced by on_view_destroyed().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ create()

View::Ptr View::create ( GtkBuilder *  scroomXml,
const PresentationInterface::Ptr presentation 
)
static
125{
126 Ptr view(new View(scroomXml));
127 view->logger->debug("Creating a new view");
128
129 if(presentation)
130 {
131 view->setPresentation(presentation);
132 }
133
134 return view;
135}
Definition view.hh:96
std::shared_ptr< View > Ptr
Definition view.hh:98
PresentationInterface::Ptr presentation
Definition view.hh:102
const auto view
Definition pipette-tests.cc:227

Referenced by create_scroom().

Here is the caller graph for this function:

◆ getCurrentPresentation()

PresentationInterface::Ptr View::getCurrentPresentation ( )
overridevirtual

Returns a shared pointer to the current presentation.

See also
PresentationInterface

Implements ViewInterface.

652{ return presentation; }

◆ getProgressInterface()

ProgressInterface::Ptr View::getProgressInterface ( )
overridevirtual

Return a pointer to the progess interface associated with the View

Note
The progress bar should only be manipulated from within a Gdk critical section (i.e. between gdk_threads_enter() and gdk_threads_leave() calls)

Implements ViewInterface.

609{ return progressBarManager; }

◆ hasPresentation()

bool View::hasPresentation ( )
171{ return presentation != nullptr; }

◆ hide()

void View::hide ( )
169{ gtk_widget_hide(GTK_WIDGET(window)); }

Referenced by on_close_activate().

Here is the caller graph for this function:

◆ invalidate()

void View::invalidate ( )
overridevirtual

Request that the window content is redrawn.

Precondition
Should be called from within a Gdk critical section (i.e. between gdk_threads_enter() and gdk_threads_leave() calls)

Implements ViewInterface.

607{ gdk_window_invalidate_rect(gtk_widget_get_window(drawingArea), nullptr, false); }

Referenced by on_buttonRelease(), on_motion_notify(), on_window_size_changed(), on_zoombox_changed(), setPresentation(), and updateXY().

Here is the caller graph for this function:

◆ on_buttonPress()

void View::on_buttonPress ( GdkEventButton *  event)
520{
521 if(event->button == 1 && modifiermove == 0)
522 {
523 // Begin left-dragging
524 modifiermove = GDK_BUTTON1_MASK;
525 cachedPoint = eventToPoint(event);
526 }
527 else if(event->button == 3)
528 {
529 auto point = windowPointToPresentationPoint(eventToPoint(event));
530 selection = point;
531 for(const auto& listener: selectionListeners)
532 {
533 auto f = tweakSelection.find(listener->getSelectionType());
534 auto tweaker = f == tweakSelection.end() ? tweakSelection.at(SelectionType::DEFAULT) : f->second;
535 const auto tweakedSelection = tweaker->tweakSelection(*selection);
536 listener->onSelectionStart(tweakedSelection, shared_from_this<ViewInterface>());
537 }
538 }
539}
std::optional< Selection > selection
Definition view.hh:132
Scroom::Utils::Point< double > cachedPoint
Definition view.hh:142
Scroom::Utils::Point< double > windowPointToPresentationPoint(Scroom::Utils::Point< double > wp) const
Definition view.cc:687
gint modifiermove
Definition view.hh:141
std::vector< SelectionListener::Ptr > selectionListeners
Definition view.hh:133
f
Definition gtkhelper-tests.cc:43
const std::string DEFAULT(GRID)
Scroom::Utils::Point< double > eventToPoint(GdkEventButton *event)
Definition view.cc:54

Referenced by on_button_press_event().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ on_buttonRelease()

void View::on_buttonRelease ( GdkEventButton *  event)
542{
543 if(event->button == 1 && modifiermove == GDK_BUTTON1_MASK)
544 {
545 // End left-dragging
546 modifiermove = 0;
547 cachedPoint.x = 0;
548 cachedPoint.y = 0;
549 }
550 else if(event->button == 3 && selection)
551 {
553 for(const auto& listener: selectionListeners)
554 {
555 auto f = tweakSelection.find(listener->getSelectionType());
556 auto tweaker = f == tweakSelection.end() ? tweakSelection.at(SelectionType::DEFAULT) : f->second;
557 const auto tweakedSelection = tweaker->tweakSelection(*selection);
558 listener->onSelectionEnd(tweakedSelection, shared_from_this<ViewInterface>());
559 }
560 invalidate();
561 }
562}
value_type y
Definition point.hh:112
value_type x
Definition point.hh:111
void invalidate() override
Definition view.cc:607

Referenced by on_button_release_event().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ on_configure()

void View::on_configure ( )
405{
406 // There should be a simpler way to do this...
407 cairo_region_t* r = gdk_window_get_visible_region(gtk_widget_get_window(drawingArea));
408 cairo_rectangle_int_t rect;
409 cairo_region_get_extents(r, &rect);
410
411 Scroom::Utils::Point<int> const newSize(rect.width, rect.height);
412
413 if(drawingAreaSize != newSize)
414 {
415 on_window_size_changed(newSize);
416 }
417
418 cairo_region_destroy(r);
419}
Definition point.hh:28
Scroom::Utils::Point< int > drawingAreaSize
Definition view.hh:107
void on_window_size_changed(const Scroom::Utils::Point< int > &newSize)
Definition view.cc:421
const auto rect
Definition rectangletests.cc:335
Scroom::Utils::Rectangle< double > const r
Definition transformpresentation_test.cc:65

Referenced by on_drawingarea_configure_event(), and View().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ on_motion_notify()

void View::on_motion_notify ( GdkEventMotion *  event)
565{
566 if((event->state & GDK_BUTTON1_MASK) && modifiermove == GDK_BUTTON1_MASK)
567 {
568 auto mousePos = eventToPoint(event);
569
570 const auto pixelSize = pixelSizeFromZoom(zoom);
571 const auto newPos = position - (mousePos - cachedPoint) / pixelSize;
572 cachedPoint = mousePos;
573
574 updateXY(newPos, OTHER);
575 }
576 else if((event->state & GDK_BUTTON3_MASK) && selection)
577 {
579 for(const auto& listener: selectionListeners)
580 {
581 auto f = tweakSelection.find(listener->getSelectionType());
582 auto tweaker = f == tweakSelection.end() ? tweakSelection.at(SelectionType::DEFAULT) : f->second;
583 const auto tweakedSelection = tweaker->tweakSelection(*selection);
584 listener->onSelectionUpdate(tweakedSelection, shared_from_this<ViewInterface>());
585 }
586 invalidate();
587 }
588}
double pixelSizeFromZoom(int zoom)
Definition cairo-helpers.cc:123
Freezable< Scroom::Utils::Point< double > > position
Definition view.hh:131
int zoom
Definition view.hh:130
void updateXY(const Scroom::Utils::Point< double > &newPos, const LocationChangeCause &source)
Definition view.cc:779

Referenced by on_motion_notify_event().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ on_newPresentationInterfaces_update()

void View::on_newPresentationInterfaces_update ( const std::map< NewPresentationInterface::Ptr, std::string > &  newPresentationInterfaces)
370{
371 GtkWidget* new_menu_item = GTK_WIDGET(gtk_builder_get_object(scroomXml, "new"));
372
373 if(newPresentationInterfaces.empty())
374 {
375 gtk_widget_set_sensitive(new_menu_item, false);
376 gtk_menu_item_set_submenu(GTK_MENU_ITEM(new_menu_item), nullptr);
377 }
378 else
379 {
380 gtk_widget_set_sensitive(new_menu_item, true);
381
382 GtkWidget* new_menu = gtk_menu_new();
383 gtk_menu_item_set_submenu(GTK_MENU_ITEM(new_menu_item), new_menu);
384
385 for(auto cur = newPresentationInterfaces.begin(); cur != newPresentationInterfaces.end(); cur++)
386 {
387 GtkWidget* menu_item = gtk_menu_item_new_with_label(cur->second.c_str());
388 gtk_widget_show(menu_item);
389 gtk_container_add(GTK_CONTAINER(new_menu), menu_item);
390
391 g_signal_connect(static_cast<gpointer>(menu_item), "activate", G_CALLBACK(on_new_activate), cur->first.get());
392 }
393 }
394}
void on_new_activate(GtkMenuItem *, gpointer user_data)
Definition callbacks.cc:91

Referenced by View().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ on_presentation_created()

void View::on_presentation_created ( const PresentationInterface::Ptr p)
397{
398 presentations[p] = nullptr;
400}
Scroom::Utils::WeakKeyMap< PresentationInterface::WeakPtr, GtkWidget * > presentations
Definition view.hh:146
PresentationInterfaceStub::Ptr const p
Definition determine-size-test.cc:172
Here is the call graph for this function:

◆ on_presentation_destroyed()

void View::on_presentation_destroyed ( )
Here is the call graph for this function:

◆ on_scrollbar_value_changed()

void View::on_scrollbar_value_changed ( GtkAdjustment *  adjustment)
504{
505 auto newPos = position.get();
506
507 if(adjustment == vscrollbaradjustment)
508 {
509 newPos.y = gtk_adjustment_get_value(adjustment);
510 }
511 else
512 {
513 newPos.x = gtk_adjustment_get_value(adjustment);
514 }
515
516 updateXY(newPos, SCROLLBAR);
517}
const value_type & get() const
Definition view.hh:61

Referenced by on_scrollbar_value_changed().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ on_scrollwheel()

void View::on_scrollwheel ( GdkEventScroll *  event)
434{
435 if(event->direction == GDK_SCROLL_UP || event->direction == GDK_SCROLL_DOWN)
436 {
437 int newZoom = zoom + ((event->direction == GDK_SCROLL_UP) ? 1 : -1);
438 newZoom = std::min(MaxZoom, newZoom);
439
440 GtkTreeIter iter;
441 for(
442 bool valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(zoomItems), &iter); valid;
443 valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(zoomItems), &iter)
444 )
445 {
446 GValue value = G_VALUE_INIT;
447 gtk_tree_model_get_value(GTK_TREE_MODEL(zoomItems), &iter, COLUMN_ZOOM, &value);
448 const int foundZoom = g_value_get_int(&value);
449
450 if(foundZoom == newZoom)
451 {
452 on_zoombox_changed(newZoom, {event->x, event->y});
453 gtk_combo_box_set_active_iter(zoomBox, &iter);
454 break;
455 }
456 }
457 }
458}
const uint8_t value
Definition blob-tests.cc:114
void on_zoombox_changed()
Definition view.cc:460
@ COLUMN_ZOOM
Definition view.cc:45
#define G_VALUE_INIT
Definition view.cc:28
static const int MaxZoom
Definition view.cc:40

Referenced by on_scroll_event().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ on_textbox_value_changed()

void View::on_textbox_value_changed ( GtkEditable *  editable)
490{
491 try
492 {
493 auto newPos = tweakPositionTextBox->parse(gtk_entry_get_text(xTextBox), gtk_entry_get_text(yTextBox), drawingAreaSize, zoom);
494
495 updateXY(newPos, TEXTBOX);
496 }
497 catch(boost::bad_lexical_cast& ex)
498 {
499 // User typed something invalid, probably a letter. Ignore...
500 }
501}

Referenced by on_textbox_value_changed().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ on_window_size_changed()

void View::on_window_size_changed ( const Scroom::Utils::Point< int > &  newSize)
422{
423 auto pixelSize = pixelSizeFromZoom(zoom);
424 position += (drawingAreaSize - newSize) / pixelSize / 2;
425
426 std::scoped_lock const protect_position(position);
427 drawingAreaSize = newSize;
428 updateZoom();
430 invalidate();
431}
void updateScrollbars()
Definition view.cc:256
void updateZoom()
Definition view.cc:293

Referenced by on_configure().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ on_zoombox_changed() [1/2]

void View::on_zoombox_changed ( )
461{
462 GtkTreeIter iter;
463 GValue value = G_VALUE_INIT;
464 gtk_combo_box_get_active_iter(zoomBox, &iter);
465
466 if(gtk_list_store_iter_is_valid(zoomItems, &iter))
467 {
468 gtk_tree_model_get_value(GTK_TREE_MODEL(zoomItems), &iter, COLUMN_ZOOM, &value);
469 const int newZoom = g_value_get_int(&value);
470 on_zoombox_changed(newZoom, drawingAreaSize.to<double>() / 2);
471 }
472}
Point< U > to() const
Definition point.hh:103

Referenced by on_scrollwheel(), on_zoombox_changed(), and on_zoombox_changed().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ on_zoombox_changed() [2/2]

void View::on_zoombox_changed ( int  newzoom,
const Scroom::Utils::Point< double > &  mousePos 
)
private
475{
476 if(newzoom != zoom)
477 {
478 position += mousePos / pixelSizeFromZoom(zoom);
479 position -= mousePos / pixelSizeFromZoom(newzoom);
480
481 std::scoped_lock const protect_position(position);
482 zoom = newzoom;
485 invalidate();
486 }
487}
void updateTextbox()
Definition view.cc:274
Here is the call graph for this function:

◆ operator=() [1/2]

View View::operator= ( const View )
delete

◆ operator=() [2/2]

View View::operator= ( View &&  )
delete

◆ presentationPointToWindowPoint()

Scroom::Utils::Point< double > View::presentationPointToWindowPoint ( Scroom::Utils::Point< double >  presentationpoint) const
private
693{
694 return (presentationpoint - tweakedPosition()) * pixelSizeFromZoom(zoom);
695}
Scroom::Utils::Point< double > tweakedPosition() const
Definition view.cc:804
Here is the call graph for this function:

◆ redraw()

void View::redraw ( cairo_t *  cr)
144{
145 if(presentation)
146 {
147 const double pixelSize = pixelSizeFromZoom(zoom);
148 Scroom::Utils::Point<double> const visibleRegionSize = drawingAreaSize.to<double>() / pixelSize;
149
150 auto rect = Scroom::Utils::make_rect(tweakedPosition(), visibleRegionSize);
151
152 presentation->redraw(shared_from_this<View>(), cr, rect, zoom);
153 for(const auto& renderer: postRenderers)
154 {
155 renderer->render(shared_from_this<View>(), cr, rect, zoom);
156 }
157 }
158 else
159 {
160 // A logo here would be nice...
161
162 // char buffer[] = "View says \"Hi\"";
163 //
164 // cairo_move_to(cr, 50, 50);
165 // cairo_show_text(cr, buffer);
166 }
167}
std::vector< PostRenderer::Ptr > postRenderers
Definition view.hh:134
Rectangle< T > make_rect(T x, T y, T width, T height)
Definition rectangle.hh:284
cairo_t * cr
Definition transformpresentation_test.cc:72

Referenced by on_drawingarea_expose_event().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ registerPostRenderer()

void View::registerPostRenderer ( PostRenderer::Ptr  )
overridevirtual

Register a postrenderer to be updated whenever a redraw occurs. When this happens, the 'render' function gets called on the instance that is passed to the given instance.

Note that the order in which different registered instances get updated is the order in which they register to the view. This order remains constant throughout the view's lifetime.

See also
PostRenderer

Implements ViewInterface.

644{ postRenderers.push_back(renderer); }

◆ registerSelectionListener()

void View::registerSelectionListener ( SelectionListener::Ptr  )
overridevirtual

Register a SelectionListener to be updated whenever the user selects a region . When the user changes the selection, various functions on the given instance are called.

See also
SelectionListener

Implements ViewInterface.

642{ selectionListeners.push_back(listener); }

◆ removeFromToolbar()

void View::removeFromToolbar ( GtkToolItem *  ti)
overridevirtual

Request that the given tool item be removed from the toolbar.

Precondition
Should be called from within a Gdk critical section (i.e. between gdk_threads_enter() and gdk_threads_leave() calls)

Implements ViewInterface.

631{
632 gtk_container_remove(GTK_CONTAINER(toolBar), GTK_WIDGET(ti));
633 toolBarCount--;
634
635 if(toolBarCount == 0)
636 {
637 gtk_container_remove(GTK_CONTAINER(toolBar), GTK_WIDGET(toolBarSeparator));
638 toolBarSeparator = nullptr;
639 }
640}

◆ removeSideWidget()

void View::removeSideWidget ( GtkWidget *  w)
overridevirtual

Request that the given widget be removed from the sidebar.

Precondition
Should be called from within a Gdk critical section (i.e. between gdk_threads_enter() and gdk_threads_leave() calls)

Implements ViewInterface.

void removeSideWidget(GtkWidget *w)
Definition sidebarmanager.cc:35
Here is the call graph for this function:

◆ setFullScreen()

void View::setFullScreen ( )
591{
592 gtk_window_fullscreen(window);
593 gtk_widget_set_visible(toolbarArea, false);
594 gtk_widget_set_visible(statusArea, false);
595}

◆ setPresentation()

void View::setPresentation ( PresentationInterface::Ptr  presentation)
191{
192 View::Ptr const me = shared_from_this<View>();
193
194 if(presentation)
195 {
196 presentation->close(me);
197 presentation.reset();
198 }
199
200 presentation = std::move(presentation_);
201
202 if(presentation)
203 {
204 presentation->open(me);
205 presentationRect = presentation->getRect();
206 std::string s = presentation->getTitle();
207
208 updateTweaks();
209
210 if(!s.empty())
211 {
212 s = "Scroom - " + s;
213 }
214 else
215 {
216 s = "Scroom";
217 }
218 gtk_window_set_title(window, s.c_str());
219 }
220
221 zoom = 0;
222 const double pixelSize = pixelSizeFromZoom(zoom);
223 position = -drawingAreaSize.to<double>() / pixelSize / 2;
224
225 updateZoom();
228 invalidate();
229}
void updateTweaks()
Definition view.cc:178
Scroom::Utils::Rectangle< double > presentationRect
Definition view.hh:108
BitmapSurface::Ptr const s
Definition transformpresentation_test.cc:70

Referenced by clearPresentation().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ setStatusMessage()

void View::setStatusMessage ( const std::string &  )
overridevirtual

Sets the status message in the status bar of the application.

Implements ViewInterface.

647{
648 gtk_statusbar_pop(statusBar, statusBarContextId);
649 gtk_statusbar_push(statusBar, statusBarContextId, message.c_str());
650}

◆ toolButtonToggled()

void View::toolButtonToggled ( GtkToggleButton *  button)
347{
348 if(gtk_toggle_button_get_active(button))
349 {
350 for(const auto& tool: tools)
351 {
352 if(tool.first != button && gtk_toggle_button_get_active(tool.first))
353 {
354 gtk_toggle_button_set_active(tool.first, false);
355 gtk_widget_set_sensitive(GTK_WIDGET(tool.first), true);
356 tools[tool.first]->onDisable();
357 }
358 }
359 gtk_widget_set_sensitive(GTK_WIDGET(button), false);
360 tools[button]->onEnable();
361 }
362}

◆ tweakedPosition()

Scroom::Utils::Point< double > View::tweakedPosition ( ) const
private
805{
807}

Referenced by presentationPointToWindowPoint(), redraw(), updateRulers(), and windowPointToPresentationPoint().

Here is the caller graph for this function:

◆ unsetFullScreen()

void View::unsetFullScreen ( )
598{
599 gtk_window_unfullscreen(window);
600 gtk_widget_set_visible(toolbarArea, true);
601 gtk_widget_set_visible(statusArea, true);
602}

◆ updateNewWindowMenu()

void View::updateNewWindowMenu ( )
private
698{
699 GtkWidget* newWindow_menu_item = GTK_WIDGET(gtk_builder_get_object(scroomXml, "newWindow"));
700
701 GtkWidget* newWindow_menu = gtk_menu_item_get_submenu(GTK_MENU_ITEM(newWindow_menu_item));
702 if(!newWindow_menu)
703 {
704 newWindow_menu = gtk_menu_new();
705 }
706 g_object_ref_sink(G_OBJECT(newWindow_menu));
707
708 auto cur = presentations.begin();
709 auto end = presentations.end();
710
711 while(cur != end)
712 {
713 auto next = cur;
714 next++;
715
717 PresentationInterface::Ptr const p = cur->first.lock();
718 GtkWidget* m = cur->second;
719 if(p && m)
720 {
721 // Do nothing
722 }
723 else if(p && !m)
724 {
725 // Add a menu item
726 std::string s = p->getTitle();
727 if(s.empty())
728 {
729 s = "Default";
730 }
731 m = gtk_menu_item_new_with_label(s.c_str());
732 gtk_widget_show(m);
733 cur->second = m;
734 gtk_container_add(GTK_CONTAINER(newWindow_menu), m);
735
736 g_signal_connect(
737 static_cast<gpointer>(m),
738 "activate",
739 G_CALLBACK(on_newWindow_activate),
740 const_cast<PresentationInterface::WeakPtr*>(&cur->first)
741 );
742 }
743 else if(!p && m)
744 {
745 // Remove menu item, then remove this element from the map
746 cur->second = nullptr;
747 gtk_widget_destroy(m);
748 presentations.erase(cur);
749 }
750 else if(!p && !m)
751 {
752 // Remove this element from the map (menu already gone)
753 presentations.erase(cur);
754 }
755 else
756 {
757 // This cannot happen
758 defect();
759 }
761
762 cur = next;
763 }
764
765 if(presentations.empty())
766 {
767 gtk_widget_set_sensitive(newWindow_menu_item, false);
768 gtk_menu_item_set_submenu(GTK_MENU_ITEM(newWindow_menu_item), nullptr);
769 }
770 else
771 {
772 gtk_widget_set_sensitive(newWindow_menu_item, true);
773 gtk_menu_item_set_submenu(GTK_MENU_ITEM(newWindow_menu_item), newWindow_menu);
774 }
775
776 g_object_unref(G_OBJECT(newWindow_menu));
777}
#define defect()
Definition assertions.hh:45
std::weak_ptr< PresentationInterface > WeakPtr
Definition presentationinterface.hh:74

Referenced by on_presentation_created(), on_presentation_destroyed(), and View().

Here is the caller graph for this function:

◆ updateRulers()

void View::updateRulers ( )
336{
337 auto visible = tweakRulers->tweakRulers(tweakedPosition(), drawingAreaSize, zoom);
338
339 const auto topLeft = visible.getTopLeft();
340 const auto bottomRight = visible.getBottomRight();
341
342 hruler->setRange(topLeft.x, bottomRight.x);
343 vruler->setRange(topLeft.y, bottomRight.y);
344}

Referenced by updateScrollbars(), and updateXY().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ updateScrollbar()

void View::updateScrollbar ( GtkAdjustment *  adj,
int  zoom,
double  value,
double  presentationStart,
double  presentationSize,
double  windowSize 
)
static
239{
240 const double pixelSize = pixelSizeFromZoom(zoom_);
241
242 presentationStart -= windowSize / pixelSize / 2;
243 presentationSize += windowSize / pixelSize;
244
245 gtk_adjustment_configure(
246 adj,
247 value,
248 presentationStart,
249 presentationStart + presentationSize,
250 1 / pixelSize / 2,
251 3 * windowSize / pixelSize / 4,
252 windowSize / pixelSize
253 );
254}

Referenced by updateScrollbars().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ updateScrollbars()

void View::updateScrollbars ( )
257{
258 if(presentation)
259 {
260 gtk_widget_set_sensitive(GTK_WIDGET(vscrollbar), true);
261 gtk_widget_set_sensitive(GTK_WIDGET(hscrollbar), true);
262
265 updateRulers();
266 }
267 else
268 {
269 gtk_widget_set_sensitive(GTK_WIDGET(vscrollbar), false);
270 gtk_widget_set_sensitive(GTK_WIDGET(hscrollbar), false);
271 }
272}
value_type height() const
Definition rectangle.hh:131
value_type y() const
Definition rectangle.hh:127
value_type x() const
Definition rectangle.hh:125
value_type width() const
Definition rectangle.hh:129
static void updateScrollbar(GtkAdjustment *adj, int zoom, double value, double presentationStart, double presentationSize, double windowSize)
Definition view.cc:231
void updateRulers()
Definition view.cc:335

Referenced by on_window_size_changed(), on_zoombox_changed(), setPresentation(), and updateXY().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ updateTextbox()

void View::updateTextbox ( )
275{
276 if(presentation)
277 {
278 gtk_widget_set_sensitive(GTK_WIDGET(xTextBox), true);
279 gtk_widget_set_sensitive(GTK_WIDGET(yTextBox), true);
280
281 const auto [xs, ys] = tweakPositionTextBox->display(position, drawingAreaSize, zoom);
282
283 gtk_entry_set_text(xTextBox, xs.c_str());
284 gtk_entry_set_text(yTextBox, ys.c_str());
285 }
286 else
287 {
288 gtk_widget_set_sensitive(GTK_WIDGET(xTextBox), false);
289 gtk_widget_set_sensitive(GTK_WIDGET(yTextBox), false);
290 }
291}

Referenced by on_zoombox_changed(), setPresentation(), and updateXY().

Here is the caller graph for this function:

◆ updateTweaks()

void View::updateTweaks ( )
private
179{
180 using namespace Scroom::Utils;
181
182 auto context = presentation->getContext();
183
184 tweakPresentationPosition = get_or<ITweakPresentationPosition::Ptr>(context, getDefaultTweakPresentationPosition());
185 tweakRulers = get_or<ITweakRulers::Ptr>(context, getDefaultTweakRulers());
186 tweakPositionTextBox = get_or<ITweakPositionTextBox::Ptr>(context, getDefaultTweakPositionTextBox());
187 tweakSelection = get_or<ITweakSelection::Map>(context, getDefaultTweakSelectionMap());
188}
Definition tweak-view.hh:22

Referenced by setPresentation().

Here is the caller graph for this function:

◆ updateXY()

void View::updateXY ( const Scroom::Utils::Point< double > &  newPos,
const LocationChangeCause source 
)
private
780{
781 if(position.get() != newPos)
782 {
783 position = newPos;
784
785 std::scoped_lock const protect_position(position);
786 if(source != SCROLLBAR)
787 {
789 }
790 else
791 {
792 updateRulers();
793 }
794
795 if(source != TEXTBOX)
796 {
798 }
799
800 invalidate();
801 }
802}

Referenced by on_motion_notify(), on_scrollbar_value_changed(), and on_textbox_value_changed().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ updateZoom()

void View::updateZoom ( )
294{
295 if(presentation)
296 {
297 int presentationHeight = presentationRect.height();
298 int presentationWidth = presentationRect.width();
299 int minZoom = 0;
300
301 while(presentationHeight > drawingAreaSize.y / 2 || presentationWidth > drawingAreaSize.x / 2)
302 {
303 presentationHeight >>= 1;
304 presentationWidth >>= 1;
305 minZoom--;
306 }
307
308 gtk_widget_set_sensitive(GTK_WIDGET(zoomBox), true);
309
310 int zMax = MaxZoom - minZoom;
311 zMax = std::max(zMax, 1 + MaxZoom - zoom);
312 zMax = std::min<size_t>(zMax, sizeof(zoomfactor) / sizeof(zoomfactor[0]));
313
314 gtk_list_store_clear(zoomItems);
315 for(int z = 0; z < zMax; z++)
316 {
317 GtkTreeIter iter;
318 gtk_list_store_insert_with_values(zoomItems, &iter, z, COLUMN_TEXT, zoomfactor[z], COLUMN_ZOOM, MaxZoom - z, -1);
319
320 if(zoom == MaxZoom - z)
321 {
322 gtk_combo_box_set_active_iter(zoomBox, &iter);
323 }
324 }
325 }
326 else
327 {
328 gtk_widget_set_sensitive(GTK_WIDGET(zoomBox), false);
329 gtk_list_store_clear(zoomItems);
330 GtkTreeIter iter;
331 gtk_list_store_insert_with_values(zoomItems, &iter, 0, COLUMN_TEXT, zoomfactor[0], COLUMN_ZOOM, MaxZoom, -1);
332 }
333}
static const std::array< const char *, 36 > zoomfactor
Definition view.cc:33

Referenced by on_window_size_changed(), and setPresentation().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ windowPointToPresentationPoint()

Scroom::Utils::Point< double > View::windowPointToPresentationPoint ( Scroom::Utils::Point< double >  wp) const
private
688{
689 return tweakedPosition() + wp / pixelSizeFromZoom(zoom);
690}

Referenced by on_buttonPress(), on_buttonRelease(), and on_motion_notify().

Here is the call graph for this function:
Here is the caller graph for this function:

Member Data Documentation

◆ cachedPoint

Scroom::Utils::Point<double> View::cachedPoint
private

◆ drawingArea

GtkWidget* View::drawingArea
private

Referenced by invalidate(), on_configure(), and View().

◆ drawingAreaSize

◆ hruler

Ruler::Ptr View::hruler
private

Referenced by updateRulers(), and View().

◆ hruler_area

GtkDrawingArea* View::hruler_area
private

Referenced by View().

◆ hscrollbar

GtkScrollbar* View::hscrollbar
private

Referenced by updateScrollbars(), and View().

◆ hscrollbaradjustment

GtkAdjustment* View::hscrollbaradjustment
private

Referenced by updateScrollbars(), and View().

◆ logger

Scroom::Logger View::logger
private

Referenced by ~View().

◆ menubar

GtkWidget* View::menubar
private

Referenced by View().

◆ modifiermove

gint View::modifiermove {0}
private

◆ position

◆ postRenderers

std::vector<PostRenderer::Ptr> View::postRenderers
private

Referenced by redraw(), and registerPostRenderer().

◆ presentation

◆ presentationRect

Scroom::Utils::Rectangle<double> View::presentationRect
private

◆ presentations

◆ progressBar

GtkProgressBar* View::progressBar
private

Referenced by View().

◆ progressBarManager

ProgressBarManager::Ptr View::progressBarManager
private

Referenced by getProgressInterface(), and View().

◆ scroomXml

GtkBuilder* View::scroomXml
private

◆ selection

std::optional<Selection> View::selection
private

◆ selectionListeners

std::vector<SelectionListener::Ptr> View::selectionListeners
private

◆ sidebarManager

SidebarManager View::sidebarManager
private

◆ statusArea

GtkWidget* View::statusArea
private

◆ statusBar

GtkStatusbar* View::statusBar
private

Referenced by setStatusMessage(), and View().

◆ statusBarContextId

int View::statusBarContextId
private

Referenced by setStatusMessage(), and View().

◆ toolBar

GtkToolbar* View::toolBar
private

◆ toolbarArea

GtkWidget* View::toolbarArea
private

◆ toolBarCount

unsigned View::toolBarCount
private

◆ toolBarSeparator

GtkToolItem* View::toolBarSeparator
private

◆ tools

std::map<GtkToggleButton*, ToolStateListener::Ptr> View::tools
private

Referenced by addToolButton(), and toolButtonToggled().

◆ tweakPositionTextBox

std::shared_ptr<Scroom::Utils::ITweakPositionTextBox> View::tweakPositionTextBox
private

◆ tweakPresentationPosition

std::shared_ptr<Scroom::Utils::ITweakPresentationPosition> View::tweakPresentationPosition
private

Referenced by tweakedPosition(), and updateTweaks().

◆ tweakRulers

std::shared_ptr<Scroom::Utils::ITweakRulers> View::tweakRulers
private

Referenced by updateRulers(), and updateTweaks().

◆ tweakSelection

◆ vruler

Ruler::Ptr View::vruler
private

Referenced by updateRulers(), and View().

◆ vruler_area

GtkDrawingArea* View::vruler_area
private

Referenced by View().

◆ vscrollbar

GtkScrollbar* View::vscrollbar
private

Referenced by updateScrollbars(), and View().

◆ vscrollbaradjustment

GtkAdjustment* View::vscrollbaradjustment
private

◆ window

GtkWindow* View::window
private

◆ xTextBox

GtkEntry* View::xTextBox
private

◆ yTextBox

GtkEntry* View::yTextBox
private

◆ zoom

◆ zoomBox

GtkComboBox* View::zoomBox
private

◆ zoomItems

GtkListStore* View::zoomItems
private

The documentation for this class was generated from the following files: