[gimp] app: improve and clean up the canvas rotation dialog
- From: Michael Natterer <mitch src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gimp] app: improve and clean up the canvas rotation dialog
- Date: Thu, 26 Jun 2014 11:51:38 +0000 (UTC)
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]