summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJohn Smith <john.smith7545@yahoo.com>2012-03-21 04:10:41 +0000
committerJohn Smith <removethis.john.q.public@bigmail.com>2012-03-21 04:10:41 +0000
commite7fd26761a0a7d7344ad3f8429a4e0f804bfc5c6 (patch)
tree88e7bf3ca4317c560b05fd76a02fde80bf07c24b /src
parentFix for 950508 : Fill Stroke : Minor visual enhancements, match label sizes (diff)
downloadinkscape-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.cpp128
-rw-r--r--src/ui/dialog/xml-tree.h7
-rw-r--r--src/widgets/sp-xmlview-attr-list.cpp110
-rw-r--r--src/widgets/sp-xmlview-attr-list.h14
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