diff options
| author | John Smith <john.smith7545@yahoo.com> | 2012-03-21 04:10:41 +0000 |
|---|---|---|
| committer | John Smith <removethis.john.q.public@bigmail.com> | 2012-03-21 04:10:41 +0000 |
| commit | e7fd26761a0a7d7344ad3f8429a4e0f804bfc5c6 (patch) | |
| tree | 88e7bf3ca4317c560b05fd76a02fde80bf07c24b /src | |
| parent | Fix for 950508 : Fill Stroke : Minor visual enhancements, match label sizes (diff) | |
| download | inkscape-e7fd26761a0a7d7344ad3f8429a4e0f804bfc5c6.tar.gz inkscape-e7fd26761a0a7d7344ad3f8429a4e0f804bfc5c6.zip | |
Fix for 903676 : Replace GtkCList with GtkTreeView in XML Tree
(bzr r11105)
Diffstat (limited to 'src')
| -rw-r--r-- | src/ui/dialog/xml-tree.cpp | 128 | ||||
| -rw-r--r-- | src/ui/dialog/xml-tree.h | 7 | ||||
| -rw-r--r-- | src/widgets/sp-xmlview-attr-list.cpp | 110 | ||||
| -rw-r--r-- | src/widgets/sp-xmlview-attr-list.h | 14 |
4 files changed, 98 insertions, 161 deletions
diff --git a/src/ui/dialog/xml-tree.cpp b/src/ui/dialog/xml-tree.cpp index 810f2a5c6..cdbb2257c 100644 --- a/src/ui/dialog/xml-tree.cpp +++ b/src/ui/dialog/xml-tree.cpp @@ -190,6 +190,7 @@ XmlTree::XmlTree (void) : Gtk::ScrolledWindow *attr_scroller = new Gtk::ScrolledWindow(); attr_scroller->set_policy( Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC ); + attr_scroller->set_shadow_type(Gtk::SHADOW_IN); attr_scroller->set_size_request(0, 60); attr_subpaned_container.pack1( *attr_scroller ); @@ -230,9 +231,9 @@ XmlTree::XmlTree (void) : g_signal_connect( G_OBJECT(tree), "tree_unselect_row", G_CALLBACK(on_tree_unselect_row), this); g_signal_connect_after( G_OBJECT(tree), "tree_move", G_CALLBACK(after_tree_move), this); - g_signal_connect( G_OBJECT(attributes), "select_row", G_CALLBACK(on_attr_select_row), this); - g_signal_connect( G_OBJECT(attributes), "unselect_row", G_CALLBACK(on_attr_unselect_row), this); - g_signal_connect( G_OBJECT(attributes), "row-value-changed", G_CALLBACK(on_attr_row_changed), this); + GtkTreeSelection *selection = gtk_tree_view_get_selection (GTK_TREE_VIEW(attributes)); + g_signal_connect (G_OBJECT(selection), "changed", G_CALLBACK (on_attr_select_row), this); + xml_element_new_button.signal_clicked().connect(sigc::mem_fun(*this, &XmlTree::cmd_new_element_node)); xml_text_new_button.signal_clicked().connect(sigc::mem_fun(*this, &XmlTree::cmd_new_text_node)); @@ -729,104 +730,39 @@ void XmlTree::on_tree_unselect_row_hide() text_container.hide(); } -void XmlTree::on_attr_select_row(GtkCList *list, gint row, gint column, - GdkEventButton *event, gpointer data) +void XmlTree::on_attr_select_row(GtkTreeSelection *selection, gpointer data) { XmlTree *self = (XmlTree *)data; - self->selected_attr = sp_xmlview_attr_list_get_row_key(list, row); - self->attr_value.grab_focus (); - - self->attr_reset_context(self->selected_attr); - - self->on_attr_select_row_enable(); - self->on_attr_select_row_set_name_content(row); - self->on_attr_select_row_set_value_content(row); -} + GtkTreeIter iter; + GtkTreeModel *model; + if (!gtk_tree_selection_get_selected (selection, &model, &iter)) { +/* self->selected_attr = 0; + self->attr_reset_context(self->selected_attr); -void XmlTree::on_attr_unselect_row(GtkCList */*list*/, gint /*row*/, gint /*column*/, - GdkEventButton */*event*/, gpointer data) -{ - XmlTree *self = (XmlTree *)data; - - self->selected_attr = 0; - self->attr_reset_context(self->selected_attr); - - self->on_attr_unselect_row_disable(); - self->on_attr_unselect_row_clear_text(); -} - - -void XmlTree::on_attr_row_changed(GtkCList *list, gint row, gpointer data) -{ - gint attr = sp_xmlview_attr_list_get_row_key(list, row); - - XmlTree *self = (XmlTree *)data; - if (attr == self->selected_attr) { - /* if the attr changed, reselect the row in the list to sync - the edit box */ - - /* - // get current attr values - const gchar * name = g_quark_to_string (sp_xmlview_attr_list_get_row_key (list, row)); - const gchar * value = self->selected_repr->attribute(name); - - g_warning("value: '%s'",value); - - // get the edit box value - GtkTextIter start, end; - gtk_text_buffer_get_bounds ( gtk_text_view_get_buffer (self->attr_value), - &start, &end ); - gchar * text = gtk_text_buffer_get_text ( gtk_text_view_get_buffer (self->attr_value), - &start, &end, TRUE ); - g_warning("text: '%s'",text); - - // compare to edit box - if (strcmp(text,value)) { - // issue warning if they're different - _message_stack->flash(Inkscape::WARNING_MESSAGE, - _("Attribute changed in GUI while editing values!")); - } - g_free (text); - - */ - gtk_clist_unselect_row( GTK_CLIST(list), row, 0 ); - gtk_clist_select_row( GTK_CLIST(list), row, 0 ); + self->xml_attribute_delete_button.set_sensitive(false); + self->on_attr_unselect_row_clear_text();*/ + return; } -} - - -void XmlTree::on_attr_select_row_set_name_content(gint row) -{ - const gchar *name = g_quark_to_string(sp_xmlview_attr_list_get_row_key(GTK_CLIST(attributes), row)); - attr_name.set_text(name); -} + self->attr_value.grab_focus (); -void XmlTree::on_attr_select_row_set_value_content(gint row) -{ - const gchar *name = g_quark_to_string(sp_xmlview_attr_list_get_row_key(GTK_CLIST(attributes), row)); - const gchar *value = selected_repr->attribute(name); - if (!value) { - value = ""; - } - attr_value.get_buffer()->set_text(value); -} + self->xml_attribute_delete_button.set_sensitive(true); -void XmlTree::on_attr_select_row_enable() -{ - xml_attribute_delete_button.set_sensitive(true); -} + const gchar *name; + const gchar *value; + gint attr; + gtk_tree_model_get (model, &iter, 0, &name, 1, &value, 2, &attr, -1); + self->attr_name.set_text(name); + self->attr_value.get_buffer()->set_text(value); + self->selected_attr = attr; + self->attr_reset_context(self->selected_attr); -void XmlTree::on_attr_unselect_row_disable() -{ - xml_attribute_delete_button.set_sensitive(false); } - void XmlTree::on_attr_unselect_row_clear_text() { attr_name.set_text(""); @@ -837,22 +773,14 @@ void XmlTree::onNameChanged() { Glib::ustring text = attr_name.get_text(); /* TODO: need to do checking a little more rigorous than this */ - if (!text.empty()) { - set_attr.set_sensitive(true); - } else { - set_attr.set_sensitive(false); - } + set_attr.set_sensitive(!text.empty()); } void XmlTree::onCreateNameChanged() { Glib::ustring text = name_entry->get_text(); /* TODO: need to do checking a little more rigorous than this */ - if (!text.empty()) { - create_button->set_sensitive(true); - } else { - create_button->set_sensitive(false); - } + create_button->set_sensitive(!text.empty()); } void XmlTree::on_desktop_selection_changed() @@ -1060,11 +988,7 @@ void XmlTree::cmd_set_attr() _("Change attribute")); /* TODO: actually, the row won't have been created yet. why? */ - gint row = sp_xmlview_attr_list_find_row_from_key(GTK_CLIST(attributes), - g_quark_from_string(name)); - if (row != -1) { - gtk_clist_select_row(GTK_CLIST(attributes), row, 0); - } + sp_xmlview_attr_list_select_row_by_key(attributes, name); } diff --git a/src/ui/dialog/xml-tree.h b/src/ui/dialog/xml-tree.h index 82594d17e..eeb828771 100644 --- a/src/ui/dialog/xml-tree.h +++ b/src/ui/dialog/xml-tree.h @@ -128,9 +128,7 @@ private: /** * Callback functions for when attribute selection changes */ - static void on_attr_select_row(GtkCList *list, gint row, gint column, GdkEventButton *event, gpointer data); - static void on_attr_unselect_row(GtkCList *list, gint row, gint column, GdkEventButton *event, gpointer data); - static void on_attr_row_changed( GtkCList *list, gint row, gpointer data ); + static void on_attr_select_row(GtkTreeSelection *selection, gpointer data); /** * Enable widgets based on current selections @@ -138,11 +136,8 @@ private: void on_tree_select_row_enable(GtkCTreeNode *node); void on_tree_unselect_row_disable(); void on_tree_unselect_row_hide(); - void on_attr_select_row_enable(); void on_attr_unselect_row_disable(); void on_attr_unselect_row_clear_text(); - void on_attr_select_row_set_value_content(gint row); - void on_attr_select_row_set_name_content(gint row); void onNameChanged(); void onCreateNameChanged(); diff --git a/src/widgets/sp-xmlview-attr-list.cpp b/src/widgets/sp-xmlview-attr-list.cpp index 9aa46a399..1dd1f79bc 100644 --- a/src/widgets/sp-xmlview-attr-list.cpp +++ b/src/widgets/sp-xmlview-attr-list.cpp @@ -1,5 +1,5 @@ /* - * Specialization of GtkCList for the XML tree view + * Specialization of GtkTreeView for the XML tree view * * Authors: * MenTaLguY <mental@rydia.net> @@ -26,7 +26,7 @@ static void sp_xmlview_attr_list_destroy (GtkObject * object); static void event_attr_changed (Inkscape::XML::Node * repr, const gchar * name, const gchar * old_value, const gchar * new_value, bool is_interactive, gpointer data); -static GtkCListClass * parent_class = NULL; +static GtkTreeViewClass * parent_class = NULL; static Inkscape::XML::NodeEventVector repr_events = { NULL, /* child_added */ @@ -36,35 +36,41 @@ static Inkscape::XML::NodeEventVector repr_events = { NULL /* order_changed */ }; +enum {COL_NAME=0, COL_VALUE, COL_ATTR}; + GtkWidget * sp_xmlview_attr_list_new (Inkscape::XML::Node * repr) { - SPXMLViewAttrList * list; + SPXMLViewAttrList * attr_list; - list = (SPXMLViewAttrList*)g_object_new (SP_TYPE_XMLVIEW_ATTR_LIST, "n_columns", 2, NULL); + attr_list = (SPXMLViewAttrList*)g_object_new (SP_TYPE_XMLVIEW_ATTR_LIST, NULL); - gtk_clist_set_column_title (GTK_CLIST (list), 0, _("Attribute")); - gtk_clist_set_column_title (GTK_CLIST (list), 1, _("Value")); - gtk_clist_column_titles_show (GTK_CLIST (list)); + attr_list->store = gtk_list_store_new (3, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_POINTER); + gtk_tree_view_set_model (GTK_TREE_VIEW(attr_list), GTK_TREE_MODEL(attr_list->store)); - gtk_clist_column_titles_passive (GTK_CLIST (list)); - gtk_clist_set_column_auto_resize (GTK_CLIST (list), 0, TRUE); - gtk_clist_set_column_auto_resize (GTK_CLIST (list), 1, TRUE); - gtk_clist_set_sort_column (GTK_CLIST (list), 0); - gtk_clist_set_auto_sort (GTK_CLIST (list), TRUE); + GtkCellRenderer *cell = gtk_cell_renderer_text_new (); + gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(attr_list), COL_NAME, _("Attribute"), cell, "text", 0, NULL); + GtkTreeViewColumn *column = gtk_tree_view_get_column (GTK_TREE_VIEW(attr_list), COL_NAME); + gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_AUTOSIZE); + gtk_tree_view_column_set_sort_column_id (column, COL_NAME); + gtk_tree_sortable_set_sort_column_id ( GTK_TREE_SORTABLE(attr_list->store), COL_NAME, GTK_SORT_ASCENDING); - sp_xmlview_attr_list_set_repr (list, repr); + cell = gtk_cell_renderer_text_new (); + gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(attr_list), COL_VALUE, _("Value"), cell, "text", COL_VALUE, NULL); + column = gtk_tree_view_get_column (GTK_TREE_VIEW(attr_list), COL_VALUE); + gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_AUTOSIZE); - return (GtkWidget *) list; + sp_xmlview_attr_list_set_repr (attr_list, repr); + + return (GtkWidget *) attr_list; } void sp_xmlview_attr_list_set_repr (SPXMLViewAttrList * list, Inkscape::XML::Node * repr) { if ( repr == list->repr ) return; - gtk_clist_freeze (GTK_CLIST (list)); if (list->repr) { - gtk_clist_clear (GTK_CLIST (list)); + gtk_list_store_clear(list->store); sp_repr_remove_listener_by_data (list->repr, list); Inkscape::GC::release(list->repr); } @@ -74,7 +80,6 @@ sp_xmlview_attr_list_set_repr (SPXMLViewAttrList * list, Inkscape::XML::Node * r sp_repr_add_listener (repr, &repr_events, list); sp_repr_synthesize_events (repr, &repr_events, list); } - gtk_clist_thaw (GTK_CLIST (list)); } GType sp_xmlview_attr_list_get_type(void) @@ -94,7 +99,7 @@ GType sp_xmlview_attr_list_get_type(void) (GInstanceInitFunc)sp_xmlview_attr_list_init, 0 // value_table }; - type = g_type_register_static(GTK_TYPE_CLIST, "SPXMLViewAttrList", &info, static_cast<GTypeFlags>(0)); + type = g_type_register_static(GTK_TYPE_TREE_VIEW, "SPXMLViewAttrList", &info, static_cast<GTypeFlags>(0)); } return type; @@ -108,7 +113,7 @@ sp_xmlview_attr_list_class_init (SPXMLViewAttrListClass * klass) object_class = (GtkObjectClass *) klass; object_class->destroy = sp_xmlview_attr_list_destroy; - parent_class = (GtkCListClass*)g_type_class_peek_parent (klass); + parent_class = (GtkTreeViewClass*)g_type_class_peek_parent (klass); g_signal_new ( "row-value-changed", G_TYPE_FROM_CLASS(klass), @@ -123,6 +128,7 @@ sp_xmlview_attr_list_class_init (SPXMLViewAttrListClass * klass) void sp_xmlview_attr_list_init (SPXMLViewAttrList * list) { + list->store = NULL; list->repr = NULL; } @@ -138,6 +144,27 @@ sp_xmlview_attr_list_destroy (GtkObject * object) GTK_OBJECT_CLASS (parent_class)->destroy (object); } +void sp_xmlview_attr_list_select_row_by_key(SPXMLViewAttrList * list, gchar *name) +{ + GtkTreeIter iter; + const gchar *n; + gboolean match = false; + gboolean valid = gtk_tree_model_get_iter_first( GTK_TREE_MODEL(list->store), &iter ); + while ( valid ) { + gtk_tree_model_get (GTK_TREE_MODEL(list->store), &iter, COL_NAME, &n, -1); + if (!strcmp(n, name)) { + match = true; + break; + } + valid = gtk_tree_model_iter_next (GTK_TREE_MODEL(list->store), &iter); + } + + if (match) { + GtkTreeSelection *selection = gtk_tree_view_get_selection (GTK_TREE_VIEW(list)); + gtk_tree_selection_select_iter(selection, &iter); + } +} + void event_attr_changed (Inkscape::XML::Node * /*repr*/, const gchar * name, @@ -146,44 +173,37 @@ event_attr_changed (Inkscape::XML::Node * /*repr*/, bool /*is_interactive*/, gpointer data) { - gint row; + gint row = -1; SPXMLViewAttrList * list; - gchar new_text[128 + 4]; - gchar *gtktext; list = SP_XMLVIEW_ATTR_LIST (data); - gtk_clist_freeze (GTK_CLIST (list)); - - if (new_value) { - strncpy (new_text, new_value, 128); - if (strlen (new_value) >= 128) { - strcpy (new_text + 128, "..."); - } - gtktext = new_text; - } else { - gtktext = NULL; - } + GtkTreeIter iter; + const gchar *n; + gboolean valid = gtk_tree_model_get_iter_first( GTK_TREE_MODEL(list->store), &iter ); + gboolean match = false; + while ( valid ) { + gtk_tree_model_get (GTK_TREE_MODEL(list->store), &iter, COL_NAME, &n, -1); + if (!strcmp(n, name)) { + match = true; + break; + } + row++; + valid = gtk_tree_model_iter_next (GTK_TREE_MODEL(list->store), &iter); + } - row = gtk_clist_find_row_from_data (GTK_CLIST (list), GINT_TO_POINTER (g_quark_from_string (name))); - if (row != -1) { + if (match) { if (new_value) { - gtk_clist_set_text (GTK_CLIST (list), row, 1, gtktext); + gtk_list_store_set (list->store, &iter, COL_NAME, name, COL_VALUE, new_value, COL_ATTR, GINT_TO_POINTER (g_quark_from_string (name)), -1); } else { - gtk_clist_remove (GTK_CLIST (list), row); + gtk_list_store_remove (list->store, &iter); } } else if (new_value != NULL) { - const gchar * text[2]; - - text[0] = name; - text[1] = gtktext; + gtk_list_store_append (list->store, &iter); + gtk_list_store_set (list->store, &iter, COL_NAME, name, COL_VALUE, new_value, COL_ATTR, GINT_TO_POINTER (g_quark_from_string (name)), -1); - row = gtk_clist_append (GTK_CLIST (list), (gchar **)text); - gtk_clist_set_row_data (GTK_CLIST (list), row, GINT_TO_POINTER (g_quark_from_string (name))); } - gtk_clist_thaw (GTK_CLIST (list)); - // send a "changed" signal so widget owners will know I've updated g_signal_emit_by_name(G_OBJECT (list), "row-value-changed", row ); } diff --git a/src/widgets/sp-xmlview-attr-list.h b/src/widgets/sp-xmlview-attr-list.h index 9479dd77a..485ea0114 100644 --- a/src/widgets/sp-xmlview-attr-list.h +++ b/src/widgets/sp-xmlview-attr-list.h @@ -2,7 +2,7 @@ #define __SP_XMLVIEW_ATTR_LIST_H__ /* - * Specialization of GtkCList for editing XML node attributes + * Specialization of GtkTreeView for editing XML node attributes * * Authors: * MenTaLguY <mental@rydia.net> @@ -18,7 +18,6 @@ - #define SP_TYPE_XMLVIEW_ATTR_LIST (sp_xmlview_attr_list_get_type ()) #define SP_XMLVIEW_ATTR_LIST(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), SP_TYPE_XMLVIEW_ATTR_LIST, SPXMLViewAttrList)) #define SP_IS_XMLVIEW_ATTR_LIST(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), SP_TYPE_XMLVIEW_ATTR_LIST)) @@ -26,14 +25,16 @@ struct SPXMLViewAttrList { - GtkCList list; + + GtkTreeView list; + GtkListStore *store; Inkscape::XML::Node * repr; }; struct SPXMLViewAttrListClass { - GtkCListClass parent_class; + GtkTreeViewClass parent_class; void (* row_changed) (SPXMLViewAttrList *list, gint row); }; @@ -43,11 +44,8 @@ GtkWidget * sp_xmlview_attr_list_new (Inkscape::XML::Node * repr); #define SP_XMLVIEW_ATTR_LIST_GET_REPR(list) (SP_XMLVIEW_ATTR_LIST (list)->repr) -#define sp_xmlview_attr_list_get_row_key(list, row) (GPOINTER_TO_INT (gtk_clist_get_row_data ((list), (row)))) -#define sp_xmlview_attr_list_find_row_from_key(list, key) (gtk_clist_find_row_from_data ((list), GINT_TO_POINTER ((key)))) - void sp_xmlview_attr_list_set_repr (SPXMLViewAttrList * list, Inkscape::XML::Node * repr); - +void sp_xmlview_attr_list_select_row_by_key(SPXMLViewAttrList * list, gchar *name); #endif |
