From 6a423a99ad1f71edf3f6eaa6f09dd86efbd80769 Mon Sep 17 00:00:00 2001 From: Cosimo Cecchi Date: Mon, 28 Feb 2011 15:44:53 -0500 Subject: [PATCH] spinbutton: rework GtkSpinButton drawing handler Make the arrows bigger, and position them according to the mockups. --- gtk/gtkspinbutton.c | 89 ++++++++++++++++++--------------------------- 1 file changed, 35 insertions(+), 54 deletions(-) diff --git a/gtk/gtkspinbutton.c b/gtk/gtkspinbutton.c index 3d0875390a..6bc78e0866 100644 --- a/gtk/gtkspinbutton.c +++ b/gtk/gtkspinbutton.c @@ -988,14 +988,9 @@ gtk_spin_button_draw_arrow (GtkSpinButton *spin_button, GtkJunctionSides junction; GtkStateFlags state; GtkWidget *widget; - GtkBorder padding; gdouble angle; - gint x; - gint y; gint panel_height; - gint height; - gint width; - gint h, w; + gdouble size, width, height, actual_width, x, y; g_return_if_fail (arrow_type == GTK_ARROW_UP || arrow_type == GTK_ARROW_DOWN); @@ -1008,25 +1003,6 @@ gtk_spin_button_draw_arrow (GtkSpinButton *spin_button, panel_height = gdk_window_get_height (priv->panel); - if (arrow_type == GTK_ARROW_UP) - { - x = 0; - y = 0; - - height = panel_height / 2; - angle = 0; - junction |= GTK_JUNCTION_BOTTOM; - } - else - { - x = 0; - y = panel_height / 2; - - height = (panel_height + 1) / 2; - angle = G_PI; - junction |= GTK_JUNCTION_TOP; - } - if (spin_button_at_limit (spin_button, arrow_type)) state = GTK_STATE_FLAG_INSENSITIVE; else @@ -1043,47 +1019,52 @@ gtk_spin_button_draw_arrow (GtkSpinButton *spin_button, } } - gtk_style_context_get_padding (context, state, &padding); + /* first, draw the background and the frame */ + if (arrow_type == GTK_ARROW_UP) + { + x = 0; + y = 0; + + junction |= GTK_JUNCTION_BOTTOM; + } + else if (arrow_type == GTK_ARROW_DOWN) + { + x = 0; + y = panel_height / 2.0; + + junction |= GTK_JUNCTION_TOP; + } + gtk_style_context_set_junction_sides (context, junction); gtk_style_context_set_state (context, state); - width = spin_button_get_arrow_size (spin_button) + padding.left + padding.right; + height = panel_height / 2.0; + width = gdk_window_get_width (priv->panel); + gtk_render_background (context, cr, + x, y, width, height); + gtk_render_frame (context, cr, + x, y, width, height); - gtk_render_background (context, cr, x, y, width, height); - gtk_render_frame (context, cr, x, y, width, height); + /* make the actual rendered arrow smaller than text size */ + size = spin_button_get_arrow_size (spin_button); + size = MIN (size, width); + size *= 0.8; - height = panel_height; + x = (width - size) / 2.0; - if (arrow_type == GTK_ARROW_DOWN) + if (arrow_type == GTK_ARROW_UP) { - y = height / 2; - height = height - y - 2; + y = (height - size / 2.0) / 2.0; + angle = 0; } - else + else if (arrow_type == GTK_ARROW_DOWN) { - y = 2; - height = height / 2 - 2; + y = height + ((height - size / 2.0) / 2.0) - size / 2.0; + angle = G_PI; } - width -= 3; - - if (widget && gtk_widget_get_direction (widget) == GTK_TEXT_DIR_RTL) - x = 2; - else - x = 1; - - w = width / 2; - w -= w % 2 - 1; /* force odd */ - h = (w + 1) / 2; - - x += (width - w) / 2; - y += (height - h) / 2; - - height = h; - width = w; - gtk_render_arrow (context, cr, - angle, x, y, width); + angle, x, y, size); gtk_style_context_restore (context); }