Inkscape
Vector Graphics Editor
Loading...
Searching...
No Matches
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 <glibmm/i18n.h>
17#include <glibmm/markup.h>
18#include <string>
19
20#include "desktop.h"
21#include "document.h"
22#include "object/sp-page.h"
23#include "page-manager.h"
24#include "ui/icon-names.h"
25#include "ui/pack.h"
26
27namespace Inkscape::UI::Widget {
28
30 : Gtk::Box(Gtk::Orientation::HORIZONTAL)
31{
32 set_name("PageSelector");
33
34 _prev_button.set_image_from_icon_name(INKSCAPE_ICON("pan-start"), Gtk::IconSize::NORMAL);
35 _prev_button.set_has_frame(false);
36 _prev_button.set_tooltip_text(_("Move to previous page"));
37 _prev_button.signal_clicked().connect(sigc::mem_fun(*this, &PageSelector::prevPage));
38
39 _next_button.set_image_from_icon_name(INKSCAPE_ICON("pan-end"), Gtk::IconSize::NORMAL);
40 _next_button.set_has_frame(false);
41 _next_button.set_tooltip_text(_("Move to next page"));
42 _next_button.signal_clicked().connect(sigc::mem_fun(*this, &PageSelector::nextPage));
43
44 _selector.set_tooltip_text(_("Current page"));
45
46 _page_model = Gtk::ListStore::create(_model_columns);
47 _selector.set_model(_page_model);
48 _label_renderer.property_max_width_chars() = 15;
49 _label_renderer.property_ellipsize() = Pango::EllipsizeMode::END;
50 _selector.pack_start(_label_renderer);
51 _selector.set_cell_data_func(_label_renderer, sigc::mem_fun(*this, &PageSelector::renderPageLabel));
52
54 _selector.signal_changed().connect(sigc::mem_fun(*this, &PageSelector::setSelectedPage));
55
59}
60
67
69{
70 if (_desktop) {
71 _doc_replaced_connection.disconnect();
72 }
73
76
77 if (_desktop) {
79 }
80}
81
83{
84 if (_document) {
85 _pages_changed_connection.disconnect();
86 _page_selected_connection.disconnect();
87 }
88
89 _document = document;
90
91 if (_document) {
92 auto &page_manager = _document->getPageManager();
94 page_manager.connectPagesChanged(sigc::mem_fun(*this, &PageSelector::pagesChanged));
96 page_manager.connectPageSelected(sigc::mem_fun(*this, &PageSelector::selectonChanged));
98 }
99}
100
102{
104 auto &page_manager = _document->getPageManager();
105
106 // Destroy all existing pages in the model.
107 while (!_page_model->children().empty()) {
108 Gtk::ListStore::iterator row(_page_model->children().begin());
109 // Put cleanup here if any
110 _page_model->erase(row);
111 }
112
113 // Hide myself when there's no pages (single page document)
114 this->set_visible(page_manager.hasPages());
115
116 // Add in pages, do not use getResourcelist("page") because the items
117 // are not guaranteed to be in node order, they are in first-seen order.
118 for (auto &page : page_manager.getPages()) {
119 Gtk::ListStore::iterator row(_page_model->append());
120 row->set_value(_model_columns.object, page);
121 }
122
123 selectonChanged(page_manager.getSelected());
124
126}
127
129{
133
134 auto active = _selector.get_active();
135
136 if (!active || active->get_value(_model_columns.object) != page) {
137 for (auto row : _page_model->children()) {
138 if (page == row.get_value(_model_columns.object)) {
139 _selector.set_active(row.get_iter());
140 break;
141 }
142 }
143 }
145}
146
150void PageSelector::renderPageLabel(Gtk::TreeModel::const_iterator const &row)
151{
152 SPPage *page = (*row)[_model_columns.object];
153
154 if (page && page->getRepr()) {
155 int page_num = page->getPagePosition();
156
157 Glib::ustring format;
158 if (auto label = page->label()) {
159 auto escaped_text = Glib::Markup::escape_text(label);
160 format = Glib::ustring::compose("<span size=\"smaller\"><tt>%1.</tt>%2</span>", page_num, escaped_text);
161 } else {
162 format = Glib::ustring::compose("<span size=\"smaller\"><i>%1</i></span>", page->getDefaultLabel().c_str());
163 }
164
165 _label_renderer.property_markup() = format;
166 } else {
167 _label_renderer.property_markup() = "⚠️";
168 }
169
170 _label_renderer.property_ypad() = 1;
171}
172
180
187
194
195} // namespace Inkscape::UI::Widget
196
197/*
198 Local Variables:
199 mode:c++
200 c-file-style:"stroustrup"
201 c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
202 indent-tabs-mode:nil
203 fill-column:99
204 End:
205*/
206// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
uint64_t page
Definition canvas.cpp:171
sigc::connection connectPagesChanged(const sigc::slot< void()> &slot)
bool hasNextPage() const
void zoomToSelectedPage(SPDesktop *desktop, bool width_only=false)
bool hasPrevPage() const
bool selectPage(SPPage *page)
Set the given page as the selected page.
void setDocument(SPDocument *document)
sigc::connection _pages_changed_connection
void renderPageLabel(Gtk::TreeModel::const_iterator const &row)
Render the page icon into a suitable label.
void setDesktop(SPDesktop *desktop)
Gtk::CellRendererText _label_renderer
sigc::connection _doc_replaced_connection
sigc::connection _page_selected_connection
sigc::connection _selector_changed_connection
Glib::RefPtr< Gtk::ListStore > _page_model
To do: update description of desktop.
Definition desktop.h:149
sigc::connection connectDocumentReplaced(F &&slot)
Definition desktop.h:257
SPDocument * getDocument() const
Definition desktop.h:189
Typed SVG document implementation.
Definition document.h:103
Inkscape::PageManager & getPageManager()
Definition document.h:164
int getPagePosition() const
Definition sp-page.h:66
Editable view implementation.
Macro for icon names used in Inkscape.
Glib::ustring label
Definition desktop.h:50
Custom widgets.
Definition desktop.h:126
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
Helpers for using Gtk::Boxes, encapsulating large changes between GTK3 & GTK4.
SPPage – a page object.
SPDesktop * desktop