何を今頃気になった。
Nautilus 3.6 からメニューがボタンになったけどアレは新規 Widget だった。
ギアアイコン側の呼び方は gears menu でいいのかな。
GtkMenuButton を作成すると矢印アイコンにはなるけどギアにするには?
今後設定はこのギアアイコンのボタンを使えになるかもしれないし探さなきゃ。
しかしいくら devhelp を漁ってもそんな方法は見つからない。
海外を検索してもよく解らない、ええい面倒だ!
ということで素直に Nautilus のソースコードを落として直接調べてみる。
image = Gtk.Image() image.set_from_icon_name("emblem-system-symbolic", Gtk.IconSize.MENU) menubutton.set_image(image)
とやっていた、いや元は当然 C 言語なんだけど。
ということは /usr/share/icons 以下のどこかにギアの画像がありそうだ。
/usr/share/icons/gnome/scalable/emblems/emblem-system-symbolic.svg
svg ファイルを見つけた、コレを貼り付けるってことか。
gnome ディレクトリ以下なら Ubuntu でも問題なく使えそうなので試してみる。
#!/usr/bin/env python #-*- coding:utf-8 -*- from gi.repository import Gtk GEARS_MENU = """<ui> <popup name="Popup"> <menuitem action="open"/> <menuitem action="quit"/> </popup> </ui>""" class GearsMenuWin(Gtk.Window): """ Gears Menu Sample """ def __init__(self): Gtk.Window.__init__(self) self.set_title("Nautilus 3.6 Menu") self.connect("delete-event", self.on_quit) # GtkUIManager uimanager = Gtk.UIManager() self.add_accel_group(uimanager.get_accel_group()) actiongroup = Gtk.ActionGroup("NautilusMenu") actiongroup.add_actions([ ("open", Gtk.STOCK_OPEN, None, None, "Null", self.on_open), ("quit", Gtk.STOCK_QUIT, None, None, "Quit", self.on_quit) ]) uimanager.insert_action_group(actiongroup, 0) uimanager.add_ui_from_string(GEARS_MENU) # PopupMenu popup = uimanager.get_widget("/Popup") popup.props.halign = Gtk.Align.CENTER # GtkMenuButton menubutton = Gtk.MenuButton.new() menubutton.set_popup(popup) # Arrow Direction #menubutton.set_direction(Gtk.ArrowType.UP) # Gear Image image = Gtk.Image() image.set_from_icon_name("emblem-system-symbolic", Gtk.IconSize.MENU) menubutton.set_image(image) # Widget etc... label = Gtk.Label("Nautilus 3.6 Menu") drawingarea = Gtk.DrawingArea() # Pack hbox = Gtk.Box.new(Gtk.Orientation.HORIZONTAL, 0) hbox.pack_start(label, True, True, 0) hbox.pack_start(menubutton, False, False, 0) vbox = Gtk.Box.new(Gtk.Orientation.VERTICAL, 0) vbox.pack_start(hbox, False, False, 0) vbox.pack_start(drawingarea, True, True, 0) self.add(vbox) # self.resize(320, 240) self.show_all() def on_open(self, action, data=None): pass def on_quit(self, action, data=None): Gtk.main_quit() GearsMenuWin() Gtk.main()
GNOME3 環境だけでなく Ubuntu 12.10 でもしっかり gears-menu になるようだ。
多分 GTK+ 3.6 以降が使える環境ならどのディストリでもいいと思うが保証はしない。
ストックメニューなので日本語化もアクセラレーターもバッチリ。
コレって右クリックメニューとも共用なんかもできるのかな。
GNOME は右クリックメニューを無くしたいのだろうけど当面は無理だよね。
#!/usr/bin/env python #-*- coding:utf-8 -*- from gi.repository import Gtk, Gdk class GearsMenuWin(Gtk.Window): """ This code accelerator keys are displayed """ def __init__(self): Gtk.Window.__init__(self) self.set_title("Nautilus 3.6 Menu") self.connect("delete-event", self.on_quit) # Add Accelerator accelgroup = Gtk.AccelGroup.new() self.add_accel_group(accelgroup) # MenuIten item_open = Gtk.ImageMenuItem.new_from_stock(Gtk.STOCK_OPEN, accelgroup) item_open.connect("activate", self.on_open) item_quit = Gtk.ImageMenuItem.new_from_stock(Gtk.STOCK_QUIT, accelgroup) item_quit.connect("activate", self.on_quit) # Show item_open.show() item_quit.show() # Menu popup = Gtk.Menu.new() popup.append(item_open) popup.append(item_quit) popup.props.halign = Gtk.Align.CENTER # GtkMenuButton menubutton = Gtk.MenuButton.new() menubutton.set_popup(popup) # Gear Image image = Gtk.Image() image.set_from_icon_name("emblem-system-symbolic", Gtk.IconSize.MENU) menubutton.set_image(image) # Widget etc... label = Gtk.Label("Nautilus 3.6 Menu") drawingarea = Gtk.DrawingArea() # Pack hbox = Gtk.Box.new(Gtk.Orientation.HORIZONTAL, 0) hbox.pack_start(label, True, True, 0) hbox.pack_start(menubutton, False, False, 0) vbox = Gtk.Box.new(Gtk.Orientation.VERTICAL, 0) vbox.pack_start(hbox, False, False, 0) vbox.pack_start(drawingarea, True, True, 0) self.add(vbox) # Mouse Right Button Clicked self.set_events(Gdk.EventMask.BUTTON_PRESS_MASK | Gdk.EventMask.STRUCTURE_MASK ) self.connect("button_press_event", self.on_button_press, popup) # self.resize(320, 240) self.show_all() def on_open(self, action, data=None): pass def on_quit(self, action, data=None): Gtk.main_quit() def on_button_press(self, widget, event, popup): if event.button == 3: popup.popup(None, None, None, None, 0, event.time) GearsMenuWin() Gtk.main()
ものは試しで GtkUIManager を使わずコードで書いてみたんだが…
コッチだとアクセラレーターキーが表示されているじゃないの、何故だ?
ついでにコードで作ると show() しないと GtkMenuItem が表示されないと今頃知った。
これが関係あるのかもと思って以下をやってみたけど関係ないようだ。
uimanager.get_widget("/Popup/open").show() # No...
どちらでも Ctrl+Q で終了できるからアクセラレーターは問題ないのだが。
とにかく表示する手段があるなら次期 Nautilus はキーを表示してほしいです。
とにかくストック svg を利用する方法もオマケで解ったし得した気分。