From 20ed8d98deaeec9d63a61e71a5a52c379b9a60b9 Mon Sep 17 00:00:00 2001
From: Yari Adan <mustang@yadan.org>
Date: Mon, 1 Jul 2013 15:12:41 +0200
Subject: [PATCH] connect key accel callbacks to bauhaus sliders (complements
 commit 09a02f4093f52)

---
 src/bauhaus/bauhaus.c  |   32 ++++++++++++--
 src/bauhaus/bauhaus.h  |   10 ++++-
 src/gui/accelerators.c |  111 ++++++++++++++++++++++++++++++++++++++++--------
 3 files changed, 131 insertions(+), 22 deletions(-)

diff --git a/src/bauhaus/bauhaus.c b/src/bauhaus/bauhaus.c
index bc1be59..a78cacd 100644
--- a/src/bauhaus/bauhaus.c
+++ b/src/bauhaus/bauhaus.c
@@ -32,8 +32,6 @@
 G_DEFINE_TYPE (DtBauhausWidget, dt_bh, GTK_TYPE_DRAWING_AREA)
 
 // fwd declare
-static void dt_bauhaus_hide_popup();
-static void dt_bauhaus_show_popup(dt_bauhaus_widget_t *w);
 static gboolean
 dt_bauhaus_popup_expose(GtkWidget *widget, GdkEventExpose *event, gpointer user_data);
 static gboolean
@@ -813,6 +811,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;
@@ -1546,7 +1545,7 @@ dt_bauhaus_expose(GtkWidget *widget, GdkEventExpose *event, gpointer user_data)
   return TRUE;
 }
 
-static void
+void
 dt_bauhaus_hide_popup()
 {
   if(darktable.bauhaus->current)
@@ -1558,7 +1557,7 @@ dt_bauhaus_hide_popup()
   }
 }
 
-static void
+void
 dt_bauhaus_show_popup(dt_bauhaus_widget_t *w)
 {
   if(darktable.bauhaus->current)
@@ -1731,6 +1730,31 @@ 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_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..8327e52 100644
--- a/src/bauhaus/bauhaus.h
+++ b/src/bauhaus/bauhaus.h
@@ -40,7 +40,9 @@
 #define DT_BAUHAUS_WIDGET_CLASS(obj)       (G_TYPE_CHECK_CLASS_CAST ((obj), DT_BAUHAUS_WIDGET, DtBauhausWidgetClass))
 #define DT_IS_BAUHAUS_WIDGET(obj)          (G_TYPE_CHECK_INSTANCE_TYPE ((obj), DT_BAUHAUS_WIDGET_TYPE))
 #define DT_IS_BAUHAUS_WIDGET_CLASS(obj)    (G_TYPE_CHECK_CLASS_TYPE ((obj), DT_BAUHAUS_WIDGET_TYPE))
-#define DT_BAUHAUS_WIDGET_GET_CLASS        (G_TYPE_INSTANCE_GET_CLASS ((obj), DT_BAUHAUS_WIDGET_TYPE, DtBauausWidgetClass))
+#define DT_BAUHAUS_WIDGET_GET_CLASS        (G_TYPE_INSTANCE_GET_CLASS ((obj), DT_BAUHAUS_WIDGET_TYPE, DtBauhausWidgetClass))
+
+extern GType DT_BAUHAUS_WIDGET_TYPE;
 
 #define DT_BAUHAUS_SLIDER_VALUE_CHANGED_DELAY_MAX     500
 #define DT_BAUHAUS_SLIDER_VALUE_CHANGED_DELAY_MIN     25
@@ -58,6 +60,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
@@ -212,6 +215,9 @@ void dt_bauhaus_widget_set_quad_paint(GtkWidget *w, dt_bauhaus_quad_paint_f f, i
 // make this quad a toggle button:
 void dt_bauhaus_widget_set_quad_toggle(GtkWidget *w, int toggle);
 
+void dt_bauhaus_hide_popup();
+void dt_bauhaus_show_popup(dt_bauhaus_widget_t *w);
+
 // slider:
 GtkWidget* dt_bauhaus_slider_new(dt_iop_module_t *self);
 GtkWidget* dt_bauhaus_slider_new_with_range(dt_iop_module_t *self, float min, float max, float step, float defval, int digits);
@@ -219,6 +225,8 @@ 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);
diff --git a/src/gui/accelerators.c b/src/gui/accelerators.c
index 31d59ce..1d6dfff 100644
--- a/src/gui/accelerators.c
+++ b/src/gui/accelerators.c
@@ -23,10 +23,11 @@
 #include "common/debug.h"
 #include "develop/blend.h"
 
+#include "bauhaus/bauhaus.h"
+
 #include <gtk/gtk.h>
 #include <assert.h>
 
-
 void dt_accel_path_global(char *s, size_t n, const char* path)
 {
   snprintf(s, n, "<Darktable>/%s/%s",
@@ -363,7 +364,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 +379,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 +394,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 +420,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_show_popup(DT_BAUHAUS_WIDGET(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 +486,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 (DT_IS_BAUHAUS_WIDGET(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 +511,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 (DT_IS_BAUHAUS_WIDGET(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 +535,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 (DT_IS_BAUHAUS_WIDGET(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 +559,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 (DT_IS_BAUHAUS_WIDGET(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

