Search code examples
gtk3pygobject

Overlaying a GtkTextView on a GtkBox


I'm trying to overlay a Gtk.TextView on a Gtk.FlowBox, as shown below.

import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk

window = Gtk.Window()
window.set_default_size(200, 200)
window.connect("destroy", Gtk.main_quit)

overlay = Gtk.Overlay()
window.add(overlay)

flowbox = Gtk.FlowBox()
for _ in range(4):
    flowbox.add(Gtk.Button.new_with_label("Button"))

overlay.add(flowbox)

textbuffer = Gtk.TextBuffer()
textbuffer.set_text("Text TEXT")
textview = Gtk.TextView.new_with_buffer(textbuffer)
overlay.add_overlay(textview)
#overlay.set_overlay_pass_through(textview, True)

window.show_all()
Gtk.main()

Unfortunately all I can see is the TextView.


Solution

  • Here's the solution I came up with. (It is an amalgam of many other answers the links to which I no longer have and therefore can no longer credit.)

    import gi
    gi.require_version('Gtk', '3.0')
    from gi.repository import Gtk, Gdk
    
    CSS_DATA = b"""
            #tv
            {
                background-color: rgba(1, 1, 1, 0);
            }
    
            #tv text
            {
                background-color: rgba(1, 1, 1, 0);
            }
            """
    
    window = Gtk.Window()
    window.connect("destroy", Gtk.main_quit)
    
    style_provider = Gtk.CssProvider()
    style_provider.load_from_data(CSS_DATA)
    Gtk.StyleContext.add_provider_for_screen(
        Gdk.Screen.get_default(),
        style_provider,
        Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION
    )
            
    overlay = Gtk.Overlay()
    window.add(overlay)
    
    flowbox = Gtk.FlowBox()
    for _ in range(4):
        flowbox.add(Gtk.Button.new_with_label("Button"))
    
    overlay.add(flowbox)
    
    vbox = Gtk.VBox()
    textbuffer = Gtk.TextBuffer()
    textbuffer.set_text("Text TEXT")
    textview = Gtk.TextView.new_with_buffer(textbuffer)
    textview.set_name("tv")
    textview.set_halign(Gtk.Align.CENTER)
    textview.set_justification(Gtk.Justification.CENTER)
    textview.set_wrap_mode(Gtk.WrapMode.WORD)
    textview.set_size_request(100, -1)
    
    vbox.pack_start(textview, True, False, 0)
    overlay.add_overlay(vbox)
    
    window.show_all()
    Gtk.main()