~valavanisalex/ubuntu/precise/inkscape/fix-943984

« back to all changes in this revision

Viewing changes to inkscape-0.47pre1/src/ui/widget/spin-slider.cpp

  • Committer: Bazaar Package Importer
  • Author(s): Bryce Harrington
  • Date: 2009-07-02 17:09:45 UTC
  • mfrom: (1.1.9 upstream)
  • Revision ID: james.westby@ubuntu.com-20090702170945-nn6d6zswovbwju1t
Tags: 0.47~pre1-0ubuntu1
* New upstream release.
  - Don't constrain maximization on small resolution devices (pre0)
    (LP: #348842)
  - Fixes segfault on startup (pre0)
    (LP: #391149)

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/**
 
2
 * \brief Groups an HScale and a SpinButton together using the same Adjustment
 
3
 *
 
4
 * Author:
 
5
 *   Nicholas Bishop <nicholasbishop@gmail.com>
 
6
 *   Felipe C. da S. Sanches <felipe.sanches@gmail.com>
 
7
 *
 
8
 * Copyright (C) 2007 Author
 
9
 *
 
10
 * Released under GNU GPL.  Read the file 'COPYING' for more information.
 
11
 */
 
12
 
 
13
#include "glib/gstrfuncs.h"
 
14
#include "glibmm/i18n.h"
 
15
 
 
16
#include "spin-slider.h"
 
17
 
 
18
namespace Inkscape {
 
19
namespace UI {
 
20
namespace Widget {
 
21
 
 
22
SpinSlider::SpinSlider(double value, double lower, double upper, double step_inc,
 
23
                       double climb_rate, int digits, const SPAttributeEnum a, char* tip_text)
 
24
    : AttrWidget(a, value), _adjustment(value, lower, upper, step_inc),
 
25
      _scale(_adjustment), _spin(_adjustment, climb_rate, digits)
 
26
{
 
27
    signal_value_changed().connect(signal_attr_changed().make_slot());
 
28
 
 
29
    pack_start(_scale);
 
30
    pack_start(_spin, false, false);
 
31
    if (tip_text){
 
32
        _tt.set_tip(_scale, tip_text);
 
33
        _tt.set_tip(_spin, tip_text);
 
34
    }
 
35
 
 
36
    _scale.set_draw_value(false);
 
37
 
 
38
    show_all_children();
 
39
}
 
40
 
 
41
Glib::ustring SpinSlider::get_as_attribute() const
 
42
{
 
43
    const double val = _adjustment.get_value();
 
44
 
 
45
    if(_spin.get_digits() == 0)
 
46
        return Glib::Ascii::dtostr((int)val);
 
47
    else
 
48
        return Glib::Ascii::dtostr(val);
 
49
}
 
50
 
 
51
void SpinSlider::set_from_attribute(SPObject* o)
 
52
{
 
53
    const gchar* val = attribute_value(o);
 
54
    if(val)
 
55
        _adjustment.set_value(Glib::Ascii::strtod(val));
 
56
    else
 
57
        _adjustment.set_value(get_default()->as_double());
 
58
}
 
59
 
 
60
Glib::SignalProxy0<void> SpinSlider::signal_value_changed()
 
61
{
 
62
    return _adjustment.signal_value_changed();
 
63
}
 
64
 
 
65
double SpinSlider::get_value() const
 
66
{
 
67
    return _adjustment.get_value();
 
68
}
 
69
 
 
70
void SpinSlider::set_value(const double val)
 
71
{
 
72
    _adjustment.set_value(val);
 
73
}
 
74
 
 
75
const Gtk::Adjustment& SpinSlider::get_adjustment() const
 
76
{
 
77
    return _adjustment;
 
78
}
 
79
Gtk::Adjustment& SpinSlider::get_adjustment()
 
80
{
 
81
    return _adjustment;
 
82
}
 
83
 
 
84
const Gtk::HScale& SpinSlider::get_scale() const
 
85
{
 
86
    return _scale;
 
87
}
 
88
Gtk::HScale& SpinSlider::get_scale()
 
89
{
 
90
    return _scale;
 
91
}
 
92
 
 
93
const Gtk::SpinButton& SpinSlider::get_spin_button() const
 
94
{
 
95
    return _spin;
 
96
}
 
97
Gtk::SpinButton& SpinSlider::get_spin_button()
 
98
{
 
99
    return _spin;
 
100
}
 
101
 
 
102
void SpinSlider::set_update_policy(const Gtk::UpdateType u)
 
103
{
 
104
    _scale.set_update_policy(u);
 
105
}
 
106
 
 
107
void SpinSlider::remove_scale()
 
108
{
 
109
    remove(_scale);
 
110
}
 
111
 
 
112
DualSpinSlider::DualSpinSlider(double value, double lower, double upper, double step_inc,
 
113
                               double climb_rate, int digits, const SPAttributeEnum a, char* tip_text1, char* tip_text2)
 
114
    : AttrWidget(a),
 
115
      _s1(value, lower, upper, step_inc, climb_rate, digits, SP_ATTR_INVALID, tip_text1),
 
116
      _s2(value, lower, upper, step_inc, climb_rate, digits, SP_ATTR_INVALID, tip_text2),
 
117
      //TRANSLATORS: only translate "string" in "context|string".
 
118
      // For more details, see http://developer.gnome.org/doc/API/2.0/glib/glib-I18N.html#Q-:CAPS
 
119
      // "Link" means to _link_ two sliders together
 
120
      _link(Q_("sliders|Link"))
 
121
{
 
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, &DualSpinSlider::update_linked));
 
127
    _link.signal_toggled().connect(sigc::mem_fun(*this, &DualSpinSlider::link_toggled));
 
128
 
 
129
    Gtk::VBox* vb = Gtk::manage(new Gtk::VBox);
 
130
    vb->add(_s1);
 
131
    vb->add(_s2);
 
132
    pack_start(*vb);
 
133
    pack_start(_link, false, false);
 
134
    _link.set_active(true);
 
135
 
 
136
    show_all();
 
137
}
 
138
 
 
139
Glib::ustring DualSpinSlider::get_as_attribute() const
 
140
{
 
141
    if(_link.get_active())
 
142
        return _s1.get_as_attribute();
 
143
    else
 
144
        return _s1.get_as_attribute() + " " + _s2.get_as_attribute();
 
145
}
 
146
 
 
147
void DualSpinSlider::set_from_attribute(SPObject* o)
 
148
{
 
149
    const gchar* val = attribute_value(o);
 
150
    if(val) {
 
151
        // Split val into parts
 
152
        gchar** toks = g_strsplit(val, " ", 2);
 
153
 
 
154
        if(toks) {
 
155
            double v1, v2;
 
156
            if(toks[0])
 
157
                v1 = v2 = Glib::Ascii::strtod(toks[0]);
 
158
            if(toks[1])
 
159
                v2 = Glib::Ascii::strtod(toks[1]);
 
160
 
 
161
            _link.set_active(toks[1] == 0);
 
162
 
 
163
            _s1.get_adjustment().set_value(v1);
 
164
            _s2.get_adjustment().set_value(v2);
 
165
 
 
166
            g_strfreev(toks);
 
167
        }
 
168
    }
 
169
}
 
170
 
 
171
sigc::signal<void>& DualSpinSlider::signal_value_changed()
 
172
{
 
173
    return _signal_value_changed;
 
174
}
 
175
 
 
176
const SpinSlider& DualSpinSlider::get_spinslider1() const
 
177
{
 
178
    return _s1;
 
179
}
 
180
 
 
181
SpinSlider& DualSpinSlider::get_spinslider1()
 
182
{
 
183
    return _s1;
 
184
}
 
185
 
 
186
const SpinSlider& DualSpinSlider::get_spinslider2() const
 
187
{
 
188
    return _s2;
 
189
}
 
190
 
 
191
SpinSlider& DualSpinSlider::get_spinslider2()
 
192
{
 
193
    return _s2;
 
194
}
 
195
 
 
196
void DualSpinSlider::set_update_policy(const Gtk::UpdateType u)
 
197
{
 
198
    _s1.set_update_policy(u);
 
199
    _s2.set_update_policy(u);
 
200
}
 
201
 
 
202
void DualSpinSlider::remove_scale()
 
203
{
 
204
    _s1.remove_scale();
 
205
    _s2.remove_scale();
 
206
}
 
207
 
 
208
void DualSpinSlider::link_toggled()
 
209
{
 
210
    _s2.set_sensitive(!_link.get_active());
 
211
    update_linked();
 
212
}
 
213
 
 
214
void DualSpinSlider::update_linked()
 
215
{
 
216
    if(_link.get_active())
 
217
        _s2.set_value(_s1.get_value());
 
218
}
 
219
 
 
220
} // namespace Widget
 
221
} // namespace UI
 
222
} // namespace Inkscape
 
223
 
 
224
/* 
 
225
  Local Variables:
 
226
  mode:c++
 
227
  c-file-style:"stroustrup"
 
228
  c-file-offsets:((innamespace . 0)(inline-open . 0))
 
229
  indent-tabs-mode:nil
 
230
  fill-column:99
 
231
  End:
 
232
*/
 
233
// vim: filetype=c++:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :