PyGObject: Gtk.Fixed Z-order

Question:

I’m using Gtk.Fixed and a viewport putting images that, sometimes, overlaps. How can I set the z-index like in html?

Asked By: David Davó

||

Answers:

Gtk.Fixed doesn’t support setting the z-order. It’s not meant for overlapping widgets, so the z-order is arbitrary and probably depends on what order the widgets were added in.

It’s not clear from your question what your intention is; if you are purposely overlapping widgets, use Gtk.Overlay instead. If you are not intending to overlap them, then you should use a more versatile container such as Gtk.Grid which will take the widgets’ sizes into account.

Answered By: ptomato

Like ptomato said, I had to use the Gtk.Overlay. I used an overlay with 3 Gtk.Layout, like layers and it works fine.

Answered By: David Davó

I only used the C bindings, but I’ll try my best to hopefully answer it correctly for the Python bindings as well.

Generally, since GTK4 you can move around your widget using

widget.insert_before (sibling, parent)

Where you might want to obtain the sibling (which will be in front of your widget) and it’s parent first.

The function expects the parent to be the parent of the sibling.
So it can be assumed that:

parent = sibling.get_parent ()

At least within a GtkFixed (but possibly other containers as well), siblings are sorted bottom to top, so the first child is the one that’s the furthest to the back. "Inserting before" thereby moves your widget behind.

Be aware though, that according to a maintainer, this should only be used within a custom widget and not on an application scale. This is also mentioned in the API of the functions.

From the documentation however, it’s not clear to me if this is considered legal. I doubt that this way is supported. However I also doubt, that GtkFixed keeps any track regarding the children order and therefore, I assume that moving children around within a GtkFixed is fine, although illegal.

Moving the widgets around like this also made my application crash, as long as the inspector is open, just as a heads up.

To iterate through the widgets, bottom to top, you can use sibling = parent.get_first_child() as well as sibling = parent.get_next_sibling()
or alternatively use the iterator defined on Widget.

Answered By: The19thFighter
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.