Request API: fix integer fields, add bounds to them

Sun, 12 May 2013 12:45:52 +0200

author
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
date
Sun, 12 May 2013 12:45:52 +0200
changeset 33935
e740bbb8350c
parent 33934
4e2c5ebf3056
child 33936
c941cb2cedf7
child 34193
95e4bd9d5b9c

Request API: fix integer fields, add bounds to them

finch/gntblist.c file | annotate | diff | comparison | revisions
finch/gntplugin.c file | annotate | diff | comparison | revisions
finch/gntprefs.c file | annotate | diff | comparison | revisions
libpurple/plugins/idle.c file | annotate | diff | comparison | revisions
libpurple/plugins/perl/common/Request.xs file | annotate | diff | comparison | revisions
libpurple/request.c file | annotate | diff | comparison | revisions
libpurple/request.h file | annotate | diff | comparison | revisions
pidgin/gtkblist.c file | annotate | diff | comparison | revisions
pidgin/gtkrequest.c file | annotate | diff | comparison | revisions
--- a/finch/gntblist.c	Sat May 11 18:04:43 2013 -0400
+++ b/finch/gntblist.c	Sun May 12 12:45:52 2013 +0200
@@ -1149,7 +1149,7 @@
 			const char *str = g_hash_table_lookup(purple_chat_get_components(chat), pce->identifier);
 			if (!str || sscanf(str, "%d", &val) != 1)
 				val = pce->min;
-			field = purple_request_field_int_new(pce->identifier, pce->label, val);
+			field = purple_request_field_int_new(pce->identifier, pce->label, val, INT_MIN, INT_MAX);
 		} else {
 			field = purple_request_field_string_new(pce->identifier, pce->label,
 					g_hash_table_lookup(purple_chat_get_components(chat), pce->identifier), FALSE);
--- a/finch/gntplugin.c	Sat May 11 18:04:43 2013 -0400
+++ b/finch/gntplugin.c	Sun May 12 12:45:52 2013 +0200
@@ -510,7 +510,7 @@
 					field = purple_request_field_bool_new(name, label, purple_prefs_get_bool(name));
 					break;
 				case PURPLE_PREF_INT:
-					field = purple_request_field_int_new(name, label, purple_prefs_get_int(name));
+					field = purple_request_field_int_new(name, label, purple_prefs_get_int(name), INT_MIN, INT_MAX);
 					break;
 				case PURPLE_PREF_STRING:
 					field = purple_request_field_string_new(name, label, purple_prefs_get_string(name),
--- a/finch/gntprefs.c	Sat May 11 18:04:43 2013 -0400
+++ b/finch/gntprefs.c	Sun May 12 12:45:52 2013 +0200
@@ -123,7 +123,7 @@
 				break;
 			case PURPLE_PREF_INT:
 				field = purple_request_field_int_new(prefs->pref, _(prefs->label),
-						purple_prefs_get_int(prefs->pref));
+						purple_prefs_get_int(prefs->pref), INT_MIN, INT_MAX);
 				break;
 			case PURPLE_PREF_STRING:
 				field = purple_request_field_string_new(prefs->pref, _(prefs->label),
--- a/libpurple/plugins/idle.c	Sat May 11 18:04:43 2013 -0400
+++ b/libpurple/plugins/idle.c	Sun May 12 12:45:52 2013 +0200
@@ -151,7 +151,7 @@
 	purple_request_field_account_set_show_all(field, FALSE);
 	purple_request_field_group_add_field(group, field);
 
-	field = purple_request_field_int_new("mins", _("Minutes"), 10);
+	field = purple_request_field_int_new("mins", _("Minutes"), 10, 0, 9999);
 	purple_request_field_group_add_field(group, field);
 
 	request = purple_request_fields_new();
@@ -211,7 +211,7 @@
 
 	group = purple_request_field_group_new(NULL);
 
-	field = purple_request_field_int_new("mins", _("Minutes"), 10);
+	field = purple_request_field_int_new("mins", _("Minutes"), 10, 0, 9999);
 	purple_request_field_group_add_field(group, field);
 
 	request = purple_request_fields_new();
--- a/libpurple/plugins/perl/common/Request.xs	Sat May 11 18:04:43 2013 -0400
+++ b/libpurple/plugins/perl/common/Request.xs	Sun May 12 12:45:52 2013 +0200
@@ -327,11 +327,13 @@
 PROTOTYPES: ENABLE
 
 Purple::Request::Field
-purple_request_field_int_new(clas, id, text, default_value = 0)
+purple_request_field_int_new(clas, id, text, default_value = 0, lower_bound = INT_MIN, upper_bound = INT_MAX)
 	const char *id
 	const char *text
 	int default_value
-	C_ARGS: id, text, default_value
+	int lower_bound
+	int upper_bound
+	C_ARGS: id, text, default_value, lower_bound, upper_bound
 
 int
 purple_request_field_int_get_default_value(field)
--- a/libpurple/request.c	Sat May 11 18:04:43 2013 -0400
+++ b/libpurple/request.c	Sun May 12 12:45:52 2013 +0200
@@ -70,7 +70,8 @@
 		{
 			int default_value;
 			int value;
-
+			int lower_bound;
+			int upper_bound;
 		} integer;
 
 		struct
@@ -864,7 +865,7 @@
 
 PurpleRequestField *
 purple_request_field_int_new(const char *id, const char *text,
-						   int default_value)
+	int default_value, int lower_bound, int upper_bound)
 {
 	PurpleRequestField *field;
 
@@ -873,6 +874,8 @@
 
 	field = purple_request_field_new(id, text, PURPLE_REQUEST_FIELD_INTEGER);
 
+	purple_request_field_int_set_lower_bound(field, lower_bound);
+	purple_request_field_int_set_upper_bound(field, upper_bound);
 	purple_request_field_int_set_default_value(field, default_value);
 	purple_request_field_int_set_value(field, default_value);
 
@@ -890,11 +893,37 @@
 }
 
 void
+purple_request_field_int_set_lower_bound(PurpleRequestField *field,
+	int lower_bound)
+{
+	g_return_if_fail(field != NULL);
+	g_return_if_fail(field->type == PURPLE_REQUEST_FIELD_INTEGER);
+
+	field->u.integer.lower_bound = lower_bound;
+}
+
+void
+purple_request_field_int_set_upper_bound(PurpleRequestField *field,
+	int upper_bound)
+{
+	g_return_if_fail(field != NULL);
+	g_return_if_fail(field->type == PURPLE_REQUEST_FIELD_INTEGER);
+
+	field->u.integer.upper_bound = upper_bound;
+}
+
+void
 purple_request_field_int_set_value(PurpleRequestField *field, int value)
 {
 	g_return_if_fail(field != NULL);
 	g_return_if_fail(field->type == PURPLE_REQUEST_FIELD_INTEGER);
 
+	if (field->u.integer.value < field->u.integer.lower_bound ||
+		field->u.integer.value > field->u.integer.upper_bound) {
+		purple_debug_error("request", "Int value out of bounds\n");
+		return;
+	}
+
 	field->u.integer.value = value;
 }
 
@@ -908,6 +937,24 @@
 }
 
 int
+purple_request_field_int_get_lower_bound(const PurpleRequestField *field)
+{
+	g_return_val_if_fail(field != NULL, 0);
+	g_return_val_if_fail(field->type == PURPLE_REQUEST_FIELD_INTEGER, 0);
+
+	return field->u.integer.lower_bound;
+}
+
+int
+purple_request_field_int_get_upper_bound(const PurpleRequestField *field)
+{
+	g_return_val_if_fail(field != NULL, 0);
+	g_return_val_if_fail(field->type == PURPLE_REQUEST_FIELD_INTEGER, 0);
+
+	return field->u.integer.upper_bound;
+}
+
+int
 purple_request_field_int_get_value(const PurpleRequestField *field)
 {
 	g_return_val_if_fail(field != NULL, 0);
@@ -1522,59 +1569,6 @@
 	return FALSE;
 }
 
-gboolean purple_request_field_numeric_validator(PurpleRequestField *field,
-	gchar **errmsg, void *range_p)
-{
-	gboolean succ = TRUE;
-	int value = 0;
-	int *range = range_p;
-	
-	g_return_val_if_fail(field != NULL, FALSE);
-	g_return_val_if_fail(field->type == PURPLE_REQUEST_FIELD_STRING ||
-		field->type == PURPLE_REQUEST_FIELD_INTEGER, FALSE);
-
-	if (field->type == PURPLE_REQUEST_FIELD_STRING)
-	{
-		const gchar *svalue, *it;
-		svalue = purple_request_field_string_get_value(field);
-		if (svalue == NULL || svalue[0] == '\0')
-			succ = FALSE;
-		it = svalue;
-		if (it[0] == '-')
-			it++;
-		while (succ && *it)
-		{
-			if (!g_ascii_isdigit(*it))
-				succ = FALSE;
-			it++;
-		}
-		if (succ)
-		{
-			char *endptr;
-			value = strtol(svalue, &endptr, 10);
-			succ = (errno != ERANGE && endptr[0] == '\0');
-		}
-	}
-	// TODO: integer fields doesn't seems to work, so this one needs testing
-	else if (field->type == PURPLE_REQUEST_FIELD_INTEGER)
-		value = purple_request_field_int_get_value(field);
-	else
-		g_return_val_if_reached(FALSE);
-
-	if (succ && range)
-		succ = (value >= range[0] && value <= range[1]);
-
-	if (succ)
-		return TRUE;
-
-	if (errmsg && !range)
-		*errmsg = g_strdup(_("Invalid number"));
-	if (errmsg && range)
-		*errmsg = g_strdup_printf(_("Value is not between %d and %d"),
-			range[0], range[1]);
-	return FALSE;
-}
-
 /* -- */
 
 void *
--- a/libpurple/request.h	Sat May 11 18:04:43 2013 -0400
+++ b/libpurple/request.h	Sun May 12 12:45:52 2013 +0200
@@ -739,12 +739,13 @@
  * @param id            The field ID.
  * @param text          The text label of the field.
  * @param default_value The default value.
+ * @param lower_bound   The lower bound.
+ * @param upper_bound   The upper bound.
  *
  * @return The new field.
  */
 PurpleRequestField *purple_request_field_int_new(const char *id,
-											 const char *text,
-											 int default_value);
+	const char *text, int default_value, int lower_bound, int upper_bound);
 
 /**
  * Sets the default value in an integer field.
@@ -756,6 +757,22 @@
 											  int default_value);
 
 /**
+ * Sets the lower bound in an integer field.
+ *
+ * @param field       The field.
+ * @param lower_bound The lower bound.
+ */
+void purple_request_field_int_set_lower_bound(PurpleRequestField *field, int lower_bound);
+
+/**
+ * Sets the upper bound in an integer field.
+ *
+ * @param field       The field.
+ * @param upper_bound The upper bound.
+ */
+void purple_request_field_int_set_upper_bound(PurpleRequestField *field, int lower_bound);
+
+/**
  * Sets the value in an integer field.
  *
  * @param field The field.
@@ -773,6 +790,24 @@
 int purple_request_field_int_get_default_value(const PurpleRequestField *field);
 
 /**
+ * Returns the lower bound in an integer field.
+ *
+ * @param field The field.
+ *
+ * @return The lower bound.
+ */
+int purple_request_field_int_get_lower_bound(const PurpleRequestField *field);
+
+/**
+ * Returns the upper bound in an integer field.
+ *
+ * @param field The field.
+ *
+ * @return The upper bound.
+ */
+int purple_request_field_int_get_upper_bound(const PurpleRequestField *field);
+
+/**
  * Returns the user-entered value in an integer field.
  *
  * @param field The field.
@@ -1301,21 +1336,6 @@
 gboolean purple_request_field_alphanumeric_validator(PurpleRequestField *field,
 	gchar **errmsg, void *allowed_characters);
 
-/**
- * Validates a field which should contain numeric content, within (optional)
- * range.
- *
- * @see purple_request_field_set_validator
- *
- * @param field The field.
- * @param errmsg (Optional) destination for error message.
- * @param user_data (Optional) an int[2] array containing specified range.
- *
- * @return TRUE, if field contains only alphanumeric characters.
- */
-gboolean purple_request_field_numeric_validator(PurpleRequestField *field,
-	gchar **errmsg, void *range);
-
 /*@}*/
 
 /**************************************************************************/
--- a/pidgin/gtkblist.c	Sat May 11 18:04:43 2013 -0400
+++ b/pidgin/gtkblist.c	Sun May 12 12:45:52 2013 +0200
@@ -701,7 +701,7 @@
 			const char *str = g_hash_table_lookup(purple_chat_get_components(chat), pce->identifier);
 			if (!str || sscanf(str, "%d", &val) != 1)
 				val = pce->min;
-			field = purple_request_field_int_new(pce->identifier, pce->label, val);
+			field = purple_request_field_int_new(pce->identifier, pce->label, val, INT_MIN, INT_MAX);
 		} else {
 			field = purple_request_field_string_new(pce->identifier, pce->label,
 					g_hash_table_lookup(purple_chat_get_components(chat), pce->identifier), FALSE);
--- a/pidgin/gtkrequest.c	Sat May 11 18:04:43 2013 -0400
+++ b/pidgin/gtkrequest.c	Sun May 12 12:45:52 2013 +0200
@@ -222,16 +222,6 @@
 	return FALSE;
 }
 
-static gboolean
-field_int_focus_out_cb(GtkEntry *entry, GdkEventFocus *event,
-					   PurpleRequestField *field)
-{
-	purple_request_field_int_set_value(field,
-			atoi(gtk_entry_get_text(entry)));
-
-	return FALSE;
-}
-
 static void
 field_bool_cb(GtkToggleButton *button, PurpleRequestField *field)
 {
@@ -757,6 +747,12 @@
 static void
 req_entry_field_changed_cb(GtkWidget *entry, PurpleRequestField *field)
 {
+	if (purple_request_field_get_type(field) == PURPLE_REQUEST_FIELD_INTEGER) {
+		int value = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(entry));
+		purple_request_field_int_set_value(field, value);
+		return;
+	}
+
 	if (purple_request_field_string_is_multiline(field))
 	{
 		char *text;
@@ -921,26 +917,17 @@
 	int value;
 	GtkWidget *widget;
 
-	widget = gtk_entry_new();
+	widget = gtk_spin_button_new_with_range(
+		purple_request_field_int_get_lower_bound(field),
+		purple_request_field_int_get_upper_bound(field), 1);
 
 	setup_entry_field(widget, field);
 
 	value = purple_request_field_int_get_default_value(field);
-
-	if (value != 0)
-	{
-		char buf[32];
-
-		g_snprintf(buf, sizeof(buf), "%d", value);
-
-		gtk_entry_set_text(GTK_ENTRY(widget), buf);
-	}
+	gtk_spin_button_set_value(GTK_SPIN_BUTTON(widget), value);
 
 	gtk_widget_set_tooltip_text(widget, purple_request_field_get_tooltip(field));
 
-	g_signal_connect(G_OBJECT(widget), "focus-out-event",
-					 G_CALLBACK(field_int_focus_out_cb), field);
-
 	return widget;
 }
 

mercurial