diff options
author | Ramiro Estrugo <ramiro@src.gnome.org> | 2001-03-31 04:20:37 +0000 |
---|---|---|
committer | Ramiro Estrugo <ramiro@src.gnome.org> | 2001-03-31 04:20:37 +0000 |
commit | 6c6a5832e08600afbdbcba983652663f7c2d5ff2 (patch) | |
tree | 11dfcec2da4f85cb3c608cd4169953d714dd7cc1 | |
parent | 5fc11f9e8584a5a9f24719a92ee19023826fc2d0 (diff) | |
download | nautilus-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-- | ChangeLog | 20 | ||||
-rw-r--r-- | libnautilus-extensions/nautilus-enumeration.c | 202 | ||||
-rw-r--r-- | libnautilus-extensions/nautilus-enumeration.h | 9 | ||||
-rw-r--r-- | libnautilus-extensions/nautilus-preferences-item.c | 80 | ||||
-rw-r--r-- | libnautilus-private/nautilus-enumeration.c | 202 | ||||
-rw-r--r-- | libnautilus-private/nautilus-enumeration.h | 9 | ||||
-rw-r--r-- | libnautilus-private/nautilus-preferences-item.c | 80 |
7 files changed, 512 insertions, 90 deletions
@@ -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 |