[gimp] app: improve and clean up the canvas rotation dialog



commit 78bc7ac94ec4f1a09afd9ec1876407e043a6876d
Author: Michael Natterer <mitch gimp org>
Date:   Thu Jun 26 13:48:12 2014 +0200

    app: improve and clean up the canvas rotation dialog
    
    Make the action area buttons behave less unexpected, and add and angle
    dial.

 app/display/gimpdisplayshell-rotate-dialog.c |   93 +++++++++++++++++++++++---
 1 files changed, 83 insertions(+), 10 deletions(-)
---
diff --git a/app/display/gimpdisplayshell-rotate-dialog.c b/app/display/gimpdisplayshell-rotate-dialog.c
index 436445a..c116958 100644
--- a/app/display/gimpdisplayshell-rotate-dialog.c
+++ b/app/display/gimpdisplayshell-rotate-dialog.c
@@ -28,6 +28,7 @@
 #include "core/gimp.h"
 #include "core/gimpviewable.h"
 
+#include "widgets/gimpdial.h"
 #include "widgets/gimphelp-ids.h"
 #include "widgets/gimpviewabledialog.h"
 
@@ -46,21 +47,30 @@ typedef struct
 {
   GimpDisplayShell *shell;
   GtkAdjustment    *rotate_adj;
+  gdouble           old_angle;
 } RotateDialogData;
 
 
 /*  local function prototypes  */
 
-static void  gimp_display_shell_rotate_dialog_response (GtkWidget        *widget,
-                                                        gint              response_id,
+static void  gimp_display_shell_rotate_dialog_response (GtkWidget         *widget,
+                                                        gint               response_id,
                                                         RotateDialogData  *dialog);
-static void  gimp_display_shell_rotate_dialog_free     (RotateDialogData  *dialog);
+static void      gimp_display_shell_rotate_dialog_free (RotateDialogData  *dialog);
 
-static void  rotate_adjustment_changed                (GtkAdjustment     *adj,
-                                                       RotateDialogData  *dialog);
-static void  display_shell_rotated                    (GimpDisplayShell  *shell,
-                                                       RotateDialogData  *dialog);
+static void      rotate_adjustment_changed             (GtkAdjustment     *adj,
+                                                        RotateDialogData  *dialog);
+static void      display_shell_rotated                 (GimpDisplayShell  *shell,
+                                                        RotateDialogData  *dialog);
 
+static gboolean  deg_to_rad                            (GBinding          *binding,
+                                                        const GValue      *from_value,
+                                                        GValue            *to_value,
+                                                        gpointer           user_data);
+static gboolean  rad_to_deg                            (GBinding          *binding,
+                                                        const GValue      *from_value,
+                                                        GValue            *to_value,
+                                                        gpointer           user_data);
 
 
 /*  public functions  */
@@ -80,6 +90,7 @@ gimp_display_shell_rotate_dialog (GimpDisplayShell *shell)
   GtkWidget        *toplevel;
   GtkWidget        *hbox;
   GtkWidget        *spin;
+  GtkWidget        *dial;
   GtkWidget        *label;
 
   g_return_if_fail (GIMP_IS_DISPLAY_SHELL (shell));
@@ -94,7 +105,8 @@ gimp_display_shell_rotate_dialog (GimpDisplayShell *shell)
 
   data = g_slice_new (RotateDialogData);
 
-  data->shell = shell;
+  data->shell     = shell;
+  data->old_angle = shell->rotate_angle;
 
   shell->rotate_dialog =
     gimp_viewable_dialog_new (GIMP_VIEWABLE (image),
@@ -107,13 +119,14 @@ gimp_display_shell_rotate_dialog (GimpDisplayShell *shell)
                               GIMP_HELP_VIEW_ROTATE_OTHER,
 
                               GIMP_STOCK_RESET, RESPONSE_RESET,
+                              GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
                               GTK_STOCK_OK,     GTK_RESPONSE_OK,
 
                               NULL);
 
   gtk_dialog_set_alternative_button_order (GTK_DIALOG (shell->rotate_dialog),
                                            GTK_RESPONSE_OK,
-                                           RESPONSE_RESET,
+                                           GTK_RESPONSE_CANCEL,
                                            -1);
 
   g_object_weak_ref (G_OBJECT (shell->rotate_dialog),
@@ -155,6 +168,23 @@ gimp_display_shell_rotate_dialog (GimpDisplayShell *shell)
   gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
   gtk_widget_show (label);
 
+  dial = gimp_dial_new ();
+  g_object_set (dial,
+                "size",       32,
+                "background", GIMP_CIRCLE_BACKGROUND_PLAIN,
+                "draw-beta",  FALSE,
+                NULL);
+  gtk_box_pack_start (GTK_BOX (hbox), dial, FALSE, FALSE, 0);
+  gtk_widget_show (dial);
+
+  g_object_bind_property_full (data->rotate_adj, "value",
+                               dial,             "alpha",
+                               G_BINDING_BIDIRECTIONAL |
+                               G_BINDING_SYNC_CREATE,
+                               deg_to_rad,
+                               rad_to_deg,
+                               NULL, NULL);
+
   g_signal_connect (data->rotate_adj, "value-changed",
                     G_CALLBACK (rotate_adjustment_changed),
                     data);
@@ -170,9 +200,18 @@ gimp_display_shell_rotate_dialog_response (GtkWidget        *widget,
                                            gint              response_id,
                                            RotateDialogData *dialog)
 {
-  if (response_id == RESPONSE_RESET)
+  switch (response_id)
     {
+    case RESPONSE_RESET:
       gtk_adjustment_set_value (dialog->rotate_adj, 0.0);
+      return;
+
+    case GTK_RESPONSE_CANCEL:
+      gtk_adjustment_set_value (dialog->rotate_adj, dialog->old_angle);
+      /* fall thru */
+
+    default:
+      break;
     }
 
   gtk_widget_destroy (dialog->shell->rotate_dialog);
@@ -219,3 +258,37 @@ display_shell_rotated (GimpDisplayShell  *shell,
                                      rotate_adjustment_changed,
                                      dialog);
 }
+
+static gboolean
+deg_to_rad (GBinding     *binding,
+            const GValue *from_value,
+            GValue       *to_value,
+            gpointer      user_data)
+{
+  gdouble value = g_value_get_double (from_value);
+
+  value = 360.0 - value;
+
+  value *= G_PI / 180.0;
+
+  g_value_set_double (to_value, value);
+
+  return TRUE;
+}
+
+static gboolean
+rad_to_deg (GBinding     *binding,
+            const GValue *from_value,
+            GValue       *to_value,
+            gpointer      user_data)
+{
+  gdouble value = g_value_get_double (from_value);
+
+  value *= 180.0 / G_PI;
+
+  value = 360.0 - value;
+
+  g_value_set_double (to_value, value);
+
+  return TRUE;
+}


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]