mirror of
https://github.com/qelectrotech/qelectrotech-source-mirror.git
synced 2026-10-01 07:14:14 +02:00
7c0e867226
The remaining two defects from bugtracker #671's original analysis, which #686 knowingly didn't cover (see that PR's review thread and the comment on the now-closed #672). ## #671 item 5: the XML matching ignored nesting prefixFromLabelFile() was a flat token scan: it matched any <category name="..."> whose name equalled the next path segment, with no check that the match was actually a *child* of the previous match. It gave correct results on the shipped 10_electric/qet_labels.xml only because that file's document order happens to line up with its hierarchy -- any file with a same-named category at the wrong nesting depth would silently return the wrong prefix. Reproduced with a synthetic file where a top-level sibling category happens to share a name with what should be an unmatched grandchild: the old (already re-verified-fixed-for-whitespace) lookup returns a prefix from a completely unrelated branch of the document; this rewrite correctly reports "not found". Fixed by replacing the QXmlStreamReader token walk with a QDomDocument walk that only ever considers a matched node's direct <category> children (firstChildElement()/nextSiblingElement(), scoped to that node), which cannot cross into a same-named sibling subtree. This also makes the whitespace-dependence fixed in #686 moot for the same reason: DOM parsing doesn't distinguish pretty-printed from minified input to begin with. The inheritance rule ("if a directory has no prefix, use its parent's, and so on") and the empty-<prefix/>-overrides-inheritance behaviour #686 added both carry over unchanged: a category's own <prefix> child, even an empty one, always overrides whatever a shallower ancestor already provided; a category with no <prefix> child at all leaves the inherited value untouched. ## #671 item 2: common-collection trees other than 10_electric The lookup only ever consulted commonElementsDir()/10_electric -- literally: `if (current_location.fileName() == "10_electric")`. The common collection ships four other top-level trees (20_logic, 30_hydraulic, 50_pneumatic, 60_energy); none of them could carry a qet_labels.xml at all, because nothing ever looked for one. Generalised to commonElementsDir()/<tree>/qet_labels.xml for whichever top-level tree the element's path actually walks up to, tried first, then custom, then company -- each of the latter two tried against both a from-root layout (matching a custom/company file organised as a mirror of the common collection, tree name included) and a tree-relative one (matching a file scoped to just one tree), so existing custom files keep working either way. This is the same multi-candidate structure #686 already established for custom-then- company; it now also covers which common-collection tree to check. ## Testing Same constraint as #686: no working full build in this sandbox (missing generated headers/deps), so the exact functions as committed were extracted into a standalone Qt6 harness and run against the real shipped 10_electric/qet_labels.xml (pretty-printed and minified), a synthetic empty-prefix-override file, and the nesting-trap file above -- 9/9, including the three cases #686 already fixed (direct prefix, inherited prefix, not-found) staying correct, confirming this rewrite doesn't regress that work. Not exercised here (needs a real running QETApp / ElementsLocation, which the standalone harness can't stand up): the elementPrefixForLocation() candidate-list wiring itself -- collection_root computation, the from-root/tree-relative dual lookup, and the common-then-custom-then- company ordering. That code is mechanical and was reviewed carefully by hand, but it has not been run.