PyGObject: GtkPopoverMenu submenu

PyGObject Tips の書き換え作業で次はメニューなんだが。。。。。
GtkPopoverMenu の submenu で想像以上に詰まっている。
GtkPopoverMenu | Child Properties にある submenu にアクセスする手段が全然解らない。
この項目はもっと上部に置いていたけどこの理由で下げたのは多分バレていない。

GI.Gtk.Objects.PopoverMenu

遠回りしまくってやっとこんなのを見つける。
筆者は経験値でなんとなく解るけどさ、こんなサンプルで理解できる人いるのか?
ということで、そのまんま動くサンプルコードを書いてみる。

#!/usr/bin/env python3

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

XMLTEXT = '''<interface>
<object class="GtkPopoverMenu" id="MyMenu">
  <child>
    <object class="GtkBox">
      <property name="visible">True</property>
      <property name="margin">10</property>
      <property name="orientation">vertical</property>
      <child>
        <object class="GtkModelButton">
          <property name="visible">True</property>
          <property name="action-name">app.new_window_action</property>
          <property name="text" translatable="yes">_New Window</property>
        </object>
      </child>
      <child>
        <object class="GtkModelButton">
          <property name="visible">True</property>
          <property name="menu-name">more</property>
          <property name="text" translatable="yes">More</property>
        </object>
      </child>
      <child>
        <object class="GtkModelButton">
          <property name="visible">True</property>
          <property name="action-name">app.quit_action</property>
          <property name="text" translatable="yes">_Quit Application</property>
        </object>
      </child>
    </object>
  </child>
  <child>
    <object class="GtkBox">
      <property name="visible">True</property>
      <property name="margin">10</property>
      <property name="orientation">vertical</property>
      <child>
        <object class="GtkModelButton">
          <property name="visible">True</property>
          <property name="action-name">app.set_title_action</property>
          <property name="text" translatable="yes">Set Titlebar Text</property>
        </object>
      </child>
      <child>
        <object class="GtkModelButton">
          <property name="visible">True</property>
          <property name="action-name">app.append_title_action</property>
          <property name="text" translatable="yes">Append Titlebar Text</property>
        </object>
      </child>
    </object>
    <packing>
      <property name="submenu">more</property>
    </packing>
  </child>
</object>
</interface>'''

class Win(Gtk.ApplicationWindow):
    '''
        GtkPopoverMenu submenu Sample
        from GtkBuilder
    '''
    def __init__(self, app):
        Gtk.ApplicationWindow.__init__(self, application=app, title='Py')
        # Menu Button
        button = Gtk.Button.new_from_icon_name('open-menu-symbolic', Gtk.IconSize.MENU)
        button.connect('clicked', self.on_menu_button_clicked)
        # Create Popover Menu
        builder = Gtk.Builder.new_from_string(XMLTEXT, -1)
        self.popovermenu = builder.get_object('MyMenu')
        self.popovermenu.props.relative_to = button
        # Add GtkHeaderBar
        hbar = Gtk.HeaderBar(show_close_button=True)
        hbar.pack_end(button)
        # self
        self.set_titlebar(hbar)
        self.show_all()

    def on_menu_button_clicked(self, widget):
        self.popovermenu.show_all()

class App(Gtk.Application):
    def __init__(self):
        Gtk.Application.__init__(self)

    def do_startup(self):
        Gtk.Application.do_startup(self)
        # GAction
        new_window_action = Gio.SimpleAction(name='new_window_action')
        set_title_action = Gio.SimpleAction(name='set_title_action')
        append_title_action = Gio.SimpleAction(name='append_title_action')
        quit_action = Gio.SimpleAction(name='quit_action')
        # Add
        self.add_action(new_window_action)
        self.add_action(set_title_action)
        self.add_action(append_title_action)
        self.add_action(quit_action)
        # Keyboard Shortecut
        self.set_accels_for_action('app.new_window_action', ['<Control>N'])
        self.set_accels_for_action('app.set_title_action', ['<Control>S'])
        self.set_accels_for_action('app.append_title_action', ['<Control>A'])
        self.set_accels_for_action('app.quit_action', ['<Control>Q'])
        # Signal
        new_window_action.connect('activate', self.on_new_window_action)
        set_title_action.connect('activate', self.on_set_title_action)
        append_title_action.connect('activate', self.on_append_title_action)
        quit_action.connect('activate', self.on_quit_action)
        # Window
        Win(self)

    def on_set_title_action(self, action, parameter):
        self.props.active_window.props.title = 'Hello'

    def on_append_title_action(self, action, parameter):
        self.props.active_window.props.title += 'Hello'

    def on_new_window_action(self, action, parameter):
        Win(self)

    def on_quit_action(self, action, parameter):
        self.quit()

    def do_activate(self):
        self.props.active_window.present()

app = App()
app.run(sys.argv)

なんとかサブメニューを表示することができた。
だけど Totem や Gedit のように上部に「戻るボタン」は出ない。
そもそも submenu Property にどうアクセスできているのかさえ XML ではワカンネ!

筆者は「コードだけでアプリを作りたい」人なんじゃい!
は置いておいて。
何がどうなってこうなったかを理解できていないと絶対に詰まる、もっと勉強だ。