spinbutton: Port to draw vfunc

This commit is contained in:
Benjamin Otte 2010-09-09 21:22:43 +02:00
parent d13a2ad66a
commit 5228913f68

View File

@ -116,8 +116,8 @@ static void gtk_spin_button_size_request (GtkWidget *widget,
GtkRequisition *requisition); GtkRequisition *requisition);
static void gtk_spin_button_size_allocate (GtkWidget *widget, static void gtk_spin_button_size_allocate (GtkWidget *widget,
GtkAllocation *allocation); GtkAllocation *allocation);
static gint gtk_spin_button_expose (GtkWidget *widget, static gint gtk_spin_button_draw (GtkWidget *widget,
GdkEventExpose *event); cairo_t *cr);
static gint gtk_spin_button_button_press (GtkWidget *widget, static gint gtk_spin_button_button_press (GtkWidget *widget,
GdkEventButton *event); GdkEventButton *event);
static gint gtk_spin_button_button_release (GtkWidget *widget, static gint gtk_spin_button_button_release (GtkWidget *widget,
@ -137,7 +137,7 @@ static void gtk_spin_button_state_changed (GtkWidget *widget,
static void gtk_spin_button_style_set (GtkWidget *widget, static void gtk_spin_button_style_set (GtkWidget *widget,
GtkStyle *previous_style); GtkStyle *previous_style);
static void gtk_spin_button_draw_arrow (GtkSpinButton *spin_button, static void gtk_spin_button_draw_arrow (GtkSpinButton *spin_button,
GdkRectangle *area, cairo_t *cr,
GtkArrowType arrow_type); GtkArrowType arrow_type);
static gboolean gtk_spin_button_timer (GtkSpinButton *spin_button); static gboolean gtk_spin_button_timer (GtkSpinButton *spin_button);
static void gtk_spin_button_stop_spinning (GtkSpinButton *spin); static void gtk_spin_button_stop_spinning (GtkSpinButton *spin);
@ -206,7 +206,7 @@ gtk_spin_button_class_init (GtkSpinButtonClass *class)
widget_class->unrealize = gtk_spin_button_unrealize; widget_class->unrealize = gtk_spin_button_unrealize;
widget_class->size_request = gtk_spin_button_size_request; widget_class->size_request = gtk_spin_button_size_request;
widget_class->size_allocate = gtk_spin_button_size_allocate; widget_class->size_allocate = gtk_spin_button_size_allocate;
widget_class->expose_event = gtk_spin_button_expose; widget_class->draw = gtk_spin_button_draw;
widget_class->scroll_event = gtk_spin_button_scroll; widget_class->scroll_event = gtk_spin_button_scroll;
widget_class->button_press_event = gtk_spin_button_button_press; widget_class->button_press_event = gtk_spin_button_button_press;
widget_class->button_release_event = gtk_spin_button_button_release; widget_class->button_release_event = gtk_spin_button_button_release;
@ -783,41 +783,42 @@ gtk_spin_button_size_allocate (GtkWidget *widget,
} }
static gint static gint
gtk_spin_button_expose (GtkWidget *widget, gtk_spin_button_draw (GtkWidget *widget,
GdkEventExpose *event) cairo_t *cr)
{ {
GtkSpinButton *spin = GTK_SPIN_BUTTON (widget); GtkSpinButton *spin = GTK_SPIN_BUTTON (widget);
GtkSpinButtonPrivate *priv = spin->priv; GtkSpinButtonPrivate *priv = spin->priv;
if (gtk_widget_is_drawable (widget)) GTK_WIDGET_CLASS (gtk_spin_button_parent_class)->draw (widget, cr);
if (gtk_cairo_should_draw_window (cr, priv->panel))
{ {
if (event->window == priv->panel) GtkShadowType shadow_type;
{ int x, y;
GtkShadowType shadow_type;
shadow_type = spin_button_get_shadow_type (spin); shadow_type = spin_button_get_shadow_type (spin);
if (shadow_type != GTK_SHADOW_NONE) gdk_window_get_position (priv->panel, &x, &y);
{ cairo_translate (cr, x, y);
gint width, height;
GtkStateType state;
state = gtk_widget_has_focus (widget) ? if (shadow_type != GTK_SHADOW_NONE)
GTK_STATE_ACTIVE : gtk_widget_get_state (widget); {
gint width, height;
GtkStateType state;
gdk_drawable_get_size (priv->panel, &width, &height); state = gtk_widget_has_focus (widget) ?
GTK_STATE_ACTIVE : gtk_widget_get_state (widget);
gtk_paint_box (gtk_widget_get_style (widget), priv->panel, gdk_drawable_get_size (priv->panel, &width, &height);
state, shadow_type,
&event->area, widget, "spinbutton",
0, 0, width, height);
}
gtk_spin_button_draw_arrow (spin, &event->area, GTK_ARROW_UP); gtk_cairo_paint_box (gtk_widget_get_style (widget), cr,
gtk_spin_button_draw_arrow (spin, &event->area, GTK_ARROW_DOWN); state, shadow_type,
} widget, "spinbutton",
else 0, 0, width, height);
GTK_WIDGET_CLASS (gtk_spin_button_parent_class)->expose_event (widget, event); }
gtk_spin_button_draw_arrow (spin, cr, GTK_ARROW_UP);
gtk_spin_button_draw_arrow (spin, cr, GTK_ARROW_DOWN);
} }
return FALSE; return FALSE;
@ -851,10 +852,11 @@ spin_button_at_limit (GtkSpinButton *spin_button,
static void static void
gtk_spin_button_draw_arrow (GtkSpinButton *spin_button, gtk_spin_button_draw_arrow (GtkSpinButton *spin_button,
GdkRectangle *area, cairo_t *cr,
GtkArrowType arrow_type) GtkArrowType arrow_type)
{ {
GtkSpinButtonPrivate *priv; GtkSpinButtonPrivate *priv;
GtkRequisition requisition;
GtkStateType state_type; GtkStateType state_type;
GtkShadowType shadow_type; GtkShadowType shadow_type;
GtkStyle *style; GtkStyle *style;
@ -870,100 +872,95 @@ gtk_spin_button_draw_arrow (GtkSpinButton *spin_button,
priv = spin_button->priv; priv = spin_button->priv;
widget = GTK_WIDGET (spin_button); widget = GTK_WIDGET (spin_button);
if (gtk_widget_is_drawable (widget)) style = gtk_widget_get_style (widget);
gtk_size_request_get_size (GTK_SIZE_REQUEST (widget), &requisition, NULL);
width = spin_button_get_arrow_size (spin_button) + 2 * style->xthickness;
if (arrow_type == GTK_ARROW_UP)
{ {
GtkRequisition requisition; x = 0;
y = 0;
style = gtk_widget_get_style (widget); height = requisition.height / 2;
gtk_size_request_get_size (GTK_SIZE_REQUEST (widget), &requisition, NULL);
width = spin_button_get_arrow_size (spin_button) + 2 * style->xthickness;
if (arrow_type == GTK_ARROW_UP)
{
x = 0;
y = 0;
height = requisition.height / 2;
}
else
{
x = 0;
y = requisition.height / 2;
height = (requisition.height + 1) / 2;
}
if (spin_button_at_limit (spin_button, arrow_type))
{
shadow_type = GTK_SHADOW_OUT;
state_type = GTK_STATE_INSENSITIVE;
}
else
{
if (priv->click_child == arrow_type)
{
state_type = GTK_STATE_ACTIVE;
shadow_type = GTK_SHADOW_IN;
}
else
{
if (priv->in_child == arrow_type &&
priv->click_child == NO_ARROW)
{
state_type = GTK_STATE_PRELIGHT;
}
else
{
state_type = gtk_widget_get_state (widget);
}
shadow_type = GTK_SHADOW_OUT;
}
}
gtk_paint_box (style, priv->panel,
state_type, shadow_type,
area, widget,
(arrow_type == GTK_ARROW_UP)? "spinbutton_up" : "spinbutton_down",
x, y, width, height);
height = requisition.height;
if (arrow_type == GTK_ARROW_DOWN)
{
y = height / 2;
height = height - y - 2;
}
else
{
y = 2;
height = height / 2 - 2;
}
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_paint_arrow (style, priv->panel,
state_type, shadow_type,
area, widget, "spinbutton",
arrow_type, TRUE,
x, y, width, height);
} }
else
{
x = 0;
y = requisition.height / 2;
height = (requisition.height + 1) / 2;
}
if (spin_button_at_limit (spin_button, arrow_type))
{
shadow_type = GTK_SHADOW_OUT;
state_type = GTK_STATE_INSENSITIVE;
}
else
{
if (priv->click_child == arrow_type)
{
state_type = GTK_STATE_ACTIVE;
shadow_type = GTK_SHADOW_IN;
}
else
{
if (priv->in_child == arrow_type &&
priv->click_child == NO_ARROW)
{
state_type = GTK_STATE_PRELIGHT;
}
else
{
state_type = gtk_widget_get_state (widget);
}
shadow_type = GTK_SHADOW_OUT;
}
}
gtk_cairo_paint_box (style, cr,
state_type, shadow_type,
widget,
(arrow_type == GTK_ARROW_UP)? "spinbutton_up" : "spinbutton_down",
x, y, width, height);
height = requisition.height;
if (arrow_type == GTK_ARROW_DOWN)
{
y = height / 2;
height = height - y - 2;
}
else
{
y = 2;
height = height / 2 - 2;
}
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_cairo_paint_arrow (style, cr,
state_type, shadow_type,
widget, "spinbutton",
arrow_type, TRUE,
x, y, width, height);
} }
static gint static gint