Timeline: sort out how to link the ProfileInterpreter into the draw function

This commit is contained in:
Fischlurch 2019-06-13 17:48:30 +02:00
parent 223113ee44
commit 3f04bb8698
4 changed files with 138 additions and 26 deletions

View file

@ -93,7 +93,7 @@ namespace timeline {
UNIMPLEMENTED ("draw bottom");
}
/** draw grounding of a overview/ruler track
/** draw grounding of an overview/ruler track
* with the given height */
void
ruler (uint h) override
@ -141,12 +141,23 @@ namespace timeline {
virtual ~TrackGroundingRenderer() { }
};
template<class PINT>
auto
makeRenderer (TrackProfile& profile, bool isHeadPart)
{
return [&profile, isHeadPart](CairoC cox)
{
PINT concreteRenderScheme{cox, PixSpan{}}; ///////////////////////////////////TICKET #1019 : do we actually need to know the covered virtual area (PixSpan)?
profile.performWith (concreteRenderScheme);
};
}
}
TimelineCanvas::TimelineCanvas (_RenderFactory groundingFac, _RenderFactory overlayFac)
TimelineCanvas::TimelineCanvas (_Renderer groundingFac, _Renderer overlayFac)
: Gtk::Layout{}
, getGroundingRenderer_{groundingFac}
, getOverlayRenderer_{overlayFac}
@ -159,12 +170,12 @@ namespace timeline {
BodyCanvasWidget::BodyCanvasWidget (DisplayManager& displayManager)
: Gtk::Box{Gtk::ORIENTATION_VERTICAL}
, contentArea_{}
, rulerCanvas_{std::function<Renderer&(CairoC)>(), std::function<Renderer&(CairoC)>()} ///////////TODO dummy placeholder factories.... need to build the real thing
, mainCanvas_{std::function<Renderer&(CairoC)>(), std::function<Renderer&(CairoC)>()}
, layout_{displayManager}
, profile_{}
, rootBody_{nullptr}
, contentArea_{}
, rulerCanvas_{makeRenderer<TrackGroundingRenderer>(profile_, true), makeRenderer<TrackGroundingRenderer>(profile_, true)}
, mainCanvas_{makeRenderer<TrackGroundingRenderer>(profile_, false), makeRenderer<TrackGroundingRenderer>(profile_, false)}
{
this->set_border_width (0);
this->property_expand() = true; // dynamically grab any available additional space
@ -214,9 +225,8 @@ namespace timeline {
{
if (not profile_)
rootBody_->establishTrackSpace (profile_);
// TrackGroundingRenderer renderer{cox, layout_.getPixSpan()}; //////////TODO TOD-oh
}
return profile_; //////////////////////////////////////////////////////////////////////////////////////TICKET #1039 : who actually invokes this function? what if not(rootBody_)?
}
@ -287,7 +297,7 @@ namespace timeline {
void
TimelineCanvas::drawGrounding (CairoC const& cox)
{
// profile_.performWith (renderer);
getGroundingRenderer_(cox);
/////////////////////////////////////////////TICKET #1039 : placeholder drawing
cox->set_source_rgb(0.8, 0.0, 0.0);
cox->set_line_width (5.0);
@ -304,6 +314,7 @@ namespace timeline {
void
TimelineCanvas::drawOverlays (CairoC const& cox)
{
getOverlayRenderer_(cox);
/////////////////////////////////////////////TICKET #1039 : placeholder drawing
auto alloc = get_allocation();
int w = alloc.get_width();

View file

@ -77,25 +77,17 @@ namespace timeline {
class TrackBody;
class TimelineCanvas;
class Renderer
{
public:
virtual ~Renderer() { } ///< this is an interface
virtual void drawTo (TimelineCanvas&) =0;
};
class TimelineCanvas
: public Gtk::Layout
{
using _RenderFactory = std::function<Renderer&(CairoC)>;
using _Renderer = std::function<void(CairoC)>;
_RenderFactory getGroundingRenderer_;
_RenderFactory getOverlayRenderer_;
_Renderer getGroundingRenderer_;
_Renderer getOverlayRenderer_;
public:
TimelineCanvas (_RenderFactory groundingFac, _RenderFactory overlayFac);
TimelineCanvas (_Renderer groundingFac, _Renderer overlayFac);
private:
virtual bool on_draw (CairoC) override;
@ -114,14 +106,14 @@ namespace timeline {
class BodyCanvasWidget
: public Gtk::Box
{
Gtk::ScrolledWindow contentArea_;
TimelineCanvas rulerCanvas_;
TimelineCanvas mainCanvas_;
DisplayManager& layout_;
TrackProfile profile_;
TrackBody* rootBody_;
Gtk::ScrolledWindow contentArea_;
TimelineCanvas rulerCanvas_;
TimelineCanvas mainCanvas_;
public:
BodyCanvasWidget (DisplayManager&);
~BodyCanvasWidget();

View file

@ -92,8 +92,8 @@ namespace timeline {
PixSpan
TimelineLayout::getPixSpan()
{
////////////////////////////////////////////////////////TICKET 1019 : need a "ZoomWindow" here to manage the visible area
////////////////////////////////////////////////////////TICKET 1039 : "somehow" wire with the TimelineController to find out the covered span
////////////////////////////////////////////////////////TICKET #1019 : need a "ZoomWindow" here to manage the visible area
////////////////////////////////////////////////////////TICKET #1039 : "somehow" wire with the TimelineController to find out the covered span
return PixSpan {0, 2048}; ////////////////Lalala Lalü
}

View file

@ -20374,12 +20374,121 @@
</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"/>
<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>
<head>
</head>
<body>
<p>
vorher war n&#228;mlich das Profil im Canvas selber.
</p>
<p>
Jetzt ist das Profil in das BodyCanvasWidget hochgewandert,
</p>
<p>
und soll von beiden sub-Canvas gleicherma&#223;en jeweils passend interpretiert werden
</p>
</body>
</html>
</richcontent>
</node>
<node CREATED="1560303745209" ID="ID_202529970" MODIFIED="1560303777782" TEXT="es ergeben sich 4 verschiedene Interpretierungen eines einzigen Profils">
<icon BUILTIN="info"/>
</node>
</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?">
<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"/>
<node CREATED="1560303861175" ID="ID_1281704590" MODIFIED="1560303882272" TEXT="Renderer ist ein einmal-wegwerf-Objekt">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
...daher die Factory
</p>
</body>
</html>
</richcontent>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1560303951038" ID="ID_353953611" MODIFIED="1560304077463" TEXT="Frage: wirklich zweistufig konstruieren??">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<ol>
<li>
getXxxRenderer(CairoC) -&gt; packt Profil ein
</li>
<li>
Renderer.drawTo(canvas)
</li>
</ol>
</body>
</html>
</richcontent>
<icon BUILTIN="help"/>
<node CREATED="1560428273738" ID="ID_149938310" MODIFIED="1560428299172" TEXT="was hab ich mir vor ein paar Monaten wohl gedacht??!"/>
<node CREATED="1560428302521" ID="ID_616331969" MODIFIED="1560428322828" TEXT="Anla&#xdf; war wohl der Unterschied zwischen Canvas und CairoContext">
<icon BUILTIN="idea"/>
<node CREATED="1560428573068" ID="ID_1838989620" MODIFIED="1560428581790" TEXT="Canvas == Container f&#xfc;r &quot;Zukunft&quot;"/>
<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 CREATED="1560304395781" ID="ID_1496832477" MODIFIED="1560428268414" TEXT="_RenderFactory f&#xe4;llt weg">
<icon BUILTIN="idea"/>
</node>
<node CREATED="1560304412203" ID="ID_1976247827" MODIFIED="1560304477152">
<richcontent TYPE="NODE"><html>
<head>
</head>
<body>
<p>
Renderer <i>ist</i>&#160;bereits der Funktor
</p>
</body>
</html>
</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>
<node CREATED="1560304868565" ID="ID_471873086" MODIFIED="1560304898970" 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>
<head>
</head>
<body>
<ol>
<li>
der Renderer. Abstrahiert welcher Interpreter wie genau zum Einsatz kommen soll (Hintergrund/Overla sowie Ruler/Content)
</li>
<li>
der konkrete Interpreter
</li>
<li>
die einzelnen Verben im Profil
</li>
</ol>
</body>
</html>
</richcontent>
</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>
</node>
</node>
<node CREATED="1560175646834" ID="ID_585934033" MODIFIED="1560175663115" TEXT="wo wird entschieden, was in den Ruler-Teil kommt?"/>
</node>