From b500fcd8f4eadce84bec50f9fef1f22c20d70088 Mon Sep 17 00:00:00 2001 From: Ichthyostega Date: Tue, 27 Sep 2022 23:29:35 +0200 Subject: [PATCH] ElementBox: investigate adverse behaviour and work out solution ...the key point is to ask the embedded box holding the label about it's preferred_size() -- this info is updated immediately, even at begin, when the nested child widgets did not yet receive an allocation. Even while the preferred-size is something different than the actual allocation, it will always be smaller and is thus sufficient to decide if the size constraint can be met --- src/stage/timeline/track-presenter.hpp | 6 +- src/stage/widget/element-box-widget.cpp | 22 ++-- src/stage/widget/element-box-widget.hpp | 35 ++++++- wiki/thinkPad.ichthyo.mm | 134 +++++++++++++++++++++++- 4 files changed, 177 insertions(+), 20 deletions(-) diff --git a/src/stage/timeline/track-presenter.hpp b/src/stage/timeline/track-presenter.hpp index e98300b84..26769ac12 100644 --- a/src/stage/timeline/track-presenter.hpp +++ b/src/stage/timeline/track-presenter.hpp @@ -267,11 +267,11 @@ namespace timeline { new model::CanvasHooked{display_.hookedAt(x,y) , widget::Kind::MARK , widget::Type::LABEL - , widget::name("ΩΩΩΩΩ") + , widget::name("ΩΩΩ") , widget::constrained( - []() + [arbitrarySiz = 10 + rand() % 80]() -> int { - uint arbitrarySiz = 10 + rand() % 60; + cout << "PPPP:: arbitrary="< "< "<; +/////////////////////////////////////////////////////////////////////////////////////////////////////////////TICKET #1219 : TESTCODE : remove this + class HackedTxt + : public Gtk::Label + { + public: + using Gtk::Label::Label; + protected: + void + get_preferred_width_vfunc (int& mw, int& nw) const override + { + Gtk::Label::get_preferred_width_vfunc (mw,nw); + cout << "Haxx::"< - + @@ -18855,12 +18855,15 @@ - + + + - - + + + @@ -18887,14 +18890,131 @@ + + + + + + +
    +
  • + Zufallszahl wurde re-evaluiert im callback +
  • +
  • + darf nicht die Allokation verwenden, sondern stattdessen das Kind nach seiner preferred_size fragen +
  • +
+ +
+ +
+
+ + + + + + + + + +

+ ...was normalerweise ja auch irrelevant ist, denn per Voraussetzung sollte ein Container die Werte von seinen Kindern bereits bei seiner initialen Meldung berücksichtigt haben +

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+ Fazit: ja die Lösung funktioniert uns erscheint stabil +

+ +
+ +
- + + + + + + + + + + +

+ zwar machen wir im Ctor zuletzt ein show_all(), welches dann erst diese Layout-Berechnung anstößt. Aber zum Zeitpunkt der Allokations-Zuteilung für das Container-Widget (ElementBox selber) haben die nested-children noch keine Allokation bekommen; zwar gelten sie schon als "mapped" und "realized", aber offensichtlich führt eine Änderung des visible()-Status dazu, daß das damit ausgeblendete Kind-Widget schon gleich gar nicht gezeichnet wird +

+ +
+
+ + + + + + +

+ ersichtlich aus Trace-Meldungen, welche ich zur Analyse in den get_preferred_*-Funktionen und beim Setzen der Allokation hatte. Auch auf dem Kind-Elementen sehe ich keine erneuten Aufrufe +

+ +
+ +
+ + + +
@@ -18905,6 +19025,10 @@ + + + +