52 TimelineLayout::~TimelineLayout() { }
54 TimelineLayout::TimelineLayout (Gtk::Paned& topLevelContainer)
55 : paneSplitPosition_{topLevelContainer.property_position()}
57 , headerPane_{bodyCanvas_.get_vadjustment()}
58 , displayEvaluation_{}
60 topLevelContainer.add1 (headerPane_);
61 topLevelContainer.add2 (bodyCanvas_);
63 zoomWindow_.attachChangeNotification (signalStructureChange_);
65 bodyCanvas_.get_hadjustment()->property_value().signal_changed().connect(
67 ,bodyCanvas_.get_hadjustment()));
69 bodyCanvas_.signal_size_allocate().connect(
85 headerPane_.installForkRoot (head);
86 bodyCanvas_.installForkRoot (body);
89 body.signalStructureChange_ = signalStructureChange_;
90 signalStructureChange_();
100 displayEvaluation_.attach (*
this);
101 displayEvaluation_.attach (forkRoot);
102 displayEvaluation_.attach (bodyCanvas_);
106 TimelineLayout::getBodyWidgetPath()
const 108 return bodyCanvas_.get_path();
122 displayEvaluation_.perform();
132 Time windowStart = zoomWindow_.visible().start();
133 int pxOffset = translateTimeToPixels (windowStart);
134 bodyCanvas_.get_hadjustment()->set_value(pxOffset);
155 double pos = hadj->get_value();
156 TimeValue windowStart = applyScreenDelta(zoomWindow_.overallSpan().start(), pos);
157 zoomWindow_.setVisibleStart (windowStart);
168 int contentWidthPx = alloc.get_width();
169 if (abs(contentWidthPx) != zoomWindow_.pxWidth())
170 zoomWindow_.calibrateExtension (contentWidthPx);
180 headerPane_.installForkRoot (head);
186 bodyCanvas_.installForkRoot (body);
189 body.signalStructureChange_ = signalStructureChange_;
190 signalStructureChange_();
197 headerPane_.disable();
203 bodyCanvas_.disable();
210 NOTREACHED (
"TimelineLayout: top-Level must not be re-ordered");
214 TimelineLayout::rehook (
TrackBody&) noexcept
216 NOTREACHED (
"TimelineLayout: top-Level must not be re-ordered");
void establishLayout(DisplayEvaluation &) override
TimelineLayout also participates itself in the DisplayEvaluation, notably to set up the basic paramet...
void setupStructure(LayoutElement &)
Lumiera's internal time value datatype.
void triggerDisplayEvaluation() override
Perform a complete recursive pass over all elements relevant for layout, reestablish size allocation ...
void sizeZoomWindow(Gtk::Allocation &)
Signal receiver (slot) to react on changes of the window screen space allocation. ...
A core service of the timeline UI to ensure consistent display and layout of all components within th...
Visitor and state holder for a collaborative layout adjustment pass.
Expecting Advice and giving Advice: a cross-cutting collaboration of loosely coupled participants...
Lumiera GTK UI implementation root.
void syncZoomWindow(PAdjustment)
Signal receiver (slot) to react on scrollbar changes.
void installRootTrack(TrackHeadWidget &, TrackBody &)
This function is invoked once for each new TimelineWidget, in order to build the starting point for t...
boost::rational< int64_t > FSecs
rational representation of fractional seconds
Helper to organise and draw the space allocated for a fork of sub-tracks.
This helper class serves to manage the layout and display of the horizontally extended space of a "tr...
A time interval anchored at a specific point in time.
a family of time value like entities and their relationships.
basic constant internal time value.
A set of basic GTK includes for the UI.