From 378d46c49b27161365284b277e44ea33c4869c75 Mon Sep 17 00:00:00 2001 From: Jabier Arraiza Date: Sat, 7 Sep 2019 22:12:53 +0200 Subject: More issues fixes --- src/ui/toolbar/text-toolbar.cpp | 35 ++++++++++++++++++++++++++--------- 1 file changed, 26 insertions(+), 9 deletions(-) diff --git a/src/ui/toolbar/text-toolbar.cpp b/src/ui/toolbar/text-toolbar.cpp index 90b9ebe90..a36859454 100644 --- a/src/ui/toolbar/text-toolbar.cpp +++ b/src/ui/toolbar/text-toolbar.cpp @@ -2307,7 +2307,9 @@ void TextToolbar::prepare_inner() } SPObject *startobj = reinterpret_cast(rawptr); SPString *string = dynamic_cast(startobj); - if (string) { + while (startobj->parent != SP_OBJECT(text) && + startobj->parent != SP_OBJECT(flowtext)) + { startobj = startobj->parent; // SPStrings don't have style } SPObject *container = dynamic_cast(startobj->parent); @@ -2328,20 +2330,31 @@ void TextToolbar::prepare_inner() if (flowtspan) { Inkscape::XML::Node *rflowpara = xml_doc->createElement("svg:flowPara"); std::vector childparas = flowtspan->childList(false); + bool hascontent = false; for (auto childpara : childparas) { if (childpara) { Inkscape::XML::Node *childparanode = childpara->getRepr()->duplicate(xml_doc); flowtspan->getRepr()->removeChild(childpara->getRepr()); rflowpara->addChild(childparanode, nullptr); + Inkscape::GC::release(childparanode); + hascontent = true; } } - flowtext->getRepr()->addChild(rflowpara, prevchild); - prevchild = rflowpara; + if (hascontent) { + flowtext->getRepr()->addChild(rflowpara, prevchild); + Inkscape::GC::release(rflowpara); + prevchild = rflowpara; + } container->getRepr()->removeChild(flowtspan->getRepr()); } else if (tspan) { - object->getRepr()->setAttribute("sodipodi:role", "line"); - unindent_node(object->getRepr(), prevchild); - prevchild = object->getRepr(); + if (object->childList(false).size()) { + object->getRepr()->setAttribute("sodipodi:role", "line"); + unindent_node(object->getRepr(), prevchild); + prevchild->setAttribute("sodipodi:role", "line"); + } else { + Inkscape::XML::Node *parent = object->getRepr()->parent(); + parent->removeChild(object->getRepr()); + } } else if (spstring) { SPText *text = dynamic_cast(container->parent); SPFlowtext *flowtext = dynamic_cast(container->parent); @@ -2375,7 +2388,7 @@ void TextToolbar::prepare_inner() } } -void TextToolbar::unindent_node(Inkscape::XML::Node *repr, Inkscape::XML::Node *before) +void TextToolbar::unindent_node(Inkscape::XML::Node *repr, Inkscape::XML::Node *prevchild) { g_assert(repr != nullptr); @@ -2383,9 +2396,13 @@ void TextToolbar::unindent_node(Inkscape::XML::Node *repr, Inkscape::XML::Node * g_return_if_fail(parent); Inkscape::XML::Node *grandparent = parent->parent(); g_return_if_fail(grandparent); - + SPDocument *doc = SP_ACTIVE_DOCUMENT; + Inkscape::XML::Document *xml_doc = doc->getReprDoc(); + Inkscape::XML::Node *newrepr = repr->duplicate(xml_doc); parent->removeChild(repr); - grandparent->addChild(repr, before); + grandparent->addChild(newrepr, prevchild); + Inkscape::GC::release(newrepr); + prevchild = newrepr; } void TextToolbar::subselection_changed(gpointer texttool) -- cgit v1.2.3