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 キーへの対応。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 | #!/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' , [ '<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)< / control>< / control>< / control>< / control> |
なんとか GNOME 標準アプリに近づいてきた。