forked from AuroraMiddleware/gtk
Changed GtkSpinButtonUpdatePolicy enum, added keyboard
acceleration, new API gtk_spin_button_set_snap_to_ticks.
This commit is contained in:
parent
7d0331a679
commit
7cb2ce4d11
@ -75,6 +75,8 @@ static void gtk_spin_button_value_changed (GtkWidget *widget,
|
||||
GtkSpinButton *spin_button);
|
||||
static gint gtk_spin_button_key_press (GtkWidget *widget,
|
||||
GdkEventKey *event);
|
||||
static gint gtk_spin_button_key_release (GtkWidget *widget,
|
||||
GdkEventKey *event);
|
||||
static void gtk_spin_button_update (GtkSpinButton *spin_button);
|
||||
static void gtk_spin_button_activate (GtkEditable *editable);
|
||||
static void gtk_spin_button_snap (GtkSpinButton *spin_button,
|
||||
@ -139,6 +141,7 @@ gtk_spin_button_class_init (GtkSpinButtonClass *class)
|
||||
widget_class->button_release_event = gtk_spin_button_button_release;
|
||||
widget_class->motion_notify_event = gtk_spin_button_motion_notify;
|
||||
widget_class->key_press_event = gtk_spin_button_key_press;
|
||||
widget_class->key_release_event = gtk_spin_button_key_release;
|
||||
widget_class->enter_notify_event = gtk_spin_button_enter_notify;
|
||||
widget_class->leave_notify_event = gtk_spin_button_leave_notify;
|
||||
widget_class->focus_out_event = gtk_spin_button_focus_out;
|
||||
@ -154,17 +157,19 @@ gtk_spin_button_init (GtkSpinButton *spin_button)
|
||||
spin_button->panel = NULL;
|
||||
spin_button->shadow_type = GTK_SHADOW_OUT;
|
||||
spin_button->timer = 0;
|
||||
spin_button->ev_time = 0;
|
||||
spin_button->climb_rate = 0.0;
|
||||
spin_button->timer_step = 0.0;
|
||||
spin_button->update_policy = GTK_UPDATE_ALWAYS | GTK_UPDATE_SNAP_TO_TICKS;
|
||||
spin_button->update_policy = GTK_UPDATE_ALWAYS;
|
||||
spin_button->in_child = 2;
|
||||
spin_button->click_child = 2;
|
||||
spin_button->button = 0;
|
||||
spin_button->need_timer = 0;
|
||||
spin_button->timer_calls = 0;
|
||||
spin_button->digits = 0;
|
||||
spin_button->numeric = 0;
|
||||
spin_button->wrap = 0;
|
||||
spin_button->numeric = FALSE;
|
||||
spin_button->wrap = FALSE;
|
||||
spin_button->snap_to_ticks = FALSE;
|
||||
}
|
||||
|
||||
void
|
||||
@ -213,7 +218,7 @@ gtk_spin_button_finalize (GtkObject *object)
|
||||
|
||||
gtk_object_unref (GTK_OBJECT (GTK_SPIN_BUTTON (object)->adjustment));
|
||||
|
||||
(* GTK_OBJECT_CLASS (parent_class)->finalize) (object);
|
||||
GTK_OBJECT_CLASS (parent_class)->finalize (object);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -257,7 +262,10 @@ gtk_spin_button_realize (GtkWidget *widget)
|
||||
|
||||
real_width = widget->allocation.width;
|
||||
widget->allocation.width -= ARROW_SIZE + 2 * widget->style->klass->xthickness;
|
||||
gtk_widget_set_events (widget, gtk_widget_get_events (widget) |
|
||||
GDK_KEY_RELEASE_MASK);
|
||||
GTK_WIDGET_CLASS (parent_class)->realize (widget);
|
||||
|
||||
widget->allocation.width = real_width;
|
||||
|
||||
attributes.window_type = GDK_WINDOW_CHILD;
|
||||
@ -411,6 +419,8 @@ gtk_spin_button_draw_arrow (GtkSpinButton *spin_button,
|
||||
GtkStateType state_type;
|
||||
GtkShadowType shadow_type;
|
||||
GtkWidget *widget;
|
||||
gint x;
|
||||
gint y;
|
||||
|
||||
g_return_if_fail (spin_button != NULL);
|
||||
g_return_if_fail (GTK_IS_SPIN_BUTTON (spin_button));
|
||||
@ -436,22 +446,36 @@ gtk_spin_button_draw_arrow (GtkSpinButton *spin_button,
|
||||
|
||||
if (arrow == GTK_ARROW_UP)
|
||||
{
|
||||
if (spin_button->shadow_type != GTK_SHADOW_NONE)
|
||||
{
|
||||
x = widget->style->klass->xthickness;
|
||||
y = widget->style->klass->ythickness;
|
||||
}
|
||||
else
|
||||
{
|
||||
x = widget->style->klass->xthickness - 1;
|
||||
y = widget->style->klass->ythickness - 1;
|
||||
}
|
||||
gtk_draw_arrow (widget->style, spin_button->panel,
|
||||
state_type, shadow_type, arrow, TRUE,
|
||||
widget->style->klass->xthickness,
|
||||
widget->style->klass->ythickness,
|
||||
ARROW_SIZE,
|
||||
widget->requisition.height / 2
|
||||
x, y, ARROW_SIZE, widget->requisition.height / 2
|
||||
- widget->style->klass->ythickness);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (spin_button->shadow_type != GTK_SHADOW_NONE)
|
||||
{
|
||||
x = widget->style->klass->xthickness;
|
||||
y = widget->requisition.height / 2;
|
||||
}
|
||||
else
|
||||
{
|
||||
x = widget->style->klass->xthickness - 1;
|
||||
y = widget->requisition.height / 2 + 1;
|
||||
}
|
||||
gtk_draw_arrow (widget->style, spin_button->panel,
|
||||
state_type, shadow_type, arrow, TRUE,
|
||||
widget->style->klass->xthickness,
|
||||
widget->requisition.height / 2,
|
||||
ARROW_SIZE,
|
||||
widget->requisition.height / 2
|
||||
x, y, ARROW_SIZE, widget->requisition.height / 2
|
||||
- widget->style->klass->ythickness);
|
||||
}
|
||||
}
|
||||
@ -777,10 +801,8 @@ gtk_spin_button_spin (GtkSpinButton *spin_button,
|
||||
new_value = spin_button->adjustment->upper;
|
||||
}
|
||||
else
|
||||
{
|
||||
new_value = MIN (new_value, spin_button->adjustment->upper);
|
||||
}
|
||||
}
|
||||
else if (direction == GTK_ARROW_DOWN)
|
||||
{
|
||||
new_value = spin_button->adjustment->value - step;
|
||||
@ -792,10 +814,8 @@ gtk_spin_button_spin (GtkSpinButton *spin_button,
|
||||
new_value = spin_button->adjustment->lower;
|
||||
}
|
||||
else
|
||||
{
|
||||
new_value = MAX (new_value, spin_button->adjustment->lower);
|
||||
}
|
||||
}
|
||||
|
||||
if (new_value != spin_button->adjustment->value)
|
||||
gtk_adjustment_set_value (spin_button->adjustment, new_value);
|
||||
@ -821,14 +841,16 @@ gtk_spin_button_key_press (GtkWidget *widget,
|
||||
{
|
||||
GtkSpinButton *spin;
|
||||
gint key;
|
||||
gboolean key_repeat = FALSE;
|
||||
|
||||
g_return_val_if_fail (widget != NULL, FALSE);
|
||||
g_return_val_if_fail (GTK_IS_SPIN_BUTTON (widget), FALSE);
|
||||
g_return_val_if_fail (event != NULL, FALSE);
|
||||
|
||||
spin = GTK_SPIN_BUTTON (widget);
|
||||
key = event->keyval;
|
||||
|
||||
key_repeat = (event->time == spin->ev_time);
|
||||
|
||||
if (key == GDK_Up || key == GDK_Down ||
|
||||
key == GDK_Page_Up || key == GDK_Page_Down)
|
||||
gtk_spin_button_update (spin);
|
||||
@ -840,8 +862,25 @@ gtk_spin_button_key_press (GtkWidget *widget,
|
||||
{
|
||||
gtk_signal_emit_stop_by_name (GTK_OBJECT (widget),
|
||||
"key_press_event");
|
||||
gtk_spin_button_spin (spin, GTK_ARROW_UP,
|
||||
spin->adjustment->step_increment);
|
||||
if (!key_repeat)
|
||||
spin->timer_step = spin->adjustment->step_increment;
|
||||
|
||||
gtk_spin_button_spin (spin, GTK_ARROW_UP, spin->timer_step);
|
||||
|
||||
if (key_repeat)
|
||||
{
|
||||
if (spin->climb_rate > 0.0 && spin->timer_step
|
||||
< spin->adjustment->page_increment)
|
||||
{
|
||||
if (spin->timer_calls < MAX_TIMER_CALLS)
|
||||
spin->timer_calls++;
|
||||
else
|
||||
{
|
||||
spin->timer_calls = 0;
|
||||
spin->timer_step += spin->climb_rate;
|
||||
}
|
||||
}
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
return FALSE;
|
||||
@ -850,8 +889,25 @@ gtk_spin_button_key_press (GtkWidget *widget,
|
||||
{
|
||||
gtk_signal_emit_stop_by_name (GTK_OBJECT (widget),
|
||||
"key_press_event");
|
||||
gtk_spin_button_spin (spin, GTK_ARROW_DOWN,
|
||||
spin->adjustment->step_increment);
|
||||
if (!key_repeat)
|
||||
spin->timer_step = spin->adjustment->step_increment;
|
||||
|
||||
gtk_spin_button_spin (spin, GTK_ARROW_DOWN, spin->timer_step);
|
||||
|
||||
if (key_repeat)
|
||||
{
|
||||
if (spin->climb_rate > 0.0 && spin->timer_step
|
||||
< spin->adjustment->page_increment)
|
||||
{
|
||||
if (spin->timer_calls < MAX_TIMER_CALLS)
|
||||
spin->timer_calls++;
|
||||
else
|
||||
{
|
||||
spin->timer_calls = 0;
|
||||
spin->timer_step += spin->climb_rate;
|
||||
}
|
||||
}
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
return FALSE;
|
||||
@ -875,6 +931,21 @@ gtk_spin_button_key_press (GtkWidget *widget,
|
||||
return GTK_WIDGET_CLASS (parent_class)->key_press_event (widget, event);
|
||||
}
|
||||
|
||||
static gint
|
||||
gtk_spin_button_key_release (GtkWidget *widget,
|
||||
GdkEventKey *event)
|
||||
{
|
||||
GtkSpinButton *spin;
|
||||
|
||||
g_return_val_if_fail (widget != NULL, FALSE);
|
||||
g_return_val_if_fail (GTK_IS_SPIN_BUTTON (widget), FALSE);
|
||||
|
||||
spin = GTK_SPIN_BUTTON (widget);
|
||||
|
||||
spin->ev_time = event->time;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_spin_button_snap (GtkSpinButton *spin_button,
|
||||
gfloat val)
|
||||
@ -902,14 +973,14 @@ gtk_spin_button_update (GtkSpinButton *spin_button)
|
||||
|
||||
val = strtod (gtk_entry_get_text (GTK_ENTRY (spin_button)), &error);
|
||||
|
||||
if (spin_button->update_policy & GTK_UPDATE_ALWAYS)
|
||||
if (spin_button->update_policy == GTK_UPDATE_ALWAYS)
|
||||
{
|
||||
if (val < spin_button->adjustment->lower)
|
||||
val = spin_button->adjustment->lower;
|
||||
else if (val > spin_button->adjustment->upper)
|
||||
val = spin_button->adjustment->upper;
|
||||
}
|
||||
else if ((spin_button->update_policy & GTK_UPDATE_IF_VALID) &&
|
||||
else if ((spin_button->update_policy == GTK_UPDATE_IF_VALID) &&
|
||||
(*error ||
|
||||
val < spin_button->adjustment->lower ||
|
||||
val > spin_button->adjustment->upper))
|
||||
@ -919,7 +990,7 @@ gtk_spin_button_update (GtkSpinButton *spin_button)
|
||||
return;
|
||||
}
|
||||
|
||||
if (spin_button->update_policy & GTK_UPDATE_SNAP_TO_TICKS)
|
||||
if (spin_button->snap_to_ticks)
|
||||
gtk_spin_button_snap (spin_button, val);
|
||||
else
|
||||
gtk_adjustment_set_value (spin_button->adjustment, val);
|
||||
@ -1031,14 +1102,6 @@ gtk_spin_button_set_update_policy (GtkSpinButton *spin_button,
|
||||
g_return_if_fail (GTK_IS_SPIN_BUTTON (spin_button));
|
||||
|
||||
spin_button->update_policy = policy;
|
||||
if (policy & GTK_UPDATE_SNAP_TO_TICKS)
|
||||
{
|
||||
gchar *error = NULL;
|
||||
gfloat val;
|
||||
|
||||
val = strtod (gtk_entry_get_text (GTK_ENTRY (spin_button)), &error);
|
||||
gtk_spin_button_snap (spin_button, val);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
@ -1148,3 +1211,28 @@ gtk_spin_button_set_shadow_type (GtkSpinButton *spin_button,
|
||||
gdk_window_clear (spin_button->panel);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
gtk_spin_button_set_snap_to_ticks (GtkSpinButton *spin_button,
|
||||
gint snap_to_ticks)
|
||||
{
|
||||
guint new_val;
|
||||
|
||||
g_return_if_fail (spin_button != NULL);
|
||||
g_return_if_fail (GTK_IS_SPIN_BUTTON (spin_button));
|
||||
|
||||
new_val = (snap_to_ticks != 0);
|
||||
|
||||
if (new_val != spin_button->snap_to_ticks)
|
||||
{
|
||||
spin_button->snap_to_ticks = new_val;
|
||||
if (new_val)
|
||||
{
|
||||
gchar *error = NULL;
|
||||
gfloat val;
|
||||
|
||||
val = strtod (gtk_entry_get_text (GTK_ENTRY (spin_button)), &error);
|
||||
gtk_spin_button_snap (spin_button, val);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -41,9 +41,8 @@ extern "C" {
|
||||
|
||||
typedef enum
|
||||
{
|
||||
GTK_UPDATE_ALWAYS = 1 << 0,
|
||||
GTK_UPDATE_IF_VALID = 1 << 1,
|
||||
GTK_UPDATE_SNAP_TO_TICKS = 1 << 2
|
||||
GTK_UPDATE_ALWAYS,
|
||||
GTK_UPDATE_IF_VALID
|
||||
} GtkSpinButtonUpdatePolicy;
|
||||
|
||||
|
||||
@ -61,11 +60,12 @@ struct _GtkSpinButton
|
||||
GtkShadowType shadow_type;
|
||||
|
||||
guint32 timer;
|
||||
guint32 ev_time;
|
||||
|
||||
gfloat climb_rate;
|
||||
gfloat timer_step;
|
||||
|
||||
guint8 update_policy;
|
||||
GtkSpinButtonUpdatePolicy update_policy;
|
||||
|
||||
guint in_child : 2;
|
||||
guint click_child : 2;
|
||||
@ -75,6 +75,7 @@ struct _GtkSpinButton
|
||||
guint digits : 3;
|
||||
guint numeric : 1;
|
||||
guint wrap : 1;
|
||||
guint snap_to_ticks : 1;
|
||||
};
|
||||
|
||||
struct _GtkSpinButtonClass
|
||||
@ -124,7 +125,8 @@ void gtk_spin_button_set_wrap (GtkSpinButton *spin_button,
|
||||
void gtk_spin_button_set_shadow_type (GtkSpinButton *spin_button,
|
||||
GtkShadowType shadow_type);
|
||||
|
||||
|
||||
void gtk_spin_button_set_snap_to_ticks (GtkSpinButton *spin_button,
|
||||
gint snap_to_ticks);
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
@ -2382,11 +2382,7 @@ static GtkWidget *spinner1;
|
||||
static void
|
||||
toggle_snap (GtkWidget *widget, GtkSpinButton *spin)
|
||||
{
|
||||
if (GTK_TOGGLE_BUTTON (widget)->active)
|
||||
gtk_spin_button_set_update_policy (spin, GTK_UPDATE_ALWAYS
|
||||
| GTK_UPDATE_SNAP_TO_TICKS);
|
||||
else
|
||||
gtk_spin_button_set_update_policy (spin, GTK_UPDATE_ALWAYS);
|
||||
gtk_spin_button_set_snap_to_ticks (spin, GTK_TOGGLE_BUTTON (widget)->active);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -2403,7 +2399,7 @@ change_digits (GtkWidget *widget, GtkSpinButton *spin)
|
||||
}
|
||||
|
||||
static void
|
||||
get_value (GtkWidget *widget, gint data)
|
||||
get_value (GtkWidget *widget, gpointer data)
|
||||
{
|
||||
gchar buf[32];
|
||||
GtkLabel *label;
|
||||
@ -2411,7 +2407,7 @@ get_value (GtkWidget *widget, gint data)
|
||||
|
||||
spin = GTK_SPIN_BUTTON (spinner1);
|
||||
label = GTK_LABEL (gtk_object_get_user_data (GTK_OBJECT (widget)));
|
||||
if (data == 1)
|
||||
if (GPOINTER_TO_INT (data) == 1)
|
||||
sprintf (buf, "%d", gtk_spin_button_get_value_as_int (spin));
|
||||
else
|
||||
sprintf (buf, "%0.*f", spin->digits,
|
||||
@ -2529,8 +2525,6 @@ create_spins (void)
|
||||
spinner1 = gtk_spin_button_new (adj, 1.0, 2);
|
||||
gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner1), TRUE);
|
||||
gtk_widget_set_usize (spinner1, 100, 0);
|
||||
gtk_spin_button_set_update_policy (GTK_SPIN_BUTTON (spinner1),
|
||||
GTK_UPDATE_ALWAYS);
|
||||
gtk_box_pack_start (GTK_BOX (vbox2), spinner1, FALSE, TRUE, 0);
|
||||
|
||||
vbox2 = gtk_vbox_new (FALSE, 0);
|
||||
@ -2574,14 +2568,14 @@ create_spins (void)
|
||||
gtk_object_set_user_data (GTK_OBJECT (button), val_label);
|
||||
gtk_signal_connect (GTK_OBJECT (button), "clicked",
|
||||
GTK_SIGNAL_FUNC (get_value),
|
||||
(gpointer) 1);
|
||||
GINT_TO_POINTER (1));
|
||||
gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
|
||||
|
||||
button = gtk_button_new_with_label ("Value as Float");
|
||||
gtk_object_set_user_data (GTK_OBJECT (button), val_label);
|
||||
gtk_signal_connect (GTK_OBJECT (button), "clicked",
|
||||
GTK_SIGNAL_FUNC (get_value),
|
||||
(gpointer) 2);
|
||||
GINT_TO_POINTER (2));
|
||||
gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
|
||||
|
||||
gtk_box_pack_start (GTK_BOX (vbox), val_label, TRUE, TRUE, 0);
|
||||
|
@ -2382,11 +2382,7 @@ static GtkWidget *spinner1;
|
||||
static void
|
||||
toggle_snap (GtkWidget *widget, GtkSpinButton *spin)
|
||||
{
|
||||
if (GTK_TOGGLE_BUTTON (widget)->active)
|
||||
gtk_spin_button_set_update_policy (spin, GTK_UPDATE_ALWAYS
|
||||
| GTK_UPDATE_SNAP_TO_TICKS);
|
||||
else
|
||||
gtk_spin_button_set_update_policy (spin, GTK_UPDATE_ALWAYS);
|
||||
gtk_spin_button_set_snap_to_ticks (spin, GTK_TOGGLE_BUTTON (widget)->active);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -2403,7 +2399,7 @@ change_digits (GtkWidget *widget, GtkSpinButton *spin)
|
||||
}
|
||||
|
||||
static void
|
||||
get_value (GtkWidget *widget, gint data)
|
||||
get_value (GtkWidget *widget, gpointer data)
|
||||
{
|
||||
gchar buf[32];
|
||||
GtkLabel *label;
|
||||
@ -2411,7 +2407,7 @@ get_value (GtkWidget *widget, gint data)
|
||||
|
||||
spin = GTK_SPIN_BUTTON (spinner1);
|
||||
label = GTK_LABEL (gtk_object_get_user_data (GTK_OBJECT (widget)));
|
||||
if (data == 1)
|
||||
if (GPOINTER_TO_INT (data) == 1)
|
||||
sprintf (buf, "%d", gtk_spin_button_get_value_as_int (spin));
|
||||
else
|
||||
sprintf (buf, "%0.*f", spin->digits,
|
||||
@ -2529,8 +2525,6 @@ create_spins (void)
|
||||
spinner1 = gtk_spin_button_new (adj, 1.0, 2);
|
||||
gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner1), TRUE);
|
||||
gtk_widget_set_usize (spinner1, 100, 0);
|
||||
gtk_spin_button_set_update_policy (GTK_SPIN_BUTTON (spinner1),
|
||||
GTK_UPDATE_ALWAYS);
|
||||
gtk_box_pack_start (GTK_BOX (vbox2), spinner1, FALSE, TRUE, 0);
|
||||
|
||||
vbox2 = gtk_vbox_new (FALSE, 0);
|
||||
@ -2574,14 +2568,14 @@ create_spins (void)
|
||||
gtk_object_set_user_data (GTK_OBJECT (button), val_label);
|
||||
gtk_signal_connect (GTK_OBJECT (button), "clicked",
|
||||
GTK_SIGNAL_FUNC (get_value),
|
||||
(gpointer) 1);
|
||||
GINT_TO_POINTER (1));
|
||||
gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
|
||||
|
||||
button = gtk_button_new_with_label ("Value as Float");
|
||||
gtk_object_set_user_data (GTK_OBJECT (button), val_label);
|
||||
gtk_signal_connect (GTK_OBJECT (button), "clicked",
|
||||
GTK_SIGNAL_FUNC (get_value),
|
||||
(gpointer) 2);
|
||||
GINT_TO_POINTER (2));
|
||||
gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
|
||||
|
||||
gtk_box_pack_start (GTK_BOX (vbox), val_label, TRUE, TRUE, 0);
|
||||
|
Loading…
Reference in New Issue
Block a user