現在 Comipoli の GTK4 化の準備をしているんだが。
まずメニュー。
GTK3 は GtkModelButton を GtkBox に入れソレを GtkPopoverMenu に。
だったけど GTK4 は GtkModelButton が廃止されている。
なので GTK4 は GMenuItem を GtkPopoverMenu に入れろとあるんだが。
GMenuItem をコードで作る方法はどこにも書いていない。
しかたがないので XML で作る。
それから、GtkButton の image プロパティが廃止されていた。
代わりに icon-name が追加、つまり GtkImage を時前で用意しなくてもいい。
#!/usr/bin/env python3 from gi.repository import Gtk menu_model = ''' <?xml version="1.0" encoding="UTF-8"?> <interface> <menu id='comipoli-menu'> <section> <item> <attribute name='label' translatable='yes'>_Open</attribute> <attribute name='action'>app.new_file_action</attribute> </item> <item> <attribute name='label' translatable='yes'>_New Window</attribute> <attribute name='action'>app.new_window_action</attribute> </item> <item> <attribute name='label' translatable='yes'>_Preference</attribute> <attribute name='action'>app.preference_action</attribute> </item> <item> <attribute name='label' translatable='yes'>_Keyboard Shortcut</attribute> <attribute name='action'>app.shortcut_action</attribute> </item> <item> <attribute name='label' translatable='yes'>_About</attribute> <attribute name='action'>app.about_action</attribute> </item> <item> <attribute name='label' translatable='yes'>_Quit</attribute> <attribute name='action'>app.quit_action</attribute> </item> </section> </menu> </interface> ''' class ComipoliMenuButton(Gtk.MenuButton): def __init__(self): ''' GTK3 # MenuIten menu_open = Gtk.ModelButton(active=True, action_name='app.new_file_action', text='_Open', use_markup=True) menu_new = Gtk.ModelButton(active=True, action_name='app.new_window_action', text='_New Window', use_markup=True) menu_pref = Gtk.ModelButton(active=True, action_name='app.preference_action', text='_Preference', use_markup=True) menu_kbd = Gtk.ModelButton(active=True, action_name='app.shortcut_action', text='_Keyboard Shortcut', use_markup=True) menu_about = Gtk.ModelButton(active=True, action_name='app.about_action', text='_About', use_markup=True) menu_quit = Gtk.ModelButton(active=True, action_name='app.quit_action', text='_Quit', use_markup=True) # Box vbox = Gtk.Box(visible=True, margin=10, orientation=Gtk.Orientation.VERTICAL) vbox.pack_start(menu_open, False, False, 0) vbox.pack_start(Gtk.Separator(orientation=Gtk.Orientation.HORIZONTAL), False, False, 0) vbox.pack_start(menu_new, False, False, 0) vbox.pack_start(menu_pref, False, False, 0) vbox.pack_start(menu_kbd, False, False, 0) vbox.pack_start(menu_about, False, False, 0) vbox.pack_start(Gtk.Separator(orientation=Gtk.Orientation.HORIZONTAL), False, False, 0) vbox.pack_start(menu_quit, False, False, 0) # PopoverMenu self.popover = Gtk.PopoverMenu() self.popover.add(vbox) ''' builder = Gtk.Builder.new_from_string(menu_model, len(menu_model)) model = builder.get_object('comipoli-menu') self.popover = Gtk.PopoverMenu.new_from_model(model) ''' GTK3 #image = Gtk.Image(icon_name='open-menu-symbolic') #Gtk.MenuButton.__init__(self, can_focus=False, focus_on_click=False, image=image, visible=True, popover=self.popover) ''' Gtk.MenuButton.__init__(self, can_focus=False, focus_on_click=False, icon_name='open-menu-symbolic', visible=True, popover=self.popover) def do_toggled(self): if self.props.active: self.popover.show_all() else: self.popover.hide()
丸ごと作り替えだった。
そうそう、GtkShortcutsWindow の pack_start が廃止。
かつ GtkBox のサブクラスに、なので append で配置する。
orientation=Gtk.Orientation.HORIZONTAL 指定を忘れずに。
最初縦に配置されてしばらく悩んでしまった。
そんなことより。
GtkShortcutsWindow を表示すると上記エラーを吐く。
もちろんサーチバーは出ない、これバグだよな。
Fedora 36 では修正されているのかな?
まだ色々とあるけど解決していないのでまた今度。