From 9c249b888f81f786d453d68c22135575636a3259 Mon Sep 17 00:00:00 2001
From: Yari Adan <mustang@yadan.org>
Date: Sat, 22 Jun 2013 22:39:58 +0200
Subject: [PATCH] connect key accel callbacks to bauhaus sliders (complements
 commit 09a02f4093f52)

---
 src/bauhaus/bauhaus.c  |   36 ++++++++++++++++
 src/bauhaus/bauhaus.h  |    4 ++
 src/gui/accelerators.c |  111 +++++++++++++++++++++++++++++++++++++++++-------
 3 files changed, 135 insertions(+), 16 deletions(-)

diff --git a/src/bauhaus/bauhaus.c b/src/bauhaus/bauhaus.c
index bc1be59..65038f3 100644
--- a/src/bauhaus/bauhaus.c
+++ b/src/bauhaus/bauhaus.c
@@ -813,6 +813,7 @@ dt_bauhaus_slider_new_with_range(dt_iop_module_t *self, float min, float max, fl
   dt_bauhaus_slider_data_t *d = &w->data.slider;
   d->min = min;
   d->max = max;
+  d->step = step;
   // normalize default:
   d->defpos = (defval-min)/(max-min);
   d->pos = d->defpos;
@@ -1731,6 +1732,41 @@ dt_bauhaus_slider_set(GtkWidget *widget, float pos)
   dt_bauhaus_slider_set_normalized(w, (pos-d->min)/(d->max-d->min));
 }
 
+float
+dt_bauhaus_slider_get_step(GtkWidget *widget)
+{
+  dt_bauhaus_widget_t *w = (dt_bauhaus_widget_t *)DT_BAUHAUS_WIDGET(widget);
+
+  if(w->type != DT_BAUHAUS_SLIDER) return 0;
+
+  dt_bauhaus_slider_data_t *d = &w->data.slider;
+
+  return d->step;
+}
+
+void
+dt_bauhaus_slider_show_popup(GtkWidget *widget)
+{
+  dt_bauhaus_widget_t *w = (dt_bauhaus_widget_t *)DT_BAUHAUS_WIDGET(widget);
+
+  dt_bauhaus_show_popup(w);
+
+  return;
+}
+
+void
+dt_bauhaus_slider_reset(GtkWidget *widget)
+{
+  dt_bauhaus_widget_t *w = (dt_bauhaus_widget_t *)DT_BAUHAUS_WIDGET(widget);
+
+  if(w->type != DT_BAUHAUS_SLIDER) return;
+  dt_bauhaus_slider_data_t *d = &w->data.slider;
+
+  dt_bauhaus_slider_set_normalized(w, d->defpos);
+
+  return;
+}
+
 void
 dt_bauhaus_slider_set_format(GtkWidget *widget, const char *format)
 {
diff --git a/src/bauhaus/bauhaus.h b/src/bauhaus/bauhaus.h
index 936c412..659faea 100644
--- a/src/bauhaus/bauhaus.h
+++ b/src/bauhaus/bauhaus.h
@@ -58,6 +58,7 @@ typedef struct dt_bauhaus_slider_data_t
 {
   float pos;      // normalized slider value
   float oldpos;   // slider value before entering finetune mode (normalized)
+  float step;     // step width (not normalized)
   float defpos;   // default value (normalized)
   float min, max; // min and max range
   float scale;    // step width for loupe mode
@@ -219,9 +220,12 @@ GtkWidget* dt_bauhaus_slider_new_with_range(dt_iop_module_t *self, float min, fl
 // outside doesn't see the real type, we cast it internally.
 void dt_bauhaus_slider_set(GtkWidget *w, float pos);
 float dt_bauhaus_slider_get(GtkWidget *w);
+float dt_bauhaus_slider_get_step(GtkWidget *widget);
+void dt_bauhaus_slider_reset(GtkWidget *widget);
 void dt_bauhaus_slider_set_format(GtkWidget *w, const char *format);
 void dt_bauhaus_slider_set_stop(GtkWidget *widget, float stop, float r, float g, float b);
 void dt_bauhaus_slider_set_default(GtkWidget *widget, float def);
+void dt_bauhaus_slider_show_popup(GtkWidget *widget);
 
 // combobox:
 GtkWidget* dt_bauhaus_combobox_new(dt_iop_module_t *self);
diff --git a/src/gui/accelerators.c b/src/gui/accelerators.c
index 31d59ce..7173c6c 100644
--- a/src/gui/accelerators.c
+++ b/src/gui/accelerators.c
@@ -23,9 +23,12 @@
 #include "common/debug.h"
 #include "develop/blend.h"
 
+#include "bauhaus/bauhaus.h"
+
 #include <gtk/gtk.h>
 #include <assert.h>
 
+#define IS_BAUHAUS_SLIDER(widget) GTK_IS_DRAWING_AREA(widget)
 
 void dt_accel_path_global(char *s, size_t n, const char* path)
 {
@@ -363,7 +366,6 @@ void dt_accel_connect_button_lib(dt_lib_module_t *module, const gchar *path,
   dt_accel_connect_lib(module, path, closure);
 }
 
-
 static gboolean slider_edit_callback(GtkAccelGroup *accel_group,
                                      GObject *acceleratable, guint keyval,
                                      GdkModifierType modifier, gpointer data)
@@ -379,9 +381,10 @@ static gboolean slider_edit_callback(GtkAccelGroup *accel_group,
   gtk_widget_queue_draw (GTK_WIDGET(slider));
   return TRUE;
 }
+
 static gboolean slider_increase_callback(GtkAccelGroup *accel_group,
-    GObject *acceleratable, guint keyval,
-    GdkModifierType modifier, gpointer data)
+                                         GObject *acceleratable, guint keyval,
+                                         GdkModifierType modifier, gpointer data)
 {
   GtkDarktableSlider *slider=DTGTK_SLIDER(data);
   float value = gtk_adjustment_get_value(slider->adjustment);
@@ -393,9 +396,10 @@ static gboolean slider_increase_callback(GtkAccelGroup *accel_group,
   g_signal_emit_by_name(G_OBJECT(slider),"value-changed");
   return TRUE;
 }
+
 static gboolean slider_decrease_callback(GtkAccelGroup *accel_group,
-    GObject *acceleratable, guint keyval,
-    GdkModifierType modifier, gpointer data)
+                                         GObject *acceleratable, guint keyval,
+                                         GdkModifierType modifier, gpointer data)
 {
   GtkDarktableSlider *slider=DTGTK_SLIDER(data);
   float value = gtk_adjustment_get_value(slider->adjustment);
@@ -418,13 +422,63 @@ static gboolean slider_reset_callback(GtkAccelGroup *accel_group,
   g_signal_emit_by_name(G_OBJECT(slider),"value-changed");
   return TRUE;
 }
+
+static gboolean bauhaus_slider_edit_callback(GtkAccelGroup *accel_group,
+                                             GObject *acceleratable, guint keyval,
+                                             GdkModifierType modifier, gpointer data)
+{
+  GtkWidget *slider = GTK_WIDGET(data);
+
+  dt_bauhaus_slider_show_popup(slider);
+
+  return TRUE;
+}
+
+static gboolean bauhaus_slider_increase_callback(GtkAccelGroup *accel_group,
+                                                 GObject *acceleratable, guint keyval,
+                                                 GdkModifierType modifier, gpointer data)
+{
+  GtkWidget *slider = GTK_WIDGET(data);
+
+  float value = dt_bauhaus_slider_get(slider);
+  float step  = dt_bauhaus_slider_get_step(slider);
+
+  dt_bauhaus_slider_set(slider, value + step);
+
+  g_signal_emit_by_name(G_OBJECT(slider),"value-changed");
+  return TRUE;
+}
+
+static gboolean bauhaus_slider_decrease_callback(GtkAccelGroup *accel_group,
+                                                 GObject *acceleratable, guint keyval,
+                                                 GdkModifierType modifier, gpointer data)
+{
+  GtkWidget *slider = GTK_WIDGET(data);
+
+  float value = dt_bauhaus_slider_get(slider);
+  float step  = dt_bauhaus_slider_get_step(slider);
+
+  dt_bauhaus_slider_set(slider, value - step);
+
+  g_signal_emit_by_name(G_OBJECT(slider),"value-changed");
+  return TRUE;
+}
+
+static gboolean bauhaus_slider_reset_callback(GtkAccelGroup *accel_group,
+                                              GObject *acceleratable, guint keyval,
+                                              GdkModifierType modifier, gpointer data)
+{
+  GtkWidget *slider = GTK_WIDGET(data);
+
+  dt_bauhaus_slider_reset(slider);
+
+  g_signal_emit_by_name(G_OBJECT(slider),"value-changed");
+  return TRUE;
+}
+
 void dt_accel_connect_slider_iop(dt_iop_module_t *module, const gchar *path,
                                  GtkWidget *slider)
 {
-  // just make this callback safe for bauhaus sliders for now:
-  // TODO: implement it for these widgets, too!
-  // (we check for their inheritance from gtk drawing area, that's simpler)
-  if(GTK_IS_DRAWING_AREA(slider)) return;
   gchar increase_path[256];
   gchar decrease_path[256];
   gchar reset_path[256];
@@ -434,8 +488,15 @@ void dt_accel_connect_slider_iop(dt_iop_module_t *module, const gchar *path,
   char *paths[] = {increase_path, decrease_path, reset_path, edit_path};
   dt_accel_paths_slider_iop(paths, 256, module->op, path);
 
-  closure =  g_cclosure_new(G_CALLBACK(slider_increase_callback),
-                            (gpointer)slider, NULL);
+  if(IS_BAUHAUS_SLIDER(slider)) {
+    closure =  g_cclosure_new(G_CALLBACK(bauhaus_slider_increase_callback),
+                              (gpointer)slider, NULL);
+
+  } else {
+    closure =  g_cclosure_new(G_CALLBACK(slider_increase_callback),
+                              (gpointer)slider, NULL);
+  }
+
   accel = _lookup_accel(increase_path);
 
   if (accel)
@@ -452,8 +513,14 @@ void dt_accel_connect_slider_iop(dt_iop_module_t *module, const gchar *path,
     module->accel_closures = g_slist_prepend(module->accel_closures, accel);
   }
 
-  closure = g_cclosure_new(G_CALLBACK(slider_decrease_callback),
-                           (gpointer)slider, NULL);
+  if(IS_BAUHAUS_SLIDER(slider)) {
+    closure = g_cclosure_new(G_CALLBACK(bauhaus_slider_decrease_callback),
+                             (gpointer)slider, NULL);
+  } else {
+    closure = g_cclosure_new(G_CALLBACK(slider_decrease_callback),
+                             (gpointer)slider, NULL);
+  }
+
   accel = _lookup_accel(decrease_path);
 
   if (accel)
@@ -470,8 +537,14 @@ void dt_accel_connect_slider_iop(dt_iop_module_t *module, const gchar *path,
     module->accel_closures = g_slist_prepend(module->accel_closures, accel);
   }
 
-  closure = g_cclosure_new(G_CALLBACK(slider_reset_callback),
-                           (gpointer)slider, NULL);
+  if (IS_BAUHAUS_SLIDER(slider)) {
+    closure = g_cclosure_new(G_CALLBACK(bauhaus_slider_reset_callback),
+                             (gpointer)slider, NULL);
+  } else {
+    closure = g_cclosure_new(G_CALLBACK(slider_reset_callback),
+                             (gpointer)slider, NULL);
+  }
+
   accel = _lookup_accel(reset_path);
 
   if (accel)
@@ -488,8 +561,14 @@ void dt_accel_connect_slider_iop(dt_iop_module_t *module, const gchar *path,
     module->accel_closures = g_slist_prepend(module->accel_closures, accel);
   }
 
-  closure = g_cclosure_new(G_CALLBACK(slider_edit_callback),
+  if (IS_BAUHAUS_SLIDER(slider)) {
+    closure = g_cclosure_new(G_CALLBACK(bauhaus_slider_edit_callback),
                            (gpointer)slider, NULL);
+  } else {
+    closure = g_cclosure_new(G_CALLBACK(slider_edit_callback),
+                             (gpointer)slider, NULL);
+  }
+
   accel = _lookup_accel(edit_path);
 
   if (accel)
-- 
1.7.10.4

