[gimp] app: undeprecate GimpGradientEditor, fix scrolling and drawing
- From: Michael Natterer <mitch src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gimp] app: undeprecate GimpGradientEditor, fix scrolling and drawing
- Date: Wed, 13 Jun 2018 22:49:35 +0000 (UTC)
commit ffcd2a036639f943e7b41f74b93886ab6a0a21b2
Author: Michael Natterer <mitch gimp org>
Date: Thu Jun 14 00:48:27 2018 +0200
app: undeprecate GimpGradientEditor, fix scrolling and drawing
app/actions/gradient-editor-commands.c | 2 +-
app/widgets/gimpgradienteditor.c | 290 ++++++++++++++++-----------------
app/widgets/gimpgradienteditor.h | 3 +-
3 files changed, 142 insertions(+), 153 deletions(-)
---
diff --git a/app/actions/gradient-editor-commands.c b/app/actions/gradient-editor-commands.c
index b8fe8415ae..59512762dc 100644
--- a/app/actions/gradient-editor-commands.c
+++ b/app/actions/gradient-editor-commands.c
@@ -716,7 +716,7 @@ gradient_editor_zoom_cmd_callback (GtkAction *action,
{
GimpGradientEditor *editor = GIMP_GRADIENT_EDITOR (data);
- gimp_gradient_editor_zoom (editor, (GimpZoomType) value);
+ gimp_gradient_editor_zoom (editor, (GimpZoomType) value, 1.0);
}
diff --git a/app/widgets/gimpgradienteditor.c b/app/widgets/gimpgradienteditor.c
index 14e93e0389..b7b2ca6930 100644
--- a/app/widgets/gimpgradienteditor.c
+++ b/app/widgets/gimpgradienteditor.c
@@ -77,7 +77,7 @@
#define EPSILON 1e-10
#define GRAD_SCROLLBAR_STEP_SIZE 0.05
-#define GRAD_SCROLLBAR_PAGE_SIZE 0.75
+#define GRAD_SCROLLBAR_PAGE_SIZE 0.5
#define GRAD_VIEW_SIZE 96
#define GRAD_CONTROL_HEIGHT 14
@@ -214,21 +214,13 @@ static void control_draw_all (GimpGradientEditor *editor,
gint height,
gdouble left,
gdouble right);
-static void control_draw_normal_handle (GimpGradientEditor *editor,
+static void control_draw_handle (GimpGradientEditor *editor,
+ GtkStyleContext *style,
cairo_t *cr,
gdouble pos,
gint height,
- gboolean selected);
-static void control_draw_middle_handle (GimpGradientEditor *editor,
- cairo_t *cr,
- gdouble pos,
- gint height,
- gboolean selected);
-static void control_draw_handle (cairo_t *cr,
- const GdkRGBA *border,
- const GdkRGBA *fill,
- gint xpos,
- gint height);
+ gboolean middle,
+ GtkStateFlags flags);
static gint control_calc_p_pos (GimpGradientEditor *editor,
gdouble pos);
@@ -273,17 +265,6 @@ gimp_gradient_editor_class_init (GimpGradientEditorClass *klass)
editor_class->set_data = gimp_gradient_editor_set_data;
editor_class->title = _("Gradient Editor");
-
- gtk_widget_class_install_style_property (widget_class,
- g_param_spec_boxed ("handle-color",
- NULL, NULL,
- GDK_TYPE_RGBA,
- GIMP_PARAM_READABLE));
- gtk_widget_class_install_style_property (widget_class,
- g_param_spec_boxed ("handle-color-selected",
- NULL, NULL,
- GDK_TYPE_RGBA,
- GIMP_PARAM_READABLE));
}
static void
@@ -306,8 +287,6 @@ gimp_gradient_editor_init (GimpGradientEditor *editor)
GtkWidget *hbox;
GtkWidget *hint_vbox;
GimpRGB transp;
- GtkCssProvider *css;
- const gchar *str;
gimp_rgba_set (&transp, 0.0, 0.0, 0.0, 0.0);
@@ -449,19 +428,6 @@ gimp_gradient_editor_init (GimpGradientEditor *editor)
gimp_rgba_set (&editor->saved_colors[7], 0.0, 1.0, 1.0, GIMP_OPACITY_OPAQUE);
gimp_rgba_set (&editor->saved_colors[8], 0.0, 0.0, 1.0, GIMP_OPACITY_OPAQUE);
gimp_rgba_set (&editor->saved_colors[9], 1.0, 0.0, 1.0, GIMP_OPACITY_OPAQUE);
-
- str =
- "GimpGradientEditor {\n"
- " -GimpGradientEditor-handle-color: mix (@text_color, @base_color, 0.5);\n"
- " -GimpGradientEditor-handle-color-selected: mix (@selected_fg_color, @selected_bg_color, 0.5);\n"
- "}\n";
-
- css = gtk_css_provider_new ();
- gtk_css_provider_load_from_data (css, str, -1, NULL);
- gtk_style_context_add_provider (gtk_widget_get_style_context (GTK_WIDGET (editor)),
- GTK_STYLE_PROVIDER (css),
- GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
- g_object_unref (css);
}
static void
@@ -582,7 +548,8 @@ gimp_gradient_editor_update (GimpGradientEditor *editor)
void
gimp_gradient_editor_zoom (GimpGradientEditor *editor,
- GimpZoomType zoom_type)
+ GimpZoomType zoom_type,
+ gdouble delta)
{
GtkAdjustment *adjustment;
gdouble old_value;
@@ -592,6 +559,22 @@ gimp_gradient_editor_zoom (GimpGradientEditor *editor,
g_return_if_fail (GIMP_IS_GRADIENT_EDITOR (editor));
+ if (zoom_type == GIMP_ZOOM_SMOOTH)
+ {
+ if (delta < 0)
+ zoom_type = GIMP_ZOOM_IN;
+ else if (delta > 0)
+ zoom_type = GIMP_ZOOM_OUT;
+ else
+ return;
+
+ delta = ABS (delta);
+ }
+ else
+ {
+ delta = 1.0;
+ }
+
adjustment = editor->scroll_data;
old_value = gtk_adjustment_get_value (adjustment);
@@ -602,7 +585,7 @@ gimp_gradient_editor_zoom (GimpGradientEditor *editor,
case GIMP_ZOOM_IN_MAX:
case GIMP_ZOOM_IN_MORE:
case GIMP_ZOOM_IN:
- editor->zoom_factor++;
+ editor->zoom_factor += delta;
page_size = 1.0 / editor->zoom_factor;
value = old_value + (old_page_size - page_size) / 2.0;
@@ -613,7 +596,7 @@ gimp_gradient_editor_zoom (GimpGradientEditor *editor,
if (editor->zoom_factor <= 1)
return;
- editor->zoom_factor--;
+ editor->zoom_factor -= delta;
page_size = 1.0 / editor->zoom_factor;
value = old_value - (page_size - old_page_size) / 2.0;
@@ -631,6 +614,9 @@ gimp_gradient_editor_zoom (GimpGradientEditor *editor,
value = 0.0;
page_size = 1.0;
break;
+
+ case GIMP_ZOOM_SMOOTH: /* can't happen, see above switch() */
+ break;
}
gtk_adjustment_configure (adjustment,
@@ -895,14 +881,21 @@ view_events (GtkWidget *widget,
if (sevent->state & gimp_get_toggle_behavior_mask ())
{
+ gdouble delta;
+
switch (sevent->direction)
{
case GDK_SCROLL_UP:
- gimp_gradient_editor_zoom (editor, GIMP_ZOOM_IN);
+ gimp_gradient_editor_zoom (editor, GIMP_ZOOM_IN, 1.0);
break;
case GDK_SCROLL_DOWN:
- gimp_gradient_editor_zoom (editor, GIMP_ZOOM_OUT);
+ gimp_gradient_editor_zoom (editor, GIMP_ZOOM_OUT, 1.0);
+ break;
+
+ case GDK_SCROLL_SMOOTH:
+ gdk_event_get_scroll_deltas (event, NULL, &delta);
+ gimp_gradient_editor_zoom (editor, GIMP_ZOOM_SMOOTH, delta);
break;
default:
@@ -911,29 +904,13 @@ view_events (GtkWidget *widget,
}
else
{
- GtkAdjustment *adj = editor->scroll_data;
- gfloat value = gtk_adjustment_get_value (adj);
+ gdouble value;
- switch (sevent->direction)
- {
- case GDK_SCROLL_UP:
- value -= gtk_adjustment_get_page_increment (adj) / 2;
- break;
-
- case GDK_SCROLL_DOWN:
- value += gtk_adjustment_get_page_increment (adj) / 2;
- break;
-
- default:
- break;
- }
-
- value = CLAMP (value,
- gtk_adjustment_get_lower (adj),
- gtk_adjustment_get_upper (adj) -
- gtk_adjustment_get_page_size (adj));
+ gimp_scroll_adjustment_values (sevent,
+ editor->scroll_data, NULL,
+ &value, NULL);
- gtk_adjustment_set_value (adj, value);
+ gtk_adjustment_set_value (editor->scroll_data, value);
}
}
break;
@@ -1102,27 +1079,36 @@ control_events (GtkWidget *widget,
if (sevent->state & gimp_get_toggle_behavior_mask ())
{
- if (sevent->direction == GDK_SCROLL_UP)
- gimp_gradient_editor_zoom (editor, GIMP_ZOOM_IN);
- else
- gimp_gradient_editor_zoom (editor, GIMP_ZOOM_OUT);
+ gdouble delta;
+
+ switch (sevent->direction)
+ {
+ case GDK_SCROLL_UP:
+ gimp_gradient_editor_zoom (editor, GIMP_ZOOM_IN, 1.0);
+ break;
+
+ case GDK_SCROLL_DOWN:
+ gimp_gradient_editor_zoom (editor, GIMP_ZOOM_OUT, 1.0);
+ break;
+
+ case GDK_SCROLL_SMOOTH:
+ gdk_event_get_scroll_deltas (event, NULL, &delta);
+ gimp_gradient_editor_zoom (editor, GIMP_ZOOM_SMOOTH, delta);
+ break;
+
+ default:
+ break;
+ }
}
else
{
- GtkAdjustment *adj = editor->scroll_data;
- gfloat new_value;
-
- new_value = (gtk_adjustment_get_value (adj) +
- ((sevent->direction == GDK_SCROLL_UP) ?
- - gtk_adjustment_get_page_increment (adj) / 2 :
- gtk_adjustment_get_page_increment (adj) / 2));
+ gdouble value;
- new_value = CLAMP (new_value,
- gtk_adjustment_get_lower (adj),
- gtk_adjustment_get_upper (adj) -
- gtk_adjustment_get_page_size (adj));
+ gimp_scroll_adjustment_values (sevent,
+ editor->scroll_data, NULL,
+ &value, NULL);
- gtk_adjustment_set_value (adj, new_value);
+ gtk_adjustment_set_value (editor->scroll_data, value);
}
}
break;
@@ -1726,91 +1712,93 @@ control_draw_all (GimpGradientEditor *editor,
gdouble left,
gdouble right)
{
- GtkStyleContext *control_style;
+ GtkStyleContext *style;
GimpGradientSegment *seg;
GradientEditorDragMode handle;
- GdkRGBA color;
gint sel_l;
gint sel_r;
gdouble g_pos;
- gboolean selected;
+ GtkStateFlags flags;
if (! gradient)
return;
/* Draw selection */
- control_style = gtk_widget_get_style_context (editor->control);
+ style = gtk_widget_get_style_context (editor->control);
sel_l = control_calc_p_pos (editor, editor->control_sel_l->left);
sel_r = control_calc_p_pos (editor, editor->control_sel_r->right);
- gtk_style_context_add_class (control_style, GTK_STYLE_CLASS_ENTRY);
+ gtk_style_context_save (style);
- gtk_style_context_get_background_color (control_style, 0,
- &color);
- gdk_cairo_set_source_rgba (cr, &color);
- cairo_rectangle (cr, 0, 0, width, height);
- cairo_fill (cr);
+ gtk_style_context_add_class (style, GTK_STYLE_CLASS_VIEW);
+ gtk_render_background (style, cr, 0, 0, width, height);
- gtk_style_context_get_background_color (control_style, GTK_STATE_FLAG_SELECTED,
- &color);
- gdk_cairo_set_source_rgba (cr, &color);
- cairo_rectangle (cr, sel_l, 0, sel_r - sel_l + 1, height);
- cairo_fill (cr);
+ gtk_style_context_set_state (style, GTK_STATE_FLAG_SELECTED);
+ gtk_render_background (style, cr,sel_l, 0, sel_r - sel_l + 1, height);
- gtk_style_context_remove_class (control_style, GTK_STYLE_CLASS_ENTRY);
+ gtk_style_context_restore (style);
/* Draw handles */
- selected = FALSE;
+ flags = GTK_STATE_FLAG_NORMAL;
for (seg = gradient->segments; seg; seg = seg->next)
{
if (seg == editor->control_sel_l)
- selected = TRUE;
+ flags = GTK_STATE_FLAG_SELECTED;
- control_draw_normal_handle (editor, cr, seg->left, height, selected);
- control_draw_middle_handle (editor, cr, seg->middle, height, selected);
+ control_draw_handle (editor, style, cr, seg->left,
+ height, FALSE, flags);
+ control_draw_handle (editor, style, cr, seg->middle,
+ height, TRUE, flags);
/* Draw right handle only if this is the last segment */
if (seg->next == NULL)
- control_draw_normal_handle (editor, cr, seg->right, height, selected);
+ control_draw_handle (editor, style, cr, seg->right,
+ height, FALSE, flags);
if (seg == editor->control_sel_r)
- selected = FALSE;
+ flags = GTK_STATE_FLAG_NORMAL;
}
/* Draw the handle which is closest to the mouse position */
+ flags = GTK_STATE_FLAG_PRELIGHT;
+
g_pos = control_calc_g_pos (editor, editor->control_last_x);
seg_get_closest_handle (gradient, CLAMP (g_pos, 0.0, 1.0), &seg, &handle);
- selected = (seg &&
- seg_in_selection (gradient, seg,
- editor->control_sel_l, editor->control_sel_r));
+ if (seg && seg_in_selection (gradient, seg,
+ editor->control_sel_l, editor->control_sel_r))
+ flags |= GTK_STATE_FLAG_SELECTED;
switch (handle)
{
case GRAD_DRAG_LEFT:
if (seg)
{
- control_draw_normal_handle (editor, cr, seg->left, height, selected);
+ control_draw_handle (editor, style, cr, seg->left,
+ height, FALSE, flags);
}
else
{
seg = gimp_gradient_segment_get_last (gradient->segments);
- selected = (seg == editor->control_sel_r);
+ if (seg == editor->control_sel_r)
+ flags |= GTK_STATE_FLAG_SELECTED;
- control_draw_normal_handle (editor, cr, seg->right, height, selected);
+ control_draw_handle (editor, style, cr, seg->right,
+ height, FALSE, flags);
}
break;
case GRAD_DRAG_MIDDLE:
- control_draw_middle_handle (editor, cr, seg->middle, height, selected);
+ control_draw_handle (editor, style, cr, seg->middle,
+ height, TRUE, flags);
break;
default:
@@ -1819,59 +1807,59 @@ control_draw_all (GimpGradientEditor *editor,
}
static void
-control_draw_normal_handle (GimpGradientEditor *editor,
- cairo_t *cr,
- gdouble pos,
- gint height,
- gboolean selected)
-{
- GdkRGBA border;
- GdkRGBA fill = { 0.0, 0.0, 0.0, 1.0 };
-
- gimp_get_style_color (GTK_WIDGET (editor),
- selected ? "handle-color-selected" : "handle-color",
- &border);
-
- control_draw_handle (cr, &border, &fill,
- control_calc_p_pos (editor, pos), height);
-}
-
-static void
-control_draw_middle_handle (GimpGradientEditor *editor,
- cairo_t *cr,
- gdouble pos,
- gint height,
- gboolean selected)
+control_draw_handle (GimpGradientEditor *editor,
+ GtkStyleContext *style,
+ cairo_t *cr,
+ gdouble pos,
+ gint height,
+ gboolean middle,
+ GtkStateFlags flags)
{
- GdkRGBA border;
- GdkRGBA fill = { 1.0, 1.0, 1.0, 1.0 };
+ GdkRGBA color;
+ gint xpos = control_calc_p_pos (editor, pos);
+ gboolean selected = (flags & GTK_STATE_FLAG_SELECTED) != 0;
- gimp_get_style_color (GTK_WIDGET (editor),
- selected ? "handle-color-selected" : "handle-color",
- &border);
+ cairo_save (cr);
- control_draw_handle (cr, &border, &fill,
- control_calc_p_pos (editor, pos), height);
-}
-
-static void
-control_draw_handle (cairo_t *cr,
- const GdkRGBA *border,
- const GdkRGBA *fill,
- gint xpos,
- gint height)
-{
cairo_move_to (cr, xpos, 0);
cairo_line_to (cr, xpos - height / 2.0, height);
cairo_line_to (cr, xpos + height / 2.0, height);
cairo_line_to (cr, xpos, 0);
- gdk_cairo_set_source_rgba (cr, fill);
+ gtk_style_context_save (style);
+
+ gtk_style_context_add_class (style, GTK_STYLE_CLASS_VIEW);
+
+ gtk_style_context_save (style);
+
+ gtk_style_context_set_state (style, flags);
+
+ gtk_style_context_get_color (style, gtk_style_context_get_state (style),
+ &color);
+
+ gtk_style_context_restore (style);
+
+ if (middle)
+ color.alpha = 0.5;
+
+ gdk_cairo_set_source_rgba (cr, &color);
cairo_fill_preserve (cr);
- gdk_cairo_set_source_rgba (cr, border);
+ if (selected)
+ gtk_style_context_set_state (style, flags &= ~GTK_STATE_FLAG_SELECTED);
+ else
+ gtk_style_context_set_state (style, flags |= GTK_STATE_FLAG_SELECTED);
+
+ gtk_style_context_get_color (style, gtk_style_context_get_state (style),
+ &color);
+
+ gdk_cairo_set_source_rgba (cr, &color);
cairo_set_line_width (cr, 1);
cairo_stroke (cr);
+
+ gtk_style_context_restore (style);
+
+ cairo_restore (cr);
}
/*****/
diff --git a/app/widgets/gimpgradienteditor.h b/app/widgets/gimpgradienteditor.h
index 8f0429a0c3..1e62fed968 100644
--- a/app/widgets/gimpgradienteditor.h
+++ b/app/widgets/gimpgradienteditor.h
@@ -113,7 +113,8 @@ GtkWidget * gimp_gradient_editor_new (GimpContext *context,
void gimp_gradient_editor_update (GimpGradientEditor *editor);
void gimp_gradient_editor_zoom (GimpGradientEditor *editor,
- GimpZoomType zoom_type);
+ GimpZoomType zoom_type,
+ gdouble delta);
#endif /* __GIMP_GRADIENT_EDITOR_H__ */
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]