Timeline: wire distinct grounding/overlay renderers

TODO:
 - actual draw operations not yet implemented
 - find a way how to select the prelude / body part of the track profile

This is a consequence of subsuming the timeline ruler under the concept of an overview track
This commit is contained in:
Fischlurch 2019-06-13 18:17:46 +02:00
parent 3f04bb8698
commit a105e02b52
3 changed files with 142 additions and 27 deletions

View file

@ -86,7 +86,7 @@ namespace timeline {
}
/** finish painting the track body area
* @param pad additional padding to add at bottom */
* @param pad additional padding to add at bottom */
void
coda (uint pad) override
{
@ -138,8 +138,78 @@ namespace timeline {
: cox_{currentDrawContext}
, display_{move (toShow)}
{ }
};
class TrackOverlayRenderer
: public ProfileInterpreter
{
CairoC cox_;
PixSpan display_;
virtual ~TrackGroundingRenderer() { }
/** overlays to show at top of the track body area
* @param f number of consecutive track elements
* to keep pinned (always visible) at top */
void
prelude (uint f) override
{
UNIMPLEMENTED ("overlays for timeline top");
}
/** finish painting overlays a the bottom of the track body area
* @param pad additional padding to add at bottom */
void
coda (uint pad) override
{
UNIMPLEMENTED ("overlays for bottom");
}
/** draw overlays on top of overview/ruler track
* @param h ruler track height */
void
ruler (uint h) override
{
UNIMPLEMENTED ("overlays for ruler");
}
/** render overlays on top of padding/gap */
void
gap (uint h) override
{
UNIMPLEMENTED ("overlays for gap");
}
/** place overlays on top of of track content area,
* @remark anything to show semi-transparent
* on top of the content clips */
void
content (uint h) override
{
UNIMPLEMENTED ("overlays for content area");
}
/** render overlays covering the opening slope towards nested tracks */
void
open() override
{
UNIMPLEMENTED ("overlays for downward slope");
}
/** render overlays covering the closing slope towards nested tracks */
void
close (uint n) override
{
UNIMPLEMENTED ("overlays for upward slope");
}
public:
TrackOverlayRenderer (CairoC currentDrawContext, PixSpan toShow)
: cox_{currentDrawContext}
, display_{move (toShow)}
{ }
};
template<class PINT>
@ -149,6 +219,7 @@ namespace timeline {
return [&profile, isHeadPart](CairoC cox)
{
PINT concreteRenderScheme{cox, PixSpan{}}; ///////////////////////////////////TICKET #1019 : do we actually need to know the covered virtual area (PixSpan)?
/////////////////////////////////////////////////////////////////////////////////TICKET #1039 : find out a way how to select the header/body part of the profile!
profile.performWith (concreteRenderScheme);
};
}
@ -159,8 +230,8 @@ namespace timeline {
TimelineCanvas::TimelineCanvas (_Renderer groundingFac, _Renderer overlayFac)
: Gtk::Layout{}
, getGroundingRenderer_{groundingFac}
, getOverlayRenderer_{overlayFac}
, renderGrounding_{groundingFac}
, renderOverlay_{overlayFac}
{ }
@ -174,8 +245,8 @@ namespace timeline {
, profile_{}
, rootBody_{nullptr}
, contentArea_{}
, rulerCanvas_{makeRenderer<TrackGroundingRenderer>(profile_, true), makeRenderer<TrackGroundingRenderer>(profile_, true)}
, mainCanvas_{makeRenderer<TrackGroundingRenderer>(profile_, false), makeRenderer<TrackGroundingRenderer>(profile_, false)}
, rulerCanvas_{makeRenderer<TrackGroundingRenderer>(profile_, true), makeRenderer<TrackOverlayRenderer>(profile_, true)}
, mainCanvas_{makeRenderer<TrackGroundingRenderer>(profile_, false), makeRenderer<TrackOverlayRenderer>(profile_, false)}
{
this->set_border_width (0);
this->property_expand() = true; // dynamically grab any available additional space
@ -297,7 +368,7 @@ namespace timeline {
void
TimelineCanvas::drawGrounding (CairoC const& cox)
{
getGroundingRenderer_(cox);
renderGrounding_(cox);
/////////////////////////////////////////////TICKET #1039 : placeholder drawing
cox->set_source_rgb(0.8, 0.0, 0.0);
cox->set_line_width (5.0);
@ -314,7 +385,7 @@ namespace timeline {
void
TimelineCanvas::drawOverlays (CairoC const& cox)
{
getOverlayRenderer_(cox);
renderOverlay_(cox);
/////////////////////////////////////////////TICKET #1039 : placeholder drawing
auto alloc = get_allocation();
int w = alloc.get_width();

View file

@ -83,8 +83,8 @@ namespace timeline {
{
using _Renderer = std::function<void(CairoC)>;
_Renderer getGroundingRenderer_;
_Renderer getOverlayRenderer_;
_Renderer renderGrounding_;
_Renderer renderOverlay_;
public:
TimelineCanvas (_Renderer groundingFac, _Renderer overlayFac);

View file

@ -19608,11 +19608,14 @@
<node CREATED="1555198484257" ID="ID_447173098" MODIFIED="1557498707228" TEXT="Problem: Aufteilung">
<arrowlink DESTINATION="ID_577805455" ENDARROW="Default" ENDINCLINATION="146;-10;" ID="Arrow_ID_228489961" STARTARROW="Default" STARTINCLINATION="110;0;"/>
<node CREATED="1555198495266" ID="ID_118142711" MODIFIED="1557498707228" TEXT="was kommt in den (immer sichtbaren) oberen Teil?"/>
<node CREATED="1555198558887" ID="ID_1718337163" MODIFIED="1557498707228" TEXT="Beide Canvas-Instanzen verwenden das gleiche Koordinatensystem">
<node CREATED="1555198558887" ID="ID_1718337163" MODIFIED="1560442514142" TEXT="Beide Canvas-Instanzen verwenden das gleiche Koordinatensystem">
<arrowlink DESTINATION="ID_1220970686" ENDARROW="Default" ENDINCLINATION="-532;0;" ID="Arrow_ID_1730442283" STARTARROW="None" STARTINCLINATION="377;0;"/>
<icon BUILTIN="yes"/>
</node>
<node CREATED="1555198633466" ID="ID_780787053" MODIFIED="1557498707228" TEXT="Auf Interpretieren des Struktur-Profils zur&#xfc;ckgef&#xfc;hrt">
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1555247298877" ID="ID_1739468610" MODIFIED="1557498707228" TEXT="das mu&#xdf; dann aber verallgemeinert wertden">
<node COLOR="#338800" CREATED="1555198633466" ID="ID_780787053" MODIFIED="1560442064470" TEXT="Auf Interpretieren des Struktur-Profils zur&#xfc;ckgef&#xfc;hrt">
<icon BUILTIN="button_ok"/>
<node COLOR="#435e98" CREATED="1555247298877" ID="ID_1739468610" MODIFIED="1560442477849" TEXT="das mu&#xdf; dann aber verallgemeinert wertden">
<font ITALIC="true" NAME="SansSerif" SIZE="12"/>
<icon BUILTIN="yes"/>
<node CREATED="1555247361420" ID="ID_1263829263" MODIFIED="1557498707228" TEXT="warum?">
<richcontent TYPE="NOTE"><html>
@ -19650,8 +19653,8 @@
</html></richcontent>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1555247320686" ID="ID_1896093043" MODIFIED="1557590822696" TEXT="brauche Visitor mit flexiblen Argumenten">
<icon BUILTIN="pencil"/>
<node COLOR="#338800" CREATED="1555247320686" FOLDED="true" ID="ID_1896093043" MODIFIED="1560442052440" TEXT="brauche Visitor mit flexiblen Argumenten">
<icon BUILTIN="button_ok"/>
<node CREATED="1555247502178" ID="ID_297247554" MODIFIED="1557498707228" TEXT="Anforderung">
<icon BUILTIN="yes"/>
<node CREATED="1555247509182" ID="ID_184476156" MODIFIED="1557498707228" TEXT="funktioniert genauso wie Visitor im Diff, mit Verb-Tokens"/>
@ -20307,8 +20310,8 @@
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1557590586650" ID="ID_1348312855" MODIFIED="1560213524736" TEXT="den (neu gebauten) VerbPack integrieren">
<icon BUILTIN="pencil"/>
<node COLOR="#338800" CREATED="1557590586650" ID="ID_1348312855" MODIFIED="1560442031421" TEXT="den (neu gebauten) VerbPack integrieren">
<icon BUILTIN="button_ok"/>
<node CREATED="1560175373902" ID="ID_1956293405" MODIFIED="1560175561475" TEXT="bestehendes TrackProfile sinngem&#xe4;&#xdf; umbauen">
<icon BUILTIN="yes"/>
</node>
@ -20361,7 +20364,7 @@
</richcontent>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1560175529230" ID="ID_914166338" MODIFIED="1560175635885">
<node COLOR="#338800" CREATED="1560175529230" ID="ID_914166338" MODIFIED="1560441859516">
<richcontent TYPE="NODE"><html>
<head>
@ -20373,7 +20376,7 @@
</body>
</html></richcontent>
<arrowlink COLOR="#508bd1" DESTINATION="ID_1592949721" ENDARROW="Default" ENDINCLINATION="59;-58;" ID="Arrow_ID_1618633786" STARTARROW="None" STARTINCLINATION="-91;0;"/>
<icon BUILTIN="flag-yellow"/>
<icon BUILTIN="button_ok"/>
<node CREATED="1560303652840" ID="ID_1947607603" MODIFIED="1560303667034" TEXT="Konsequenz des generischen &#xbb;Ruler&#xab;-Konzepts"/>
<node CREATED="1560303597884" ID="ID_1906099403" MODIFIED="1560303739318" TEXT="wurde notwendig wegen der Aufteilung in zwei Canvas">
<richcontent TYPE="NOTE"><html>
@ -20400,10 +20403,14 @@
</node>
</node>
</node>
<node CREATED="1560175579123" ID="ID_678068478" MODIFIED="1560175590213" TEXT="in generische draw()-Routine einbinden">
<node CREATED="1560175593361" ID="ID_1592949721" MODIFIED="1560175631513" TEXT="wo kommt der Renderer ins Spiel?">
<node COLOR="#435e98" CREATED="1560175579123" ID="ID_678068478" MODIFIED="1560442081244" TEXT="in generische draw()-Routine einbinden">
<icon BUILTIN="idea"/>
<node COLOR="#338800" CREATED="1560175593361" ID="ID_1592949721" MODIFIED="1560442019836" TEXT="wo kommt der Renderer ins Spiel?">
<linktarget COLOR="#508bd1" DESTINATION="ID_1592949721" ENDARROW="Default" ENDINCLINATION="59;-58;" ID="Arrow_ID_1618633786" SOURCE="ID_914166338" STARTARROW="None" STARTINCLINATION="-91;0;"/>
<node CREATED="1560303801546" ID="ID_1150937962" MODIFIED="1560303835713" TEXT="Renderer verkapselt das Profil"/>
<icon BUILTIN="button_ok"/>
<node CREATED="1560303801546" ID="ID_1150937962" MODIFIED="1560442045382" TEXT="Renderer verkapselt das Profil">
<icon BUILTIN="info"/>
</node>
<node CREATED="1560303861175" ID="ID_1281704590" MODIFIED="1560303882272" TEXT="Renderer ist ein einmal-wegwerf-Objekt">
<richcontent TYPE="NOTE"><html>
<head>
@ -20417,7 +20424,7 @@
</html>
</richcontent>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1560303951038" ID="ID_353953611" MODIFIED="1560304077463" TEXT="Frage: wirklich zweistufig konstruieren??">
<node COLOR="#435e98" CREATED="1560303951038" ID="ID_353953611" MODIFIED="1560441877245" TEXT="Frage: wirklich zweistufig konstruieren??">
<richcontent TYPE="NOTE"><html>
<head>
@ -20442,7 +20449,8 @@
<node CREATED="1560428585872" ID="ID_1746909203" MODIFIED="1560428593856" TEXT="CairoContext: da zeichnet man konkret"/>
</node>
</node>
<node CREATED="1560304378008" ID="ID_1402776173" MODIFIED="1560304394553" TEXT="vereinfachen...?">
<node COLOR="#435e98" CREATED="1560304378008" ID="ID_1402776173" MODIFIED="1560441942501" TEXT="vereinfachen...?">
<icon BUILTIN="stop-sign"/>
<node CREATED="1560304395781" ID="ID_1496832477" MODIFIED="1560428268414" TEXT="_RenderFactory f&#xe4;llt weg">
<icon BUILTIN="idea"/>
</node>
@ -20460,9 +20468,14 @@
</richcontent>
<icon BUILTIN="yes"/>
<node CREATED="1560304535209" ID="ID_1225485882" MODIFIED="1560304560890" TEXT="void(TimelineCanvas&amp;)"/>
<node CREATED="1560428691244" ID="ID_1126064182" MODIFIED="1560428708235" TEXT="Konsequenz: TimelineCanvas wird zum Interface"/>
<node CREATED="1560428691244" ID="ID_1126064182" MODIFIED="1560441982757" TEXT="Konsequenz: TimelineCanvas wird zum Interface">
<icon BUILTIN="button_cancel"/>
</node>
<node CREATED="1560304868565" ID="ID_471873086" MODIFIED="1560304898970" TEXT="brauchen wir &#xfc;berhaupt einen Funktor als weitere Indirektion?">
<node COLOR="#338800" CREATED="1560441983792" ID="ID_998159430" MODIFIED="1560442009273" TEXT="nein: alles Ben&#xf6;tigte mu&#xdf; als Argument &#xfc;bergeben werden">
<icon BUILTIN="yes"/>
</node>
</node>
<node COLOR="#435e98" CREATED="1560304868565" ID="ID_471873086" MODIFIED="1560441928610" TEXT="brauchen wir &#xfc;berhaupt einen Funktor als weitere Indirektion?">
<icon BUILTIN="help"/>
<node CREATED="1560304911496" ID="ID_241280957" MODIFIED="1560305044856" TEXT="macht n&#xe4;mlich drei Indirektionen">
<richcontent TYPE="NOTE"><html>
@ -20487,11 +20500,42 @@
</node>
<node CREATED="1560305049471" ID="ID_1228128138" MODIFIED="1560305059543" TEXT="k&#xf6;nnte man 1) und 2) zusammenlegen?"/>
<node CREATED="1560305069484" ID="ID_488264100" MODIFIED="1560305090839" TEXT="d.h. der Renderer w&#xe4;re zugleich ein Profil-Interpreter"/>
<node CREATED="1560441903171" ID="ID_220479717" MODIFIED="1560441921539" TEXT="nein: der Renderer konstruiert einen transienten Profil-Interpreter">
<icon BUILTIN="button_cancel"/>
</node>
</node>
</node>
<node CREATED="1560175646834" ID="ID_585934033" MODIFIED="1560175663115" TEXT="wo wird entschieden, was in den Ruler-Teil kommt?"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1560175646834" ID="ID_585934033" MODIFIED="1560442420666" TEXT="Selektor f&#xfc;r den relevanten Teil des Profils">
<linktarget COLOR="#235691" DESTINATION="ID_585934033" ENDARROW="Default" ENDINCLINATION="-259;-8;" ID="Arrow_ID_975721855" SOURCE="ID_1448105245" STARTARROW="Default" STARTINCLINATION="168;-53;"/>
<icon BUILTIN="flag-yellow"/>
<node CREATED="1560442117286" ID="ID_1565882906" MODIFIED="1560442234529" TEXT="wir haben jetzt zwei Canvas">
<icon BUILTIN="info"/>
<node CREATED="1560442238349" ID="ID_1013135995" MODIFIED="1560442245202" TEXT="Overview-Ruler (always on top)"/>
<node CREATED="1560442245898" ID="ID_1189464925" MODIFIED="1560442253375" TEXT="Track Body (scrollable)"/>
</node>
<node CREATED="1560442129908" ID="ID_410132191" MODIFIED="1560442196351" TEXT="jeder mu&#xdf; nur den f&#xfc;r ihn relevanten Teil rendern"/>
<node CREATED="1560442220007" ID="ID_92028891" MODIFIED="1560442229810" TEXT="ist nur eine Preformance-Optimierung">
<icon BUILTIN="idea"/>
<node CREATED="1560442262544" ID="ID_1220970686" MODIFIED="1560442514142" TEXT="wir verwenden einheitliche Koordinaten">
<linktarget COLOR="#a9b4c1" DESTINATION="ID_1220970686" ENDARROW="Default" ENDINCLINATION="-532;0;" ID="Arrow_ID_1730442283" SOURCE="ID_1718337163" STARTARROW="None" STARTINCLINATION="377;0;"/>
<font ITALIC="true" NAME="SansSerif" SIZE="12"/>
<icon BUILTIN="yes"/>
</node>
<node CREATED="1560442275246" ID="ID_1464324660" MODIFIED="1560442286901" TEXT="deshalb ist auch nur jeweils der relevante Teil sichtbar"/>
<node CREATED="1560442288690" ID="ID_106486844" MODIFIED="1560442318651" TEXT="trotzdem kann man hier die H&#xe4;lfte der draw-Anweisungen einsparen">
<icon BUILTIN="idea"/>
</node>
</node>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1560442439507" ID="ID_1072410115" MODIFIED="1560442445776" TEXT="Implementierung">
<icon BUILTIN="flag-pink"/>
</node>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1560442383281" ID="ID_1448105245" MODIFIED="1560442425362" TEXT="Festlegen der horizontalen Ausdehnung der Teil-Widgets">
<arrowlink COLOR="#235691" DESTINATION="ID_585934033" ENDARROW="Default" ENDINCLINATION="-259;-8;" ID="Arrow_ID_975721855" STARTARROW="Default" STARTINCLINATION="168;-53;"/>
<icon BUILTIN="flag-yellow"/>
</node>
</node>
</node>