summaryrefslogtreecommitdiffstats
path: root/src/ui/widget/ink-spinscale.cpp
diff options
context:
space:
mode:
authorEduard Braun <eduard.braun2@gmx.de>2018-03-11 16:32:53 +0000
committerEduard Braun <eduard.braun2@gmx.de>2018-03-12 18:28:38 +0000
commit94f674e70c93fbc3949a31f017e22579b02a028e (patch)
treea1c7d427b89e1ef700e6e65529c0725023917c64 /src/ui/widget/ink-spinscale.cpp
parentAllow to constrain color slider values by pressing Ctrl key (diff)
downloadinkscape-94f674e70c93fbc3949a31f017e22579b02a028e.tar.gz
inkscape-94f674e70c93fbc3949a31f017e22579b02a028e.zip
Allow to constrain InkSpinScale slider values by pressing Ctrl key
Some common and useful step intervals are hardcoded.
Diffstat (limited to 'src/ui/widget/ink-spinscale.cpp')
-rw-r--r--src/ui/widget/ink-spinscale.cpp28
1 files changed, 24 insertions, 4 deletions
diff --git a/src/ui/widget/ink-spinscale.cpp b/src/ui/widget/ink-spinscale.cpp
index ab7ceffc4..711dcfaa4 100644
--- a/src/ui/widget/ink-spinscale.cpp
+++ b/src/ui/widget/ink-spinscale.cpp
@@ -95,7 +95,8 @@ bool
InkScale::on_button_press_event(GdkEventButton* button_event) {
if (! (button_event->state & GDK_MOD1_MASK) ) {
- set_adjustment_value(button_event->x);
+ bool constrained = button_event->state & GDK_CONTROL_MASK;
+ set_adjustment_value(button_event->x, constrained);
}
// Dragging must be initialized after any adjustment due to button press.
@@ -123,7 +124,8 @@ InkScale::on_motion_notify_event(GdkEventMotion* motion_event) {
if (! (motion_event->state & GDK_MOD1_MASK) ) {
// Absolute change
- set_adjustment_value(x);
+ bool constrained = motion_event->state & GDK_CONTROL_MASK;
+ set_adjustment_value(x, constrained);
} else {
// Relative change
double xx = (_drag_offset + (x - _drag_start) * 0.1);
@@ -162,15 +164,33 @@ InkScale::get_fraction() {
}
void
-InkScale::set_adjustment_value(double x) {
+InkScale::set_adjustment_value(double x, bool constrained) {
Glib::RefPtr<Gtk::Adjustment> adjustment = get_adjustment();
double upper = adjustment->get_upper();
double lower = adjustment->get_lower();
+ double range = upper-lower;
Gdk::Rectangle slider_area = get_range_rect();
double fraction = (x - slider_area.get_x()) / (double)slider_area.get_width();
- double value = fraction * (upper - lower) + lower;
+ double value = fraction * range + lower;
+
+ if (constrained) {
+ // TODO: do we want preferences for (any of) these?
+ if (fmod(range+1,16) == 0) {
+ value = round(value/16) * 16;
+ } else if (range >= 1000 && fmod(upper,100) == 0) {
+ value = round(value/100) * 100;
+ } else if (range >= 100 && fmod(upper,10) == 0) {
+ value = round(value/10) * 10;
+ } else if (range > 20 && fmod(upper,5) == 0) {
+ value = round(value/5) * 5;
+ } else if (range > 2) {
+ value = round(value);
+ } else if (range <= 2) {
+ value = round(value*10) / 10;
+ }
+ }
adjustment->set_value( value );
}