Fedora 22 にしてから一ヶ月近いが GTK3 関連でヤル気が出ない。
新規 Widget が GtkPopoverMenu くらいしかないので。
GtkPopover とたいして違わなそうだし。
多分 Nautilus のメニューがコレだと思うけど。
GTK+ Inspector で確認してみるか。
やはりっっってあれ、GtkModelButton って何?
devhelp で確認するとコレも 3.16 からの新規 Widget のようだ。
何故こんなにヒッソリと追加なのよ、よし調べて使ってみよう。
gtk3-demo には無い、海外を検索してもまだ誰もやっていない。
また devhelp のみが頼りか、いつものことだ。
GtkPopoverMenu: GTK+ 3 Reference Manual
GtkPopover のサブクラスなのでやはり GtkBox に積み重ねる必要あり。
action-name プロパティに GAction のアクション名指定だけでイケるっぽい。
今回は devhelp のように GtkBuilder でやってみました。
#!/usr/bin/env python3 from gi.repository import Gtk, Gio POPOVER = '''<interface> <object class="GtkPopoverMenu" id="menu"> <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="active">True</property> <property name="action-name">win.hello</property> <property name="text" translatable="yes">Hello</property> </object> </child> <child> <object class="GtkModelButton"> <property name="visible">True</property> <property name="action-name">win.world</property> <property name="text" translatable="yes">World</property> </object> </child> </object> </child> </object> </interface>''' class PopoverMenu(Gtk.ApplicationWindow): """ GtkPopoverMenu Test """ def __init__(self): Gtk.ApplicationWindow.__init__(self) # DrawingAre area = Gtk.DrawingArea.new() # Popup Button button = Gtk.Button.new_with_label("Option") button.connect("clicked", self.on_option_button_clicked) # ActionBar bar = Gtk.ActionBar.new() bar.pack_end(button) # # Popup Contents builder = Gtk.Builder.new_from_string(POPOVER, -1) self.menu = builder.get_object("menu") self.menu.set_relative_to(button) action = Gio.SimpleAction.new("hello", None) action.connect("activate", self.hello_cb) self.add_action(action) action2 = Gio.SimpleAction.new("world", None) action2.connect("activate", self.world_cb) self.add_action(action2) # # pack vbox = Gtk.Box.new(Gtk.Orientation.VERTICAL, 0) vbox.pack_start(area, True, True, 0) vbox.pack_start(bar, False, False, 0) # self self.add(vbox) self.connect("delete-event", Gtk.main_quit) self.set_title("PopUp") self.resize(300, 200) self.show_all() def hello_cb(self, action, parameter): self.set_title("Hello") def world_cb(self, action, parameter): self.set_title("World") def on_option_button_clicked(self, widget): """ Show Menu """ self.menu.show_all() PopoverMenu() Gtk.main()
Gedit や eog のプラグインを作っておいて良かった。
多分やっていなければ action-name property でドンズマリしていた。
つまり action-name プロパティには win のプリフィクスが必要。
win なんて自分ではどこにも定義していないけど固定値みたい。
GtkApplication を使わなくてもいるのね、なんでだろう。
margin は 10 にすると Nautilus のメニューとほぼ一致する。
妙にデカい気がするけど多分タッチパネル化の準備だろう。
GtkBuilder の XML で vertical と書くことができるのか。
あまり使わないから知らなかった、整数や文字列だけかと思っていた。
つか devhelp のサンプルコードにコレ入れてくれよ。
この程度なら GtkBuilder よりコードで作ったほうが簡単そう。
他人が読むことを考えると XML のほうが理解しやすいだろうけどNE。