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