UI-Coordinates: polish test and consider next steps
After completing the self-contained UICoord data elements, the next thing to consider might be how to resolve UI coordinates against an actual window topology. We need to define a suitable command-and-query interface in order to build and verify this intricate resolution process separated from the actual UI code.
This commit is contained in:
parent
5c113b058d
commit
18d1e7a280
5 changed files with 607 additions and 53 deletions
106
src/gui/interact/ui-coord-resolver.hpp
Normal file
106
src/gui/interact/ui-coord-resolver.hpp
Normal file
|
|
@ -0,0 +1,106 @@
|
|||
/*
|
||||
UI-COORD-RESOLVER.hpp - resolve UI coordinate spec against actual window topology
|
||||
|
||||
Copyright (C) Lumiera.org
|
||||
2017, Hermann Vosseler <Ichthyostega@web.de>
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License as
|
||||
published by the Free Software Foundation; either version 2 of
|
||||
the License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
*/
|
||||
|
||||
|
||||
/** @file ui-coord-resolver.hpp
|
||||
** Evaluation of UI coordinates against a concrete window topology.
|
||||
** [UI-Coordinates](\ref UICoord) allow to describe and locate an interface component within the
|
||||
** Lumiera GUI through a topological access path. As such these coordinate specifications are abstract,
|
||||
** and need to be related, attached or resolved against the actual configuration of widgets in the UI.
|
||||
** Through this relation it becomes possible to pose meaningful queries over these coordinates, or to
|
||||
** build, rebuild and remould a coordinate specification.
|
||||
**
|
||||
** We need to avoid tainting with the intrinsics of the actual UI toolkit though -- which indicates
|
||||
** the UICoordResolver should be designed as an abstract intermediary, built on top of a command and
|
||||
** query interface, provided by the \ref Navigator and backed by the actual UI configuration.
|
||||
**
|
||||
** @todo WIP 10/2017 first draft ////////////////////////////////////////////////////////////////////////////TICKET #1106 generic UI coordinate system
|
||||
**
|
||||
** @see UICoordResolver_test
|
||||
** @see UICoord_test
|
||||
** @see navigator.hpp
|
||||
** @see view-locator.hpp
|
||||
*/
|
||||
|
||||
|
||||
#ifndef GUI_INTERACT_UI_COORD_RESOLVER_H
|
||||
#define GUI_INTERACT_UI_COORD_RESOLVER_H
|
||||
|
||||
#include "lib/error.hpp"
|
||||
//#include "lib/symbol.hpp"
|
||||
#include "gui/interact/ui-coord.hpp"
|
||||
//#include "lib/util.hpp"
|
||||
|
||||
//#include <boost/noncopyable.hpp>
|
||||
//#include <string>
|
||||
//#include <vector>
|
||||
//#include <utility>
|
||||
//#include <memory>
|
||||
|
||||
|
||||
namespace gui {
|
||||
namespace interact {
|
||||
|
||||
namespace error = lumiera::error;
|
||||
|
||||
// using std::unique_ptr;
|
||||
// using std::string;
|
||||
// using lib::Literal;
|
||||
// using lib::Symbol;
|
||||
// using util::unConst;
|
||||
// using util::isnil;
|
||||
// using util::min;
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Query and mutate UICoord specifications in relation to actual UI topology.
|
||||
*
|
||||
* @todo initial draft as of 10/2017
|
||||
*/
|
||||
class UICoordResolver
|
||||
{
|
||||
|
||||
public:
|
||||
|
||||
|
||||
|
||||
/* === named component access === */
|
||||
|
||||
/** */
|
||||
|
||||
|
||||
|
||||
/* === query functions === */
|
||||
|
||||
/**
|
||||
*/
|
||||
|
||||
|
||||
private:
|
||||
};
|
||||
|
||||
|
||||
|
||||
}}// namespace gui::interact
|
||||
#endif /*GUI_INTERACT_UI_COORD_RESOLVER_H*/
|
||||
396
tests/gui/interact/ui-coord-resolver-test.cpp
Normal file
396
tests/gui/interact/ui-coord-resolver-test.cpp
Normal file
|
|
@ -0,0 +1,396 @@
|
|||
/*
|
||||
UICoordResolver(Test) - resolve UI coordinates against actual topology
|
||||
|
||||
Copyright (C) Lumiera.org
|
||||
2017, Hermann Vosseler <Ichthyostega@web.de>
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License as
|
||||
published by the Free Software Foundation; either version 2 of
|
||||
the License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
* *****************************************************/
|
||||
|
||||
/** @file ui-coord-resolver-test.cpp
|
||||
** unit test \ref UICoordResolver_test
|
||||
*/
|
||||
|
||||
|
||||
#include "lib/test/run.hpp"
|
||||
#include "lib/test/test-helper.hpp"
|
||||
#include "gui/interact/ui-coord.hpp"
|
||||
#include "gui/interact/ui-coord-resolver.hpp"
|
||||
#include "lib/format-cout.hpp"/////////////////////////TODO RLY?
|
||||
#include "lib/format-util.hpp"
|
||||
//#include "lib/idi/entry-id.hpp"
|
||||
//#include "lib/diff/gen-node.hpp"
|
||||
#include "lib/util.hpp"
|
||||
|
||||
#include <string>
|
||||
|
||||
|
||||
using std::string;
|
||||
//using lib::idi::EntryID;
|
||||
//using lib::diff::GenNode;
|
||||
//using util::isSameObject;
|
||||
using lib::Symbol;
|
||||
using util::isnil;
|
||||
using util::join;
|
||||
|
||||
|
||||
|
||||
namespace gui {
|
||||
namespace interact {
|
||||
namespace test {
|
||||
|
||||
// using lumiera::error::LUMIERA_ERROR_WRONG_TYPE;
|
||||
using lumiera::error::LUMIERA_ERROR_INDEX_BOUNDS;
|
||||
using lumiera::error::LUMIERA_ERROR_LOGIC;
|
||||
|
||||
namespace { //Test fixture...
|
||||
|
||||
}//(End)Test fixture
|
||||
|
||||
|
||||
/******************************************************************************//**
|
||||
* @test verify query and mutation of UICoord in relation to actual UI topology.
|
||||
*
|
||||
* @see UICoordResolver
|
||||
* @see navigator.hpp
|
||||
* @see ViewLocator
|
||||
* @see UICoord_test
|
||||
*/
|
||||
class UICoordResolver_test : public Test
|
||||
{
|
||||
|
||||
virtual void
|
||||
run (Arg)
|
||||
{
|
||||
verify_basics();
|
||||
verify_builder();
|
||||
verify_stringRepr();
|
||||
verify_comparisons();
|
||||
verify_queryAnchor();
|
||||
verify_queryCoverage();
|
||||
verify_mutateAnchor();
|
||||
verify_mutateCover();
|
||||
verify_mutateExtend();
|
||||
verify_mutateCreate();
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
verify_basics()
|
||||
{
|
||||
UICoord undef;
|
||||
CHECK (isnil (undef));
|
||||
|
||||
UICoord uic{"Γ","Δ","Θ","Ξ","Σ","Ψ","Φ","Ω"};
|
||||
CHECK (not isnil (uic));
|
||||
CHECK (8 == uic.size());
|
||||
// path is iterable
|
||||
CHECK ("ΓΔΘΞΣΨΦΩ" == join(uic,""));
|
||||
|
||||
// indexed access
|
||||
CHECK ("Γ" == uic[UIC_WINDOW]);
|
||||
CHECK ("Δ" == uic[UIC_PERSP]);
|
||||
CHECK ("Θ" == uic[UIC_PANEL]);
|
||||
CHECK ("Ξ" == uic[UIC_VIEW]);
|
||||
CHECK ("Σ" == uic[UIC_TAB]);
|
||||
CHECK ("Ψ" == uic[UIC_PATH]);
|
||||
CHECK ("Φ" == uic[UIC_PATH+1]);
|
||||
CHECK ("Ω" == uic[UIC_PATH+2]);
|
||||
|
||||
// iteration matches index order
|
||||
uint i=0;
|
||||
for (UICoord::iterator ii = uic.begin(); ii; ++ii, ++i)
|
||||
CHECK (uic[i] == *ii);
|
||||
CHECK (8 == i);
|
||||
|
||||
VERIFY_ERROR (INDEX_BOUNDS, uic[8]);
|
||||
|
||||
// string representation
|
||||
CHECK ("UI:Γ[Δ]-Θ.Ξ.Σ/Ψ/Φ/Ω" == string(uic));
|
||||
CHECK ("Γ[Δ]-Θ.Ξ.Σ" == uic.getComp());
|
||||
CHECK ("Ψ/Φ/Ω" == uic.getPath());
|
||||
|
||||
// new value can be assigned, but not altered in place
|
||||
uic = UICoord{nullptr,nullptr,"Θ",nullptr,"Σ",nullptr,"Φ"};
|
||||
CHECK (7 == uic.size());
|
||||
|
||||
// representation is trimmed and filled
|
||||
CHECK ("UI:?-Θ.*.Σ/*/Φ" == string(uic));
|
||||
CHECK (Symbol::EMPTY == uic[UIC_WINDOW]);
|
||||
CHECK (Symbol::EMPTY == uic[UIC_PERSP]);
|
||||
CHECK ("Θ" == uic[UIC_PANEL]);
|
||||
CHECK ("*" == uic[UIC_VIEW]);
|
||||
CHECK ("Σ" == uic[UIC_TAB]);
|
||||
CHECK ("*" == uic[UIC_PATH]);
|
||||
CHECK ("Φ" == uic[UIC_PATH+1]);
|
||||
VERIFY_ERROR (INDEX_BOUNDS, uic[UIC_PATH+2]);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
verify_builder()
|
||||
{
|
||||
UICoord uic1 = UICoord::window("window");
|
||||
UICoord uic2 = uic1.view("view");
|
||||
CHECK ("UI:window" == string(uic1));
|
||||
CHECK ("UI:window[*]-*.view" == string(uic2));
|
||||
CHECK (1 == uic1.size());
|
||||
CHECK (4 == uic2.size());
|
||||
|
||||
// fault-tolerant accessors for the generic part
|
||||
CHECK ("window" == uic1.getWindow());
|
||||
CHECK ("window" == uic2.getWindow());
|
||||
CHECK ("" == uic1.getPersp());
|
||||
CHECK ("*" == uic2.getPersp());
|
||||
CHECK ("" == uic1.getPanel());
|
||||
CHECK ("*" == uic2.getPanel());
|
||||
CHECK ("" == uic1.getView());
|
||||
CHECK ("view" == uic2.getView());
|
||||
CHECK ("" == uic1.getTab());
|
||||
CHECK ("" == uic2.getTab());
|
||||
CHECK ("" == uic1.getPath());
|
||||
CHECK ("" == uic2.getPath());
|
||||
CHECK ("window" == uic1.getComp());
|
||||
CHECK ("window[*]-*.view" == uic2.getComp());
|
||||
|
||||
VERIFY_ERROR (INDEX_BOUNDS, uic1[UIC_PERSP]);
|
||||
VERIFY_ERROR (INDEX_BOUNDS, uic2[UIC_TAB]);
|
||||
|
||||
UICoord uic3 = UICoord().view("view");
|
||||
CHECK (4 == uic3.size());
|
||||
CHECK ("UI:?.view" == string(uic3));
|
||||
CHECK ("" == uic3.getWindow());
|
||||
CHECK ("" == uic3.getPersp());
|
||||
CHECK ("" == uic3.getPanel());
|
||||
CHECK ("view" == uic3.getView());
|
||||
|
||||
UICoord uic4 = uic3.persp("persp");
|
||||
CHECK (4 == uic4.size());
|
||||
CHECK ("UI:?[persp]-*.view" == string(uic4));
|
||||
|
||||
uic4 = uic3.append("tab");
|
||||
CHECK (5 == uic4.size());
|
||||
CHECK ("UI:?.view.tab" == string(uic4));
|
||||
uic4 = uic3.prepend("panel");
|
||||
CHECK (4 == uic4.size());
|
||||
CHECK ("UI:?-panel.view" == string(uic4));
|
||||
uic4 = uic4.tab(555);
|
||||
CHECK (5 == uic4.size());
|
||||
CHECK ("UI:?-panel.view.#555" == string(uic4));
|
||||
VERIFY_ERROR(LOGIC, uic1.prepend("root"));
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
verify_stringRepr()
|
||||
{
|
||||
UICoord uic;
|
||||
CHECK ("UI:?" == string(uic));
|
||||
CHECK ("" == uic.getComp());
|
||||
CHECK ("" == uic.getPath());
|
||||
|
||||
uic = uic.path("ἁρχή");
|
||||
CHECK ("UI:?/ἁρχή" == string(uic));
|
||||
CHECK ("" == uic.getComp());
|
||||
CHECK ("ἁρχή" == uic.getPath());
|
||||
|
||||
uic = uic.path("α/β/γ");
|
||||
CHECK ("UI:?/α/β/γ" == string(uic));
|
||||
CHECK ("" == uic.getComp());
|
||||
CHECK ("α/β/γ" == uic.getPath());
|
||||
|
||||
uic = uic.append("δ");
|
||||
CHECK ("UI:?/α/β/γ/δ" == string(uic));
|
||||
CHECK ("" == uic.getComp());
|
||||
CHECK ("α/β/γ/δ" == uic.getPath());
|
||||
|
||||
uic = uic.append("");
|
||||
CHECK ("UI:?/α/β/γ/δ" == string(uic));
|
||||
CHECK ("" == uic.getComp());
|
||||
CHECK ("α/β/γ/δ" == uic.getPath());
|
||||
|
||||
uic = uic.append("ε/λ/ον");
|
||||
CHECK ("UI:?/α/β/γ/δ/ε/λ/ον" == string(uic));
|
||||
CHECK ("" == uic.getComp());
|
||||
CHECK ("α/β/γ/δ/ε/λ/ον" == uic.getPath());
|
||||
|
||||
// note: we built a partially empty path array...
|
||||
CHECK (12 == uic.size());
|
||||
CHECK (Symbol::EMPTY == uic.getView());
|
||||
CHECK (Symbol::EMPTY == uic.getTab());
|
||||
CHECK (Symbol::EMPTY == uic[UIC_WINDOW]);
|
||||
CHECK (Symbol::EMPTY == uic[UIC_PERSP]);
|
||||
CHECK (Symbol::EMPTY == uic[UIC_PANEL]);
|
||||
CHECK (Symbol::EMPTY == uic[UIC_VIEW]);
|
||||
CHECK (Symbol::EMPTY == uic[UIC_TAB]);
|
||||
CHECK ("α" == uic[UIC_PATH]);
|
||||
CHECK ("β" == uic[UIC_PATH+1]);
|
||||
CHECK ("γ" == uic[UIC_PATH+2]);
|
||||
CHECK ("δ" == uic[UIC_PATH+3]);
|
||||
CHECK ("ε" == uic[UIC_PATH+4]);
|
||||
CHECK ("λ" == uic[UIC_PATH+5]);
|
||||
CHECK ("ον" == uic[UIC_PATH+6]);
|
||||
|
||||
uic = uic.prepend("ειδος");
|
||||
CHECK ("UI:?.ειδος/α/β/γ/δ/ε/λ/ον" == string(uic));
|
||||
CHECK ("?.ειδος" == uic.getComp());
|
||||
CHECK ("α/β/γ/δ/ε/λ/ον" == uic.getPath());
|
||||
CHECK (12 == uic.size());
|
||||
|
||||
uic = uic.tab("");
|
||||
CHECK ("UI:?/α/β/γ/δ/ε/λ/ον" == string(uic));
|
||||
CHECK ("" == uic.getComp());
|
||||
CHECK ("α/β/γ/δ/ε/λ/ον" == uic.getPath());
|
||||
|
||||
uic = uic.view("ειδος");
|
||||
CHECK ("UI:?.ειδος.*/α/β/γ/δ/ε/λ/ον" == string(uic));
|
||||
CHECK ("?.ειδος.*" == uic.getComp());
|
||||
CHECK ("α/β/γ/δ/ε/λ/ον" == uic.getPath());
|
||||
|
||||
uic = uic.prepend("panel");
|
||||
CHECK ("UI:?-panel.ειδος.*/α/β/γ/δ/ε/λ/ον" == string(uic));
|
||||
CHECK ("?-panel.ειδος.*" == uic.getComp());
|
||||
CHECK ("α/β/γ/δ/ε/λ/ον" == uic.getPath());
|
||||
|
||||
uic = uic.view(nullptr);
|
||||
CHECK ("UI:?-panel.*.*/α/β/γ/δ/ε/λ/ον" == string(uic));
|
||||
CHECK ("?-panel.*.*" == uic.getComp());
|
||||
CHECK ("α/β/γ/δ/ε/λ/ον" == uic.getPath());
|
||||
|
||||
uic = uic.tab(" ");
|
||||
CHECK ("UI:?-panel.*. /α/β/γ/δ/ε/λ/ον" == string(uic));
|
||||
CHECK ("?-panel.*. " == uic.getComp());
|
||||
CHECK ("α/β/γ/δ/ε/λ/ον" == uic.getPath());
|
||||
|
||||
uic = uic.prepend("perspective");
|
||||
CHECK ("UI:?[perspective]-panel.*. /α/β/γ/δ/ε/λ/ον" == string(uic));
|
||||
CHECK ("?[perspective]-panel.*. " == uic.getComp());
|
||||
CHECK ("α/β/γ/δ/ε/λ/ον" == uic.getPath());
|
||||
|
||||
uic = uic.prepend("win");
|
||||
CHECK ("UI:win[perspective]-panel.*. /α/β/γ/δ/ε/λ/ον" == string(uic));
|
||||
CHECK ("win[perspective]-panel.*. " == uic.getComp());
|
||||
CHECK ("α/β/γ/δ/ε/λ/ον" == uic.getPath());
|
||||
|
||||
uic = uic.persp("");
|
||||
CHECK ("UI:win[*]-panel.*. /α/β/γ/δ/ε/λ/ον" == string(uic));
|
||||
CHECK ("win[*]-panel.*. " == uic.getComp());
|
||||
CHECK ("α/β/γ/δ/ε/λ/ον" == uic.getPath());
|
||||
CHECK (12 == uic.size());
|
||||
|
||||
uic = uic.path(" ");
|
||||
CHECK ("UI:win[*]-panel.*. / " == string(uic));
|
||||
CHECK ("win[*]-panel.*. " == uic.getComp());
|
||||
CHECK (" " == uic.getPath());
|
||||
CHECK (6 == uic.size());
|
||||
CHECK (" " == uic[UIC_PATH]);
|
||||
VERIFY_ERROR (INDEX_BOUNDS, uic[UIC_PATH+1]);
|
||||
|
||||
uic = uic.path(nullptr);
|
||||
CHECK ("UI:win[*]-panel.*. " == string(uic));
|
||||
CHECK ("win[*]-panel.*. " == uic.getComp());
|
||||
CHECK ("" == uic.getPath());
|
||||
CHECK (5 == uic.size());
|
||||
VERIFY_ERROR (INDEX_BOUNDS, uic[UIC_PATH]);
|
||||
|
||||
uic = uic.append(nullptr);
|
||||
CHECK ("UI:win[*]-panel.*. " == string(uic));
|
||||
CHECK ("win[*]-panel.*. " == uic.getComp());
|
||||
CHECK ("" == uic.getPath());
|
||||
CHECK (5 == uic.size());
|
||||
|
||||
uic = uic.append("*");
|
||||
CHECK ("UI:win[*]-panel.*. " == string(uic));
|
||||
CHECK ("win[*]-panel.*. " == uic.getComp());
|
||||
CHECK ("" == uic.getPath());
|
||||
CHECK (5 == uic.size());
|
||||
|
||||
uic = uic.append("**");
|
||||
CHECK ("UI:win[*]-panel.*. /**" == string(uic));
|
||||
CHECK ("win[*]-panel.*. " == uic.getComp());
|
||||
CHECK ("**" == uic.getPath());
|
||||
CHECK ("**" == uic[UIC_PATH]);
|
||||
CHECK (6 == uic.size());
|
||||
|
||||
uic = uic.tab("");
|
||||
CHECK ("UI:win[*]-panel.*.*/**" == string(uic));
|
||||
CHECK ("win[*]-panel.*.*" == uic.getComp());
|
||||
CHECK ("**" == uic.getPath());
|
||||
CHECK (6 == uic.size());
|
||||
|
||||
uic = uic.path("");
|
||||
CHECK ("UI:win[*]-panel" == string(uic));
|
||||
CHECK ("win[*]-panel" == uic.getComp());
|
||||
CHECK ("" == uic.getPath());
|
||||
CHECK (3 == uic.size());
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
verify_comparisons()
|
||||
{
|
||||
UNIMPLEMENTED ("verify comparison of UI coordinates");
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
verify_queryAnchor()
|
||||
{
|
||||
UNIMPLEMENTED ("query anchorage of given UI coordinates");
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
verify_queryCoverage()
|
||||
{
|
||||
UNIMPLEMENTED ("query coverage of given UI coordinates with respect to actual UI");
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
verify_mutateAnchor()
|
||||
{
|
||||
UNIMPLEMENTED ("mutate given UI coordinates by anchoring them");
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
verify_mutateCover()
|
||||
{
|
||||
UNIMPLEMENTED ("mutate given UI coordinates by reducing to covered part");
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
verify_mutateExtend()
|
||||
{
|
||||
UNIMPLEMENTED ("mutate given UI coordinates by uncovered extension");
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
verify_mutateCreate()
|
||||
{
|
||||
UNIMPLEMENTED ("mutate given UI coordinates by creating new components");
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
/** Register this test class... */
|
||||
LAUNCHER (UICoordResolver_test, "unit gui");
|
||||
|
||||
|
||||
}}} // namespace gui::interact::test
|
||||
|
|
@ -61,12 +61,19 @@ namespace test {
|
|||
|
||||
|
||||
/******************************************************************************//**
|
||||
* @test verify the mechanics of a functor based internal DSL
|
||||
* to configure access and allocation patters for component views.
|
||||
* @test verify the basic properties of topological UI coordinate specifications.
|
||||
* - created as path-like sequence of components
|
||||
* - provides a builder API for definition and mutation
|
||||
* - Normalisation and handling of missing parts
|
||||
* - access to UI coordinate components
|
||||
* - string representation
|
||||
* - comparisons
|
||||
*
|
||||
* @see id-scheme.hpp
|
||||
* @see ViewLocator
|
||||
* @see UICoord_test
|
||||
* @see ui-coord.hpp
|
||||
* @see path-array.hpp
|
||||
* @see PathArray_test
|
||||
* @see UICoordResolver_test
|
||||
* @see ViewSpecDSL_test
|
||||
*/
|
||||
class UICoord_test : public Test
|
||||
{
|
||||
|
|
@ -97,19 +104,19 @@ namespace test {
|
|||
CHECK (not isnil (uic));
|
||||
CHECK (8 == uic.size());
|
||||
// path is iterable
|
||||
CHECK ("ΓΔΘΞΣΨΦΩ" == join(uic,""));
|
||||
CHECK ("Γ-Δ-Θ-Ξ-Σ-Ψ-Φ-Ω" == join(uic,"-"));
|
||||
|
||||
// indexed access
|
||||
CHECK ("Γ" == uic[UIC_WINDOW]);
|
||||
CHECK ("Δ" == uic[UIC_PERSP]);
|
||||
CHECK ("Θ" == uic[UIC_PANEL]);
|
||||
CHECK ("Ξ" == uic[UIC_VIEW]);
|
||||
CHECK ("Σ" == uic[UIC_TAB]);
|
||||
CHECK ("Ψ" == uic[UIC_PATH]);
|
||||
CHECK ("Φ" == uic[UIC_PATH+1]);
|
||||
CHECK ("Γ" == uic[UIC_WINDOW]); // window spec to anchor the path
|
||||
CHECK ("Δ" == uic[UIC_PERSP]); // the perspective used within that window
|
||||
CHECK ("Θ" == uic[UIC_PANEL]); // the docking panel within the window
|
||||
CHECK ("Ξ" == uic[UIC_VIEW]); // the view residing in the docking panel
|
||||
CHECK ("Σ" == uic[UIC_TAB]); // the tab or element group within the view
|
||||
CHECK ("Ψ" == uic[UIC_PATH]); // a path sequence...
|
||||
CHECK ("Φ" == uic[UIC_PATH+1]); // ...descending through local widgets
|
||||
CHECK ("Ω" == uic[UIC_PATH+2]);
|
||||
|
||||
// iteration matches index order
|
||||
// iteration of complete path matches index order
|
||||
uint i=0;
|
||||
for (UICoord::iterator ii = uic.begin(); ii; ++ii, ++i)
|
||||
CHECK (uic[i] == *ii);
|
||||
|
|
@ -119,8 +126,8 @@ namespace test {
|
|||
|
||||
// string representation
|
||||
CHECK ("UI:Γ[Δ]-Θ.Ξ.Σ/Ψ/Φ/Ω" == string(uic));
|
||||
CHECK ("Γ[Δ]-Θ.Ξ.Σ" == uic.getComp());
|
||||
CHECK ("Ψ/Φ/Ω" == uic.getPath());
|
||||
CHECK ( "Γ[Δ]-Θ.Ξ.Σ" == uic.getComp());
|
||||
CHECK ( "Ψ/Φ/Ω" == uic.getPath());
|
||||
|
||||
// new value can be assigned, but not altered in place
|
||||
uic = UICoord{nullptr,nullptr,"Θ",nullptr,"Σ",nullptr,"Φ"};
|
||||
|
|
@ -143,8 +150,8 @@ namespace test {
|
|||
verify_builder()
|
||||
{
|
||||
UICoord uic1 = UICoord::window("window");
|
||||
UICoord uic2 = uic1.view("view");
|
||||
CHECK ("UI:window" == string(uic1));
|
||||
UICoord uic2 = uic1.view("view"); // Note: does not alter uic1
|
||||
CHECK ("UI:window" == string(uic1));
|
||||
CHECK ("UI:window[*]-*.view" == string(uic2));
|
||||
CHECK (1 == uic1.size());
|
||||
CHECK (4 == uic2.size());
|
||||
|
|
@ -168,6 +175,7 @@ namespace test {
|
|||
VERIFY_ERROR (INDEX_BOUNDS, uic1[UIC_PERSP]);
|
||||
VERIFY_ERROR (INDEX_BOUNDS, uic2[UIC_TAB]);
|
||||
|
||||
// partial (incomplete) coordinate spec
|
||||
UICoord uic3 = UICoord().view("view");
|
||||
CHECK (4 == uic3.size());
|
||||
CHECK ("UI:?.view" == string(uic3));
|
||||
|
|
@ -176,9 +184,9 @@ namespace test {
|
|||
CHECK ("" == uic3.getPanel());
|
||||
CHECK ("view" == uic3.getView());
|
||||
|
||||
UICoord uic4 = uic3.persp("persp");
|
||||
UICoord uic4 = uic3.persp("perspective");
|
||||
CHECK (4 == uic4.size());
|
||||
CHECK ("UI:?[persp]-*.view" == string(uic4));
|
||||
CHECK ("UI:?[perspective]-*.view" == string(uic4));
|
||||
|
||||
uic4 = uic3.append("tab");
|
||||
CHECK (5 == uic4.size());
|
||||
|
|
@ -269,6 +277,11 @@ namespace test {
|
|||
CHECK ("?-panel.*.*" == uic.getComp());
|
||||
CHECK ("α/β/γ/δ/ε/λ/ον" == uic.getPath());
|
||||
|
||||
uic = uic.tab(8);
|
||||
CHECK ("UI:?-panel.*.#8/α/β/γ/δ/ε/λ/ον" == string(uic));
|
||||
CHECK ("?-panel.*. " == uic.getComp());
|
||||
CHECK ("α/β/γ/δ/ε/λ/ον" == uic.getPath());
|
||||
|
||||
uic = uic.tab(" ");
|
||||
CHECK ("UI:?-panel.*. /α/β/γ/δ/ε/λ/ον" == string(uic));
|
||||
CHECK ("?-panel.*. " == uic.getComp());
|
||||
|
|
|
|||
|
|
@ -9615,7 +9615,7 @@ The dispatch of //diff messages// is directly integrated into the UI-Bus -- whic
|
|||
|
||||
The Graphical User interface, the upper layer in this hierarchy, embodies everything of tangible relevance to the user working with the application. The interplay with Proc-Layer, the middle layer below the UI, is organised along the distinction between two realms of equal importance: on one side, there is the immediate //mechanics of the interface,// which is implemented directly within the ~UI-Layer, based on the Graphical User Interface Toolkit. And, on the other side, there are those //core concerns of working with media,// which are cast into the HighLevelModel at the heart of the middle layer.</pre>
|
||||
</div>
|
||||
<div title="UICoord" creator="Ichthyostega" modifier="Ichthyostega" created="201709222300" modified="201710011858" tags="def draft spec GuiPattern" changecount="6">
|
||||
<div title="UICoord" creator="Ichthyostega" modifier="Ichthyostega" created="201709222300" modified="201710021428" tags="def draft spec GuiPattern" changecount="11">
|
||||
<pre>//A topological addressing scheme to designate structural locations within the UI.//
|
||||
Contrary to conventional screen pixel coordinates, here we aim at a topological description of the UI structure. Such a framework of structural reference allows us
|
||||
* to refer to some "place" or "space" within the interface
|
||||
|
|
@ -9652,13 +9652,13 @@ Internally the coordinate resolver in turn relies on a context query interface,
|
|||
In addition to the //locally decidable properties// of a coordinate spec, which are the explicitness and the presence of some component, several contextual predications may be queried
|
||||
;anchorage
|
||||
:the way the given coordinate spec is or can be anchored
|
||||
:* it is already //explicitly anchored// and this anchorage can be covered and backed by the currently existing UI configuration
|
||||
:* it is already //explicitly anchored// by referring either to a specific window or by generic specification
|
||||
:* it //can be a anchored// by interpolation of some wildcards
|
||||
:* it is //incomplete// and need to be extended to allow anchoring
|
||||
:* it is //impossible to anchor// in the current UI configuration
|
||||
;coverage
|
||||
:the extent to which a given coordinate spec is backed by the actual UI configuration
|
||||
:please note: to determine the coverage, the spec need to anchored (either explicitly, or by interpolation, or by extension of an incomplete spec)
|
||||
:please note: to determine the coverage, the spec needs to be anchored (either explicitly, or by interpolation, or by extension of an incomplete spec)
|
||||
:* it is //completely covered//
|
||||
:* it is //partially covered// with an remaining, uncovered extension part
|
||||
:* it is //possible to cover completely//
|
||||
|
|
@ -9666,11 +9666,11 @@ In addition to the //locally decidable properties// of a coordinate spec, which
|
|||
!!!Mutations
|
||||
In addition to querying the interpretation of a given coordinate spec with respect to the current UI environment, it is also possible to rewrite or extend the spec based on this environment
|
||||
;anchoring
|
||||
:in correspondence to the possible states of anchorage, we may derived an explicitly anchored spec
|
||||
:in correspondence to the possible states of anchorage, we may derive an explicitly anchored spec
|
||||
:*by interpolating the given spec
|
||||
:*by interpolation and extension of the given spec
|
||||
:*by interpretation and extension of the given spec
|
||||
;covering
|
||||
:we may construct the covered part of a given spec, including automatic anchoring.
|
||||
:we may construct the covered part of a given spec, which includes automatic anchoring.
|
||||
;navigating
|
||||
:we may rewrite a given spec by navigating within the existing UI environment
|
||||
:as starting point, the coordinate spec need to be anchored and completely covered
|
||||
|
|
|
|||
|
|
@ -1379,7 +1379,7 @@
|
|||
<node CREATED="1501939240217" ID="ID_325602880" MODIFIED="1501939252187" TEXT="triggert Proc-Command"/>
|
||||
<node CREATED="1501939252991" ID="ID_31140909" MODIFIED="1501939261802" TEXT="dieses sendet Mark zurück"/>
|
||||
<node CREATED="1501939263030" ID="ID_381890207" MODIFIED="1501939271161" TEXT="ein Widget im UI reagiert">
|
||||
<node CREATED="1504200793444" ID="ID_340215113" MODIFIED="1504478476617" TEXT="mißbrauche InfoBox">
|
||||
<node CREATED="1504200793444" ID="ID_340215113" MODIFIED="1506957535426" TEXT="mißbrauche InfoBox">
|
||||
<arrowlink COLOR="#f5dd67" DESTINATION="ID_19179662" ENDARROW="Default" ENDINCLINATION="743;-1563;" ID="Arrow_ID_1195014928" STARTARROW="None" STARTINCLINATION="-452;605;"/>
|
||||
<icon BUILTIN="idea"/>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1504200974955" ID="ID_1182589184" MODIFIED="1504200979244" TEXT="neues Dock">
|
||||
|
|
@ -3572,7 +3572,8 @@
|
|||
<node CREATED="1506176108473" ID="ID_241520424" MODIFIED="1506176114467" TEXT="Interpretation"/>
|
||||
<node CREATED="1506176114984" ID="ID_332155493" MODIFIED="1506176117235" TEXT="Abgleich"/>
|
||||
</node>
|
||||
<node CREATED="1506175984577" ID="ID_610939878" MODIFIED="1506175987228" TEXT="im Resolver">
|
||||
<node CREATED="1506175984577" HGAP="25" ID="ID_610939878" MODIFIED="1506957372981" TEXT="im Resolver" VSHIFT="-1">
|
||||
<arrowlink COLOR="#65759f" DESTINATION="ID_1878859300" ENDARROW="Default" ENDINCLINATION="-439;-594;" ID="Arrow_ID_68163828" STARTARROW="None" STARTINCLINATION="307;351;"/>
|
||||
<node CREATED="1506176010590" ID="ID_901285927" MODIFIED="1506176067906" TEXT="Kontext-Infos">
|
||||
<node CREATED="1506176024596" ID="ID_1050302466" MODIFIED="1506176028175" TEXT="Aktuelles Fenster"/>
|
||||
<node CREATED="1506176028787" ID="ID_1768321192" MODIFIED="1506176037158" TEXT="existierende">
|
||||
|
|
@ -3826,7 +3827,7 @@
|
|||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1506181068556" ID="ID_749871444" MODIFIED="1506181084051" TEXT="UICoord">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node COLOR="#338800" CREATED="1506181721910" FOLDED="true" ID="ID_1680105436" MODIFIED="1506831506238" TEXT="Folge von Symbolen">
|
||||
<node COLOR="#338800" CREATED="1506181721910" FOLDED="true" ID="ID_1680105436" MODIFIED="1506956411552" TEXT="Folge von Symbolen">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node CREATED="1506263953722" ID="ID_1293486815" MODIFIED="1506831482410" TEXT="Basis-Abstraktion">
|
||||
<icon BUILTIN="info"/>
|
||||
|
|
@ -3939,7 +3940,8 @@
|
|||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1506181073556" ID="ID_1878859300" MODIFIED="1506181084811" TEXT="Resolver">
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1506181073556" ID="ID_1878859300" MODIFIED="1506957351600" TEXT="Resolver">
|
||||
<linktarget COLOR="#65759f" DESTINATION="ID_1878859300" ENDARROW="Default" ENDINCLINATION="-439;-594;" ID="Arrow_ID_68163828" SOURCE="ID_610939878" STARTARROW="None" STARTINCLINATION="307;351;"/>
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1506181794428" ID="ID_333406817" MODIFIED="1506181807435" TEXT="Setup">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
|
|
@ -3950,6 +3952,24 @@
|
|||
<icon BUILTIN="flag-yellow"/>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1506957414370" ID="ID_848105210" MODIFIED="1506957613469">
|
||||
<richcontent TYPE="NODE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<p>
|
||||
Integration
|
||||
</p>
|
||||
<p>
|
||||
Resolver / Navigator
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
<linktarget COLOR="#3f4b87" DESTINATION="ID_848105210" ENDARROW="Default" ENDINCLINATION="-1260;542;" ID="Arrow_ID_1760927309" SOURCE="ID_1256149179" STARTARROW="None" STARTINCLINATION="1244;-591;"/>
|
||||
<icon BUILTIN="help"/>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1506175097367" ID="ID_1442345755" MODIFIED="1506181085379" TEXT="ViewSpec-DSL">
|
||||
<arrowlink COLOR="#b45c5a" DESTINATION="ID_686917529" ENDARROW="Default" ENDINCLINATION="-468;-196;" ID="Arrow_ID_1955094318" STARTARROW="None" STARTINCLINATION="360;85;"/>
|
||||
|
|
@ -3970,8 +3990,8 @@
|
|||
<icon BUILTIN="flag-yellow"/>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1506181908037" HGAP="-29" ID="ID_1925951134" MODIFIED="1506182045240" TEXT="Test" VSHIFT="21">
|
||||
<icon BUILTIN="stop"/>
|
||||
<node CREATED="1506181908037" HGAP="-29" ID="ID_1925951134" MODIFIED="1506956365444" TEXT="Test" VSHIFT="21">
|
||||
<icon BUILTIN="prepare"/>
|
||||
<node CREATED="1506181922767" ID="ID_1642380411" MODIFIED="1506181922767" TEXT="UICoord_test">
|
||||
<node COLOR="#338800" CREATED="1506182009518" ID="ID_138248232" MODIFIED="1506906630089" TEXT="verify_basics">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
|
|
@ -4584,7 +4604,7 @@
|
|||
<node CREATED="1486763385591" ID="ID_6651258" MODIFIED="1486763391202" TEXT="Zugang zum Asset-Management"/>
|
||||
<node CREATED="1486763391862" ID="ID_1568245541" MODIFIED="1486763397977" TEXT="Zugang zur Konfiguration"/>
|
||||
<node CREATED="1486763408780" ID="ID_520762274" MODIFIED="1486763417950" TEXT="Zugang zum persistenten Interface-State"/>
|
||||
<node CREATED="1504371285442" ID="ID_634013434" MODIFIED="1504386979259" TEXT="Allokation von ComponentViews">
|
||||
<node CREATED="1504371285442" ID="ID_634013434" MODIFIED="1506957035235" TEXT="Allokation von ComponentViews">
|
||||
<arrowlink DESTINATION="ID_948587913" ENDARROW="Default" ENDINCLINATION="87;-34;" ID="Arrow_ID_1863964331" STARTARROW="None" STARTINCLINATION="157;10;"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1486768073223" HGAP="38" ID="ID_1457876217" MODIFIED="1488566292402" TEXT="konkret" VSHIFT="16">
|
||||
|
|
@ -4798,27 +4818,19 @@
|
|||
</node>
|
||||
<node CREATED="1487461242609" ID="ID_164538059" MODIFIED="1487461245308" TEXT="Struktur">
|
||||
<node CREATED="1487461304560" ID="ID_349728972" MODIFIED="1488492188626" TEXT="betreibt">
|
||||
<node CREATED="1487273437019" ID="ID_1653934212" MODIFIED="1506956689947" TEXT="Navigator">
|
||||
<node CREATED="1506957512565" ID="ID_1256149179" MODIFIED="1506957613469" TEXT="betreibt Resolver">
|
||||
<arrowlink COLOR="#3f4b87" DESTINATION="ID_848105210" ENDARROW="Default" ENDINCLINATION="-1260;542;" ID="Arrow_ID_1760927309" STARTARROW="None" STARTINCLINATION="1244;-591;"/>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1487270206369" ID="ID_1888334597" MODIFIED="1487461321289" TEXT="SpotLocator"/>
|
||||
<node CREATED="1487273437019" ID="ID_1653934212" MODIFIED="1487461312002" TEXT="Navigator"/>
|
||||
<node CREATED="1487275297855" ID="ID_898365328" MODIFIED="1487461316314" TEXT="FocusTracker"/>
|
||||
<node CREATED="1504368969990" ID="ID_948587913" MODIFIED="1504386990881" TEXT="ViewLocator">
|
||||
<linktarget COLOR="#7f97bd" DESTINATION="ID_948587913" ENDARROW="Default" ENDINCLINATION="-977;81;" ID="Arrow_ID_954883780" SOURCE="ID_1747666798" STARTARROW="None" STARTINCLINATION="1159;303;"/>
|
||||
<node CREATED="1504368969990" ID="ID_948587913" MODIFIED="1506957107818" TEXT="ViewLocator">
|
||||
<arrowlink COLOR="#9da9b7" DESTINATION="ID_344392695" ENDARROW="Default" ENDINCLINATION="-96;-128;" ID="Arrow_ID_17315740" STARTARROW="None" STARTINCLINATION="-94;5;"/>
|
||||
<linktarget COLOR="#a9b4c1" DESTINATION="ID_948587913" ENDARROW="Default" ENDINCLINATION="87;-34;" ID="Arrow_ID_1863964331" SOURCE="ID_634013434" STARTARROW="None" STARTINCLINATION="157;10;"/>
|
||||
<linktarget COLOR="#7c8aa8" DESTINATION="ID_948587913" ENDARROW="Default" ENDINCLINATION="-592;150;" ID="Arrow_ID_1156487076" SOURCE="ID_869653682" STARTARROW="None" STARTINCLINATION="641;-106;"/>
|
||||
<node CREATED="1504370345039" ID="ID_1018366676" MODIFIED="1504370348218" TEXT="Service"/>
|
||||
<node CREATED="1504373189956" ID="ID_1625042163" MODIFIED="1504373207181" TEXT="intern direkt verdrahtet mit dem PanelLocator"/>
|
||||
<node CREATED="1504370354446" ID="ID_1714266927" MODIFIED="1504370416721" TEXT="findet, ggfs alloziert einen ComponentView"/>
|
||||
<node CREATED="1504387078950" ID="ID_1433555277" MODIFIED="1504387097144" TEXT="bietet Komponenten-Management">
|
||||
<node CREATED="1504387105363" ID="ID_631730744" MODIFIED="1504387110342" TEXT="neue Komponente"/>
|
||||
<node CREATED="1504387110866" ID="ID_879632055" MODIFIED="1504387115157" TEXT="Komponente löschen"/>
|
||||
<node CREATED="1504387189744" ID="ID_934669703" MODIFIED="1504387202285" TEXT="notwendig für Kind-Mutation">
|
||||
<icon BUILTIN="info"/>
|
||||
</node>
|
||||
<node CREATED="1504368969990" ID="ID_1346454848" MODIFIED="1504387179279" TEXT="impl delegiert an den PanelLocator">
|
||||
<linktarget COLOR="#7c8aa8" DESTINATION="ID_1346454848" ENDARROW="None" ENDINCLINATION="139;18;" ID="Arrow_ID_1776804306" SOURCE="ID_1606296935" STARTARROW="Default" STARTINCLINATION="425;-69;"/>
|
||||
<icon BUILTIN="idea"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1487461353681" ID="ID_1117222917" MODIFIED="1488492194073" TEXT="Modell">
|
||||
|
|
@ -4843,6 +4855,27 @@
|
|||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1506956798915" HGAP="-73" ID="ID_1897228503" MODIFIED="1506956825070" TEXT="Services" VSHIFT="32">
|
||||
<node CREATED="1506956866802" ID="ID_652269096" MODIFIED="1506956900479" TEXT="Navigator"/>
|
||||
<node CREATED="1504368969990" ID="ID_344392695" MODIFIED="1506957099012" TEXT="ViewLocator">
|
||||
<linktarget COLOR="#7f97bd" DESTINATION="ID_344392695" ENDARROW="Default" ENDINCLINATION="-977;81;" ID="Arrow_ID_1627222173" SOURCE="ID_1747666798" STARTARROW="None" STARTINCLINATION="1159;303;"/>
|
||||
<linktarget COLOR="#7c8aa8" DESTINATION="ID_344392695" ENDARROW="Default" ENDINCLINATION="-676;143;" ID="Arrow_ID_1224269755" SOURCE="ID_869653682" STARTARROW="None" STARTINCLINATION="641;-106;"/>
|
||||
<linktarget COLOR="#9da9b7" DESTINATION="ID_344392695" ENDARROW="Default" ENDINCLINATION="-96;-128;" ID="Arrow_ID_17315740" SOURCE="ID_948587913" STARTARROW="None" STARTINCLINATION="-94;5;"/>
|
||||
<node CREATED="1504387078950" ID="ID_1433555277" MODIFIED="1504387097144" TEXT="bietet Komponenten-Management">
|
||||
<node CREATED="1504387105363" ID="ID_631730744" MODIFIED="1504387110342" TEXT="neue Komponente"/>
|
||||
<node CREATED="1504387110866" ID="ID_879632055" MODIFIED="1504387115157" TEXT="Komponente löschen"/>
|
||||
<node CREATED="1504387189744" ID="ID_934669703" MODIFIED="1504387202285" TEXT="notwendig für Kind-Mutation">
|
||||
<icon BUILTIN="info"/>
|
||||
</node>
|
||||
<node CREATED="1504368969990" ID="ID_1346454848" MODIFIED="1504387179279" TEXT="impl delegiert an den PanelLocator">
|
||||
<linktarget COLOR="#7c8aa8" DESTINATION="ID_1346454848" ENDARROW="None" ENDINCLINATION="139;18;" ID="Arrow_ID_1776804306" SOURCE="ID_1606296935" STARTARROW="Default" STARTINCLINATION="425;-69;"/>
|
||||
<icon BUILTIN="idea"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1506956871401" ID="ID_1817966830" MODIFIED="1506956891024" TEXT="SpotLocator"/>
|
||||
<node CREATED="1506956892303" ID="ID_238906242" MODIFIED="1506956898082" TEXT="FocusTracker"/>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1485126466520" ID="ID_717310004" MODIFIED="1488423306865" TEXT="WindowManager" VSHIFT="34">
|
||||
<icon BUILTIN="button_cancel"/>
|
||||
|
|
@ -5051,7 +5084,7 @@
|
|||
</html>
|
||||
</richcontent>
|
||||
</node>
|
||||
<node CREATED="1504371342426" ID="ID_869653682" MODIFIED="1504387002927">
|
||||
<node CREATED="1504371342426" ID="ID_869653682" MODIFIED="1506957062518">
|
||||
<richcontent TYPE="NODE"><html>
|
||||
<head>
|
||||
|
||||
|
|
@ -5063,7 +5096,7 @@
|
|||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
<arrowlink COLOR="#7c8aa8" DESTINATION="ID_948587913" ENDARROW="Default" ENDINCLINATION="-592;150;" ID="Arrow_ID_1156487076" STARTARROW="None" STARTINCLINATION="641;-106;"/>
|
||||
<arrowlink COLOR="#7c8aa8" DESTINATION="ID_344392695" ENDARROW="Default" ENDINCLINATION="-676;143;" ID="Arrow_ID_1224269755" STARTARROW="None" STARTINCLINATION="641;-106;"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
|
|
@ -6470,8 +6503,8 @@
|
|||
<node CREATED="1504368500421" ID="ID_184425569" MODIFIED="1504368925887" TEXT="es gibt einen PanelLocator im WindowLocator">
|
||||
<icon BUILTIN="idea"/>
|
||||
</node>
|
||||
<node CREATED="1504368540111" ID="ID_1747666798" MODIFIED="1504386996704" TEXT="es gibt einen ViewLocator im InteractionDirector">
|
||||
<arrowlink COLOR="#7f97bd" DESTINATION="ID_948587913" ENDARROW="Default" ENDINCLINATION="-977;81;" ID="Arrow_ID_954883780" STARTARROW="None" STARTINCLINATION="1159;303;"/>
|
||||
<node CREATED="1504368540111" ID="ID_1747666798" MODIFIED="1506957054528" TEXT="es gibt einen ViewLocator im InteractionDirector">
|
||||
<arrowlink COLOR="#7f97bd" DESTINATION="ID_344392695" ENDARROW="Default" ENDINCLINATION="-977;81;" ID="Arrow_ID_1627222173" STARTARROW="None" STARTINCLINATION="1159;303;"/>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1504200512737" ID="ID_320931452" MODIFIED="1504200533688" TEXT="Müllhaufen">
|
||||
|
|
@ -6479,7 +6512,7 @@
|
|||
</node>
|
||||
<node CREATED="1504200743610" ID="ID_1973994759" MODIFIED="1504200749701" TEXT="vorläufig....">
|
||||
<node CREATED="1504200750905" ID="ID_1728645080" MODIFIED="1504200758236" TEXT="gibt es noch eine ZombieTimeline"/>
|
||||
<node CREATED="1504200758920" ID="ID_19179662" MODIFIED="1504478476617" TEXT="hab ich schon mal eine InfoBox dazugebaut">
|
||||
<node CREATED="1504200758920" ID="ID_19179662" MODIFIED="1506957535426" TEXT="hab ich schon mal eine InfoBox dazugebaut">
|
||||
<linktarget COLOR="#f5dd67" DESTINATION="ID_19179662" ENDARROW="Default" ENDINCLINATION="743;-1563;" ID="Arrow_ID_1195014928" SOURCE="ID_340215113" STARTARROW="None" STARTINCLINATION="-452;605;"/>
|
||||
<node CREATED="1504200878312" ID="ID_1934842950" MODIFIED="1504201022642" TEXT="...für #1099 DemoGuiRoundtrip">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
|
|
@ -13111,6 +13144,12 @@
|
|||
<node CREATED="1504463067051" ID="ID_1393457815" MODIFIED="1504463076837" TEXT="Komponente.Komponente..."/>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1506956495003" ID="ID_364730867" MODIFIED="1506956499822" TEXT="konktete Topologie">
|
||||
<node CREATED="1506956525336" ID="ID_344871464" MODIFIED="1506956531880" TEXT="stateful"/>
|
||||
<node CREATED="1506956501474" ID="ID_905779000" MODIFIED="1506956515389" TEXT="zugänglich duch Navigator">
|
||||
<icon BUILTIN="idea"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
|
|
|
|||
Loading…
Reference in a new issue