[gelöst] Wie absolute Position eines widgets im Gesamt-Bildschirm ermitteln ?

  • Hallo


    Wenn ich ein Widget in einem Skin-Screen mit <widget Name="testwidget" pos="10,10"...> positioniere, dann kann ich im Code diese Position ja mit
    self["testwidget"].instance.position().x() und
    self["testwidget"].instance.position().y() abfragen.


    Allerdings ist das nur dann auch die absolute Position im Gesamt-Bildschirm (+ Screen top, left), wenn man im Skin-Screen wfNoBorder verwendet.
    <screen Name="testScreen" pos="200,200" flags="wfNoBorder" …>
    Lasse ich das wfNoBorder jedoch weg, verschiebt sich die absolute Position des Widgets im Gesamt-Bildschirm immer um noch die Titelhöhe des Screens (für y) nach unten und eine evtl. Rahmenbreite des Screens (für x) nach rechts.


    Das hängt ja damit zusammen, dass sich die absolute Screen-Position damit auch verschiebt.
    Bei <screen Name="testScreen" pos="200,200" flags="wfNoBorder" …> 
    ist self.instance.position().x() = 200 und self.instance.position().y() = 200
    Bei <screen Name="testScreen" pos="0,0" …> (ohne wfNoBorder)
    ist z.B. self.instance.position().x() = 183 und self.instance.position().y() = 155


    Damit könnte man den Versatz des Widgets ja berechnen, allerdings müsste ich im Code dann wissen, welche Original-Position im Skin (200, 200) ursprünglich angegeben war.


    Nun die Frage:
    - kann man auch die absolute Position eines Widgets im Gesamt-Bildschirm abfragen/ermitteln ?
    (self["testwidget"].instance.position() ist ja nur die relative Position innerhalb des Screens)
    - kann man irgendwie die Originalscreen-Position des Screens aus dem Skin abfragen, damit man dann den Versatz berechnen kann ?

    Gruß Sven (aka Dreamy)


    DM920 mit unstable OE2.5 DP
    One mit unstable OE2.6 DP

  • die original size etc bekommst du in parseskinattibutes raus. if attribute == size oder so.
    schau mal in dem running text rendere, da hab ich ja ne size2 hinzugefuegt.

  • Ja, den Skin auslesen wäre eine Variante.
    Dachte aber eher, es gibt da einen Einzeiler :winking_face:


    Ich hab inzwischen noch das gefunden:


    self["testwidget"].instance.getAbsolutPosition()


    Da ist dann schonmal die Screen-Position (top, left) eingerechnet.


    Allerdings ändert sich der Wert nicht mit/ohne wfNoBorder, so dass die Title-Höhe und Rahmenbreite noch fehlen.

    Gruß Sven (aka Dreamy)


    DM920 mit unstable OE2.5 DP
    One mit unstable OE2.6 DP

  • Ja, intern im Skin schon.


    Ich benötige aber die absolute Position, weil ich einen anderen Screen (instantiateDialog) über einem Skin-Element positionieren will.

    Gruß Sven (aka Dreamy)


    DM920 mit unstable OE2.5 DP
    One mit unstable OE2.6 DP

  • ähm .. nochmal , es gibt keine versatz, weder im Skin noch irgend wo anders. Da mußt du überhaupt nichts rechnen.



    Woher sollen den die Screens in den Plugins zB wissen, wie groß die Bodersets im Skin sind ?

    DM 920 UHD sss :smiling_face_with_heart_eyes:

  • Dann ermittle doch im Plugin mal self.instance.position().y() einmal mit wfnoborder und einmal ohne wfnoborder.


    Dann wirst du sehen, dass der Screen dann an unterschiedlichen Positionen sitzt.
    Und dieser Unterschied ist der Versatz, den ich meine.


    Für die Elemente im Screen spielt das natürlich keine Rolle, so dass das beim Skinnen völlig egal ist.


    Das versteht vermutlich nur ein „Programmierer“.
    Wenn ich dir meine halbfertige Idee zeigen würde, würdest du es auch verstehen :winking_face:

    Gruß Sven (aka Dreamy)


    DM920 mit unstable OE2.5 DP
    One mit unstable OE2.6 DP

  • Ich hab da aber noch eine Idee.
    Ich kann den Versatz ja über den „eigenen“ instantiateDialog-Screen ermitteln.
    Wobei ich dann immer noch wissen müsste, ob der eigentliche Screen mit oder ohne wfNoBorder ist.


    Das probiere ich Abend mal :winking_face:

    Gruß Sven (aka Dreamy)


    DM920 mit unstable OE2.5 DP
    One mit unstable OE2.6 DP

  • Ich hab in der widget.h noch das gefunden:


    /* enable this if you need the absolute position of the widget */
    void setPositionNotifyChild(int n) { m_notify_child_on_position_change = 1; }


    Da muss ich mal sehen, wie man das dann in Python nutzt :winking_face:
    Klingt zumindest schon mal gut.

    Gruß Sven (aka Dreamy)


    DM920 mit unstable OE2.5 DP
    One mit unstable OE2.6 DP

  • Mit setPositionNotifyChild bin ich nicht weitergekommen.


    Ich hab jetzt mit dem eigenen Screen den Versatz des Skins (Borderset) ermittelt.
    Wenn man den Screen im Skin auf pos=0,0 setzt und wfNoBorder weglasst, dann ist das Borderset außerhalb des Bildschirms.
    Dabei wird dann bei self.instance.position ein negativer Wert (x, y) angezeigt, soweit es einen Versatz durch den Skin gibt.


    Ob der Hauptscreen mit wfNoBorder läuft oder nicht, hab ich mit self.instance.size und self.instance.csize gelöst.
    Wenn csize != size, dann gibt es eine Vergrößerung des Skins durch das Borderset.
    (csize ist dann die GesamtBreite des Screens inkl. Borderset, size ist nur der Screenbereich, wo die Elemente sind)


    Problem also gelöst :winking_face:

    Gruß Sven (aka Dreamy)


    DM920 mit unstable OE2.5 DP
    One mit unstable OE2.6 DP