⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gtkspinbutton.c

📁 gtk是linux一款强大的夸平台的图形化开发工具
💻 C
📖 第 1 页 / 共 3 页
字号:
      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 + -