diff --git a/src/gui/interact/ui-coord-resolver.hpp b/src/gui/interact/ui-coord-resolver.hpp index 6340a8a03..f7b901498 100644 --- a/src/gui/interact/ui-coord-resolver.hpp +++ b/src/gui/interact/ui-coord-resolver.hpp @@ -59,6 +59,7 @@ #include "lib/error.hpp" #include "lib/symbol.hpp" +#include "lib/format-string.hpp" #include "gui/interact/ui-coord.hpp" #include "lib/iter-tree-explorer.hpp" #include "lib/iter-source.hpp" @@ -372,7 +373,29 @@ namespace interact { UICoordResolver&& extend (UICoord const& partialExtensionSpec) { - UNIMPLEMENTED ("extend by UI-Coordinates"); + if (not canCover()) + { + uic_ = partialExtensionSpec; + } + else + { + ENSURE (res_.isResolved and res_.covfefe); + size_t coverable = res_.covfefe->size(); + auto newContent = partialExtensionSpec.begin(); + size_t extensionPos = newContent? partialExtensionSpec.indexOf(*newContent) : 0; + if (coverable >= extensionPos) + throw error::Invalid (util::_Fmt{"Attempt to extend covered path %s with %s " + "would overwrite positions %d to %d (incl)"} + % *res_.covfefe + % partialExtensionSpec + % extensionPos + % coverable); + cover(); + for ( ; newContent; ++newContent, ++extensionPos ) + overwrite (extensionPos, *newContent); + } + res_.depth = query_.determineCoverage (this->uic_); // coverage may grow + return std::move (*this); } diff --git a/src/gui/interact/ui-coord.hpp b/src/gui/interact/ui-coord.hpp index c1be9e7ae..0ad6b43c9 100644 --- a/src/gui/interact/ui-coord.hpp +++ b/src/gui/interact/ui-coord.hpp @@ -599,6 +599,14 @@ namespace interact { uic_.normalise(); return std::move (*this); } + + Builder&& + overwrite (size_t depth, Literal newSpec) + { + Literal* storage = uic_.expandPosition (depth); + uic_.setContent (storage, newSpec); + return std::move (*this); + } }; diff --git a/wiki/thinkPad.ichthyo.mm b/wiki/thinkPad.ichthyo.mm index 3a8c8648e..e64d5a706 100644 --- a/wiki/thinkPad.ichthyo.mm +++ b/wiki/thinkPad.ichthyo.mm @@ -8944,6 +8944,13 @@ + + + + + + + @@ -9372,6 +9379,15 @@ + + + + + + + + +