PyGObject: Set Child Property

GtkPopoverMenu の submenu 続き。
Child Properties にある submenu にコードでアクセスする手段が解った。

gtk_container_child_set_property って関数があるヤン!
devhelp で GtkContainer の所を見るだけで解決してしまった。

それと GtkPopoverMenu の Description を見ると
親メニューに戻るボタンを最初に入れる、inverted, centered を使え。
そしてメインメニュー名は ‘main’ です、とある。

何だ、全部 devhelp に書いてあった。

英語が読めない?それは読もうとしないだけだ。
筆者だって Google 翻訳が無かったらこんなことワカランわい。

おまけで。
GtkPopoverMenu の use-markup は勝手に True にセットされるようだ。
visible も show_all を使うなら特に設定は不要、今まで無駄を書いていた。
メニューボタンも GNOME アプリは GtkMenuButton を使っているみたい。

そんなこんなで。
前回のサンプルコードをコードだけで書き直し。
プラス、メインメニューに戻るメニューの追加。
プラス、GtkMenuButton に変更及び F10 キーへの対応。

#!/usr/bin/env python3

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

class Win(Gtk.ApplicationWindow):
    '''
        GtkPopoverMenu submenu Sample
        Do not use GtkBuilder
    '''
    def __init__(self, app):
        Gtk.ApplicationWindow.__init__(self, application=app, title='Py')
        # First Contents
        menu_open  = Gtk.ModelButton(action_name='app.new_window_action', text='_New Window')
        menu_new   = Gtk.ModelButton(menu_name = 'tool_page', text='_Tool')
        menu_quit  = Gtk.ModelButton(action_name='app.quit_action', text='_Quit Application')
        #
        vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, margin=10)
        vbox.pack_start(menu_open, False, False, 0)
        vbox.pack_start(menu_new, False, False, 0)
        vbox.pack_start(Gtk.Separator(), False, False, 0)
        vbox.pack_start(menu_quit, False, False, 0)
        # Second Contents
        menu_back   = Gtk.ModelButton(menu_name = 'main', inverted=True, centered=True, text='_Tool')
        menu_set    = Gtk.ModelButton(action_name='app.set_title_action', text='_Set Titlebar Text')
        menu_append = Gtk.ModelButton(action_name='app.append_title_action', text='_Append Titlebar Text')
        #
        tool_box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, margin=10)
        tool_box.pack_start(menu_back, False, False, 0)
        tool_box.pack_start(menu_set, False, False, 0)
        tool_box.pack_start(menu_append, False, False, 0)
        # GtkPopoverMenu
        self.popovermenu = Gtk.PopoverMenu()
        self.popovermenu.add(vbox)
        self.popovermenu.add(tool_box)
        self.popovermenu.child_set_property(tool_box, 'submenu', 'tool_page')
        # MenuButton
        open_image = Gtk.Image(icon_name='open-menu-symbolic', icon_size=Gtk.IconSize.MENU)
        self.menu_button = Gtk.MenuButton(image=open_image, popover=self.popovermenu)
        self.menu_button.connect('toggled', self.on_menu_button_toggled)
        # GtkHeaderBar
        hbar = Gtk.HeaderBar(show_close_button=True)
        hbar.pack_end(self.menu_button)
        self.set_titlebar(hbar)
        # F10
        accelgroup = Gtk.AccelGroup()
        self.add_accel_group(accelgroup)
        accelgroup.connect(Gdk.KEY_F10, 0, Gtk.AccelFlags.VISIBLE, self.on_f10)
        # self
        self.resize(240, 200)
        self.show_all()

    def on_f10(self, group, acceleratable, keyval, modifier):
        self.menu_button.clicked()

    def on_menu_button_toggled(self, button):
        if button.props.active:
            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', ['N'])
        self.set_accels_for_action('app.set_title_action', ['S'])
        self.set_accels_for_action('app.append_title_action', ['A'])
        self.set_accels_for_action('app.quit_action', ['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)

なんとか GNOME 標準アプリに近づいてきた。