Index: src/dialogs/xml-tree.cpp =================================================================== --- src/dialogs/xml-tree.cpp (revision 22775) +++ src/dialogs/xml-tree.cpp (working copy) @@ -51,6 +51,7 @@ static sigc::connection sel_changed_connection; static sigc::connection document_uri_set_connection; static sigc::connection document_replaced_connection; +static sigc::connection layer_changed_connection; static win_data wd; // impossible original values to make sure they are read from prefs static gint x = -1000, y = -1000, w = 0, h = 0; @@ -68,6 +69,7 @@ static SPXMLViewContent *content = NULL; static gint blocked = 0; +static bool swallow_empty_select_after_layer_change = false; static SPDesktop *current_desktop = NULL; static SPDocument *current_document = NULL; static gint selected_attr = 0; @@ -119,6 +121,7 @@ static void on_editable_changed_enable_if_valid_xml_name(GtkEditable *editable, gpointer data); static void on_desktop_selection_changed(Inkscape::Selection *selection); +static void on_current_layer_changed(SPObject *layer); static void on_document_replaced(SPDesktop *dt, SPDocument *document); static void on_document_uri_set(gchar const *uri, SPDocument *document); @@ -652,11 +655,13 @@ if (current_desktop) { sel_changed_connection.disconnect(); document_replaced_connection.disconnect(); + layer_changed_connection.disconnect(); } current_desktop = desktop; if (desktop) { sel_changed_connection = sp_desktop_selection(desktop)->connectChanged(&on_desktop_selection_changed); document_replaced_connection = desktop->connectDocumentReplaced(&on_document_replaced); + layer_changed_connection = desktop->connectCurrentLayerChanged(&on_current_layer_changed); set_tree_document(sp_desktop_document(desktop)); } else { set_tree_document(NULL); @@ -1257,17 +1262,35 @@ void on_desktop_selection_changed(Inkscape::Selection */*selection*/) { if (!blocked++) { - set_tree_select(get_dt_select()); + Inkscape::XML::Node *sel = get_dt_select(); + if (sel || !swallow_empty_select_after_layer_change) { + set_tree_select(get_dt_select()); + } + // reset flag anyway + swallow_empty_select_after_layer_change = false; } blocked--; } +static void on_current_layer_changed(SPObject *layer) +{ + if (!blocked++ && layer->repr) { + set_tree_select(layer->repr); + swallow_empty_select_after_layer_change = true; + } + blocked--; +} + static void on_document_replaced(SPDesktop *dt, SPDocument *doc) { - if (current_desktop) + if (current_desktop) { sel_changed_connection.disconnect(); + layer_changed_connection.disconnect(); + } sel_changed_connection = sp_desktop_selection(dt)->connectChanged(&on_desktop_selection_changed); + layer_changed_connection = dt->connectCurrentLayerChanged(&on_current_layer_changed); + set_tree_document(doc); }