Code

Fixes for transient dialogs in win32.
[inkscape.git] / src / ui / widget / spin-slider.cpp
index a76f1db4900b0a189b9f6e90b0af95c07d761374..15cd5ea1b881946b207ac7f3b7e49f64dad360ab 100644 (file)
@@ -10,6 +10,7 @@
  */
 
 #include "glib/gstrfuncs.h"
+#include "glibmm/i18n.h"
 
 #include "spin-slider.h"
 
@@ -22,6 +23,8 @@ SpinSlider::SpinSlider(double value, double lower, double upper, double step_inc
     : AttrWidget(a), _adjustment(value, lower, upper, step_inc),
       _scale(_adjustment), _spin(_adjustment, climb_rate, digits)
 {
+    signal_value_changed().connect(signal_attr_changed().make_slot());
+
     pack_start(_scale);
     pack_start(_spin, false, false);
 
@@ -32,7 +35,12 @@ SpinSlider::SpinSlider(double value, double lower, double upper, double step_inc
 
 Glib::ustring SpinSlider::get_as_attribute() const
 {
-    return Glib::Ascii::dtostr((int)_adjustment.get_value());
+    const double val = _adjustment.get_value();
+
+    if(_spin.get_digits() == 0)
+        return Glib::Ascii::dtostr((int)val);
+    else
+        return Glib::Ascii::dtostr(val);
 }
 
 void SpinSlider::set_from_attribute(SPObject* o)
@@ -89,18 +97,41 @@ void SpinSlider::set_update_policy(const Gtk::UpdateType u)
     _scale.set_update_policy(u);
 }
 
+void SpinSlider::remove_scale()
+{
+    remove(_scale);
+}
+
 DualSpinSlider::DualSpinSlider(double value, double lower, double upper, double step_inc,
                                double climb_rate, int digits, const SPAttributeEnum a)
-    : AttrWidget(a), _s1(value, lower, upper, step_inc, climb_rate, digits),
-      _s2(value, lower, upper, step_inc, climb_rate, digits)
+    : AttrWidget(a),
+      _s1(value, lower, upper, step_inc, climb_rate, digits),
+      _s2(value, lower, upper, step_inc, climb_rate, digits),
+      _link(_("Link"))
 {
+    signal_value_changed().connect(signal_attr_changed().make_slot());
+
     _s1.get_adjustment().signal_value_changed().connect(_signal_value_changed.make_slot());
     _s2.get_adjustment().signal_value_changed().connect(_signal_value_changed.make_slot());
+    _s1.get_adjustment().signal_value_changed().connect(sigc::mem_fun(*this, &DualSpinSlider::update_linked));
+    _link.signal_toggled().connect(sigc::mem_fun(*this, &DualSpinSlider::link_toggled));
+
+    Gtk::VBox* vb = Gtk::manage(new Gtk::VBox);
+    vb->add(_s1);
+    vb->add(_s2);
+    pack_start(*vb);
+    pack_start(_link, false, false);
+    _link.set_active(true);
+
+    show_all();
 }
 
 Glib::ustring DualSpinSlider::get_as_attribute() const
 {
-    return _s1.get_as_attribute() + " " + _s2.get_as_attribute();
+    if(_link.get_active())
+        return _s1.get_as_attribute();
+    else
+        return _s1.get_as_attribute() + " " + _s2.get_as_attribute();
 }
 
 void DualSpinSlider::set_from_attribute(SPObject* o)
@@ -117,6 +148,8 @@ void DualSpinSlider::set_from_attribute(SPObject* o)
             if(toks[1])
                 v2 = Glib::Ascii::strtod(toks[1]);
 
+            _link.set_active(toks[1] == 0);
+
             _s1.get_adjustment().set_value(v1);
             _s2.get_adjustment().set_value(v2);
 
@@ -156,6 +189,24 @@ void DualSpinSlider::set_update_policy(const Gtk::UpdateType u)
     _s2.set_update_policy(u);
 }
 
+void DualSpinSlider::remove_scale()
+{
+    _s1.remove_scale();
+    _s2.remove_scale();
+}
+
+void DualSpinSlider::link_toggled()
+{
+    _s2.set_sensitive(!_link.get_active());
+    update_linked();
+}
+
+void DualSpinSlider::update_linked()
+{
+    if(_link.get_active())
+        _s2.set_value(_s1.get_value());
+}
+
 } // namespace Widget
 } // namespace UI
 } // namespace Inkscape