Timeline: start implementing some bits of the drawing code

Use a "catchy" style definition with lime background to make the drawing visible
This commit is contained in:
Fischlurch 2019-07-14 17:53:21 +02:00
parent bc4f7604a2
commit ec50407167
9 changed files with 186 additions and 121 deletions

View file

@ -31,3 +31,16 @@
.indication_flash text {
border: 4px solid red;
}
/* profile structure of the track fork...
* within the timeline body display (right side)
*
* margin is used for padding above / below
* border is used to paint the slopes to nested scopes
* background is used within the track scopes
*/
.timeline-page > .timeline-body fork.timeline {
margin: 2ex 0;
border: 5px inset;
background-color: lime;
}

View file

@ -83,14 +83,28 @@ namespace timeline {
StyleC style_;
PixSpan visible_;
/** the current "water level".
* To be updated while drawing top-down */
int line_ = 0;
/** paint the top of the track body area
* @param f number of consecutive track elements
* to keep pinned (always visible) at top */
* to keep pinned (always visible) at top
* @todo argument doesn't belong here
*/
void
prelude (uint f) override
prelude (uint) override
{
UNIMPLEMENTED ("draw timeline top");
int topMargin = style_->get_margin().get_top();
style_->render_background (cox_
,visible_.b // left start of the rectangle
,line_ // top of the rectangle
,visible_.delta() // width of the area
,topMargin // height to fill
);
line_ += topMargin;
line_ += 5; //////////////////////////////////////////////////////////////////TODO: visual debugging
}
/** finish painting the track body area
@ -98,7 +112,14 @@ namespace timeline {
void
coda (uint pad) override
{
UNIMPLEMENTED ("draw bottom");
int bottomPad = pad + style_->get_margin().get_bottom();
style_->render_background (cox_
,visible_.b // left start of the rectangle
,line_ // top of the rectangle
,visible_.delta() // width of the area
,bottomPad // height to fill
);
line_ += bottomPad;
}
/** draw grounding of an overview/ruler track
@ -121,7 +142,14 @@ namespace timeline {
void
content (uint h) override
{
UNIMPLEMENTED ("paint background of content area");
style_->render_background (cox_
,visible_.b // left start of the rectangle
,line_ // top of the rectangle
,visible_.delta() // width of the area
,h // height to fill
);
line_ += h;
line_ += 8; //////////////////////////////////////////////////////////////////TODO: visual debugging
}
/** paint opening slope to enter nested sub tracks
@ -155,16 +183,22 @@ namespace timeline {
: public ProfileInterpreter
{
CairoC cox_;
StyleC style_;
PixSpan visible_;
int line_ = 0;
/** overlays to show at top of the track body area
* @param f number of consecutive track elements
* to keep pinned (always visible) at top */
* to keep pinned (always visible) at top
* @todo argument doesn't belong here
*/
void
prelude (uint f) override
prelude (uint) override
{
UNIMPLEMENTED ("overlays for timeline top");
/* nothing to paint */
line_ += style_->get_margin().get_top();
}
/** finish painting overlays a the bottom of the track body area
@ -172,7 +206,8 @@ namespace timeline {
void
coda (uint pad) override
{
UNIMPLEMENTED ("overlays for bottom");
/* nothing to paint */
line_ += pad + style_->get_margin().get_bottom();
}
/** draw overlays on top of overview/ruler track
@ -196,7 +231,8 @@ namespace timeline {
void
content (uint h) override
{
UNIMPLEMENTED ("overlays for content area");
/* nothing to paint */
line_ += h;
}
/** render overlays covering the opening slope towards nested tracks */
@ -217,6 +253,7 @@ namespace timeline {
public:
TrackOverlayRenderer (CairoC currentDrawContext, DisplayManager& layout)
: cox_{currentDrawContext}
, style_{trackBodyStyle.getAdvice()}
, visible_{layout.getPixSpan()}
{ }
};

View file

@ -91,6 +91,12 @@ namespace timeline {
{
return e <= b;
}
int
delta() const
{
return e - b;
}
};
/**

View file

@ -68,7 +68,7 @@ namespace timeline {
virtual void content(uint h) =0; ///< represent a content area with the given vertical extension
virtual void open() =0; ///< indicate entering a nested structure, typically as 3D inset
virtual void close(uint n) =0; ///< indicate the end of `n` nested structures, typically by ascending back `n` levels
virtual void prelude(uint f) =0; ///< start track presentation at top of the timeline, with `f` pinned (always visible) elements
virtual void prelude(uint f) =0; ///< start track presentation at top of the timeline, with `f` pinned (always visible) elements @todo argument doesn't belong here
virtual void coda(uint pad) =0; ///< the closing part of the timeline at the bottom of the track display, with `pad` additional padding
static const size_t MAX_ARG_SIZE = sizeof(size_t);
@ -82,6 +82,7 @@ namespace timeline {
* To decouple the drawing code -- thus allowing for later customisations --
* we let the individual TrackBody elements just emit these structure description.
* @todo WIP-WIP as of 4/2019
* @todo the number of pinned elements should be a member field, instead of sneaking it into the prelude element...
*/
struct TrackProfile
{

View file

@ -31,7 +31,7 @@
**
** @todo WIP as of 10/2018 ///////////////////////TICKET #1042
**
** @see DummySessionConnection_test
** @see [corresponding UI](\ref stage::dialog::TestControl)
**
*/
@ -109,10 +109,9 @@ namespace session {
DummySessionConnection::fabricateSeq1 (string baseID)
{
const RandID forkRootID{stage::ATTR_fork};
const GenNode timeline = emptyTimeline (baseID, forkRootID)
, rootTrackName = GenNode{string{stage::ATTR_name}, "Track-"+baseID}
, forkRoot = MakeRec().genNode(forkRootID)
;
const GenNode timeline = emptyTimeline (baseID, forkRootID);
const GenNode rootTrackName = GenNode{string{stage::ATTR_name}, "Track-"+baseID};
const GenNode forkRoot = MakeRec().genNode(forkRootID);
return MutationMessage{ ins (timeline)
, mut (timeline)

View file

@ -83,7 +83,6 @@ namespace session {
* Stage-Layer and Steam-Layer, so the software gains some tangible functionality...
* @note readily-available singleton to enact prototypical behaviour as appropriate.
*
* @see DummySessionConnection_test
* @see stage::interact::InteractionDirector::buildMutator
* @see stage::interact::InteractionDirector::injectTimeline
* @see stage::timeline::TimelineController

View file

@ -33,11 +33,6 @@ return: 0
END
PLANNED "Scaffolding to develop the UI-Session connection" DummySessionConnection_test <<END
return: 0
END
TEST "SessionElementTracker_test" SessionElementTracker_test <<END
return: 0
END

View file

@ -1,87 +0,0 @@
/*
DummySessionConnection(Test) - verify scaffolding to drive the GUI-Session connection
Copyright (C) Lumiera.org
2016, 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 dummy-session-connection-test.cpp
**
*/
#include "lib/test/run.hpp"
#include "lib/util.hpp"
#include "steam/mobject/session/dummy-session-connection.hpp"
//#include <boost/lexical_cast.hpp>
//#include <iostream>
#include <string>
#include <map>
//using boost::lexical_cast;
using util::contains;
using std::string;
//using std::cout;
//using std::endl;
namespace steam {
namespace mobject {
namespace session {
namespace test {
namespace { // test fixture...
} //(End) test fixture
/***********************************************************************//**
* @test verify scaffolding used to develop the actual connection between
* the UI, the UI-Bus, the core services in the UI and the Session.
* - weakness of WIP-WIP-WIP
*
* @see UiBus
* @see DummySessionConnection
*/
class DummySessionConnection_test
: public Test
{
virtual void
run (Arg)
{
demonstrate_weakness ();
}
/** @test demonstrate a serious weakness of
* When...
*
* This problem is especially dangerous when...
*/
void demonstrate_weakness ( )
{
UNIMPLEMENTED("stop making sense...");
}
};
/** Register this test class... */
LAUNCHER(DummySessionConnection_test, "unit session");
}}}} // namespace steam::mobject::session::test

View file

@ -1,6 +1,6 @@
<map version="1.0.1">
<!-- To view this file, download free mind mapping software FreeMind from http://freemind.sourceforge.net -->
<node BACKGROUND_COLOR="#6666ff" CREATED="1434127882200" ID="ID_1452170048" MODIFIED="1557498707243" STYLE="fork" TEXT="Lumi">
<node BACKGROUND_COLOR="#6666ff" CREATED="1434127882200" ID="ID_1452170048" MODIFIED="1563117959225" STYLE="fork" TEXT="Lumi">
<font NAME="SansSerif" SIZE="25"/>
<node CREATED="1434128046296" ID="ID_1900827283" MODIFIED="1557498707213" POSITION="right" TEXT="GUI">
<font BOLD="true" NAME="SansSerif" SIZE="14"/>
@ -20837,7 +20837,7 @@
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1560442439507" ID="ID_1072410115" MODIFIED="1560612658066" TEXT="Implementierung">
<icon BUILTIN="pencil"/>
<node CREATED="1560612664570" FOLDED="true" ID="ID_487480098" MODIFIED="1561827483834" TEXT="wo steckt diese Info?">
<node CREATED="1560612664570" ID="ID_487480098" MODIFIED="1563117887785" TEXT="wo steckt diese Info?">
<node CREATED="1560612681316" ID="ID_1320073999" MODIFIED="1560612835546" TEXT="bisher im Argument des Prelude-Verbs">
<icon BUILTIN="info"/>
</node>
@ -20877,7 +20877,7 @@
<node CREATED="1560612942381" ID="ID_1967930581" MODIFIED="1560612949943" TEXT="und das w&#xe4;re etwa die gleiche Menge Code"/>
<node CREATED="1560612951033" ID="ID_850127059" MODIFIED="1560612963343" TEXT="und auch etwa gleicherma&#xdf;en lesbar"/>
</node>
<node CREATED="1560613101287" ID="ID_4285270" MODIFIED="1560613236377" TEXT="Beschlu&#xdf;: sofern die Prelude/Coda-Stukur da ist, kann man sie auch so nutzen">
<node CREATED="1560613101287" ID="ID_4285270" MODIFIED="1563118082873" TEXT="Beschlu&#xdf;: sofern die Prelude/Coda-Stukur da ist, kann man sie auch so nutzen">
<richcontent TYPE="NOTE"><html>
<head>
@ -20900,6 +20900,7 @@
</p>
</body>
</html></richcontent>
<linktarget COLOR="#304ed9" DESTINATION="ID_4285270" ENDARROW="Default" ENDINCLINATION="751;409;" ID="Arrow_ID_1197384474" SOURCE="ID_189142395" STARTARROW="None" STARTINCLINATION="603;0;"/>
<icon BUILTIN="yes"/>
</node>
</node>
@ -20912,7 +20913,7 @@
<icon BUILTIN="bell"/>
</node>
</node>
<node COLOR="#338800" CREATED="1561150497032" FOLDED="true" ID="ID_617550585" MODIFIED="1561827483834" TEXT="Aufspalten des Profils">
<node COLOR="#338800" CREATED="1561150497032" ID="ID_617550585" MODIFIED="1563117862694" TEXT="Aufspalten des Profils">
<icon BUILTIN="button_ok"/>
<node CREATED="1561150521519" FOLDED="true" ID="ID_1498693390" MODIFIED="1561827482929" TEXT="Schei...">
<font ITALIC="true" NAME="SansSerif" SIZE="12"/>
@ -20959,10 +20960,17 @@
</html></richcontent>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1563118329642" ID="ID_337327442" MODIFIED="1563118375106" TEXT="Denkfehler: prelude() mu&#xdf; mitgez&#xe4;hlt werden">
<linktarget COLOR="#d7476c" DESTINATION="ID_337327442" ENDARROW="Default" ENDINCLINATION="523;0;" ID="Arrow_ID_376180455" SOURCE="ID_1599825097" STARTARROW="Default" STARTINCLINATION="1063;0;"/>
<icon BUILTIN="flag-yellow"/>
</node>
</node>
</node>
</node>
<node CREATED="1563118200356" ID="ID_1267787629" MODIFIED="1563118296820" TEXT="Gegenst&#xfc;ck im draw()-Code">
<arrowlink COLOR="#44437f" DESTINATION="ID_1017084418" ENDARROW="Default" ENDINCLINATION="1682;-201;" ID="Arrow_ID_187242024" STARTARROW="None" STARTINCLINATION="1913;158;"/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1560442383281" ID="ID_1448105245" MODIFIED="1560608570817" TEXT="Festlegen der vertikalen Ausdehnung der Teil-Widgets">
<arrowlink COLOR="#235691" DESTINATION="ID_585934033" ENDARROW="Default" ENDINCLINATION="-259;-8;" ID="Arrow_ID_975721855" STARTARROW="Default" STARTINCLINATION="168;-53;"/>
@ -21564,8 +21572,8 @@
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1562237357741" ID="ID_836338266" MODIFIED="1562972876507" TEXT="Prototyp / Evaluierung">
<icon BUILTIN="pencil"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1562238962640" ID="ID_1949200690" MODIFIED="1562843653138" TEXT="#1201 Prototype: custom styled timeline profile">
<linktarget COLOR="#3a84dd" DESTINATION="ID_1949200690" ENDARROW="Default" ENDINCLINATION="-483;0;" ID="Arrow_ID_16837481" SOURCE="ID_424517976" STARTARROW="None" STARTINCLINATION="566;0;"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1562238962640" ID="ID_1949200690" MODIFIED="1563118002540" TEXT="#1201 Prototype: custom styled timeline profile">
<linktarget COLOR="#3a84dd" DESTINATION="ID_1949200690" ENDARROW="Default" ENDINCLINATION="-483;0;" ID="Arrow_ID_16837481" SOURCE="ID_424517976" STARTARROW="None" STARTINCLINATION="615;0;"/>
<icon BUILTIN="flag-yellow"/>
</node>
<node CREATED="1562238991603" ID="ID_1946428740" MODIFIED="1562238993781" TEXT="Idee">
@ -21891,6 +21899,32 @@
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1563117424492" ID="ID_356525175" MODIFIED="1563117534739" TEXT="Anwendung">
<icon BUILTIN="pencil"/>
<node CREATED="1563117450249" ID="ID_36783315" MODIFIED="1563117529819">
<richcontent TYPE="NODE"><html>
<head>
</head>
<body>
<p>
spezielle Regel gesetzt auf: <b>.timeline-page &gt; .timeline-body fork.timeline</b>
</p>
</body>
</html>
</richcontent>
<icon BUILTIN="info"/>
</node>
<node COLOR="#338800" CREATED="1563117430347" ID="ID_374547857" MODIFIED="1563117529819" TEXT="bekomme die Hintergrundfarbe aus dem CSS">
<icon BUILTIN="button_ok"/>
</node>
<node COLOR="#338800" CREATED="1563117439402" ID="ID_368389111" MODIFIED="1563117529819" TEXT="bekomme den Margin">
<icon BUILTIN="button_ok"/>
</node>
<node COLOR="#435e98" CREATED="1563117502706" ID="ID_935663855" MODIFIED="1563117529819" TEXT="funzt">
<icon BUILTIN="ksmiletris"/>
</node>
</node>
</node>
</node>
</node>
@ -21958,7 +21992,45 @@
</node>
<node CREATED="1554517013770" ID="ID_1565362810" MODIFIED="1557498707230" TEXT="Verb-Sequenz konsolidieren"/>
<node CREATED="1554517023983" ID="ID_582840262" MODIFIED="1557498707230" TEXT="Verb-Sequenz interpretieren">
<node CREATED="1554517097141" ID="ID_1017084418" MODIFIED="1557498707230" TEXT="&#xdc;bersichts-Ruler handhaben"/>
<node CREATED="1554517097141" ID="ID_1017084418" MODIFIED="1563118296821" TEXT="&#xdc;bersichts-Ruler handhaben">
<linktarget COLOR="#44437f" DESTINATION="ID_1017084418" ENDARROW="Default" ENDINCLINATION="1682;-201;" ID="Arrow_ID_187242024" SOURCE="ID_1267787629" STARTARROW="None" STARTINCLINATION="1913;158;"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1563117568795" ID="ID_1179051544" MODIFIED="1563117587278" TEXT="Unterscheidung realisieren">
<icon BUILTIN="pencil"/>
<node CREATED="1563117596397" ID="ID_925319859" MODIFIED="1563117602323" TEXT="pinned-elements">
<node CREATED="1563117603629" ID="ID_760190185" MODIFIED="1563117609774" TEXT="im prelude()-Verb">
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1563117613147" ID="ID_1413963999" MODIFIED="1563117625089" TEXT="keine Gute Idee">
<icon BUILTIN="yes"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1563117630103" ID="ID_251975498" MODIFIED="1563117644348" TEXT="sollte in ein Objekt-Feld im Profil">
<icon BUILTIN="bell"/>
</node>
</node>
<node CREATED="1563117655125" ID="ID_764471994" MODIFIED="1563118116587" TEXT="in das Profil speichern">
<icon BUILTIN="hourglass"/>
<node CREATED="1563118014245" ID="ID_336436751" MODIFIED="1563118086917" TEXT="ja...nein...ja...??">
<icon BUILTIN="smiley-angry"/>
</node>
<node CREATED="1563118023721" ID="ID_189142395" MODIFIED="1563118124539" TEXT="hatte da vor 1 Monat schon mal dar&#xfc;ber nachgedacht">
<arrowlink COLOR="#304ed9" DESTINATION="ID_4285270" ENDARROW="Default" ENDINCLINATION="751;409;" ID="Arrow_ID_1197384474" STARTARROW="None" STARTINCLINATION="603;0;"/>
<icon BUILTIN="stop-sign"/>
</node>
<node CREATED="1563118092858" ID="ID_1331508927" MODIFIED="1563118108338" TEXT="und beschlossen, es vorerst im prelude() zu belassen">
<icon BUILTIN="yes"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1563117670147" ID="ID_1912884721" MODIFIED="1563117681947" TEXT="Filter realisieren">
<icon BUILTIN="pencil"/>
<node COLOR="#338800" CREATED="1563117686001" ID="ID_698759785" MODIFIED="1563117694625" TEXT="prefix-Filter implementiert">
<icon BUILTIN="button_ok"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1563117696328" ID="ID_1599825097" MODIFIED="1563118375105" TEXT="Konzeptioneller Fehler beim Z&#xe4;hlen">
<arrowlink COLOR="#d7476c" DESTINATION="ID_337327442" ENDARROW="Default" ENDINCLINATION="523;0;" ID="Arrow_ID_376180455" STARTARROW="Default" STARTINCLINATION="1063;0;"/>
<icon BUILTIN="flag-yellow"/>
</node>
</node>
</node>
</node>
</node>
<node CREATED="1554517044045" ID="ID_520113686" MODIFIED="1557498707230" TEXT="Farben bereitstellen">
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1561412290895" ID="ID_433241551" MODIFIED="1562843377739" TEXT="Frage/Problem: Farbformat">
<icon BUILTIN="flag-yellow"/>
@ -22116,8 +22188,8 @@
<icon BUILTIN="messagebox_warning"/>
<node CREATED="1561898385345" ID="ID_959729268" MODIFIED="1561898420583" TEXT="allgemeines Problem">
<arrowlink COLOR="#cf284f" DESTINATION="ID_30064777" ENDARROW="Default" ENDINCLINATION="-6;190;" ID="Arrow_ID_970836248" STARTARROW="None" STARTINCLINATION="-914;34;"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1562238962640" ID="ID_424517976" MODIFIED="1562843662505" TEXT="#1201 Prototype: custom styled timeline profile">
<arrowlink COLOR="#3a84dd" DESTINATION="ID_1949200690" ENDARROW="Default" ENDINCLINATION="-483;0;" ID="Arrow_ID_16837481" STARTARROW="None" STARTINCLINATION="566;0;"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1562238962640" ID="ID_424517976" MODIFIED="1563118002540" TEXT="#1201 Prototype: custom styled timeline profile">
<arrowlink COLOR="#3a84dd" DESTINATION="ID_1949200690" ENDARROW="Default" ENDINCLINATION="-483;0;" ID="Arrow_ID_16837481" STARTARROW="None" STARTINCLINATION="615;0;"/>
<icon BUILTIN="flag-yellow"/>
</node>
</node>
@ -22140,12 +22212,42 @@
<arrowlink COLOR="#4b31cd" DESTINATION="ID_678877446" ENDARROW="Default" ENDINCLINATION="-711;38;" ID="Arrow_ID_643305825" STARTARROW="Default" STARTINCLINATION="-237;18;"/>
<arrowlink COLOR="#4b31cd" DESTINATION="ID_1755242650" ENDARROW="Default" ENDINCLINATION="-1204;55;" ID="Arrow_ID_847790641" STARTARROW="Default" STARTINCLINATION="-1798;0;"/>
<node CREATED="1563019856854" ID="ID_1799510436" MODIFIED="1563019861202" TEXT="Gtk::WidgetPath"/>
<node CREATED="1563019863670" ID="ID_1584577599" MODIFIED="1563019868785" TEXT="Gtk::StyleContext"/>
<node CREATED="1563019863670" ID="ID_1584577599" MODIFIED="1563019868785" TEXT="Gtk::StyleContext">
<node CREATED="1563110305840" ID="ID_1669038361" MODIFIED="1563110358754" TEXT="kann Backround f&#xfc;llen">
<linktarget COLOR="#6295d1" DESTINATION="ID_1669038361" ENDARROW="Default" ENDINCLINATION="-474;0;" ID="Arrow_ID_715907117" SOURCE="ID_1436336037" STARTARROW="None" STARTINCLINATION="463;25;"/>
</node>
<node CREATED="1563110313699" ID="ID_667969256" MODIFIED="1563110318169" TEXT="kann Rahmen zeichnen"/>
</node>
</node>
</node>
<node CREATED="1561742196428" ID="ID_1908345164" MODIFIED="1561742202862" TEXT="Fl&#xe4;chen"/>
<node CREATED="1561742203636" ID="ID_1959492243" MODIFIED="1561742205504" TEXT="Rampen"/>
</node>
<node CREATED="1561742196428" ID="ID_1908345164" MODIFIED="1561742202862" TEXT="Fl&#xe4;chen">
<node CREATED="1563110329558" ID="ID_1436336037" MODIFIED="1563110365807" TEXT="definiere diese als Background">
<arrowlink COLOR="#6295d1" DESTINATION="ID_1669038361" ENDARROW="Default" ENDINCLINATION="-474;0;" ID="Arrow_ID_715907117" STARTARROW="None" STARTINCLINATION="463;25;"/>
</node>
<node CREATED="1563112603781" ID="ID_774804464" MODIFIED="1563112609310" TEXT="brauche aber auch Abst&#xe4;nde">
<node CREATED="1563112611511" ID="ID_1116374684" MODIFIED="1563112636155" TEXT="man kann sich Margin/Padding besorgen">
<icon BUILTIN="idea"/>
</node>
</node>
</node>
<node CREATED="1561742203636" ID="ID_1959492243" MODIFIED="1561742205504" TEXT="Rampen">
<node CREATED="1563112435603" ID="ID_957636184" MODIFIED="1563112566794" TEXT="Idee-1">
<icon BUILTIN="smiley-neutral"/>
<node CREATED="1563112441737" ID="ID_900587446" MODIFIED="1563112449250" TEXT="Rahmen zeichnen und Richtung umkehren"/>
<node CREATED="1563112451973" ID="ID_1878103890" MODIFIED="1563112459772" TEXT="Rahmen mu&#xdf; dazu inset/outset sein"/>
</node>
<node CREATED="1563112464141" ID="ID_497314735" MODIFIED="1563112572591" TEXT="Idee-2">
<icon BUILTIN="forward"/>
<node CREATED="1563112482359" ID="ID_100127081" MODIFIED="1563112487856" TEXT="Rahmen mit Gap zeichnen"/>
<node CREATED="1563112489001" ID="ID_1802227725" MODIFIED="1563112511333" TEXT="...und dadurch die Oberseite verdecken"/>
</node>
<node CREATED="1563112523511" ID="ID_1881724639" MODIFIED="1563112555503" TEXT="Idee-3">
<icon BUILTIN="button_cancel"/>
<node CREATED="1563112528094" ID="ID_1162030446" MODIFIED="1563112536377" TEXT="zu zeichnende Rahmen in einem Stack sammeln"/>
<node CREATED="1563112537602" ID="ID_1896039320" MODIFIED="1563112551944" TEXT="...und dann am Ende auf einmal alle zeichnen"/>
</node>
</node>
</node>
</node>
</node>