📄 gtkspinbutton.c
字号:
return TRUE; case GDK_Page_Down: if (event->state & GDK_CONTROL_MASK) { gfloat diff = spin->adjustment->value - spin->adjustment->lower; if (diff > EPSILON) gtk_spin_button_real_spin (spin, -diff); } else gtk_spin_button_real_spin (spin, -spin->adjustment->page_increment); return TRUE; default: break; } return GTK_WIDGET_CLASS (parent_class)->key_press_event (widget, event);}static gintgtk_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 voidgtk_spin_button_snap (GtkSpinButton *spin_button, gfloat val){ gfloat inc; gfloat tmp; inc = spin_button->adjustment->step_increment; tmp = (val - spin_button->adjustment->lower) / inc; if (tmp - floor (tmp) < ceil (tmp) - tmp) val = spin_button->adjustment->lower + floor (tmp) * inc; else val = spin_button->adjustment->lower + ceil (tmp) * inc; if (fabs (val - spin_button->adjustment->value) > EPSILON) gtk_adjustment_set_value (spin_button->adjustment, val); else { char buf[MAX_TEXT_LENGTH]; sprintf (buf, "%0.*f", spin_button->digits, spin_button->adjustment->value); if (strcmp (buf, gtk_entry_get_text (GTK_ENTRY (spin_button)))) gtk_entry_set_text (GTK_ENTRY (spin_button), buf); }}void gtk_spin_button_update (GtkSpinButton *spin_button){ gfloat val; gchar *error = NULL; g_return_if_fail (spin_button != NULL); g_return_if_fail (GTK_IS_SPIN_BUTTON (spin_button)); val = strtod (gtk_entry_get_text (GTK_ENTRY (spin_button)), &error); 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) && (*error || val < spin_button->adjustment->lower || val > spin_button->adjustment->upper)) { gtk_spin_button_value_changed (spin_button->adjustment, spin_button); return; } if (spin_button->snap_to_ticks) gtk_spin_button_snap (spin_button, val); else { if (fabs (val - spin_button->adjustment->value) > EPSILON) gtk_adjustment_set_value (spin_button->adjustment, val); else { char buf[MAX_TEXT_LENGTH]; sprintf (buf, "%0.*f", spin_button->digits, spin_button->adjustment->value); if (strcmp (buf, gtk_entry_get_text (GTK_ENTRY (spin_button)))) gtk_entry_set_text (GTK_ENTRY (spin_button), buf); } }}static voidgtk_spin_button_activate (GtkEditable *editable){ g_return_if_fail (editable != NULL); g_return_if_fail (GTK_IS_SPIN_BUTTON (editable)); if (editable->editable) gtk_spin_button_update (GTK_SPIN_BUTTON (editable));}static voidgtk_spin_button_insert_text (GtkEditable *editable, const gchar *new_text, gint new_text_length, gint *position){ GtkEntry *entry; GtkSpinButton *spin; g_return_if_fail (editable != NULL); g_return_if_fail (GTK_IS_SPIN_BUTTON (editable)); entry = GTK_ENTRY (editable); spin = GTK_SPIN_BUTTON (editable); if (spin->numeric) { struct lconv *lc; gboolean sign; gint dotpos = -1; gint i; GdkWChar pos_sign; GdkWChar neg_sign; guint entry_length; entry_length = entry->text_length; lc = localeconv (); if (*(lc->negative_sign)) neg_sign = *(lc->negative_sign); else neg_sign = '-'; if (*(lc->positive_sign)) pos_sign = *(lc->positive_sign); else pos_sign = '+'; for (sign=0, i=0; i<entry_length; i++) if ((entry->text[i] == neg_sign) || (entry->text[i] == pos_sign)) { sign = 1; break; } if (sign && !(*position)) return; for (dotpos=-1, i=0; i<entry_length; i++) if (entry->text[i] == *(lc->decimal_point)) { dotpos = i; break; } if (dotpos > -1 && *position > dotpos && spin->digits - entry_length + dotpos - new_text_length + 1 < 0) return; for (i = 0; i < new_text_length; i++) { if (new_text[i] == neg_sign || new_text[i] == pos_sign) { if (sign || (*position) || i) return; sign = TRUE; } else if (new_text[i] == *(lc->decimal_point)) { if (!spin->digits || dotpos > -1 || (new_text_length - 1 - i + entry_length - *position > spin->digits)) return; dotpos = *position + i; } else if (new_text[i] < 0x30 || new_text[i] > 0x39) return; } } GTK_EDITABLE_CLASS (parent_class)->insert_text (editable, new_text, new_text_length, position);}static voidgtk_spin_button_real_spin (GtkSpinButton *spin_button, gfloat increment){ GtkAdjustment *adj; gfloat new_value = 0.0; g_return_if_fail (spin_button != NULL); g_return_if_fail (GTK_IS_SPIN_BUTTON (spin_button)); adj = spin_button->adjustment; new_value = adj->value + increment; if (increment > 0) { if (spin_button->wrap) { if (fabs (adj->value - adj->upper) < EPSILON) new_value = adj->lower; else if (new_value > adj->upper) new_value = adj->upper; } else new_value = MIN (new_value, adj->upper); } else if (increment < 0) { if (spin_button->wrap) { if (fabs (adj->value - adj->lower) < EPSILON) new_value = adj->upper; else if (new_value < adj->lower) new_value = adj->lower; } else new_value = MAX (new_value, adj->lower); } if (fabs (new_value - adj->value) > EPSILON) gtk_adjustment_set_value (adj, new_value);}/*********************************************************** *********************************************************** *** Public interface *** *********************************************************** ***********************************************************/voidgtk_spin_button_configure (GtkSpinButton *spin_button, GtkAdjustment *adjustment, gfloat climb_rate, guint digits){ g_return_if_fail (spin_button != NULL); g_return_if_fail (GTK_IS_SPIN_BUTTON (spin_button)); g_return_if_fail (digits < 6); if (adjustment) gtk_spin_button_set_adjustment (spin_button, adjustment); else adjustment = spin_button->adjustment; spin_button->digits = digits; spin_button->climb_rate = climb_rate; gtk_adjustment_value_changed (adjustment);}GtkWidget *gtk_spin_button_new (GtkAdjustment *adjustment, gfloat climb_rate, guint digits){ GtkSpinButton *spin; if (adjustment) g_return_val_if_fail (GTK_IS_ADJUSTMENT (adjustment), NULL); g_return_val_if_fail (digits < 6, NULL); spin = gtk_type_new (GTK_TYPE_SPIN_BUTTON); gtk_spin_button_configure (spin, adjustment, climb_rate, digits); return GTK_WIDGET (spin);}voidgtk_spin_button_set_adjustment (GtkSpinButton *spin_button, GtkAdjustment *adjustment){ g_return_if_fail (spin_button != NULL); g_return_if_fail (GTK_IS_SPIN_BUTTON (spin_button)); if (spin_button->adjustment != adjustment) { if (spin_button->adjustment) { gtk_signal_disconnect_by_data (GTK_OBJECT (spin_button->adjustment), (gpointer) spin_button); gtk_object_unref (GTK_OBJECT (spin_button->adjustment)); } spin_button->adjustment = adjustment; if (adjustment) { gtk_object_ref (GTK_OBJECT (adjustment)); gtk_object_sink (GTK_OBJECT (adjustment)); gtk_signal_connect (GTK_OBJECT (adjustment), "value_changed", (GtkSignalFunc) gtk_spin_button_value_changed, (gpointer) spin_button); } }}GtkAdjustment *gtk_spin_button_get_adjustment (GtkSpinButton *spin_button){ g_return_val_if_fail (spin_button != NULL, NULL); g_return_val_if_fail (GTK_IS_SPIN_BUTTON (spin_button), NULL); return spin_button->adjustment;}voidgtk_spin_button_set_digits (GtkSpinButton *spin_button, guint digits){ g_return_if_fail (spin_button != NULL); g_return_if_fail (GTK_IS_SPIN_BUTTON (spin_button)); g_return_if_fail (digits < 6); if (spin_button->digits != digits) { spin_button->digits = digits; gtk_spin_button_value_changed (spin_button->adjustment, spin_button); }}gfloatgtk_spin_button_get_value_as_float (GtkSpinButton *spin_button){ g_return_val_if_fail (spin_button != NULL, 0.0); g_return_val_if_fail (GTK_IS_SPIN_BUTTON (spin_button), 0.0); return spin_button->adjustment->value;}gintgtk_spin_button_get_value_as_int (GtkSpinButton *spin_button){ gfloat val; g_return_val_if_fail (spin_button != NULL, 0); g_return_val_if_fail (GTK_IS_SPIN_BUTTON (spin_button), 0); val = spin_button->adjustment->value; if (val - floor (val) < ceil (val) - val) return floor (val); else return ceil (val);}void gtk_spin_button_set_value (GtkSpinButton *spin_button, gfloat value){ g_return_if_fail (spin_button != NULL); g_return_if_fail (GTK_IS_SPIN_BUTTON (spin_button)); if (fabs (value - spin_button->adjustment->value) > EPSILON) gtk_adjustment_set_value (spin_button->adjustment, value); else { char buf[MAX_TEXT_LENGTH]; sprintf (buf, "%0.*f", spin_button->digits, spin_button->adjustment->value); if (strcmp (buf, gtk_entry_get_text (GTK_ENTRY (spin_button)))) gtk_entry_set_text (GTK_ENTRY (spin_button), buf); }}voidgtk_spin_button_set_update_policy (GtkSpinButton *spin_button, GtkSpinButtonUpdatePolicy policy){ g_return_if_fail (spin_button != NULL); g_return_if_fail (GTK_IS_SPIN_BUTTON (spin_button)); spin_button->update_policy = policy;}voidgtk_spin_button_set_numeric (GtkSpinButton *spin_button, gboolean numeric){ g_return_if_fail (spin_button != NULL); g_return_if_fail (GTK_IS_SPIN_BUTTON (spin_button)); spin_button->numeric = (numeric != 0);}voidgtk_spin_button_set_wrap (GtkSpinButton *spin_button, gboolean wrap){ g_return_if_fail (spin_button != NULL); g_return_if_fail (GTK_IS_SPIN_BUTTON (spin_button)); spin_button->wrap = (wrap != 0);}voidgtk_spin_button_set_shadow_type (GtkSpinButton *spin_button, GtkShadowType shadow_type){ g_return_if_fail (spin_button != NULL); g_return_if_fail (GTK_IS_SPIN_BUTTON (spin_button)); if (shadow_type != spin_button->shadow_type) { spin_button->shadow_type = shadow_type; if (GTK_WIDGET_DRAWABLE (spin_button)) gtk_widget_queue_draw (GTK_WIDGET (spin_button)); }}voidgtk_spin_button_set_snap_to_ticks (GtkSpinButton *spin_button, gboolean 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); } }}voidgtk_spin_button_spin (GtkSpinButton *spin_button, GtkSpinType direction, gfloat increment){ GtkAdjustment *adj; gfloat diff; g_return_if_fail (spin_button != NULL); g_return_if_fail (GTK_IS_SPIN_BUTTON (spin_button)); adj = spin_button->adjustment; /* for compatibility with the 1.0.x version of this function */ if (increment != 0 && increment != adj->step_increment && (direction == GTK_SPIN_STEP_FORWARD || direction == GTK_SPIN_STEP_BACKWARD)) { if (direction == GTK_SPIN_STEP_BACKWARD && increment > 0) increment = -increment; direction = GTK_SPIN_USER_DEFINED; } switch (direction) { case GTK_SPIN_STEP_FORWARD: gtk_spin_button_real_spin (spin_button, adj->step_increment); break; case GTK_SPIN_STEP_BACKWARD: gtk_spin_button_real_spin (spin_button, -adj->step_increment); break; case GTK_SPIN_PAGE_FORWARD: gtk_spin_button_real_spin (spin_button, adj->page_increment); break; case GTK_SPIN_PAGE_BACKWARD: gtk_spin_button_real_spin (spin_button, -adj->page_increment); break; case GTK_SPIN_HOME: diff = adj->value - adj->lower; if (diff > EPSILON) gtk_spin_button_real_spin (spin_button, -diff); break; case GTK_SPIN_END: diff = adj->upper - adj->value; if (diff > EPSILON) gtk_spin_button_real_spin (spin_button, diff); break; case GTK_SPIN_USER_DEFINED: if (increment != 0) gtk_spin_button_real_spin (spin_button, increment); break; default: break; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -