Timeline: setup framework for custom drawing for the track structure
...just drawing a marker cross for now to indicate allocated size; speaking of size -- GTK sometimes expands allocation horizontally, while we'd prefer an absolutely fixed size for the purpose at hand.
This commit is contained in:
parent
70b8b86182
commit
4444e2b0ec
5 changed files with 161 additions and 34 deletions
|
|
@ -53,13 +53,14 @@ namespace stage {
|
|||
namespace timeline {
|
||||
|
||||
namespace {
|
||||
const uint REQUIRED_WIDTH_px = 30;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
StaveBracketWidget::StaveBracketWidget ()
|
||||
: DrawingArea{}
|
||||
: _Base{}
|
||||
{ }
|
||||
|
||||
|
||||
|
|
@ -67,6 +68,52 @@ namespace timeline {
|
|||
|
||||
|
||||
/** */
|
||||
bool
|
||||
StaveBracketWidget::on_draw (CairoC cox)
|
||||
{
|
||||
// invoke (presumably empty) base implementation....
|
||||
bool event_is_handled = _Base::on_draw (cox);
|
||||
|
||||
/////////////////////////////////////////////TICKET #1018 : placeholder drawing
|
||||
//
|
||||
int w = get_width();
|
||||
int h = get_allocated_height();
|
||||
cox->set_source_rgb(0.8, 0.0, 0.0);
|
||||
cox->set_line_width (5.0);
|
||||
cox->move_to(0, 0);
|
||||
cox->line_to(w, h);
|
||||
cox->move_to(w, 0);
|
||||
cox->line_to(0, h);
|
||||
cox->stroke();
|
||||
/////////////////////////////////////////////TICKET #1018 : placeholder drawing
|
||||
|
||||
return event_is_handled;
|
||||
}
|
||||
|
||||
|
||||
/** indicate layout oriented towards vertical extension */
|
||||
Gtk::SizeRequestMode
|
||||
StaveBracketWidget::get_request_mode_vfunc() const
|
||||
{
|
||||
return Gtk::SizeRequestMode::SIZE_REQUEST_WIDTH_FOR_HEIGHT;
|
||||
}
|
||||
|
||||
/**
|
||||
* The structural outline adapts flexible in vertical direction,
|
||||
* but requires a fixed horizontal size for proper drawing.
|
||||
*/
|
||||
void
|
||||
StaveBracketWidget::get_preferred_width_vfunc (int& minimum_width, int& natural_width) const
|
||||
{
|
||||
minimum_width = natural_width = REQUIRED_WIDTH_px;
|
||||
}
|
||||
|
||||
void
|
||||
StaveBracketWidget::get_preferred_width_for_height_vfunc (int, int& minimum_width, int& natural_width) const
|
||||
{
|
||||
get_preferred_width (minimum_width, natural_width);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -52,6 +52,8 @@
|
|||
namespace stage {
|
||||
namespace timeline {
|
||||
|
||||
using CairoC = Cairo::RefPtr<Cairo::Context> const&;
|
||||
|
||||
// class TrackPresenter;
|
||||
|
||||
|
||||
|
|
@ -64,13 +66,20 @@ namespace timeline {
|
|||
class StaveBracketWidget
|
||||
: public Gtk::DrawingArea
|
||||
{
|
||||
using _Base = Gtk::DrawingArea;
|
||||
|
||||
public:
|
||||
~StaveBracketWidget();
|
||||
|
||||
StaveBracketWidget ();
|
||||
|
||||
private:/* ===== Internals ===== */
|
||||
|
||||
|
||||
bool on_draw(CairoC cox) override;
|
||||
|
||||
Gtk::SizeRequestMode get_request_mode_vfunc() const final;
|
||||
void get_preferred_width_vfunc (int&, int&) const override;
|
||||
void get_preferred_width_for_height_vfunc (int, int&,int&) const override;
|
||||
};
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -66,18 +66,16 @@ namespace timeline {
|
|||
|
||||
TrackHeadWidget::TrackHeadWidget()
|
||||
: Gtk::Grid{}
|
||||
, nameTODO_{widget::Kind::ITEM, widget::Type::LABEL}
|
||||
, treeTODO_{"↳"}
|
||||
, trackName_{widget::Kind::ITEM, widget::Type::LABEL}
|
||||
, structure_{}
|
||||
, padding_{}
|
||||
, headCtrl_{}
|
||||
, childCnt_{0}
|
||||
{
|
||||
treeTODO_.set_xalign(0);
|
||||
treeTODO_.set_yalign(0.5);
|
||||
headCtrl_.set_valign(Gtk::Align::ALIGN_CENTER);
|
||||
headCtrl_.set_halign(Gtk::Align::ALIGN_FILL);
|
||||
this->attach (nameTODO_, 0,0, 2,1);
|
||||
this->attach (treeTODO_, 0,1, 1,2);
|
||||
this->attach (trackName_, 0,0, 2,1);
|
||||
this->attach (structure_, 0,1, 1,2);
|
||||
this->attach (headCtrl_, 1,1, 1,1); // corresponds to direct content
|
||||
this->attach (padding_, 1,2, 1,1);// used to sync with sub-track display
|
||||
this->property_expand() = false; // do not expand to fill
|
||||
|
|
@ -99,7 +97,7 @@ namespace timeline {
|
|||
void
|
||||
TrackHeadWidget::setTrackName (cuString& trackName)
|
||||
{
|
||||
nameTODO_.setName (trackName);
|
||||
trackName_.setName (trackName);
|
||||
}
|
||||
|
||||
uint
|
||||
|
|
@ -186,8 +184,8 @@ namespace timeline {
|
|||
uint act = 2 + childCnt_; // left,top
|
||||
Gtk::Grid::attach (subForkHead, 1, act, 1,1);
|
||||
// expand the structure display column....
|
||||
Gtk::Grid::remove (treeTODO_); // width,height
|
||||
Gtk::Grid::attach (treeTODO_, 0,1, 1, act);
|
||||
Gtk::Grid::remove (structure_); // width,height
|
||||
Gtk::Grid::attach (structure_, 0,1, 1, act);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -207,8 +205,8 @@ namespace timeline {
|
|||
uint act = 2 + childCnt_;
|
||||
Gtk::Grid::remove (subForkHead);
|
||||
// reduce the structure display column....
|
||||
Gtk::Grid::remove (treeTODO_);
|
||||
Gtk::Grid::attach (treeTODO_, 0,1, 1,act);
|
||||
Gtk::Grid::remove (structure_);
|
||||
Gtk::Grid::attach (structure_, 0,1, 1,act);
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -216,13 +214,13 @@ namespace timeline {
|
|||
TrackHeadWidget::clearFork()
|
||||
{
|
||||
if (not childCnt_) return;
|
||||
Gtk::Grid::remove (treeTODO_);
|
||||
Gtk::Grid::remove (structure_);
|
||||
while (childCnt_ > 0)
|
||||
{
|
||||
Gtk::Grid::remove_row (childCnt_);
|
||||
--childCnt_;
|
||||
}
|
||||
Gtk::Grid::attach (treeTODO_, 0,1, 1,2);
|
||||
Gtk::Grid::attach (structure_, 0,1, 1,2);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -81,8 +81,8 @@ namespace timeline {
|
|||
: public Gtk::Grid
|
||||
, public model::ViewHook<TrackHeadWidget>
|
||||
{
|
||||
widget::ElementBoxWidget nameTODO_;
|
||||
Gtk::Label treeTODO_;
|
||||
widget::ElementBoxWidget trackName_;
|
||||
StaveBracketWidget structure_;
|
||||
Gtk::Box padding_;
|
||||
HeadControlArea headCtrl_;
|
||||
|
||||
|
|
|
|||
|
|
@ -27999,16 +27999,17 @@
|
|||
<linktarget COLOR="#5a7c92" DESTINATION="ID_478580800" ENDARROW="Default" ENDINCLINATION="451;41;" ID="Arrow_ID_513449931" SOURCE="ID_1311832889" STARTARROW="None" STARTINCLINATION="481;-27;"/>
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1675898638485" ID="ID_164545383" MODIFIED="1675898669530" TEXT="Strukturdiagramm rendern">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node CREATED="1675898729441" ID="ID_1183614893" MODIFIED="1675898736887" TEXT="verwende direkt eine DrawingArea">
|
||||
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1675898638485" ID="ID_164545383" MODIFIED="1676047525964" TEXT="Strukturdiagramm rendern">
|
||||
<icon BUILTIN="pencil"/>
|
||||
<node COLOR="#435e98" CREATED="1675898729441" ID="ID_1183614893" MODIFIED="1676047503876" TEXT="verwende direkt eine DrawingArea">
|
||||
<icon BUILTIN="idea"/>
|
||||
<node COLOR="#435e98" CREATED="1675898738064" ID="ID_736159731" LINK="https://developer-old.gnome.org/gtkmm-tutorial/stable/chapter-drawingarea.html.en" MODIFIED="1675898751929" TEXT="Tutorial">
|
||||
<icon BUILTIN="idea"/>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1675901157415" ID="ID_1671076758" MODIFIED="1675902471695" TEXT="aber als Komponente abstrahiert">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node CREATED="1675901877549" ID="ID_1912760164" MODIFIED="1675902223113" TEXT="Name: StaveBracket">
|
||||
<node COLOR="#338800" CREATED="1675901157415" ID="ID_1671076758" MODIFIED="1676047495780" TEXT="aber als Komponente abstrahiert">
|
||||
<icon BUILTIN="yes"/>
|
||||
<node CREATED="1675901877549" ID="ID_1912760164" MODIFIED="1676042929930" TEXT="Name: StaveBracket">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
|
|
@ -28026,7 +28027,7 @@
|
|||
</li>
|
||||
</ul>
|
||||
<p>
|
||||
<sup>(*)</sup> <i>stave</i> ist zwar selterner und ausgeprägt Brittisch, <i>staff</i>  wäre geläufiger. Aber <i>staff</i> versteht man heutzutage als Personal, wohingegen <i>stave</i> auch die Leitersprosse sein könnte (BE und AE)
|
||||
<sup>(*)</sup> <i>stave</i> ist zwar selterner und ausgeprägt Brittisch, <i>staff</i>  wäre geläufiger. Aber <i>staff</i> versteht man heutzutage als Personal, wohingegen <i>stave</i> auch die Leitersprosse oder ein Vers in einem Gedicht sein könnte (BE und AE)
|
||||
</p>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
|
|
@ -28038,15 +28039,62 @@
|
|||
<node CREATED="1675902382537" ID="ID_861207485" MODIFIED="1675902467097" TEXT="Anknüpfung für Sub-Tracks"/>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1675902513027" ID="ID_1162268597" MODIFIED="1675902517275" TEXT="Implementierung">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1675902520928" ID="ID_468397914" MODIFIED="1675902527974" TEXT="Basisfunktionalität">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1675902529503" ID="ID_544667587" MODIFIED="1675902534696" TEXT="draw()-Funktion">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1675902513027" ID="ID_1162268597" MODIFIED="1676047476754" TEXT="Implementierung">
|
||||
<icon BUILTIN="pencil"/>
|
||||
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1675902520928" ID="ID_468397914" MODIFIED="1676047473663" TEXT="Basisfunktionalität">
|
||||
<icon BUILTIN="pencil"/>
|
||||
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1675902529503" ID="ID_544667587" MODIFIED="1676047464745" TEXT="draw()-Funktion">
|
||||
<icon BUILTIN="pencil"/>
|
||||
<node CREATED="1676045132371" ID="ID_1480458495" MODIFIED="1676045152492" TEXT="Bezugspunkt: Tutorial + BodyCanvasWidget"/>
|
||||
<node COLOR="#338800" CREATED="1676045153720" ID="ID_1064401846" MODIFIED="1676047466829" TEXT="on_draw() überlagern">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node COLOR="#435e98" CREATED="1676045162558" ID="ID_1938495472" LINK="#ID_1978068021" MODIFIED="1676046631665" TEXT="brauche Ausdehnng des Widgets">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<p>
|
||||
...und zwar die konkret wirksame Ausdehnung ⟹ meiner Analyse zufolge ist das get_width|height()
|
||||
</p>
|
||||
<ul>
|
||||
<li>
|
||||
das ist die vom Framework gesetzte Allokation
|
||||
</li>
|
||||
<li>
|
||||
aber vor dem Abspeichern bereits um Dekoration verringert
|
||||
</li>
|
||||
<li>
|
||||
zuzüglich aller Anpassungen für das Flow-Layout
|
||||
</li>
|
||||
</ul>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1676046608013" ID="ID_1701009358" MODIFIED="1676047576094" TEXT="erst mal einfachen Platzhalter zeichnen">
|
||||
<linktarget COLOR="#60a5a0" DESTINATION="ID_1701009358" ENDARROW="Default" ENDINCLINATION="234;0;" ID="Arrow_ID_1201169468" SOURCE="ID_1689678210" STARTARROW="None" STARTINCLINATION="8;-5;"/>
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1675902536517" ID="ID_827367364" MODIFIED="1675902552151" TEXT="Anpassung an Allocation">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1676046656020" ID="ID_739149798" MODIFIED="1676047456082" TEXT="horizontale Ausdehnung steuern">
|
||||
<icon BUILTIN="pencil"/>
|
||||
<node COLOR="#435e98" CREATED="1676046671288" ID="ID_823909101" MODIFIED="1676047541409" TEXT="intrinsich feste Ausdehnung erforderlich, nun Höhe variabel">
|
||||
<icon BUILTIN="yes"/>
|
||||
</node>
|
||||
<node COLOR="#435e98" CREATED="1676046707056" ID="ID_1489341239" MODIFIED="1676047541408" TEXT="aber GTK weist ggfs auch gar keine Ausdehnung zu, oder teilt 50:50">
|
||||
<icon BUILTIN="messagebox_warning"/>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1676047544344" ID="ID_1689678210" MODIFIED="1676047576094" TEXT="...jetzt wird schon mal grundsätzlich korrekt gezeichnet">
|
||||
<arrowlink COLOR="#60a5a0" DESTINATION="ID_1701009358" ENDARROW="Default" ENDINCLINATION="234;0;" ID="Arrow_ID_1201169468" STARTARROW="None" STARTINCLINATION="8;-5;"/>
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1676047436191" ID="ID_1883772058" MODIFIED="1676047452394" TEXT="Problem: GTK weist manchmal trotzdem mehr zu">
|
||||
<icon BUILTIN="broken-line"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1675902610612" ID="ID_1308174165" MODIFIED="1675902619939" TEXT="Struktur-Schema">
|
||||
|
|
@ -29437,10 +29485,26 @@
|
|||
<arrowlink COLOR="#536cc0" DESTINATION="ID_1464608958" ENDARROW="Default" ENDINCLINATION="-1020;1248;" ID="Arrow_ID_1013900284" STARTARROW="None" STARTINCLINATION="-2004;139;"/>
|
||||
<icon BUILTIN="info"/>
|
||||
</node>
|
||||
<node CREATED="1672843882154" ID="ID_1978068021" MODIFIED="1672845093813" TEXT="Widget::get_allocation|width|height (aktuell gültiger Wert incl Alignment/Modifikationen)">
|
||||
<node BACKGROUND_COLOR="#c6ccd6" COLOR="#2c2a74" CREATED="1672843882154" ID="ID_1978068021" MODIFIED="1676045024820" TEXT="Beachte Unterschiede in der Bedeutung der Getter">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<ul>
|
||||
<li>
|
||||
get_allocation|width|height  ⟼  aktuell gültiger Wert incl Alignment/Modifikationen
|
||||
</li>
|
||||
<li>
|
||||
get_allocated_size  ⟼  was gesetzt wurde, aber bereits ohne Dekoration
|
||||
</li>
|
||||
</ul>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
<arrowlink COLOR="#727fbb" DESTINATION="ID_464303848" ENDARROW="Default" ENDINCLINATION="-1975;186;" ID="Arrow_ID_1946781864" STARTARROW="None" STARTINCLINATION="-1869;99;"/>
|
||||
<linktarget COLOR="#a9b4c1" DESTINATION="ID_1978068021" ENDARROW="Default" ENDINCLINATION="323;11;" ID="Arrow_ID_920771700" SOURCE="ID_400583877" STARTARROW="None" STARTINCLINATION="462;0;"/>
|
||||
<icon BUILTIN="messagebox_warning"/>
|
||||
</node>
|
||||
<node CREATED="1672843927836" ID="ID_477932212" MODIFIED="1672844195140" TEXT="Widget::get_allocated_size (was gesetzt wurde, aber bereits ohne Dekoration)"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
|
|
@ -67683,8 +67747,9 @@
|
|||
</node>
|
||||
<node CREATED="1663946250024" ID="ID_1142643633" MODIFIED="1663946255308" TEXT="Layout management">
|
||||
<node CREATED="1663946256977" ID="ID_1464608958" MODIFIED="1672843870753" TEXT="Thema: Size-Handling">
|
||||
<arrowlink COLOR="#7584a4" DESTINATION="ID_464303848" ENDARROW="Default" ENDINCLINATION="115;-178;" ID="Arrow_ID_1938018383" STARTARROW="None" STARTINCLINATION="328;-32;"/>
|
||||
<linktarget COLOR="#536cc0" DESTINATION="ID_1464608958" ENDARROW="Default" ENDINCLINATION="-1020;1248;" ID="Arrow_ID_1013900284" SOURCE="ID_1969670799" STARTARROW="None" STARTINCLINATION="-2004;139;"/>
|
||||
<node COLOR="#435e98" CREATED="1612527499386" HGAP="34" ID="ID_615948747" MODIFIED="1664401278771" TEXT="Untersuchung: size_request — 2/21 + 9/22 für Clip-Display" VSHIFT="-49">
|
||||
<node COLOR="#435e98" CREATED="1612527499386" FOLDED="true" HGAP="34" ID="ID_615948747" MODIFIED="1664401278771" TEXT="Untersuchung: size_request — 2/21 + 9/22 für Clip-Display" VSHIFT="-49">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
|
|
@ -68770,6 +68835,13 @@
|
|||
<arrowlink COLOR="#6396d3" DESTINATION="ID_1112354648" ENDARROW="Default" ENDINCLINATION="332;0;" ID="Arrow_ID_322983898" STARTARROW="None" STARTINCLINATION="130;7;"/>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1676044302875" ID="ID_464303848" MODIFIED="1676044946926" TEXT="Bedeutung der Size-Getter">
|
||||
<linktarget COLOR="#727fbb" DESTINATION="ID_464303848" ENDARROW="Default" ENDINCLINATION="-1975;186;" ID="Arrow_ID_1946781864" SOURCE="ID_1978068021" STARTARROW="None" STARTINCLINATION="-1869;99;"/>
|
||||
<linktarget COLOR="#7584a4" DESTINATION="ID_464303848" ENDARROW="Default" ENDINCLINATION="115;-178;" ID="Arrow_ID_1938018383" SOURCE="ID_1464608958" STARTARROW="None" STARTINCLINATION="328;-32;"/>
|
||||
<icon BUILTIN="idea"/>
|
||||
<node CREATED="1676044329100" ID="ID_1232423582" MODIFIED="1676044983946" TEXT="Widget::get_allocation|width|height (aktuell gültiger Wert incl Alignment/Modifikationen)"/>
|
||||
<node CREATED="1672843927836" ID="ID_477932212" MODIFIED="1672844195140" TEXT="Widget::get_allocated_size (was gesetzt wurde, aber bereits ohne Dekoration)"/>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1672842863450" ID="ID_1781957682" MODIFIED="1672842867742" TEXT="mapping">
|
||||
<node CREATED="1672842868697" ID="ID_871975923" MODIFIED="1672842877133" TEXT="Widget wird einem GDK-Window zugeordnet"/>
|
||||
|
|
@ -68862,7 +68934,8 @@
|
|||
</node>
|
||||
<node CREATED="1663967697587" ID="ID_502729133" MODIFIED="1663967701287" TEXT="Platz-Zuteilung">
|
||||
<node CREATED="1663967702275" ID="ID_1441338062" MODIFIED="1663967710309" TEXT="macht normalerweise das Framework(GTK)"/>
|
||||
<node CREATED="1663967711002" ID="ID_1524127663" MODIFIED="1663967716503" TEXT="Container machen das für ihre Kinder">
|
||||
<node CREATED="1663967711002" FOLDED="true" ID="ID_1524127663" MODIFIED="1663967716503" TEXT="Container machen das für ihre Kinder">
|
||||
<icon BUILTIN="info"/>
|
||||
<node CREATED="1663967756387" ID="ID_1440467863" MODIFIED="1663967792184" TEXT="Einstieg: Gtk::Widget::size_allocate | ggfs. incl »Baseline«">
|
||||
<node CREATED="1663967838832" ID="ID_930797784" MODIFIED="1663967902777" TEXT="void gtk_widget_size_allocate (GtkWidget *widget, GtkAllocation *allocation)">
|
||||
<font NAME="Monospaced" SIZE="12"/>
|
||||
|
|
|
|||
Loading…
Reference in a new issue