Timeline: sort out how to link the ProfileInterpreter into the draw function
This commit is contained in:
parent
223113ee44
commit
3f04bb8698
4 changed files with 138 additions and 26 deletions
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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ü
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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 »Ruler«-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ä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ß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) -> 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ß war wohl der Unterschied zwischen Canvas und CairoContext">
|
||||
<icon BUILTIN="idea"/>
|
||||
<node CREATED="1560428573068" ID="ID_1838989620" MODIFIED="1560428581790" TEXT="Canvas == Container für "Zukunft""/>
|
||||
<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ä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> bereits der Funktor
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
<icon BUILTIN="yes"/>
|
||||
<node CREATED="1560304535209" ID="ID_1225485882" MODIFIED="1560304560890" TEXT="void(TimelineCanvas&)"/>
|
||||
<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 überhaupt einen Funktor als weitere Indirektion?">
|
||||
<icon BUILTIN="help"/>
|
||||
<node CREATED="1560304911496" ID="ID_241280957" MODIFIED="1560305044856" TEXT="macht nä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önnte man 1) und 2) zusammenlegen?"/>
|
||||
<node CREATED="1560305069484" ID="ID_488264100" MODIFIED="1560305090839" TEXT="d.h. der Renderer wä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>
|
||||
|
|
|
|||
Loading…
Reference in a new issue