Timeline: consider how to manage size and layout of timeline contents

bottom line is to do most autmatically, and to establish a slave-relation
navigation-area -> timeline-ruler
header-pane-content -> corresponding track-body

this can be accomplished mostly by connecting the aproprieate signals,
thus these widgets will live within the Layout-Manager, which consequently
is renamed into TimelineLayout
This commit is contained in:
Fischlurch 2018-10-27 17:27:29 +02:00
parent c3d91d4ed3
commit 2d4e58db02
9 changed files with 315 additions and 38 deletions

View file

@ -84,6 +84,10 @@ General Code Arrangement and Layout
The primary author(s) and the year of the initial copyright claim should be mentioned.
- Each header should be focused on a specific purpose. Preferably it starts with a file-level
doxygen comment explaining the intention and anything not obvious from reading the code.
At lest a `@file` tag with one line of classification in a doxygen comment at the top of every
file is mandatory.footnote:[this rule stands simply because, without such a file-level doxygen
comment, doxygen will _ignore all contents_ of this file (really, might be surprising, yet it is
the way it is...)]
- when arranging headers and compilation units, please take care of the compilation times and the
code size. Avoid unnecessary includes. Use forward declarations where applicable.
Yet still, _all immediately required direct dependencies should be mentioned_, even if already
@ -91,11 +95,20 @@ General Code Arrangement and Layout
link:{ldoc}/technical/code/linkingStructure.html#_imports_and_import_order[issues of code organisation]
- The include block starts with our own dependencies, followed by a second block with the library
dependencies. After that, optionally some symbols may be brought into scope (through +using+ clauses).
Avoid cluttering top-level namespaces. Never import full namespaces (no +using namespace boost;+ please!)
Avoid cluttering top-level namespaces. Never import full namespaces.footnote:[no `using namespace gtk;`
or `using namespace boost` please! Experience shows, in the end you'll be using 5 names or so, but
pull in all the others just for sake of laziness. Just type the f**g `using` clause for every
import individually, and we'll all be better off...]
- the includes for our own dependencies shall be given relative to source-root (or test root). Don't use
relative includes for headers located in the same directory, or -- worse still -- in the parent directory.
- sometimes, the actual translation units will combine several facilities for technical reasons, e.g.
when sharing an implementation-level class or even singleton instance.
- sometimes, the actual translation units will combine several facilities for technical reasons.footnote:
[this means, there can be ``headers'', which are actually only be intended for inclusion on one or two
distinct places. This should be mentioned in the file-level comment, but generally is an acceptable
practice, and better then lumping everything into a 1000 lines header. As a guideline, if you expect
a rather technical concern not to be of much interest for most readers of a header, then better
extract it into a separate self-contained header and include it. E.g., you might be sharing an
an implementation-level class or even singleton instance and some constant definitions. Just
be sure not to include definitions several times.]
Anonymous namespaces should be used liberally to avoid unnecessary exports.
- template code mostly needs to reside in headers. (same for metaprogramming code).
We employ the simple inclusion model (``Borland model'') for template instantiation.

View file

@ -40,7 +40,7 @@
#include "gui/gtk-base.hpp"
#include "include/ui-protocol.hpp"
#include "gui/timeline/layout-manager.hpp"
#include "gui/timeline/timeline-layout.hpp"
#include "gui/timeline/timeline-controller.hpp"
#include "gui/timeline/track-presenter.hpp"
#include "gui/timeline/marker-widget.hpp"
@ -82,7 +82,7 @@ namespace timeline {
TimelineController::TimelineController (ID identity, ID trackID, ctrl::BusTerm& nexus, LayoutManager& layoutManager)
TimelineController::TimelineController (ID identity, ID trackID, ctrl::BusTerm& nexus, TimelineLayout& layoutManager)
: Controller{identity, nexus}
, name_{identity.getSym()} // fallback initialise name from human-readable ID symbol
, markers_{}

View file

@ -72,7 +72,7 @@ namespace timeline {
using std::string;
class TrackPresenter;
class LayoutManager;
class TimelineLayout;
class MarkerWidget;
@ -99,7 +99,7 @@ namespace timeline {
* @param trackID the mandatory root track used in the associated Sequence
* @param nexus some established connection to the UI-Bus, used for registration.
*/
TimelineController (ID identity, ID trackID, ctrl::BusTerm& nexus, LayoutManager&);
TimelineController (ID identity, ID trackID, ctrl::BusTerm& nexus, TimelineLayout&);
~TimelineController();

View file

@ -73,7 +73,11 @@ namespace timeline {
, rootTrackID_{rr.rootTrackID_}
{ }
TimelineGui::~TimelineGui() { }
TimelineGui::~TimelineGui()
{
if (this->isActive())
TODO ("cascading destruction of the TimelineWidget"); /////////////////////////////////////////////TICKET 1016 : implement sane unwinding
}
/**

View file

@ -1,5 +1,5 @@
/*
LayoutManager - global timeline layout management and display control
TimelineLayout - global timeline layout management and display control
Copyright (C) Lumiera.org
2016, Hermann Vosseler <Ichthyostega@web.de>
@ -21,7 +21,7 @@
* *****************************************************/
/** @file layout-manager.cpp
/** @file timeline-layout.cpp
** Implementation details of global timeline layout management.
**
** @todo WIP-WIP-WIP as of 12/2016
@ -31,7 +31,7 @@
#include "gui/gtk-base.hpp"
#include "gui/timeline/layout-manager.hpp"
#include "gui/timeline/timeline-layout.hpp"
//#include "gui/ui-bus.hpp"
//#include "lib/format-string.hpp"
@ -59,15 +59,17 @@ namespace timeline {
LayoutManager::~LayoutManager() { }
TimelineLayout::~TimelineLayout() { }
LayoutManager::LayoutManager ()
TimelineLayout::TimelineLayout ()
: headerPane_{}
, bodyCanvas_{}
{
}
void
LayoutManager::installRootTrack(TrackHeadWidget& head, TrackBody& body)
TimelineLayout::installRootTrack(TrackHeadWidget& head, TrackBody& body)
{
UNIMPLEMENTED ("attach the widgets for the root track display");
}

View file

@ -1,5 +1,5 @@
/*
LAYOUT-MANAGER.hpp - global timeline layout management and display control
TIMELINE-LAYOUT.hpp - global timeline layout management and display control
Copyright (C) Lumiera.org
2016, Hermann Vosseler <Ichthyostega@web.de>
@ -21,7 +21,7 @@
*/
/** @file layout-manager.hpp
/** @file timeline-layout.hpp
** A core service of the timeline UI to ensure consistent display and layout
** of all components within the timeline. The content of the timeline is organised
** into several nested collections, possibly holding several thousand individual elements.
@ -79,10 +79,12 @@
*/
#ifndef GUI_TIMELINE_LAYOUT_MANAGER_H
#define GUI_TIMELINE_LAYOUT_MANAGER_H
#ifndef GUI_TIMELINE_TIMELINE_LAYOUT_H
#define GUI_TIMELINE_TIMELINE_LAYOUT_H
#include "gui/gtk-base.hpp"
#include "gui/timeline/header-pane-widget.hpp"
#include "gui/timeline/body-canvas-widget.hpp"
//#include "lib/util.hpp"
@ -101,11 +103,14 @@ namespace timeline {
/**
* @todo WIP-WIP as of 12/2016
*/
class LayoutManager
class TimelineLayout
{
HeaderPaneWidget headerPane_;
BodyCanvasWidget bodyCanvas_;
public:
LayoutManager ();
~LayoutManager();
TimelineLayout ();
~TimelineLayout();
void installRootTrack(TrackHeadWidget&,TrackBody&);
@ -115,4 +120,4 @@ namespace timeline {
}}// namespace gui::timeline
#endif /*GUI_TIMELINE_LAYOUT_MANAGER_H*/
#endif /*GUI_TIMELINE_TIMELINE_LAYOUT_H*/

View file

@ -33,7 +33,7 @@
#include "gui/gtk-base.hpp"
#include "gui/timeline/timeline-widget.hpp"
#include "gui/timeline/timeline-controller.hpp"
#include "gui/timeline/layout-manager.hpp"
#include "gui/timeline/timeline-layout.hpp"
//#include "gui/workspace/workspace-window.hpp"
//#include "gui/ui-bus.hpp"
@ -69,7 +69,7 @@ namespace timeline {
TimelineWidget::TimelineWidget (BusTerm::ID identity, BusTerm::ID trackID, BusTerm& nexus)
: TimelinePage{}
, layout_{new LayoutManager}
, layout_{new TimelineLayout}
, control_{new TimelineController{identity, trackID, nexus, *layout_}}
{
UNIMPLEMENTED ("build the timeline UI");

View file

@ -62,6 +62,7 @@
#include "lib/time/timevalue.hpp"
#include "lib/diff/diff-mutable.hpp"
#include "lib/nocopy.hpp"
//#include <memory>
//#include <vector>
@ -78,7 +79,7 @@ namespace timeline {
using ctrl::BusTerm;
class TimelineController;
class LayoutManager;
class TimelineLayout;
/**
* Interface: GUI page holding a timeline display
@ -106,8 +107,9 @@ namespace timeline {
*/
class TimelineWidget
: public TimelinePage
, util::NonCopyable
{
std::unique_ptr<LayoutManager> layout_;
std::unique_ptr<TimelineLayout> layout_;
std::unique_ptr<TimelineController> control_;
public:

View file

@ -18288,11 +18288,44 @@
</body>
</html></richcontent>
</node>
<node CREATED="1540639615789" ID="ID_1775707565" MODIFIED="1540639622736" TEXT="ID des root-Track"/>
<node CREATED="1480725273775" ID="ID_1495656573" MODIFIED="1518487921081" TEXT="Bus-Term-Referenz"/>
</node>
</node>
<node CREATED="1540639905935" ID="ID_1563220898" MODIFIED="1540639913074" TEXT="zerst&#xf6;ren">
<node CREATED="1540639914260" ID="ID_1797549156" MODIFIED="1540639923449" TEXT="der Root-Track kann nicht gel&#xf6;scht werden">
<icon BUILTIN="idea"/>
<node CREATED="1540639925885" ID="ID_1352494029" MODIFIED="1540639933663" TEXT="das wird bereits auf Diff-Ebene abgewiesen"/>
<node CREATED="1540639934819" ID="ID_1733133201" MODIFIED="1540639942418" TEXT="...da es sich um ein Attribut-Binding handelt"/>
<node CREATED="1540639945978" ID="ID_1136500098" MODIFIED="1540640014607" TEXT="(sollte aber auch niemals auftreten)">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
...da wir unterstellen, da&#223; das Gegenst&#252;ck im Session-Modell,
</p>
<p>
von dem der Diff ausgeht, ebenfalls den Root-Track als festes Attribut h&#228;lt.
</p>
<p>
Daher sollte eine inkompatible Struktur&#228;nderung &#252;berhaupt nicht auftreten k&#246;nnen
</p>
</body>
</html>
</richcontent>
</node>
</node>
<node CREATED="1540640048428" ID="ID_838010387" MODIFIED="1540640058975" TEXT="nur das gesamte Widget insgesamt">
<node CREATED="1540640063547" ID="ID_975320950" MODIFIED="1540640069917" TEXT="kaskadiert in nat&#xfc;rlicher Ordnung"/>
<node CREATED="1540640074705" ID="ID_181154970" MODIFIED="1540640085125" TEXT="Kinder zuerst...">
<icon BUILTIN="ksmiletris"/>
</node>
</node>
</node>
<node CREATED="1480725377994" ID="ID_172881069" MODIFIED="1518487921081" TEXT="verwalten">
<node CREATED="1480741524775" ID="ID_661893589" MODIFIED="1518487921081" TEXT="Bindings einrichten">
<node COLOR="#338800" CREATED="1480741524775" ID="ID_661893589" MODIFIED="1540639585417" TEXT="Bindings einrichten">
<icon BUILTIN="button_ok"/>
</node>
<node CREATED="1480800574418" ID="ID_791426893" MODIFIED="1518487921081" TEXT="Marker">
@ -18308,6 +18341,8 @@
<node COLOR="#435e98" CREATED="1538957611472" ID="ID_1996849782" MODIFIED="1538957931290" TEXT="erwartet gem&#xe4;&#xdf; UI Modell-Schema">
<arrowlink COLOR="#919fc6" DESTINATION="ID_165150753" ENDARROW="Default" ENDINCLINATION="-902;329;" ID="Arrow_ID_651613049" STARTARROW="None" STARTINCLINATION="823;93;"/>
<icon BUILTIN="info"/>
<node COLOR="#435e98" CREATED="1540639547294" ID="ID_133813709" MODIFIED="1540639561155" TEXT="TimelineID"/>
<node COLOR="#435e98" CREATED="1540639550757" ID="ID_521896867" MODIFIED="1540639560108" TEXT="Root-TrackID"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1480694550601" ID="ID_391329400" MODIFIED="1538940840604" TEXT="TimelineController">
@ -18330,7 +18365,7 @@
<node CREATED="1480725680713" ID="ID_448125852" MODIFIED="1518487921081" TEXT="Delegate for Notification">
<icon BUILTIN="help"/>
</node>
<node CREATED="1480725704142" ID="ID_992732373" MODIFIED="1518487921081" TEXT="was bleibt abstrakt">
<node CREATED="1480725704142" ID="ID_992732373" MODIFIED="1540639469012" TEXT="was bleibt abstrakt?">
<node CREATED="1480725715916" ID="ID_890987188" MODIFIED="1539382658886" TEXT="buildMutator">
<richcontent TYPE="NOTE"><html>
<head>
@ -18351,11 +18386,14 @@
<icon BUILTIN="ksmiletris"/>
</node>
</node>
<node CREATED="1540639476279" ID="ID_298401557" MODIFIED="1540639483388" TEXT="vorerst Platzhalter">
<icon BUILTIN="bell"/>
</node>
<node CREATED="1480741498930" ID="ID_1605140473" MODIFIED="1518487921081" TEXT="hat nur einen einziten RootTrack">
</node>
<node CREATED="1480741498930" ID="ID_1605140473" MODIFIED="1540639496654" TEXT="hat nur einen einzigen RootTrack">
<icon BUILTIN="idea"/>
</node>
<node CREATED="1480742405505" FOLDED="true" ID="ID_1590367176" MODIFIED="1540506890163" TEXT="ACHTUNG: leere Sequenz?">
<node CREATED="1480742405505" FOLDED="true" ID="ID_1590367176" MODIFIED="1540639524195" TEXT="ACHTUNG: leere Sequenz?">
<richcontent TYPE="NOTE"><html>
<head>
@ -18768,6 +18806,26 @@
<linktarget COLOR="#fec680" DESTINATION="ID_562532566" ENDARROW="Default" ENDINCLINATION="-1077;-98;" ID="Arrow_ID_130009025" SOURCE="ID_758873433" STARTARROW="None" STARTINCLINATION="407;0;"/>
<icon BUILTIN="flag-yellow"/>
<node CREATED="1480639469981" ID="ID_983391388" MODIFIED="1518487921082" TEXT="Abstraktionen"/>
<node CREATED="1540647717236" ID="ID_1682094694" MODIFIED="1540647727446" TEXT="Konzept f&#xfc;r Gr&#xf6;&#xdf;en-Steuerung">
<node CREATED="1540647728418" ID="ID_71764405" MODIFIED="1540647733562" TEXT="grunds&#xe4;tzlich">
<node CREATED="1540647743681" ID="ID_344681852" MODIFIED="1540647754201" TEXT="soweit m&#xf6;glich bei der Automatik bleiben">
<icon BUILTIN="yes"/>
</node>
<node COLOR="#435e98" CREATED="1540647761611" ID="ID_841316619" MODIFIED="1540647860261" TEXT="Erweiterungs-Punkte">
<arrowlink COLOR="#59699c" DESTINATION="ID_1103556230" ENDARROW="Default" ENDINCLINATION="-876;0;" ID="Arrow_ID_72712594" STARTARROW="None" STARTINCLINATION="-1659;0;"/>
<icon BUILTIN="info"/>
<node CREATED="1540647890477" ID="ID_347383643" MODIFIED="1540647897303" TEXT="direkt die Properties setzen"/>
<node CREATED="1540647897963" ID="ID_155000915" MODIFIED="1540647930899" TEXT="an signal_size_allocate() anh&#xe4;ngen"/>
</node>
<node CREATED="1540647995231" ID="ID_37565869" MODIFIED="1540648006414" TEXT="wir kontrollieren nur die vertikale Ausdehnung"/>
<node CREATED="1540648007237" ID="ID_679717206" MODIFIED="1540648024798" TEXT="der Canvas folgt der Header-Struktur">
<node CREATED="1540648025554" ID="ID_1681608373" MODIFIED="1540648030710" TEXT="diese ist weitgehend automatisch"/>
<node CREATED="1540648036313" ID="ID_372148054" MODIFIED="1540648044821" TEXT="Quer-Verkoppelung schaffen">
<icon BUILTIN="yes"/>
</node>
</node>
</node>
</node>
<node CREATED="1480639473324" ID="ID_191170582" MODIFIED="1518487921082" TEXT="eval pass"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1480694550601" ID="ID_1306244096" MODIFIED="1538940563330" TEXT="Track-Presenter">
@ -18993,11 +19051,26 @@
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1480694550601" ID="ID_1999928728" MODIFIED="1538940662367" TEXT="Track-Anzeige">
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1480694550601" ID="ID_1999928728" MODIFIED="1540641165004" TEXT="Track-Anzeige">
<linktarget COLOR="#fec680" DESTINATION="ID_1999928728" ENDARROW="Default" ENDINCLINATION="-1077;-98;" ID="Arrow_ID_506785204" SOURCE="ID_1131206858" STARTARROW="None" STARTINCLINATION="407;0;"/>
<linktarget COLOR="#7696bb" DESTINATION="ID_1999928728" ENDARROW="Default" ENDINCLINATION="113;285;" ID="Arrow_ID_198017810" SOURCE="ID_1389266781" STARTARROW="None" STARTINCLINATION="-139;0;"/>
<icon BUILTIN="flag-yellow"/>
<node CREATED="1480607033512" ID="ID_1815699851" MODIFIED="1518487921082" TEXT="Kopf"/>
<node CREATED="1480607035712" ID="ID_1405339006" MODIFIED="1518487921082" TEXT="Rumpf"/>
<node CREATED="1480607033512" ID="ID_1815699851" MODIFIED="1518487921082" TEXT="Kopf">
<node CREATED="1540641296565" ID="ID_991484939" MODIFIED="1540652852076" TEXT="Navigations-Bereich">
<arrowlink DESTINATION="ID_1952536945" ENDARROW="Default" ENDINCLINATION="64;0;" ID="Arrow_ID_1459742640" STARTARROW="None" STARTINCLINATION="64;0;"/>
</node>
<node CREATED="1540641305092" ID="ID_18552766" MODIFIED="1540652856371" TEXT="Header-Pane">
<arrowlink DESTINATION="ID_151954769" ENDARROW="Default" ENDINCLINATION="50;0;" ID="Arrow_ID_1923805019" STARTARROW="None" STARTINCLINATION="50;0;"/>
</node>
</node>
<node CREATED="1480607035712" ID="ID_1405339006" MODIFIED="1518487921082" TEXT="Rumpf">
<node CREATED="1540641313667" ID="ID_1952536945" MODIFIED="1540652852075" TEXT="Time-Ruler">
<linktarget COLOR="#a9b4c1" DESTINATION="ID_1952536945" ENDARROW="Default" ENDINCLINATION="64;0;" ID="Arrow_ID_1459742640" SOURCE="ID_991484939" STARTARROW="None" STARTINCLINATION="64;0;"/>
</node>
<node CREATED="1540641317386" ID="ID_151954769" MODIFIED="1540652856371" TEXT="Canvas">
<linktarget COLOR="#a9b4c1" DESTINATION="ID_151954769" ENDARROW="Default" ENDINCLINATION="50;0;" ID="Arrow_ID_1923805019" SOURCE="ID_18552766" STARTARROW="None" STARTINCLINATION="50;0;"/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1480694550601" ID="ID_834517953" MODIFIED="1538940576088" TEXT="ClipPresenter">
<linktarget COLOR="#fec680" DESTINATION="ID_834517953" ENDARROW="Default" ENDINCLINATION="-1077;-98;" ID="Arrow_ID_483670351" SOURCE="ID_1570849604" STARTARROW="None" STARTINCLINATION="407;0;"/>
@ -19040,7 +19113,86 @@
<node CREATED="1538940690154" ID="ID_1132412756" MODIFIED="1538940691885" TEXT="collapsed"/>
<node CREATED="1538940692545" ID="ID_1827979765" MODIFIED="1538940694085" TEXT="expanded"/>
</node>
<node CREATED="1480607059909" ID="ID_703281238" MODIFIED="1518487921083" TEXT="Control"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1480607059909" ID="ID_703281238" MODIFIED="1540639027292" TEXT="Control">
<icon BUILTIN="flag-yellow"/>
<node CREATED="1540639047422" ID="ID_945522690" MODIFIED="1540639061056" TEXT="Timeline insgesamt">
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1540638806886" ID="ID_1690989313" MODIFIED="1540638890861" TEXT="bauen">
<icon BUILTIN="flag-yellow"/>
<node CREATED="1540639330313" ID="ID_335264895" MODIFIED="1540639371370" TEXT="top-level Population-Diff">
<icon BUILTIN="idea"/>
</node>
<node CREATED="1540639342856" ID="ID_1646839476" MODIFIED="1540639366799" TEXT="ausschlie&#xdf;lich per TimelineWidget-Ctor">
<icon BUILTIN="yes"/>
</node>
<node CREATED="1540639375028" ID="ID_690498169" MODIFIED="1540639381983" TEXT="erzeugt">
<node CREATED="1540639382945" ID="ID_1389266781" MODIFIED="1540641172028" TEXT="Widget-Struktur">
<arrowlink COLOR="#7696bb" DESTINATION="ID_1999928728" ENDARROW="Default" ENDINCLINATION="113;285;" ID="Arrow_ID_198017810" STARTARROW="None" STARTINCLINATION="-139;0;"/>
</node>
<node CREATED="1540639386795" ID="ID_35543915" MODIFIED="1540639390918" TEXT="Layout-Manager"/>
<node CREATED="1540639392170" ID="ID_1944083475" MODIFIED="1540639401302" TEXT="(root)-TrackPresenter"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1540638810920" ID="ID_481615571" MODIFIED="1540638890242" TEXT="zerst&#xf6;ren">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1540640109628" ID="ID_147809215" MODIFIED="1540640128945" TEXT="TODO: TimelineGui (proxy) mu&#xdf; kaskadieren">
<icon BUILTIN="flag-pink"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1540640144175" ID="ID_158939327" MODIFIED="1540640176132" TEXT="Zugang via TimelinePanel">
<icon BUILTIN="flag-yellow"/>
</node>
</node>
</node>
<node CREATED="1540639255700" ID="ID_1855001421" MODIFIED="1540639261031" TEXT="Anzeige..">
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1540639285684" ID="ID_1194974667" MODIFIED="1540639309937" TEXT="Scrollen">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1540639289320" ID="ID_1983393978" MODIFIED="1540639308885" TEXT="Rollen">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1540639291974" ID="ID_1116103118" MODIFIED="1540639308035" TEXT="Zoom">
<icon BUILTIN="flag-yellow"/>
</node>
</node>
<node CREATED="1540638842100" ID="ID_202893866" MODIFIED="1540638896769" TEXT="Track...">
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1540638853648" ID="ID_1229923831" MODIFIED="1540638888278" TEXT="hinzuf&#xfc;gen">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1540638857930" ID="ID_1666790008" MODIFIED="1540638887606" TEXT="l&#xf6;schen">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1540638882639" ID="ID_334962853" MODIFIED="1540638886927" TEXT="verschieben">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1540638923233" ID="ID_841357096" MODIFIED="1540638933422" TEXT="auf/zuklappen">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1540639232287" ID="ID_294651227" MODIFIED="1540639238304" TEXT="Placement">
<icon BUILTIN="flag-yellow"/>
</node>
</node>
<node CREATED="1540638984772" ID="ID_166725122" MODIFIED="1540638989225" TEXT="Marker....">
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1540638991848" ID="ID_822413142" MODIFIED="1540639009440" TEXT="platzieren">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1540638996751" ID="ID_1431308221" MODIFIED="1540639008975" TEXT="verschieben">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1540639002174" ID="ID_1757448745" MODIFIED="1540639008498" TEXT="entfernen">
<icon BUILTIN="flag-yellow"/>
</node>
</node>
<node CREATED="1540639065618" ID="ID_619025500" MODIFIED="1540639122522" TEXT="Clip........">
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1540639139572" ID="ID_740288619" MODIFIED="1540639241104" TEXT="einf&#xfc;gen">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1540639160480" ID="ID_1171854695" MODIFIED="1540639241743" TEXT="l&#xf6;schen">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1540639189634" ID="ID_836956028" MODIFIED="1540639242288" TEXT="mutieren">
<icon BUILTIN="flag-yellow"/>
</node>
</node>
</node>
</node>
</node>
<node CREATED="1479434763643" HGAP="48" ID="ID_1572413636" MODIFIED="1518487921083" TEXT="Clip" VSHIFT="32">
@ -39458,13 +39610,15 @@
<node CREATED="1535629105141" ID="ID_387236763" MODIFIED="1535629113123" TEXT="Layout">
<font NAME="SansSerif" SIZE="14"/>
<node CREATED="1535629144783" ID="ID_603397185" MODIFIED="1535629149074" TEXT="Phasen">
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1535629169164" ID="ID_1301809885" MODIFIED="1535629197406" TEXT="realized">
<icon BUILTIN="help"/>
<node CREATED="1537577511892" ID="ID_194223971" MODIFIED="1537577519599" TEXT="wird sichtbar"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1535629172787" ID="ID_1666976097" MODIFIED="1535629187584" TEXT="mapped">
<icon BUILTIN="help"/>
<node CREATED="1537577522482" ID="ID_629476344" MODIFIED="1537577533836" TEXT="einem GDK-Fenster mit Koordinaten zugeordnet"/>
<node CREATED="1540645314073" ID="ID_1765305895" MODIFIED="1540645326677" TEXT="ausgel&#xf6;st durch show/hide"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1535629169164" ID="ID_1301809885" MODIFIED="1540645271529" TEXT="realized">
<icon BUILTIN="help"/>
<node CREATED="1537577511892" ID="ID_194223971" MODIFIED="1537577519599" TEXT="wird sichtbar"/>
<node CREATED="1540645329431" ID="ID_919909299" MODIFIED="1540645361798" TEXT="initial bei Fenster-Allokation; sp&#xe4;ter als Folge von mapped"/>
</node>
</node>
<node CREATED="1535629240762" ID="ID_860094095" MODIFIED="1537576497171" STYLE="fork" TEXT="Platzierung">
@ -39474,6 +39628,9 @@
<node CREATED="1535629255856" ID="ID_66989854" MODIFIED="1535630246025" TEXT="size_request">
<node CREATED="1535629316512" ID="ID_82343540" MODIFIED="1535630246025" TEXT="minimale oder nat&#xfc;rliche Gr&#xf6;&#xdf;e"/>
<node CREATED="1535629328246" ID="ID_1797361390" MODIFIED="1535630246025" TEXT="Widget wird niemals kleiner gemacht"/>
<node CREATED="1540647597892" ID="ID_699204853" MODIFIED="1540647691526" TEXT="Widget::queue_resize">
<arrowlink DESTINATION="ID_1615887419" ENDARROW="Default" ENDINCLINATION="401;-36;" ID="Arrow_ID_1278323856" STARTARROW="None" STARTINCLINATION="1411;0;"/>
</node>
</node>
<node CREATED="1535629360298" ID="ID_872009465" MODIFIED="1535630246025" TEXT="Widget::property_expand()">
<node CREATED="1535629434440" ID="ID_384811116" MODIFIED="1535630246025" TEXT="bool">
@ -40411,6 +40568,73 @@
</node>
</node>
</node>
<node CREATED="1540643603185" ID="ID_1214860125" MODIFIED="1540643607552" TEXT="allgemein">
<node CREATED="1540643609173" ID="ID_1927927594" MODIFIED="1540643612527" TEXT="Lebenszyklus">
<node CREATED="1540645438704" ID="ID_1754311679" MODIFIED="1540645440676" TEXT="erzeugen"/>
<node CREATED="1540645441115" ID="ID_1343924195" MODIFIED="1540645445474" TEXT="verdrahten"/>
<node CREATED="1540645446023" ID="ID_1278449395" MODIFIED="1540645448986" TEXT="map"/>
<node CREATED="1540645449535" ID="ID_751713031" MODIFIED="1540645452398" TEXT="realize"/>
<node CREATED="1540645512438" ID="ID_1832277082" MODIFIED="1540645514362" TEXT="draw"/>
<node CREATED="1540645490897" ID="ID_1262425717" MODIFIED="1540645493292" TEXT="unrealize"/>
<node CREATED="1540645493913" ID="ID_1545070072" MODIFIED="1540645496660" TEXT="unmap"/>
<node CREATED="1540645497224" ID="ID_715226869" MODIFIED="1540645499003" TEXT="destroy"/>
</node>
<node CREATED="1540643613003" ID="ID_404660547" MODIFIED="1540643616911" TEXT="virtuelle Methoden">
<node CREATED="1540643621458" ID="ID_893370871" MODIFIED="1540643626934" TEXT="Widget hat eine Art VTable"/>
<node CREATED="1540643627593" ID="ID_1653985182" MODIFIED="1540643648235" TEXT="diese Methoden bilden den Lebenszyklus ab"/>
<node COLOR="#435e98" CREATED="1540643649134" ID="ID_863932581" LINK="https://developer.gnome.org/gtk3/stable/GtkWidget.html#GtkWidgetClass" MODIFIED="1540643665620" TEXT="Doku">
<font BOLD="true" NAME="SansSerif" SIZE="14"/>
<icon BUILTIN="idea"/>
</node>
<node CREATED="1540647187314" ID="ID_1715030005" MODIFIED="1540647189566" TEXT="C++">
<node CREATED="1540647217067" ID="ID_470384964" MODIFIED="1540647235266" TEXT="signal_size_allocate()">
<arrowlink COLOR="#1d47b3" DESTINATION="ID_1813983433" ENDARROW="Default" ENDINCLINATION="124;0;" ID="Arrow_ID_416269388" STARTARROW="None" STARTINCLINATION="58;0;"/>
</node>
<node CREATED="1540647190676" ID="ID_1813983433" MODIFIED="1540647235266" TEXT="on_size_allocate (Allocation&amp;)">
<linktarget COLOR="#1d47b3" DESTINATION="ID_1813983433" ENDARROW="Default" ENDINCLINATION="124;0;" ID="Arrow_ID_416269388" SOURCE="ID_470384964" STARTARROW="None" STARTINCLINATION="58;0;"/>
</node>
</node>
</node>
<node CREATED="1540645789033" ID="ID_1271246005" MODIFIED="1540645817464" TEXT="Framework-Verbindung">
<node CREATED="1540645818461" ID="ID_217892151" MODIFIED="1540645822016" TEXT="weitgehend automatisch"/>
<node CREATED="1540645822628" ID="ID_1316474474" MODIFIED="1540645861502" TEXT="alle Property-&#xc4;nderungen">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
...f&#252;hren automatisch dazu, da&#223; das Widget
</p>
<p>
ggfs. neu gemapped und invalidiert wird, woraufhin es neu gezeichnet wird
</p>
</body>
</html>
</richcontent>
</node>
<node CREATED="1540645864503" ID="ID_1092751510" MODIFIED="1540645865599" TEXT="Gtk::Widget::queue_draw_region">
<node CREATED="1540645872375" ID="ID_925460502" MODIFIED="1540645881728" TEXT="hiermit kann man explizit Neuzeichnen anfordern"/>
<node CREATED="1540645882388" ID="ID_1140702189" MODIFIED="1540645890310" TEXT="nur n&#xf6;tig bei custom-Draw">
<icon BUILTIN="yes"/>
</node>
</node>
<node CREATED="1540645903497" ID="ID_1615887419" MODIFIED="1540647691526" TEXT="Gtk::Widget::queue_resize">
<linktarget COLOR="#a9b4c1" DESTINATION="ID_1615887419" ENDARROW="Default" ENDINCLINATION="401;-36;" ID="Arrow_ID_1278323856" SOURCE="ID_699204853" STARTARROW="None" STARTINCLINATION="1411;0;"/>
<node CREATED="1540645905746" ID="ID_1768274251" MODIFIED="1540645931806" TEXT="wenn das Widget einen ge&#xe4;nderten Size-Request hat"/>
<node CREATED="1540645971349" ID="ID_1857749199" MODIFIED="1540645986822" TEXT="expliziter Aufruf normalerweise nie notwendig">
<font ITALIC="true" NAME="SansSerif" SIZE="12"/>
</node>
</node>
<node CREATED="1540646156591" ID="ID_1103556230" MODIFIED="1540647860262" TEXT="Gtk::Widget::size_allocate(Allocation const&amp;) ">
<linktarget COLOR="#59699c" DESTINATION="ID_1103556230" ENDARROW="Default" ENDINCLINATION="-876;0;" ID="Arrow_ID_72712594" SOURCE="ID_841316619" STARTARROW="None" STARTINCLINATION="-1659;0;"/>
<node CREATED="1540646197649" ID="ID_1973894224" MODIFIED="1540646206648" TEXT="kann ein Container auf einem Kind-Widget aufrufen"/>
<node CREATED="1540646207146" ID="ID_781482261" MODIFIED="1540646219378" TEXT="Folge: Framework adjustiert die Allocation (f&#xfc;r Margins)"/>
<node CREATED="1540646220099" ID="ID_219594395" MODIFIED="1540646249182" TEXT="und ruft die virtuelle Funktion adjust_size_allocation"/>
<node CREATED="1540646275479" ID="ID_1278063707" MODIFIED="1540646282845" TEXT="und invalideiert -&gt; redraw"/>
</node>
</node>
</node>
<node CREATED="1477526858307" ID="ID_676269117" MODIFIED="1518487921100" TEXT="custom widget">
<node COLOR="#ca1b00" CREATED="1477526864162" ID="ID_1385929770" LINK="https://developer.gnome.org/gtkmm-tutorial/stable/sec-custom-widgets.html.en" MODIFIED="1518487921100" TEXT="Beispiel">
<linktarget COLOR="#a9b4c1" DESTINATION="ID_1385929770" ENDARROW="Default" ENDINCLINATION="1055;0;" ID="Arrow_ID_1314305180" SOURCE="ID_426069181" STARTARROW="None" STARTINCLINATION="1055;0;"/>
@ -40433,6 +40657,33 @@
<linktarget COLOR="#a9b4c1" DESTINATION="ID_334736261" ENDARROW="Default" ENDINCLINATION="228;-492;" ID="Arrow_ID_84377619" SOURCE="ID_111059124" STARTARROW="None" STARTINCLINATION="930;-42;"/>
<icon BUILTIN="info"/>
</node>
<node CREATED="1540645596907" ID="ID_783586168" MODIFIED="1540645605245" TEXT="virtuelle Funktionen &#xfc;berlagern">
<node CREATED="1540645608249" ID="ID_1150066023" MODIFIED="1540645610485" TEXT="on_draw">
<node CREATED="1540645612137" ID="ID_1200550229" MODIFIED="1540645616076" TEXT="f&#xfc;r custom drawin"/>
</node>
</node>
<node CREATED="1540647442009" ID="ID_303011961" MODIFIED="1540647516091" TEXT="oder: an Signale anh&#xe4;ngen">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
ist of einfacher und der bevorzugete Weg.
</p>
<p>
Im Besonderen kann man sich an Signale <i>anderer Widgets</i>&#160;anh&#228;ngen
</p>
</body>
</html>
</richcontent>
<node CREATED="1540647521382" ID="ID_1112354648" MODIFIED="1540647527169" TEXT="signal_draw()">
<node CREATED="1540647528517" ID="ID_1601064030" MODIFIED="1540647544148" TEXT="man kann den gegebenen Cairo-Kontext &#xe4;ndern">
<icon BUILTIN="idea"/>
</node>
<node CREATED="1540647547755" ID="ID_577859258" MODIFIED="1540647565788" TEXT="die Clip-Region ist auf den tats&#xe4;chlich zu zeichnenden Bereich gesetzt"/>
</node>
</node>
</node>
<node CREATED="1476375676818" ID="ID_1029920942" MODIFIED="1518487921100" TEXT="Canvas">
<node CREATED="1476375696215" ID="ID_1397403295" MODIFIED="1518487921100" TEXT="GtkDrawingArea">