diff options
| author | 2009-10-11 18:00:24 +0200 | |
|---|---|---|
| committer | 2009-10-12 10:53:46 +0200 | |
| commit | c8586d5ce605ad5e2ecb951fed53decb519e3fd5 (patch) | |
| tree | 917a42ba5dd1f1a0bd33e294cc57d6a777a1f362 /src | |
| parent | e71a537a5b05fadc37ec3fe1161496332a3fe4c5 (diff) | |
| download | gnome-plist-editor-c8586d5ce605ad5e2ecb951fed53decb519e3fd5.tar.gz gnome-plist-editor-c8586d5ce605ad5e2ecb951fed53decb519e3fd5.tar.bz2 | |
Add node edition.
Diffstat (limited to 'src')
| -rw-r--r-- | src/gnome-plist-editor.c | 114 | ||||
| -rw-r--r-- | src/gnome-plist-editor.ui | 14 | 
2 files changed, 124 insertions, 4 deletions
| diff --git a/src/gnome-plist-editor.c b/src/gnome-plist-editor.c index 32a9418..eb79a2a 100644 --- a/src/gnome-plist-editor.c +++ b/src/gnome-plist-editor.c @@ -194,6 +194,38 @@ void new_plist_cb(GtkWidget* item, gpointer user_data) {  	gtk_tree_view_expand_all(app.document_tree_view);  } +void add_child_cb(GtkWidget* item, gpointer user_data) { + +	GtkTreeSelection *selection; +	GtkTreeModel     *model; +	GtkTreeView      *view = GTK_TREE_VIEW(app.document_tree_view); +	GtkTreeIter       iter; +	GtkTreePath      *path = NULL; + +	selection = gtk_tree_view_get_selection(view); +	if (gtk_tree_selection_get_selected(selection, &model, &iter)) { +		plist_t node = NULL; +		gtk_tree_model_get (model, &iter, 0, &node, -1); +		path = gtk_tree_model_get_path(model, &iter); + +		//check that node is a structured node +		plist_type type = plist_get_node_type(node); + +		if (type == PLIST_ARRAY) { +			plist_array_append_item(node, plist_new_bool(0)); +			gtk_tree_view_expand_row(view, path, FALSE); +		} +		else if (type == PLIST_DICT) { +			uint32_t n = plist_dict_get_size(node); +			gchar* key = g_strdup_printf("Item %i", n); +			plist_dict_insert_item(node, key, plist_new_bool(0)); +			g_free(key); +			gtk_tree_view_expand_row(view, path, FALSE); +		} +		gtk_tree_path_free(path); +	} +} +  void type_edited_cb(GtkCellRendererText *cell, gchar *path_string, gchar *new_text, gpointer user_data)  {  	plist_t node; @@ -234,6 +266,88 @@ void type_edited_cb(GtkCellRendererText *cell, gchar *path_string, gchar *new_te  	gtk_tree_model_row_changed(model, path, &iter);  } +void key_edited_cb(GtkCellRendererText *cell, gchar *path_string, gchar *new_text, gpointer user_data) +{ +	plist_t node; +	plist_t father; +	GtkTreeIter iter; +	GtkTreePath *path = NULL; +	plist_type type = PLIST_NONE; +	GtkTreeModel *model = GTK_TREE_MODEL(app.document_tree_store); + +	gtk_tree_model_get_iter_from_string(model, &iter, path_string); +	path = gtk_tree_path_new_from_string(path_string); +	gtk_tree_model_get(model, &iter, 0, &node, -1); + +	father = plist_get_parent(node); +	if (father){ +		type = plist_get_node_type(father); +		if (PLIST_DICT == type){ +			char* old_key = NULL; +			plist_t backup = plist_copy(node); +			plist_dict_get_item_key(node, &old_key); +			plist_dict_remove_item(father, old_key); +			free(old_key); +			plist_dict_insert_item(father, new_text, backup); +			gtk_tree_store_set(app.document_tree_store, +					   &iter, +					   0, +					   (gpointer)backup, +					   -1); +		} +	} +	gtk_tree_model_row_changed(model, path, &iter); +} + +void value_edited_cb(GtkCellRendererText *cell, gchar *path_string, gchar *new_text, gpointer user_data) +{ +	plist_t node; +	GtkTreeIter iter; +	GtkTreePath *path = NULL; +	plist_type type = PLIST_NONE; +	GtkTreeModel *model = GTK_TREE_MODEL(app.document_tree_store); + +	double d; +	uint8_t b; +	uint64_t u; + +	gtk_tree_model_get_iter_from_string(model, &iter, path_string); +	path = gtk_tree_path_new_from_string(path_string); +	gtk_tree_model_get(model, &iter, 0, &node, -1); + +	type = plist_get_node_type(node); +	switch (type){ +	case PLIST_BOOLEAN: +		b = !strcmp(new_text, "true") ? 1 : 0; +		plist_set_bool_val(node, b); +		break; +	case PLIST_UINT: +		u = g_ascii_strtoull(new_text, NULL, 0); +		plist_set_uint_val(node, u); +		break; +	case PLIST_REAL: +		d = g_ascii_strtod(new_text, NULL); +		plist_set_real_val(node, d); +		break; +	case PLIST_STRING: +		plist_set_string_val(node, new_text); +		break; +	case PLIST_DATA: +		//TODO +		break; +	case PLIST_DATE: +		//TODO +		break; +	case PLIST_ARRAY: +	case PLIST_DICT: +		break; +	default: +		break; +	} +	gtk_tree_model_row_changed(model, path, &iter); +} + +  void about_menu_item_activate_cb(GtkMenuItem* item, gpointer user_data) {  	gtk_show_about_dialog(app.main_window,  		"program-name", "GNOME Property List Editor", diff --git a/src/gnome-plist-editor.ui b/src/gnome-plist-editor.ui index e1a7931..92cea0b 100644 --- a/src/gnome-plist-editor.ui +++ b/src/gnome-plist-editor.ui @@ -249,12 +249,12 @@                </packing>              </child>              <child> -              <object class="GtkToolButton" id="add_sibling_button"> +              <object class="GtkToolButton" id="add_child_button">                  <property name="visible">True</property> -                <property name="sensitive">False</property>                  <property name="label" translatable="yes">Add Item</property>                  <property name="use_underline">True</property>                  <property name="icon_name">list-add</property> +                <signal name="clicked" handler="add_child_cb"/>                </object>                <packing>                  <property name="expand">False</property> @@ -304,7 +304,10 @@                      <property name="min_width">150</property>                      <property name="title">Key</property>                      <child> -                      <object class="GtkCellRendererText" id="cellrenderertext1"/> +                      <object class="GtkCellRendererText" id="cellrenderertext1"> +                        <property name="editable">True</property> +                        <signal name="edited" handler="key_edited_cb"/> +                      </object>                      </child>                    </object>                  </child> @@ -328,7 +331,10 @@                      <property name="title">Value</property>                      <property name="expand">True</property>                      <child> -                      <object class="GtkCellRendererText" id="cellrenderertext2"/> +                      <object class="GtkCellRendererText" id="cellrenderertext2"> +                        <property name="editable">True</property> +                        <signal name="edited" handler="value_edited_cb"/> +                      </object>                      </child>                    </object>                  </child> | 
