summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/gnome-plist-editor.c87
-rw-r--r--src/plist-utils.c20
-rw-r--r--src/plist-utils.h1
3 files changed, 50 insertions, 58 deletions
diff --git a/src/gnome-plist-editor.c b/src/gnome-plist-editor.c
index 858480c..5bf9dce 100644
--- a/src/gnome-plist-editor.c
+++ b/src/gnome-plist-editor.c
@@ -52,34 +52,24 @@ void update_document_tree_view(plist_t node, GtkTreeIter *parent) {
GtkTreeStore *store = app.document_tree_store;
GtkTreeIter iter;
plist_t subnode = NULL;
- plist_t value_node = NULL;
plist_type type;
- plist_type value_type;
gtk_tree_store_append(store, &iter, parent);
gtk_tree_store_set(store, &iter,
0, (gpointer)node,
-1);
- /* check for root */
- if (parent == NULL) {
- value_node = node;
- } else {
- value_node = plist_get_next_sibling(node);
- }
- value_type = plist_get_node_type(value_node);
-
- /* recurse through children */
- for (
- subnode = plist_get_first_child(value_node);
- subnode != NULL;
- subnode = plist_get_next_sibling(subnode)
- ) {
- type = plist_get_node_type(subnode);
- if (type == PLIST_KEY) {
- update_document_tree_view(subnode, &iter);
- }
- if (value_type == PLIST_ARRAY && (type != PLIST_DICT && type != PLIST_ARRAY)) {
+ /* If structured node, recurse through childrens (skip keys in case of dicts) */
+ type = plist_get_node_type(node);
+ if ( type == PLIST_DICT || type == PLIST_ARRAY ) {
+ for (
+ subnode = plist_get_first_child(node);
+ subnode != NULL;
+ subnode = plist_get_next_sibling(subnode)
+ ) {
+ if (type == PLIST_DICT) {
+ subnode = plist_get_next_sibling(subnode);
+ }
update_document_tree_view(subnode, &iter);
}
}
@@ -204,9 +194,10 @@ void plist_cell_data_function (GtkTreeViewColumn *col,
{
col_type_t col_type;
plist_t node;
- plist_t value_node;
+ plist_t key_node;
plist_t parent_node;
plist_type value_type;
+ plist_type parent_type;
char *text = NULL;
char *s = NULL;
@@ -219,44 +210,24 @@ void plist_cell_data_function (GtkTreeViewColumn *col,
gtk_tree_model_get(model, iter, 0, &node, -1);
parent_node = plist_get_parent(node);
-
- if (parent_node == NULL) {
- value_node = node;
- }
- else
- {
- value_node = plist_get_next_sibling(node);
+ parent_type = plist_get_node_type(parent_node);
+ if (parent_type == PLIST_DICT) {
+ key_node = plist_get_prev_sibling(node);
}
- if (plist_get_node_type(parent_node) == PLIST_ARRAY) {
- if ((value_type != PLIST_DICT) && (value_type != PLIST_ARRAY)) {
- value_node = node;
- }
- }
- value_type = plist_get_node_type(value_node);
+ value_type = plist_get_node_type(node);
switch(col_type) {
case COL_KEY:
- if (plist_get_parent(node) == NULL) {
+ if (parent_node == NULL) {
text = "Root";
}
- else
- {
- switch(plist_get_node_type(node)) {
- case PLIST_KEY:
- plist_get_key_val(node, &text);
- break;
- case PLIST_STRING:
- plist_get_string_val(node, &text);
- break;
- case PLIST_UINT:
- plist_get_uint_val(value_node, &u);
- text = g_strdup_printf("%llu", (long long)u);
- break;
- default:
- text = g_strdup_printf("Unhandled %d", plist_get_node_type(node));
- break;
- }
+ else if (parent_type == PLIST_DICT) {
+ plist_get_key_val(key_node, &text);
+ }
+ else if (parent_type == PLIST_ARRAY) {
+ int index = plist_item_index(node);
+ text = g_strdup_printf("Item %i", index);
}
break;
case COL_TYPE:
@@ -291,19 +262,19 @@ void plist_cell_data_function (GtkTreeViewColumn *col,
g_object_set(renderer, "sensitive", TRUE, NULL);
switch(value_type) {
case PLIST_BOOLEAN:
- plist_get_bool_val(value_node, &b);
+ plist_get_bool_val(node, &b);
text = (b ? "true" : "false");
break;
case PLIST_UINT:
- plist_get_uint_val(value_node, &u);
+ plist_get_uint_val(node, &u);
text = g_strdup_printf("%llu", (long long)u);
break;
case PLIST_REAL:
- plist_get_real_val(value_node, &d);
+ plist_get_real_val(node, &d);
text = g_strdup_printf("%f", d);
break;
case PLIST_STRING:
- plist_get_string_val(value_node, &text);
+ plist_get_string_val(node, &text);
break;
case PLIST_DATA:
text = "FIXME: Parse Data";
@@ -313,7 +284,7 @@ void plist_cell_data_function (GtkTreeViewColumn *col,
break;
case PLIST_ARRAY:
case PLIST_DICT:
- text = g_strdup_printf("(%d items)", plist_node_get_item_count(value_node));
+ text = g_strdup_printf("(%d items)", plist_node_get_item_count(node));
g_object_set(renderer, "sensitive", FALSE, NULL);
break;
default:
diff --git a/src/plist-utils.c b/src/plist-utils.c
index fe63439..cc3d11e 100644
--- a/src/plist-utils.c
+++ b/src/plist-utils.c
@@ -49,3 +49,23 @@ int plist_node_get_item_count(plist_t node) {
return count;
}
+int plist_item_index(plist_t node) {
+ plist_t parent;
+ plist_t child;
+ int count = 0;
+
+ parent = plist_get_parent(node);
+
+ if (parent == NULL || node == NULL) {
+ return -1;
+ }
+
+ child = plist_get_first_child(parent);
+ while (child && child != node) {
+ count ++;
+ child = plist_get_next_sibling(child);
+ }
+
+ return count;
+}
+
diff --git a/src/plist-utils.h b/src/plist-utils.h
index 0d55b14..0b25bfb 100644
--- a/src/plist-utils.h
+++ b/src/plist-utils.h
@@ -25,5 +25,6 @@
#include <plist/plist.h>
int plist_node_get_item_count(plist_t node);
+int plist_item_index(plist_t node);
#endif