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 標準アプリに近づいてきた。