Inkscape
Vector Graphics Editor
Loading...
Searching...
No Matches
measure-toolbar.cpp
Go to the documentation of this file.
1// SPDX-License-Identifier: GPL-2.0-or-later
5/* Authors:
6 * MenTaLguY <mental@rydia.net>
7 * Lauris Kaplinski <lauris@kaplinski.com>
8 * bulia byak <buliabyak@users.sf.net>
9 * Frank Felfe <innerspace@iname.com>
10 * John Cliff <simarilius@yahoo.com>
11 * David Turner <novalis@gnu.org>
12 * Josh Andler <scislac@scislac.com>
13 * Jon A. Cruz <jon@joncruz.org>
14 * Maximilian Albert <maximilian.albert@gmail.com>
15 * Tavmjong Bah <tavmjong@free.fr>
16 * Abhishek Sharma
17 * Kris De Gussem <Kris.DeGussem@gmail.com>
18 * Vaibhav Malik <vaibhavmalik2018@gmail.com>
19 *
20 * Copyright (C) 2004 David Turner
21 * Copyright (C) 2003 MenTaLguY
22 * Copyright (C) 1999-2011 authors
23 * Copyright (C) 2001-2002 Ximian, Inc.
24 *
25 * Released under GNU GPL v2+, read the file 'COPYING' for more information.
26 */
27
28#include "measure-toolbar.h"
31
32#include <glibmm/i18n.h>
33#include <gtkmm/adjustment.h>
34#include <gtkmm/togglebutton.h>
35
36#include "desktop.h"
37#include "document-undo.h"
38#include "message-stack.h"
39#include "object/sp-namedview.h"
40#include "ui/builder-utils.h"
42#include "ui/util.h"
47
52
54{
55 if (desktop) {
56 return dynamic_cast<MeasureTool *>(desktop->getTool());
57 }
58 return nullptr;
59}
60
61namespace Inkscape::UI::Toolbar {
62
66
67MeasureToolbar::MeasureToolbar(Glib::RefPtr<Gtk::Builder> const &builder)
68 : Toolbar{get_widget<Gtk::Box>(builder, "measure-toolbar")}
69 , _tracker{std::make_unique<UnitTracker>(Util::UNIT_TYPE_LINEAR)}
70 , _font_size_item{get_derived_widget<UI::Widget::SpinButton>(builder, "_font_size_item")}
71 , _precision_item{get_derived_widget<UI::Widget::SpinButton>(builder, "_precision_item")}
72 , _scale_item{get_derived_widget<UI::Widget::SpinButton>(builder, "_scale_item")}
73 , _only_selected_btn{get_widget<Gtk::ToggleButton>(builder, "_only_selected_btn")}
74 , _ignore_1st_and_last_btn{get_widget<Gtk::ToggleButton>(builder, "_ignore_1st_and_last_btn")}
75 , _inbetween_btn{get_widget<Gtk::ToggleButton>(builder, "_inbetween_btn")}
76 , _show_hidden_btn{get_widget<Gtk::ToggleButton>(builder, "_show_hidden_btn")}
77 , _all_layers_btn{get_widget<Gtk::ToggleButton>(builder, "_all_layers_btn")}
78 , _offset_item{get_derived_widget<UI::Widget::SpinButton>(builder, "_offset_item")}
79{
80 auto prefs = Preferences::get();
81
82 auto unit_menu = _tracker->create_tool_item(_("Units"), "");
83 unit_menu->signal_changed().connect(sigc::mem_fun(*this, &MeasureToolbar::unit_changed));
84 get_widget<Gtk::Box>(builder, "unit_menu_box").append(*unit_menu);
85
90
91 // Values auto-calculated.
96
97 // Signals.
98 _only_selected_btn.set_active(prefs->getBool("/tools/measure/only_selected", false));
99 _only_selected_btn.signal_toggled().connect(sigc::mem_fun(*this, &MeasureToolbar::toggle_only_selected));
100
101 _ignore_1st_and_last_btn.set_active(prefs->getBool("/tools/measure/ignore_1st_and_last", true));
102 _ignore_1st_and_last_btn.signal_toggled().connect(
103 sigc::mem_fun(*this, &MeasureToolbar::toggle_ignore_1st_and_last));
104
105 _inbetween_btn.set_active(prefs->getBool("/tools/measure/show_in_between", true));
106 _inbetween_btn.signal_toggled().connect(sigc::mem_fun(*this, &MeasureToolbar::toggle_show_in_between));
107
108 _show_hidden_btn.set_active(prefs->getBool("/tools/measure/show_hidden", true));
109 _show_hidden_btn.signal_toggled().connect(sigc::mem_fun(*this, &MeasureToolbar::toggle_show_hidden));
110
111 _all_layers_btn.set_active(prefs->getBool("/tools/measure/all_layers", true));
112 _all_layers_btn.signal_toggled().connect(sigc::mem_fun(*this, &MeasureToolbar::toggle_all_layers));
113
114 auto& settings = get_widget<Gtk::Popover>(builder, "settings-popover");
115 settings.set_child(_settings);
116
117 get_widget<Gtk::Button>(builder, "reverse_btn")
118 .signal_clicked()
119 .connect(sigc::mem_fun(*this, &MeasureToolbar::reverse_knots));
120
121 get_widget<Gtk::Button>(builder, "to_phantom_btn")
122 .signal_clicked()
123 .connect(sigc::mem_fun(*this, &MeasureToolbar::to_phantom));
124
125 get_widget<Gtk::Button>(builder, "to_guides_btn")
126 .signal_clicked()
127 .connect(sigc::mem_fun(*this, &MeasureToolbar::to_guides));
128
129 get_widget<Gtk::Button>(builder, "to_item_btn")
130 .signal_clicked()
131 .connect(sigc::mem_fun(*this, &MeasureToolbar::to_item));
132
133 get_widget<Gtk::Button>(builder, "mark_dimension_btn")
134 .signal_clicked()
135 .connect(sigc::mem_fun(*this, &MeasureToolbar::to_mark_dimension));
136
138}
139
141
143{
145
146 if (_desktop) {
147 if (!_unit_set) {
148 auto default_unit = desktop->getNamedView()->getDisplayUnit();
149 _tracker->setActiveUnitByAbbr(Preferences::get()->getString("/tools/measure/unit", default_unit->abbr).c_str());
150 _unit_set = true;
151 }
152 }
154}
155
157 double default_value, ValueChangedMemFun const value_changed_mem_fun)
158{
159 auto adj = btn.get_adjustment();
160 auto const path = "/tools/measure/" + name;
161 auto const val = Preferences::get()->getDouble(path, default_value);
162 adj->set_value(val);
163 adj->signal_value_changed().connect(sigc::mem_fun(*this, value_changed_mem_fun));
164 btn.setDefocusTarget(this);
165}
166
168{
170 return;
171 }
172 Preferences::get()->setDouble("/tools/measure/fontsize", _font_size_item.get_adjustment()->get_value());
173 if (auto mt = get_measure_tool(_desktop)) {
174 mt->showCanvasItems();
175 }
176}
177
179{
180 Glib::ustring const unit = _tracker->getActiveUnit()->abbr;
181 Preferences::get()->setString("/tools/measure/unit", unit);
182 if (auto mt = get_measure_tool(_desktop)) {
183 mt->showCanvasItems();
184 }
185}
186
188{
190 return;
191 }
192 Preferences::get()->setInt("/tools/measure/precision", _precision_item.get_adjustment()->get_value());
193 if (auto mt = get_measure_tool(_desktop)) {
194 mt->showCanvasItems();
195 }
196}
197
199{
201 return;
202 }
203 Preferences::get()->setDouble("/tools/measure/scale", _scale_item.get_adjustment()->get_value());
204 if (auto mt = get_measure_tool(_desktop)) {
205 mt->showCanvasItems();
206 }
207}
208
210{
212 return;
213 }
214 Preferences::get()->setDouble("/tools/measure/offset", _offset_item.get_adjustment()->get_value());
215 if (auto mt = get_measure_tool(_desktop)) {
216 mt->showCanvasItems();
217 }
218}
219
221{
222 bool active = _only_selected_btn.get_active();
223 Preferences::get()->setBool("/tools/measure/only_selected", active);
224 _desktop->messageStack()->flash(INFORMATION_MESSAGE, active ? _("Measures only selected.") : _("Measure all."));
225 if (auto mt = get_measure_tool(_desktop)) {
226 mt->showCanvasItems();
227 }
228}
229
231{
232 bool active = _ignore_1st_and_last_btn.get_active();
233 Preferences::get()->setBool("/tools/measure/ignore_1st_and_last", active);
234 _desktop->messageStack()->flash(INFORMATION_MESSAGE, active ? _("Start and end measures inactive.") : _("Start and end measures active."));
235 if (auto mt = get_measure_tool(_desktop)) {
236 mt->showCanvasItems();
237 }
238}
239
241{
242 bool active = _inbetween_btn.get_active();
243 Preferences::get()->setBool("/tools/measure/show_in_between", active);
244 _desktop->messageStack()->flash(INFORMATION_MESSAGE, active ? _("Compute all elements.") : _("Compute max length."));
245 if (auto mt = get_measure_tool(_desktop)) {
246 mt->showCanvasItems();
247 }
248}
249
251{
252 bool active = _show_hidden_btn.get_active();
253 Preferences::get()->setBool("/tools/measure/show_hidden", active);
254 _desktop->messageStack()->flash(INFORMATION_MESSAGE, active ? _("Show all crossings.") : _("Show visible crossings."));
255 if (auto mt = get_measure_tool(_desktop)) {
256 mt->showCanvasItems();
257 }
258}
259
261{
262 bool active = _all_layers_btn.get_active();
263 Preferences::get()->setBool("/tools/measure/all_layers", active);
264 _desktop->messageStack()->flash(INFORMATION_MESSAGE, active ? _("Use all layers in the measure.") : _("Use current layer in the measure."));
265 if (auto mt = get_measure_tool(_desktop)) {
266 mt->showCanvasItems();
267 }
268}
269
271{
272 if (auto mt = get_measure_tool(_desktop)) {
273 mt->reverseKnots();
274 }
275}
276
278{
279 if (auto mt = get_measure_tool(_desktop)) {
280 mt->toPhantom();
281 }
282}
283
285{
286 if (auto mt = get_measure_tool(_desktop)) {
287 mt->toGuides();
288 }
289}
290
292{
293 if (auto mt = get_measure_tool(_desktop)) {
294 mt->toItem();
295 }
296}
297
299{
300 if (auto mt = get_measure_tool(_desktop)) {
301 mt->toMarkDimension();
302 }
303}
304
305} // namespace Inkscape::UI::Toolbar
306
307/*
308 Local Variables:
309 mode:c++
310 c-file-style:"stroustrup"
311 c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
312 indent-tabs-mode:nil
313 fill-column:99
314 End:
315*/
316// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
Gtk builder utilities.
static bool getUndoSensitive(SPDocument const *document)
MessageId flash(MessageType type, char const *message)
Temporarily pushes a message onto the stack.
double getDouble(Glib::ustring const &pref_path, double def=0.0, Glib::ustring const &unit="")
Retrieve a floating point value.
static Preferences * get()
Access the singleton Preferences object.
void setString(Glib::ustring const &pref_path, Glib::ustring const &value)
Set an UTF-8 string value.
void setDouble(Glib::ustring const &pref_path, double value)
Set a floating point value.
void setInt(Glib::ustring const &pref_path, int value)
Set an integer value.
void setBool(Glib::ustring const &pref_path, bool value)
Set a Boolean value.
void setDesktop(SPDesktop *new_desktop)
Called when the desktop might have changed for this dialog.
UI::Widget::SpinButton & _precision_item
Dialog::MeasureToolSettingsDialog _settings
UI::Widget::SpinButton & _font_size_item
UI::Widget::SpinButton & _scale_item
void(MeasureToolbar::*)() ValueChangedMemFun
UI::Widget::SpinButton & _offset_item
std::unique_ptr< UI::Widget::UnitTracker > _tracker
void setDesktop(SPDesktop *desktop) override
void setup_derived_spin_button(UI::Widget::SpinButton &btn, Glib::ustring const &name, double default_value, ValueChangedMemFun const value_change_mem_fun)
Base class for all tool toolbars.
Definition toolbar.h:72
virtual void setDesktop(SPDesktop *desktop)
Definition toolbar.h:76
SpinButton widget, that allows entry of simple math expressions (also units, when linked with UnitMen...
Definition spinbutton.h:52
void setDefocusTarget(decltype(_defocus_target) target)
Definition spinbutton.h:127
void set_custom_numeric_menu_data(NumericMenuData &&custom_menu_data)
To do: update description of desktop.
Definition desktop.h:149
SPDocument * getDocument() const
Definition desktop.h:189
Inkscape::MessageStack * messageStack() const
Definition desktop.h:160
SPNamedView * getNamedView() const
Definition desktop.h:191
Inkscape::UI::Tools::ToolBase * getTool() const
Definition desktop.h:187
Inkscape::Util::Unit const * getDisplayUnit() const
Returns namedview's default unit.
A combobox that can be displayed in a toolbar.
Editable view implementation.
A widget that manages DialogNotebook's and other widgets inside a horizontal DialogMultipaned.
TODO: insert short description here.
Used to show extra settings for the Measure tool.
static MeasureTool * get_measure_tool(SPDesktop *desktop)
Raw stack of active status messages.
Definition desktop.h:50
W & get_widget(const Glib::RefPtr< Gtk::Builder > &builder, const char *id)
W & get_derived_widget(const Glib::RefPtr< Gtk::Builder > &builder, const char *id, Args &&... args)
Glib::RefPtr< Gtk::Builder > create_builder(const char *filename)
Miscellaneous supporting code.
Definition document.h:93
@ INFORMATION_MESSAGE
Definition message.h:30
STL namespace.
std::string getString(const std::unique_ptr< GooString > &value)
SPDesktop * desktop
Glib::ustring name
Definition toolbars.cpp:55
Glib::RefPtr< Gtk::Builder > builder