summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRamiro Estrugo <ramiro@src.gnome.org>2001-03-31 04:20:37 +0000
committerRamiro Estrugo <ramiro@src.gnome.org>2001-03-31 04:20:37 +0000
commit6c6a5832e08600afbdbcba983652663f7c2d5ff2 (patch)
tree11dfcec2da4f85cb3c608cd4169953d714dd7cc1
parent5fc11f9e8584a5a9f24719a92ee19023826fc2d0 (diff)
downloadnautilus-6c6a5832e08600afbdbcba983652663f7c2d5ff2.tar.gz
New functions to make this data structure more useful and easier to use.
* libnautilus-extensions/nautilus-enumeration.h: * libnautilus-extensions/nautilus-enumeration.c: (nautilus_enumeration_new_from_tokens), (nautilus_enumeration_get_entry_position), (nautilus_enumeration_get_value_position), (nautilus_enumeration_get_entries), (nautilus_self_check_enumeration): New functions to make this data structure more useful and easier to use. Also added self checks. * libnautilus-extensions/nautilus-preferences-item.c: (preferences_item_destroy), (preferences_item_update_constrained_integer), (constrained_integer_changed_callback), (nautilus_preferences_item_set_constrained_integer_values): Use a NautilusEnumeration instead of maintaing 2 lists of entries and values ourselves. Makes this code a little bit simpler.
-rw-r--r--ChangeLog20
-rw-r--r--libnautilus-extensions/nautilus-enumeration.c202
-rw-r--r--libnautilus-extensions/nautilus-enumeration.h9
-rw-r--r--libnautilus-extensions/nautilus-preferences-item.c80
-rw-r--r--libnautilus-private/nautilus-enumeration.c202
-rw-r--r--libnautilus-private/nautilus-enumeration.h9
-rw-r--r--libnautilus-private/nautilus-preferences-item.c80
7 files changed, 512 insertions, 90 deletions
diff --git a/ChangeLog b/ChangeLog
index 6cfe42e98..7f22bae73 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,23 @@
+2001-03-30 Ramiro Estrugo <ramiro@eazel.com>
+
+ * libnautilus-extensions/nautilus-enumeration.h:
+ * libnautilus-extensions/nautilus-enumeration.c:
+ (nautilus_enumeration_new_from_tokens),
+ (nautilus_enumeration_get_entry_position),
+ (nautilus_enumeration_get_value_position),
+ (nautilus_enumeration_get_entries),
+ (nautilus_self_check_enumeration):
+ New functions to make this data structure more useful and easier
+ to use. Also added self checks.
+
+ * libnautilus-extensions/nautilus-preferences-item.c:
+ (preferences_item_destroy),
+ (preferences_item_update_constrained_integer),
+ (constrained_integer_changed_callback),
+ (nautilus_preferences_item_set_constrained_integer_values):
+ Use a NautilusEnumeration instead of maintaing 2 lists of entries
+ and values ourselves. Makes this code a little bit simpler.
+
2001-03-30 Michael Engber <engber@eazel.com>
* components/notes/nautilus-notes.c: (notes_save_metainfo):
diff --git a/libnautilus-extensions/nautilus-enumeration.c b/libnautilus-extensions/nautilus-enumeration.c
index 7b6a7b0e9..3217e8c84 100644
--- a/libnautilus-extensions/nautilus-enumeration.c
+++ b/libnautilus-extensions/nautilus-enumeration.c
@@ -43,7 +43,7 @@ struct NautilusEnumeration
/**
* nautilus_enumeration_new:
*
- * Return value: A newly constructed string list.
+ * Return value: A newly constructed empty enumeration.
*/
NautilusEnumeration *
nautilus_enumeration_new (void)
@@ -129,9 +129,209 @@ nautilus_enumeration_get_num_entries (const NautilusEnumeration *enumeration)
return nautilus_string_list_get_length (enumeration->entries);
}
+NautilusEnumeration *
+nautilus_enumeration_new_from_tokens (const char *entries,
+ const char *descriptions,
+ const char *values,
+ const char *delimiter)
+{
+ NautilusEnumeration *enumeration;
+ NautilusStringList *entry_list;
+ NautilusStringList *description_list;
+ NautilusStringList *value_list;
+ guint i;
+ int value;
+
+ g_return_val_if_fail (entries != NULL, NULL);
+ g_return_val_if_fail (entries[0] != '\0', NULL);
+ g_return_val_if_fail (values != NULL, NULL);
+ g_return_val_if_fail (values[0] != '\0', NULL);
+ g_return_val_if_fail (delimiter != NULL, NULL);
+ g_return_val_if_fail (delimiter[0] != '\0', NULL);
+
+ enumeration = nautilus_enumeration_new ();
+
+ entry_list = nautilus_string_list_new_from_tokens (entries, delimiter, TRUE);
+ value_list = nautilus_string_list_new_from_tokens (values, delimiter, TRUE);
+
+ if (nautilus_string_list_get_length (entry_list)
+ != nautilus_string_list_get_length (value_list)) {
+ g_warning ("entries and values have different lengths.");
+ nautilus_string_list_free (entry_list);
+ nautilus_string_list_free (value_list);
+ return NULL;
+ }
+
+ description_list =
+ descriptions != NULL ?
+ nautilus_string_list_new_from_tokens (descriptions, delimiter, TRUE) :
+ NULL;
+
+ if (description_list != NULL) {
+ if (nautilus_string_list_get_length (entry_list)
+ != nautilus_string_list_get_length (description_list)) {
+ g_warning ("entries and descriptions have different lengths.");
+ nautilus_string_list_free (entry_list);
+ nautilus_string_list_free (value_list);
+ nautilus_string_list_free (description_list);
+ return NULL;
+ }
+ }
+
+ enumeration->entries = entry_list;
+
+ if (description_list == NULL) {
+ description_list = nautilus_string_list_new (TRUE);
+
+ for (i = 0; i < nautilus_string_list_get_length (entry_list); i++) {
+ nautilus_string_list_insert (description_list, "");
+ }
+ }
+
+ enumeration->entries = entry_list;
+ enumeration->descriptions = description_list;
+
+ for (i = 0; i < nautilus_string_list_get_length (entry_list); i++) {
+ if (!nautilus_string_list_nth_as_integer (value_list, i, &value)) {
+ g_warning ("Could not convert value '%d' to an integer. Using 0.", i);
+ value = 0;
+ }
+
+ enumeration->values = g_list_append (enumeration->values, GINT_TO_POINTER (value));
+ }
+ nautilus_string_list_free (value_list);
+
+ return enumeration;
+}
+
+int
+nautilus_enumeration_get_entry_position (const NautilusEnumeration *enumeration,
+ const char *entry)
+{
+ g_return_val_if_fail (enumeration != NULL, NAUTILUS_STRING_LIST_NOT_FOUND);
+ g_return_val_if_fail (entry != NULL, NAUTILUS_STRING_LIST_NOT_FOUND);
+
+ if (enumeration->entries == NULL) {
+ return NAUTILUS_STRING_LIST_NOT_FOUND;
+ }
+
+ return nautilus_string_list_get_index_for_string (enumeration->entries, entry);
+}
+
+int
+nautilus_enumeration_get_value_position (const NautilusEnumeration *enumeration,
+ int value)
+{
+ GList *node;
+ int pos;
+
+ g_return_val_if_fail (enumeration != NULL, NAUTILUS_STRING_LIST_NOT_FOUND);
+
+ if (enumeration->values == NULL) {
+ return NAUTILUS_STRING_LIST_NOT_FOUND;
+ }
+
+ for (node = enumeration->values, pos = 0; node != NULL; node = node->next, pos++) {
+ if (GPOINTER_TO_INT (node->data) == value) {
+ return pos;
+ }
+ }
+
+ return NAUTILUS_STRING_LIST_NOT_FOUND;
+}
+
+NautilusStringList *
+nautilus_enumeration_get_entries (const NautilusEnumeration *enumeration)
+{
+ g_return_val_if_fail (enumeration != NULL, NULL);
+
+ if (enumeration->entries == NULL) {
+ return NULL;
+ }
+
+ return nautilus_string_list_new_from_string_list (enumeration->entries, TRUE);
+}
+
#if !defined (NAUTILUS_OMIT_SELF_CHECK)
+
+#define CHECK_ENUMERATION_ENTRY(enumeration, i, entry, description, value) \
+ NAUTILUS_CHECK_STRING_RESULT (nautilus_enumeration_get_nth_entry (enumeration, i), entry); \
+ NAUTILUS_CHECK_STRING_RESULT (nautilus_enumeration_get_nth_description (enumeration, i), description); \
+ NAUTILUS_CHECK_INTEGER_RESULT (nautilus_enumeration_get_nth_value (enumeration, i), value); \
+ NAUTILUS_CHECK_INTEGER_RESULT (nautilus_enumeration_get_entry_position (enumeration, entry), i); \
+ NAUTILUS_CHECK_INTEGER_RESULT (nautilus_enumeration_get_value_position (enumeration, value), i);
+
void
nautilus_self_check_enumeration (void)
{
+ NautilusEnumeration *e;
+ NautilusStringList *entries;
+ NautilusStringList *entries_test;
+
+ /***/
+ e = nautilus_enumeration_new ();
+ nautilus_enumeration_insert (e, "foo", NULL, 0);
+ CHECK_ENUMERATION_ENTRY (e, 0, "foo", "", 0);
+ NAUTILUS_CHECK_INTEGER_RESULT (nautilus_enumeration_get_num_entries (e), 1);
+
+ nautilus_enumeration_insert (e, "bar", NULL, 1);
+ CHECK_ENUMERATION_ENTRY (e, 1, "bar", "", 1);
+ NAUTILUS_CHECK_INTEGER_RESULT (nautilus_enumeration_get_num_entries (e), 2);
+
+ nautilus_enumeration_free (e);
+
+ /***/
+ e = nautilus_enumeration_new_from_tokens ("apple,orange,banana",
+ NULL,
+ "1,2,3",
+ ",");
+
+ CHECK_ENUMERATION_ENTRY (e, 0, "apple", "", 1);
+ CHECK_ENUMERATION_ENTRY (e, 1, "orange", "", 2);
+ CHECK_ENUMERATION_ENTRY (e, 2, "banana", "", 3);
+ NAUTILUS_CHECK_INTEGER_RESULT (nautilus_enumeration_get_num_entries (e), 3);
+ nautilus_enumeration_free (e);
+
+ /***/
+ e = nautilus_enumeration_new_from_tokens ("foo",
+ NULL,
+ "666",
+ ",");
+ CHECK_ENUMERATION_ENTRY (e, 0, "foo", "", 666);
+ NAUTILUS_CHECK_INTEGER_RESULT (nautilus_enumeration_get_num_entries (e), 1);
+ nautilus_enumeration_free (e);
+
+ /***/
+ e = nautilus_enumeration_new_from_tokens ("red,green,blue",
+ "Red Desc,Green Desc,Blue Desc",
+ "10,20,30",
+ ",");
+
+ CHECK_ENUMERATION_ENTRY (e, 0, "red", "Red Desc", 10);
+ CHECK_ENUMERATION_ENTRY (e, 1, "green", "Green Desc", 20);
+ CHECK_ENUMERATION_ENTRY (e, 2, "blue", "Blue Desc", 30);
+ NAUTILUS_CHECK_INTEGER_RESULT (nautilus_enumeration_get_num_entries (e), 3);
+ nautilus_enumeration_free (e);
+
+ /***/
+ e = nautilus_enumeration_new_from_tokens ("red,foo:green,bar:blue,baz",
+ "Red,Desc:Green,Desc:Blue,Desc",
+ "10:20:30",
+ ":");
+
+ CHECK_ENUMERATION_ENTRY (e, 0, "red,foo", "Red,Desc", 10);
+ CHECK_ENUMERATION_ENTRY (e, 1, "green,bar", "Green,Desc", 20);
+ CHECK_ENUMERATION_ENTRY (e, 2, "blue,baz", "Blue,Desc", 30);
+ NAUTILUS_CHECK_INTEGER_RESULT (nautilus_enumeration_get_num_entries (e), 3);
+
+ entries = nautilus_enumeration_get_entries (e);
+ entries_test = nautilus_string_list_new_from_tokens ("red,foo:green,bar:blue,baz", ":", TRUE);
+
+ NAUTILUS_CHECK_BOOLEAN_RESULT (nautilus_string_list_equals (entries, entries_test), TRUE);
+
+ nautilus_string_list_free (entries);
+ nautilus_string_list_free (entries_test);
+ nautilus_enumeration_free (e);
}
+
#endif /* !NAUTILUS_OMIT_SELF_CHECK */
diff --git a/libnautilus-extensions/nautilus-enumeration.h b/libnautilus-extensions/nautilus-enumeration.h
index 663e76611..d2881e9b2 100644
--- a/libnautilus-extensions/nautilus-enumeration.h
+++ b/libnautilus-extensions/nautilus-enumeration.h
@@ -43,6 +43,15 @@ char * nautilus_enumeration_get_nth_description (const NautilusEnu
int nautilus_enumeration_get_nth_value (const NautilusEnumeration *enumeration,
guint n);
guint nautilus_enumeration_get_num_entries (const NautilusEnumeration *enumeration);
+NautilusEnumeration *nautilus_enumeration_new_from_tokens (const char *entries,
+ const char *descriptions,
+ const char *values,
+ const char *delimiter);
+int nautilus_enumeration_get_entry_position (const NautilusEnumeration *enumeration,
+ const char *entry);
+int nautilus_enumeration_get_value_position (const NautilusEnumeration *enumeration,
+ int value);
+NautilusStringList * nautilus_enumeration_get_entries (const NautilusEnumeration *enumeration);
#endif /* NAUTILUS_ENUMERATION_H */
diff --git a/libnautilus-extensions/nautilus-preferences-item.c b/libnautilus-extensions/nautilus-preferences-item.c
index 25f256ef9..3ae9eb65a 100644
--- a/libnautilus-extensions/nautilus-preferences-item.c
+++ b/libnautilus-extensions/nautilus-preferences-item.c
@@ -43,6 +43,7 @@
#include "nautilus-string-picker.h"
#include "nautilus-font-picker.h"
#include "nautilus-text-caption.h"
+#include "nautilus-enumeration.h"
#include "nautilus-global-preferences.h"
@@ -60,8 +61,7 @@ struct _NautilusPreferencesItemDetails
guint change_signal_ID;
char *control_preference_name;
NautilusPreferencesItemControlAction control_action;
- NautilusStringList *constrained_integer_value_list;
- NautilusStringList *constrained_integer_label_list;
+ NautilusEnumeration *constrained_integer_values;
};
/* GtkObjectClass methods */
@@ -142,8 +142,7 @@ preferences_item_destroy (GtkObject *object)
g_free (item->details->preference_name);
g_free (item->details->control_preference_name);
- nautilus_string_list_free (item->details->constrained_integer_value_list);
- nautilus_string_list_free (item->details->constrained_integer_label_list);
+ nautilus_enumeration_free (item->details->constrained_integer_values);
g_free (item->details);
/* Chain destroy */
@@ -461,30 +460,26 @@ preferences_item_update_constrained_integer (NautilusPreferencesItem *item)
{
char *current_label;
int current_value;
- char *current_value_as_string;
int position;
g_return_if_fail (NAUTILUS_IS_PREFERENCES_ITEM (item));
g_return_if_fail (item->details->item_type == NAUTILUS_PREFERENCE_ITEM_CONSTRAINED_INTEGER);
/* Too early if the value and label lists haven't been set up yet. */
- if (item->details->constrained_integer_value_list == NULL) {
+ if (item->details->constrained_integer_values == NULL) {
return;
}
- g_return_if_fail (item->details->constrained_integer_label_list != NULL);
current_value = nautilus_preferences_get_integer (item->details->preference_name);
- current_value_as_string = g_strdup_printf ("%d", current_value);
- position = nautilus_string_list_get_index_for_string
- (item->details->constrained_integer_value_list,
- current_value_as_string);
- g_free (current_value_as_string);
+ g_print ("%s -> %d\n", item->details->preference_name, current_value);
+
+ position = nautilus_enumeration_get_value_position (item->details->constrained_integer_values,
+ current_value);
g_return_if_fail (position != NAUTILUS_STRING_LIST_NOT_FOUND);
- current_label = nautilus_string_list_nth
- (item->details->constrained_integer_label_list,
- position);
+ current_label = nautilus_enumeration_get_nth_entry (item->details->constrained_integer_values,
+ position);
if (nautilus_string_picker_contains (NAUTILUS_STRING_PICKER (item->details->child), current_label)) {
nautilus_string_picker_set_selected_string (NAUTILUS_STRING_PICKER (item->details->child),
@@ -764,35 +759,26 @@ constrained_integer_changed_callback (NautilusStringPicker *string_picker,
NautilusPreferencesItem *item)
{
char *selected_label;
- int selected_label_index;
- char *new_value_string;
+ int position;
int new_value;
g_return_if_fail (NAUTILUS_IS_STRING_PICKER (string_picker));
g_return_if_fail (NAUTILUS_IS_PREFERENCES_ITEM (item));
- g_return_if_fail (nautilus_string_list_get_length (item->details->constrained_integer_value_list) > 0);
- g_return_if_fail (nautilus_string_list_get_length (item->details->constrained_integer_label_list) > 0);
- g_return_if_fail (nautilus_string_list_get_length (item->details->constrained_integer_value_list)
- == nautilus_string_list_get_length (item->details->constrained_integer_label_list));
-
+ g_return_if_fail (item->details->constrained_integer_values != NULL);
+ g_return_if_fail (nautilus_enumeration_get_num_entries (item->details->constrained_integer_values) > 0);
+
selected_label = nautilus_string_picker_get_selected_string (string_picker);
g_return_if_fail (selected_label != NULL);
- selected_label_index =
- nautilus_string_list_get_index_for_string (item->details->constrained_integer_label_list,
- selected_label);
+ position = nautilus_enumeration_get_entry_position (item->details->constrained_integer_values,
+ selected_label);
g_free (selected_label);
+ g_return_if_fail (position != NAUTILUS_STRING_LIST_NOT_FOUND);
- g_return_if_fail (selected_label_index != NAUTILUS_STRING_LIST_NOT_FOUND);
-
- new_value_string = nautilus_string_list_nth (item->details->constrained_integer_value_list,
- selected_label_index);
-
- if (nautilus_strlen (new_value_string) && nautilus_str_to_int (new_value_string, &new_value)) {
- nautilus_preferences_set_integer (item->details->preference_name, new_value);
- }
-
- g_free (new_value_string);
+ new_value = nautilus_enumeration_get_nth_value (item->details->constrained_integer_values,
+ position);
+
+ nautilus_preferences_set_integer (item->details->preference_name, new_value);
}
char *
@@ -986,6 +972,8 @@ nautilus_preferences_item_set_constrained_integer_values (NautilusPreferencesIte
const char *values,
const char *labels)
{
+ NautilusStringList *entry_list;
+
g_return_if_fail (NAUTILUS_IS_PREFERENCES_ITEM (item));
g_return_if_fail (item->details->item_type == NAUTILUS_PREFERENCE_ITEM_CONSTRAINED_INTEGER);
g_return_if_fail (nautilus_strlen (labels) > 0);
@@ -993,19 +981,23 @@ nautilus_preferences_item_set_constrained_integer_values (NautilusPreferencesIte
g_return_if_fail (nautilus_str_count_characters (labels, ',')
== nautilus_str_count_characters (values, ','));
- nautilus_string_list_free (item->details->constrained_integer_value_list);
- nautilus_string_list_free (item->details->constrained_integer_label_list);
+ nautilus_enumeration_free (item->details->constrained_integer_values);
- item->details->constrained_integer_value_list = nautilus_string_list_new_from_tokens (values, ",", TRUE);
- item->details->constrained_integer_label_list = nautilus_string_list_new_from_tokens (labels, ",", TRUE);
+ item->details->constrained_integer_values = nautilus_enumeration_new_from_tokens (labels,
+ NULL,
+ values,
+ ",");
- g_return_if_fail (nautilus_string_list_get_length (item->details->constrained_integer_value_list) > 0);
- g_return_if_fail (nautilus_string_list_get_length (item->details->constrained_integer_label_list) > 0);
- g_return_if_fail (nautilus_string_list_get_length (item->details->constrained_integer_value_list)
- == nautilus_string_list_get_length (item->details->constrained_integer_label_list));
+ g_return_if_fail (nautilus_enumeration_get_num_entries (item->details->constrained_integer_values) > 0);
+
+ entry_list = nautilus_enumeration_get_entries (item->details->constrained_integer_values);
+
+ g_return_if_fail (entry_list != NULL);
nautilus_string_picker_set_string_list (NAUTILUS_STRING_PICKER (item->details->child),
- item->details->constrained_integer_label_list);
+ entry_list);
+
+ nautilus_string_list_free (entry_list);
}
gboolean
diff --git a/libnautilus-private/nautilus-enumeration.c b/libnautilus-private/nautilus-enumeration.c
index 7b6a7b0e9..3217e8c84 100644
--- a/libnautilus-private/nautilus-enumeration.c
+++ b/libnautilus-private/nautilus-enumeration.c
@@ -43,7 +43,7 @@ struct NautilusEnumeration
/**
* nautilus_enumeration_new:
*
- * Return value: A newly constructed string list.
+ * Return value: A newly constructed empty enumeration.
*/
NautilusEnumeration *
nautilus_enumeration_new (void)
@@ -129,9 +129,209 @@ nautilus_enumeration_get_num_entries (const NautilusEnumeration *enumeration)
return nautilus_string_list_get_length (enumeration->entries);
}
+NautilusEnumeration *
+nautilus_enumeration_new_from_tokens (const char *entries,
+ const char *descriptions,
+ const char *values,
+ const char *delimiter)
+{
+ NautilusEnumeration *enumeration;
+ NautilusStringList *entry_list;
+ NautilusStringList *description_list;
+ NautilusStringList *value_list;
+ guint i;
+ int value;
+
+ g_return_val_if_fail (entries != NULL, NULL);
+ g_return_val_if_fail (entries[0] != '\0', NULL);
+ g_return_val_if_fail (values != NULL, NULL);
+ g_return_val_if_fail (values[0] != '\0', NULL);
+ g_return_val_if_fail (delimiter != NULL, NULL);
+ g_return_val_if_fail (delimiter[0] != '\0', NULL);
+
+ enumeration = nautilus_enumeration_new ();
+
+ entry_list = nautilus_string_list_new_from_tokens (entries, delimiter, TRUE);
+ value_list = nautilus_string_list_new_from_tokens (values, delimiter, TRUE);
+
+ if (nautilus_string_list_get_length (entry_list)
+ != nautilus_string_list_get_length (value_list)) {
+ g_warning ("entries and values have different lengths.");
+ nautilus_string_list_free (entry_list);
+ nautilus_string_list_free (value_list);
+ return NULL;
+ }
+
+ description_list =
+ descriptions != NULL ?
+ nautilus_string_list_new_from_tokens (descriptions, delimiter, TRUE) :
+ NULL;
+
+ if (description_list != NULL) {
+ if (nautilus_string_list_get_length (entry_list)
+ != nautilus_string_list_get_length (description_list)) {
+ g_warning ("entries and descriptions have different lengths.");
+ nautilus_string_list_free (entry_list);
+ nautilus_string_list_free (value_list);
+ nautilus_string_list_free (description_list);
+ return NULL;
+ }
+ }
+
+ enumeration->entries = entry_list;
+
+ if (description_list == NULL) {
+ description_list = nautilus_string_list_new (TRUE);
+
+ for (i = 0; i < nautilus_string_list_get_length (entry_list); i++) {
+ nautilus_string_list_insert (description_list, "");
+ }
+ }
+
+ enumeration->entries = entry_list;
+ enumeration->descriptions = description_list;
+
+ for (i = 0; i < nautilus_string_list_get_length (entry_list); i++) {
+ if (!nautilus_string_list_nth_as_integer (value_list, i, &value)) {
+ g_warning ("Could not convert value '%d' to an integer. Using 0.", i);
+ value = 0;
+ }
+
+ enumeration->values = g_list_append (enumeration->values, GINT_TO_POINTER (value));
+ }
+ nautilus_string_list_free (value_list);
+
+ return enumeration;
+}
+
+int
+nautilus_enumeration_get_entry_position (const NautilusEnumeration *enumeration,
+ const char *entry)
+{
+ g_return_val_if_fail (enumeration != NULL, NAUTILUS_STRING_LIST_NOT_FOUND);
+ g_return_val_if_fail (entry != NULL, NAUTILUS_STRING_LIST_NOT_FOUND);
+
+ if (enumeration->entries == NULL) {
+ return NAUTILUS_STRING_LIST_NOT_FOUND;
+ }
+
+ return nautilus_string_list_get_index_for_string (enumeration->entries, entry);
+}
+
+int
+nautilus_enumeration_get_value_position (const NautilusEnumeration *enumeration,
+ int value)
+{
+ GList *node;
+ int pos;
+
+ g_return_val_if_fail (enumeration != NULL, NAUTILUS_STRING_LIST_NOT_FOUND);
+
+ if (enumeration->values == NULL) {
+ return NAUTILUS_STRING_LIST_NOT_FOUND;
+ }
+
+ for (node = enumeration->values, pos = 0; node != NULL; node = node->next, pos++) {
+ if (GPOINTER_TO_INT (node->data) == value) {
+ return pos;
+ }
+ }
+
+ return NAUTILUS_STRING_LIST_NOT_FOUND;
+}
+
+NautilusStringList *
+nautilus_enumeration_get_entries (const NautilusEnumeration *enumeration)
+{
+ g_return_val_if_fail (enumeration != NULL, NULL);
+
+ if (enumeration->entries == NULL) {
+ return NULL;
+ }
+
+ return nautilus_string_list_new_from_string_list (enumeration->entries, TRUE);
+}
+
#if !defined (NAUTILUS_OMIT_SELF_CHECK)
+
+#define CHECK_ENUMERATION_ENTRY(enumeration, i, entry, description, value) \
+ NAUTILUS_CHECK_STRING_RESULT (nautilus_enumeration_get_nth_entry (enumeration, i), entry); \
+ NAUTILUS_CHECK_STRING_RESULT (nautilus_enumeration_get_nth_description (enumeration, i), description); \
+ NAUTILUS_CHECK_INTEGER_RESULT (nautilus_enumeration_get_nth_value (enumeration, i), value); \
+ NAUTILUS_CHECK_INTEGER_RESULT (nautilus_enumeration_get_entry_position (enumeration, entry), i); \
+ NAUTILUS_CHECK_INTEGER_RESULT (nautilus_enumeration_get_value_position (enumeration, value), i);
+
void
nautilus_self_check_enumeration (void)
{
+ NautilusEnumeration *e;
+ NautilusStringList *entries;
+ NautilusStringList *entries_test;
+
+ /***/
+ e = nautilus_enumeration_new ();
+ nautilus_enumeration_insert (e, "foo", NULL, 0);
+ CHECK_ENUMERATION_ENTRY (e, 0, "foo", "", 0);
+ NAUTILUS_CHECK_INTEGER_RESULT (nautilus_enumeration_get_num_entries (e), 1);
+
+ nautilus_enumeration_insert (e, "bar", NULL, 1);
+ CHECK_ENUMERATION_ENTRY (e, 1, "bar", "", 1);
+ NAUTILUS_CHECK_INTEGER_RESULT (nautilus_enumeration_get_num_entries (e), 2);
+
+ nautilus_enumeration_free (e);
+
+ /***/
+ e = nautilus_enumeration_new_from_tokens ("apple,orange,banana",
+ NULL,
+ "1,2,3",
+ ",");
+
+ CHECK_ENUMERATION_ENTRY (e, 0, "apple", "", 1);
+ CHECK_ENUMERATION_ENTRY (e, 1, "orange", "", 2);
+ CHECK_ENUMERATION_ENTRY (e, 2, "banana", "", 3);
+ NAUTILUS_CHECK_INTEGER_RESULT (nautilus_enumeration_get_num_entries (e), 3);
+ nautilus_enumeration_free (e);
+
+ /***/
+ e = nautilus_enumeration_new_from_tokens ("foo",
+ NULL,
+ "666",
+ ",");
+ CHECK_ENUMERATION_ENTRY (e, 0, "foo", "", 666);
+ NAUTILUS_CHECK_INTEGER_RESULT (nautilus_enumeration_get_num_entries (e), 1);
+ nautilus_enumeration_free (e);
+
+ /***/
+ e = nautilus_enumeration_new_from_tokens ("red,green,blue",
+ "Red Desc,Green Desc,Blue Desc",
+ "10,20,30",
+ ",");
+
+ CHECK_ENUMERATION_ENTRY (e, 0, "red", "Red Desc", 10);
+ CHECK_ENUMERATION_ENTRY (e, 1, "green", "Green Desc", 20);
+ CHECK_ENUMERATION_ENTRY (e, 2, "blue", "Blue Desc", 30);
+ NAUTILUS_CHECK_INTEGER_RESULT (nautilus_enumeration_get_num_entries (e), 3);
+ nautilus_enumeration_free (e);
+
+ /***/
+ e = nautilus_enumeration_new_from_tokens ("red,foo:green,bar:blue,baz",
+ "Red,Desc:Green,Desc:Blue,Desc",
+ "10:20:30",
+ ":");
+
+ CHECK_ENUMERATION_ENTRY (e, 0, "red,foo", "Red,Desc", 10);
+ CHECK_ENUMERATION_ENTRY (e, 1, "green,bar", "Green,Desc", 20);
+ CHECK_ENUMERATION_ENTRY (e, 2, "blue,baz", "Blue,Desc", 30);
+ NAUTILUS_CHECK_INTEGER_RESULT (nautilus_enumeration_get_num_entries (e), 3);
+
+ entries = nautilus_enumeration_get_entries (e);
+ entries_test = nautilus_string_list_new_from_tokens ("red,foo:green,bar:blue,baz", ":", TRUE);
+
+ NAUTILUS_CHECK_BOOLEAN_RESULT (nautilus_string_list_equals (entries, entries_test), TRUE);
+
+ nautilus_string_list_free (entries);
+ nautilus_string_list_free (entries_test);
+ nautilus_enumeration_free (e);
}
+
#endif /* !NAUTILUS_OMIT_SELF_CHECK */
diff --git a/libnautilus-private/nautilus-enumeration.h b/libnautilus-private/nautilus-enumeration.h
index 663e76611..d2881e9b2 100644
--- a/libnautilus-private/nautilus-enumeration.h
+++ b/libnautilus-private/nautilus-enumeration.h
@@ -43,6 +43,15 @@ char * nautilus_enumeration_get_nth_description (const NautilusEnu
int nautilus_enumeration_get_nth_value (const NautilusEnumeration *enumeration,
guint n);
guint nautilus_enumeration_get_num_entries (const NautilusEnumeration *enumeration);
+NautilusEnumeration *nautilus_enumeration_new_from_tokens (const char *entries,
+ const char *descriptions,
+ const char *values,
+ const char *delimiter);
+int nautilus_enumeration_get_entry_position (const NautilusEnumeration *enumeration,
+ const char *entry);
+int nautilus_enumeration_get_value_position (const NautilusEnumeration *enumeration,
+ int value);
+NautilusStringList * nautilus_enumeration_get_entries (const NautilusEnumeration *enumeration);
#endif /* NAUTILUS_ENUMERATION_H */
diff --git a/libnautilus-private/nautilus-preferences-item.c b/libnautilus-private/nautilus-preferences-item.c
index 25f256ef9..3ae9eb65a 100644
--- a/libnautilus-private/nautilus-preferences-item.c
+++ b/libnautilus-private/nautilus-preferences-item.c
@@ -43,6 +43,7 @@
#include "nautilus-string-picker.h"
#include "nautilus-font-picker.h"
#include "nautilus-text-caption.h"
+#include "nautilus-enumeration.h"
#include "nautilus-global-preferences.h"
@@ -60,8 +61,7 @@ struct _NautilusPreferencesItemDetails
guint change_signal_ID;
char *control_preference_name;
NautilusPreferencesItemControlAction control_action;
- NautilusStringList *constrained_integer_value_list;
- NautilusStringList *constrained_integer_label_list;
+ NautilusEnumeration *constrained_integer_values;
};
/* GtkObjectClass methods */
@@ -142,8 +142,7 @@ preferences_item_destroy (GtkObject *object)
g_free (item->details->preference_name);
g_free (item->details->control_preference_name);
- nautilus_string_list_free (item->details->constrained_integer_value_list);
- nautilus_string_list_free (item->details->constrained_integer_label_list);
+ nautilus_enumeration_free (item->details->constrained_integer_values);
g_free (item->details);
/* Chain destroy */
@@ -461,30 +460,26 @@ preferences_item_update_constrained_integer (NautilusPreferencesItem *item)
{
char *current_label;
int current_value;
- char *current_value_as_string;
int position;
g_return_if_fail (NAUTILUS_IS_PREFERENCES_ITEM (item));
g_return_if_fail (item->details->item_type == NAUTILUS_PREFERENCE_ITEM_CONSTRAINED_INTEGER);
/* Too early if the value and label lists haven't been set up yet. */
- if (item->details->constrained_integer_value_list == NULL) {
+ if (item->details->constrained_integer_values == NULL) {
return;
}
- g_return_if_fail (item->details->constrained_integer_label_list != NULL);
current_value = nautilus_preferences_get_integer (item->details->preference_name);
- current_value_as_string = g_strdup_printf ("%d", current_value);
- position = nautilus_string_list_get_index_for_string
- (item->details->constrained_integer_value_list,
- current_value_as_string);
- g_free (current_value_as_string);
+ g_print ("%s -> %d\n", item->details->preference_name, current_value);
+
+ position = nautilus_enumeration_get_value_position (item->details->constrained_integer_values,
+ current_value);
g_return_if_fail (position != NAUTILUS_STRING_LIST_NOT_FOUND);
- current_label = nautilus_string_list_nth
- (item->details->constrained_integer_label_list,
- position);
+ current_label = nautilus_enumeration_get_nth_entry (item->details->constrained_integer_values,
+ position);
if (nautilus_string_picker_contains (NAUTILUS_STRING_PICKER (item->details->child), current_label)) {
nautilus_string_picker_set_selected_string (NAUTILUS_STRING_PICKER (item->details->child),
@@ -764,35 +759,26 @@ constrained_integer_changed_callback (NautilusStringPicker *string_picker,
NautilusPreferencesItem *item)
{
char *selected_label;
- int selected_label_index;
- char *new_value_string;
+ int position;
int new_value;
g_return_if_fail (NAUTILUS_IS_STRING_PICKER (string_picker));
g_return_if_fail (NAUTILUS_IS_PREFERENCES_ITEM (item));
- g_return_if_fail (nautilus_string_list_get_length (item->details->constrained_integer_value_list) > 0);
- g_return_if_fail (nautilus_string_list_get_length (item->details->constrained_integer_label_list) > 0);
- g_return_if_fail (nautilus_string_list_get_length (item->details->constrained_integer_value_list)
- == nautilus_string_list_get_length (item->details->constrained_integer_label_list));
-
+ g_return_if_fail (item->details->constrained_integer_values != NULL);
+ g_return_if_fail (nautilus_enumeration_get_num_entries (item->details->constrained_integer_values) > 0);
+
selected_label = nautilus_string_picker_get_selected_string (string_picker);
g_return_if_fail (selected_label != NULL);
- selected_label_index =
- nautilus_string_list_get_index_for_string (item->details->constrained_integer_label_list,
- selected_label);
+ position = nautilus_enumeration_get_entry_position (item->details->constrained_integer_values,
+ selected_label);
g_free (selected_label);
+ g_return_if_fail (position != NAUTILUS_STRING_LIST_NOT_FOUND);
- g_return_if_fail (selected_label_index != NAUTILUS_STRING_LIST_NOT_FOUND);
-
- new_value_string = nautilus_string_list_nth (item->details->constrained_integer_value_list,
- selected_label_index);
-
- if (nautilus_strlen (new_value_string) && nautilus_str_to_int (new_value_string, &new_value)) {
- nautilus_preferences_set_integer (item->details->preference_name, new_value);
- }
-
- g_free (new_value_string);
+ new_value = nautilus_enumeration_get_nth_value (item->details->constrained_integer_values,
+ position);
+
+ nautilus_preferences_set_integer (item->details->preference_name, new_value);
}
char *
@@ -986,6 +972,8 @@ nautilus_preferences_item_set_constrained_integer_values (NautilusPreferencesIte
const char *values,
const char *labels)
{
+ NautilusStringList *entry_list;
+
g_return_if_fail (NAUTILUS_IS_PREFERENCES_ITEM (item));
g_return_if_fail (item->details->item_type == NAUTILUS_PREFERENCE_ITEM_CONSTRAINED_INTEGER);
g_return_if_fail (nautilus_strlen (labels) > 0);
@@ -993,19 +981,23 @@ nautilus_preferences_item_set_constrained_integer_values (NautilusPreferencesIte
g_return_if_fail (nautilus_str_count_characters (labels, ',')
== nautilus_str_count_characters (values, ','));
- nautilus_string_list_free (item->details->constrained_integer_value_list);
- nautilus_string_list_free (item->details->constrained_integer_label_list);
+ nautilus_enumeration_free (item->details->constrained_integer_values);
- item->details->constrained_integer_value_list = nautilus_string_list_new_from_tokens (values, ",", TRUE);
- item->details->constrained_integer_label_list = nautilus_string_list_new_from_tokens (labels, ",", TRUE);
+ item->details->constrained_integer_values = nautilus_enumeration_new_from_tokens (labels,
+ NULL,
+ values,
+ ",");
- g_return_if_fail (nautilus_string_list_get_length (item->details->constrained_integer_value_list) > 0);
- g_return_if_fail (nautilus_string_list_get_length (item->details->constrained_integer_label_list) > 0);
- g_return_if_fail (nautilus_string_list_get_length (item->details->constrained_integer_value_list)
- == nautilus_string_list_get_length (item->details->constrained_integer_label_list));
+ g_return_if_fail (nautilus_enumeration_get_num_entries (item->details->constrained_integer_values) > 0);
+
+ entry_list = nautilus_enumeration_get_entries (item->details->constrained_integer_values);
+
+ g_return_if_fail (entry_list != NULL);
nautilus_string_picker_set_string_list (NAUTILUS_STRING_PICKER (item->details->child),
- item->details->constrained_integer_label_list);
+ entry_list);
+
+ nautilus_string_list_free (entry_list);
}
gboolean