Inkscape
Vector Graphics Editor
page-selector.cpp
Go to the documentation of this file.
1// SPDX-License-Identifier: GPL-2.0-or-later
2/*
3 * Inkscape::Widgets::PageSelector - select and move to pages
4 *
5 * Authors:
6 * Martin Owens
7 *
8 * Copyright (C) 2021 Martin Owens
9 *
10 * Released under GNU GPL v2+, read the file 'COPYING' for more information.
11 */
12
13#include "page-selector.h"
14
15#include <cstring>
16#include <string>
17#include <glibmm/i18n.h>
18
19#include "desktop.h"
20#include "document.h"
21#include "object/sp-namedview.h"
22#include "object/sp-page.h"
23#include "page-manager.h"
24#include "ui/icon-loader.h"
25#include "ui/icon-names.h"
26#include "ui/pack.h"
27
28namespace Inkscape {
29namespace UI {
30namespace Widget {
31
33 : Gtk::Box(Gtk::Orientation::HORIZONTAL)
34 , _desktop(desktop)
35{
36 set_name("PageSelector");
37
38 _prev_button.set_image_from_icon_name(INKSCAPE_ICON("pan-start"), Gtk::IconSize::NORMAL);
39 _prev_button.set_has_frame(false);
40 _prev_button.set_tooltip_text(_("Move to previous page"));
41 _prev_button.signal_clicked().connect(sigc::mem_fun(*this, &PageSelector::prevPage));
42
43 _next_button.set_image_from_icon_name(INKSCAPE_ICON("pan-end"), Gtk::IconSize::NORMAL);
44 _next_button.set_has_frame(false);
45 _next_button.set_tooltip_text(_("Move to next page"));
46 _next_button.signal_clicked().connect(sigc::mem_fun(*this, &PageSelector::nextPage));
47
48 _selector.set_tooltip_text(_("Current page"));
49
51 _selector.set_model(_page_model);
52 _selector.pack_start(_label_renderer);
53 _selector.set_cell_data_func(_label_renderer, sigc::mem_fun(*this, &PageSelector::renderPageLabel));
54
56 _selector.signal_changed().connect(sigc::mem_fun(*this, &PageSelector::setSelectedPage));
57
61
63 _desktop->connectDocumentReplaced(sigc::hide<0>(sigc::mem_fun(*this, &PageSelector::setDocument)));
64
65 setDocument(desktop->getDocument());
66}
67
69{
70 _doc_replaced_connection.disconnect();
72 setDocument(nullptr);
73}
74
76{
77 _document = document;
78 _pages_changed_connection.disconnect();
79 _page_selected_connection.disconnect();
80 if (document) {
81 auto &page_manager = document->getPageManager();
83 page_manager.connectPagesChanged(sigc::mem_fun(*this, &PageSelector::pagesChanged));
85 page_manager.connectPageSelected(sigc::mem_fun(*this, &PageSelector::selectonChanged));
87 }
88}
89
91{
93 auto &page_manager = _document->getPageManager();
94
95 // Destroy all existing pages in the model.
96 while (!_page_model->children().empty()) {
97 Gtk::ListStore::iterator row(_page_model->children().begin());
98 // Put cleanup here if any
99 _page_model->erase(row);
100 }
101
102 // Hide myself when there's no pages (single page document)
103 this->set_visible(page_manager.hasPages());
104
105 // Add in pages, do not use getResourcelist("page") because the items
106 // are not guaranteed to be in node order, they are in first-seen order.
107 for (auto &page : page_manager.getPages()) {
108 Gtk::ListStore::iterator row(_page_model->append());
109 row->set_value(_model_columns.object, page);
110 }
111
112 selectonChanged(page_manager.getSelected());
113
115}
116
118{
122
123 auto active = _selector.get_active();
124
125 if (!active || active->get_value(_model_columns.object) != page) {
126 for (auto row : _page_model->children()) {
127 if (page == row.get_value(_model_columns.object)) {
128 _selector.set_active(row.get_iter());
129 break;
130 }
131 }
132 }
134}
135
139void PageSelector::renderPageLabel(Gtk::TreeModel::const_iterator const &row)
140{
141 SPPage *page = (*row)[_model_columns.object];
142
143 if (page && page->getRepr()) {
144 int page_num = page->getPagePosition();
145
146 gchar *format;
147 if (auto label = page->label()) {
148 format = g_strdup_printf("<span size=\"smaller\"><tt>%d.</tt>%s</span>", page_num, label);
149 } else {
150 format = g_strdup_printf("<span size=\"smaller\"><i>%s</i></span>", page->getDefaultLabel().c_str());
151 }
152
153 _label_renderer.property_markup() = format;
154 g_free(format);
155 } else {
156 _label_renderer.property_markup() = "⚠️";
157 }
158
159 _label_renderer.property_ypad() = 1;
160}
161
163{
164 SPPage *page = _selector.get_active()->get_value(_model_columns.object);
167 }
168}
169
171{
174 }
175}
176
178{
181 }
182}
183
184} // namespace Widget
185} // namespace UI
186} // namespace Inkscape
187
188/*
189 Local Variables:
190 mode:c++
191 c-file-style:"stroustrup"
192 c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
193 indent-tabs-mode:nil
194 fill-column:99
195 End:
196*/
197// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
uint64_t page
Definition: canvas.cpp:172
bool hasNextPage() const
Definition: page-manager.h:75
void zoomToSelectedPage(SPDesktop *desktop, bool width_only=false)
Definition: page-manager.h:81
bool hasPrevPage() const
Definition: page-manager.h:76
bool selectPage(SPPage *page)
Set the given page as the selected page.
void setDocument(SPDocument *document)
PageSelector(SPDesktop *desktop=nullptr)
sigc::connection _pages_changed_connection
Definition: page-selector.h:63
void renderPageLabel(Gtk::TreeModel::const_iterator const &row)
Render the page icon into a suitable label.
Gtk::CellRendererText _label_renderer
Definition: page-selector.h:59
sigc::connection _doc_replaced_connection
Definition: page-selector.h:65
sigc::connection _page_selected_connection
Definition: page-selector.h:64
sigc::connection _selector_changed_connection
Definition: page-selector.h:62
Glib::RefPtr< Gtk::ListStore > _page_model
Definition: page-selector.h:60
To do: update description of desktop.
Definition: desktop.h:150
SPDocument * getDocument() const
Definition: desktop.h:187
sigc::connection connectDocumentReplaced(const sigc::slot< void(SPDesktop *, SPDocument *)> &slot)
Definition: desktop.h:256
Typed SVG document implementation.
Definition: document.h:106
Inkscape::PageManager & getPageManager()
Definition: document.h:176
Definition: sp-page.h:31
Editable view implementation.
Icon Loader.
Macro for icon names used in Inkscape.
Definition: desktop.h:51
void pack_start(Gtk::Box &box, Gtk::Widget &child, bool const expand, bool const fill, unsigned const padding)
Adds child to box, packed with reference to the start of box.
Definition: pack.cpp:141
ptr_shared format(char const *format,...) G_GNUC_PRINTF(1
Definition: format.h:33
CMYK to sRGB conversion routines.
Helpers for using Gtk::Boxes, encapsulating large changes between GTK3 & GTK4.
SPPage – a page object.
std::unique_ptr< Toolbar >(* create)(SPDesktop *desktop)
Definition: toolbars.cpp:63