Inkscape
Vector Graphics Editor
spin-scale.cpp
Go to the documentation of this file.
1// SPDX-License-Identifier: GPL-2.0-or-later
5/*
6 * Author:
7 *
8 * Copyright (C) 2007 Nicholas Bishop <nicholasbishop@gmail.com>
9 * 2008 Felipe C. da S. Sanches <juca@members.fsf.org>
10 * 2017 Tavmjong Bah
11 *
12 * Released under GNU GPL v2+, read the file 'COPYING' for more information.
13 */
14
15/*
16 * Derived from and replaces SpinSlider
17 */
18
19#include "spin-scale.h"
20
21#include <utility>
22#include <glibmm/i18n.h>
23#include <glibmm/stringutils.h>
24#include <gtkmm/enums.h>
25
26#include "ui/pack.h"
27
28namespace Inkscape::UI::Widget {
29
30SpinScale::SpinScale(Glib::ustring label, double value,
31 double lower, double upper,
32 double step_increment, double page_increment, int digits,
33 SPAttr const a, Glib::ustring const &tip_text)
34 : AttrWidget(a, value)
35 , _inkspinscale(value, lower, upper, step_increment, page_increment, 0)
36{
37 set_name("SpinScale");
38
39 _inkspinscale.set_label(std::move(label));
41 _inkspinscale.set_tooltip_text (tip_text);
42
44
45 signal_value_changed().connect(signal_attr_changed().make_slot());
46
48}
49
50SpinScale::SpinScale(Glib::ustring label,
51 Glib::RefPtr<Gtk::Adjustment> adjustment, int digits,
52 SPAttr const a, Glib::ustring const &tip_text)
53 : AttrWidget(a, 0.0)
54 , _adjustment{std::move(adjustment)}
55 , _inkspinscale{_adjustment}
56{
57 set_name("SpinScale");
58
59 _inkspinscale.set_label(std::move(label));
61 _inkspinscale.set_tooltip_text (tip_text);
62
63 signal_value_changed().connect(signal_attr_changed().make_slot());
64
66}
67
68Glib::ustring SpinScale::get_as_attribute() const
69{
70 const double val = _adjustment->get_value();
71
72 if( _inkspinscale.get_digits() == 0)
73 return Glib::Ascii::dtostr((int)val);
74 else
75 return Glib::Ascii::dtostr(val);
76}
77
79{
80 const gchar* val = attribute_value(o);
81 if (val)
82 _adjustment->set_value(Glib::Ascii::strtod(val));
83 else
84 _adjustment->set_value(get_default()->as_double());
85}
86
87Glib::SignalProxy<void()> SpinScale::signal_value_changed()
88{
89 return _adjustment->signal_value_changed();
90}
91
93{
94 return _adjustment->get_value();
95}
96
97void SpinScale::set_value(const double val)
98{
99 _adjustment->set_value(val);
100}
101
102void SpinScale::set_focuswidget(GtkWidget *widget)
103{
105}
106
108{
109 return _adjustment;
110}
111
112DualSpinScale::DualSpinScale(Glib::ustring label1, Glib::ustring label2,
113 double value, double lower, double upper,
114 double step_increment, double page_increment, int digits,
115 const SPAttr a,
116 Glib::ustring const &tip_text1, Glib::ustring const &tip_text2)
117 : AttrWidget(a),
118 _s1{std::move(label1), value, lower, upper, step_increment, page_increment, digits, SPAttr::INVALID, tip_text1},
119 _s2{std::move(label2), value, lower, upper, step_increment, page_increment, digits, SPAttr::INVALID, tip_text2}
120{
121 set_name("DualSpinScale");
122 signal_value_changed().connect(signal_attr_changed().make_slot());
123
124 _s1.get_adjustment()->signal_value_changed().connect(_signal_value_changed.make_slot());
125 _s2.get_adjustment()->signal_value_changed().connect(_signal_value_changed.make_slot());
126 _s1.get_adjustment()->signal_value_changed().connect(sigc::mem_fun(*this, &DualSpinScale::update_linked));
127
128 _link.set_has_frame(false);
129 _link.set_focus_on_click(false);
130 _link.set_focusable(false);
131 _link.add_css_class("link-edit-button");
132 _link.set_valign(Gtk::Align::CENTER);
133 _link.signal_clicked().connect(sigc::mem_fun(*this, &DualSpinScale::link_toggled));
134
135 auto const vb = Gtk::make_managed<Gtk::Box>(Gtk::Orientation::VERTICAL);
136 vb->append(_s1);
137 _s1.set_margin_bottom(3);
138 vb->append(_s2);
139 UI::pack_start(*this, *vb);
140 UI::pack_start(*this, _link, false, false);
141 set_link_active(true);
142 _s2.set_sensitive(false);
143}
144
146 _linked = link;
147 _link.set_image_from_icon_name(_linked ? "entries-linked" : "entries-unlinked", Gtk::IconSize::LARGE);
148}
149
151{
152 if (_linked) {
153 return _s1.get_as_attribute();
154 }
155 else {
156 return _s1.get_as_attribute() + " " + _s2.get_as_attribute();
157 }
158}
159
161{
162 const gchar* val = attribute_value(o);
163 if(val) {
164 // Split val into parts
165 gchar** toks = g_strsplit(val, " ", 2);
166
167 if(toks) {
168 double v1 = 0.0, v2 = 0.0;
169 if(toks[0])
170 v1 = v2 = Glib::Ascii::strtod(toks[0]);
171 if(toks[1])
172 v2 = Glib::Ascii::strtod(toks[1]);
173
174 set_link_active(toks[1] == nullptr);
175
176 _s1.get_adjustment()->set_value(v1);
177 _s2.get_adjustment()->set_value(v2);
178
179 g_strfreev(toks);
180 }
181 }
182}
183
185{
187}
188
190{
191 return _s1;
192}
193
195{
196 return _s1;
197}
198
200{
201 return _s2;
202}
203
205{
206 return _s2;
207}
208
210{
211 _linked = !_linked;
213 _s2.set_sensitive(!_linked);
215}
216
218{
219 if (_linked) {
221 }
222}
223
224} // namespace Inkscape::UI::Widget
225
226/*
227 Local Variables:
228 mode:c++
229 c-file-style:"stroustrup"
230 c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
231 indent-tabs-mode:nil
232 fill-column:99
233 End:
234*/
235// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
SPAttr
Definition: attributes.h:27
@ INVALID
Must have value 0.
void set_digits(int digits)
int get_digits() const
Glib::RefPtr< Gtk::Adjustment > get_adjustment()
Definition: ink-spinscale.h:83
void set_label(Glib::ustring label)
void set_focus_widget(GtkWidget *focus_widget)
DefaultValueHolder * get_default()
Definition: attr-widget.h:153
const gchar * attribute_value(SPObject *o) const
Definition: attr-widget.h:154
sigc::signal< void()> & signal_attr_changed()
Definition: attr-widget.h:148
const SpinScale & get_SpinScale1() const
Definition: spin-scale.cpp:189
void set_from_attribute(SPObject *) override
Definition: spin-scale.cpp:160
sigc::signal< void()> _signal_value_changed
Definition: spin-scale.h:92
DualSpinScale(const Glib::ustring label1, const Glib::ustring label2, double value, double lower, double upper, double step_increment, double page_increment, int digits, SPAttr a, Glib::ustring const &tip_text1, Glib::ustring const &tip_text2)
Definition: spin-scale.cpp:112
Glib::ustring get_as_attribute() const override
Definition: spin-scale.cpp:150
const SpinScale & get_SpinScale2() const
Definition: spin-scale.cpp:199
sigc::signal< void()> & signal_value_changed()
Definition: spin-scale.cpp:184
Wrap the InkSpinScale class and attach an attribute.
Definition: spin-scale.h:33
decltype(_adjustment) const & get_adjustment()
Definition: spin-scale.cpp:107
void set_focuswidget(GtkWidget *widget)
Definition: spin-scale.cpp:102
Glib::SignalProxy< void()> signal_value_changed()
Definition: spin-scale.cpp:87
void set_from_attribute(SPObject *) override
Definition: spin-scale.cpp:78
void set_value(const double)
Definition: spin-scale.cpp:97
SpinScale(Glib::ustring label, double value, double lower, double upper, double step_increment, double page_increment, int digits, SPAttr a=SPAttr::INVALID, Glib::ustring const &tip_text={})
Definition: spin-scale.cpp:30
Glib::RefPtr< Gtk::Adjustment > _adjustment
Definition: spin-scale.h:55
Glib::ustring get_as_attribute() const override
Definition: spin-scale.cpp:68
SPObject is an abstract base class of all of the document nodes at the SVG document level.
Definition: sp-object.h:146
Custom widgets.
Definition: desktop.h:127
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
STL namespace.
@ VERTICAL
The y-dimension (1).
Definition: rectangle.h:47
Helpers for using Gtk::Boxes, encapsulating large changes between GTK3 & GTK4.
Derived from and replaces SpinSlider.