So, here's one last call, please, for criticism of the API before it
becomes stable API in a couple of days.

Murray

On Tue, 2013-10-01 at 12:15 +0200, Murray Cumming wrote:
> Here is a description of the gtkmm menu API that should replace
> GtkUIManager. I'll reply with some opinions about the API and reasons
> why I don't think we should actually deprecate UIManager yet.
> 
> For a fairly complete example, just look here:
> https://git.gnome.org/browse/gtkmm-documentation/tree/examples/book/menus/main_menu/examplewindow.cc
> 
> * Actions:
> 
> We can replace Gtk::Action/Gtk::ToggleAction/Gtk::RadioAction instances
> with Gio::Action. You'll actually want to use Gio::SimpleAction in most
> cases, because it has useful API.
> See
> https://developer.gnome.org/glibmm/unstable/classGio_1_1SimpleAction.html
> 
> We replace Gtk::ActionGroup with Gio::ActionGroup, though you'll want to
> actually use Gio::SimpleActionGroup because you can add actions to it.
> See
> https://developer.gnome.org/glibmm/unstable/classGio_1_1SimpleActionGroup.html
> 
> We replace calls to
>   Gtk::ActionGroup::add("action-name", "Action Title", signal_handler)
> with
>   Gio::SimpleActionGroup::add_action("action-name", signal_handler)
> 
> The Action Title now becomes just a menu item title and is specified in
> the XML.
> 
> We replace GtkUIManager with GtkBuilder, using its <menu> syntax instead
> of the old <ui> syntax.
> 
> 
> * Toggle and Radio items:
> 
> Toggle items and Radio items are a bit strange. Both are demonstrated
> here, and are not as simple as the old GtkToggleAction and
> GtkRadioAction:
> https://git.gnome.org/browse/gtkmm-documentation/tree/examples/book/menus/main_menu/examplewindow.cc
> 
> 
> ** Toggle items:
> For a toggle item we add a "bool" action, which is just a regular
> GAction with a boolean "state". For instance, with gtkmm:
>   m_refToggle = refActionGroup->add_action_bool("sometoggle",
>     sigc::mem_fun(*this, &ExampleWindow::on_menu_toggle),
>     false); //false is the default value
> And we would lay that out in the glade file like any other menu item.
> 
> Unlike with GtkAction, in the signal handler, we must now explicitly
> toggle that state. Otherwise clicking the menu item won't change it's
> appearance at all. For instance:
>   void ExampleWindow::on_menu_toggle()
>   {
>     bool active = false;
>     m_refToggle->get_state(active);
>     m_refToggle->change_state(!active);
> 
> Obviously, it's good that this gives you the chance to reject the change
> and complain to the user, though I feel that that's the unusual case and
> shouldn't be the default.
> 
> 
> ** Radio items:
> 
> Radio items are even stranger. Unlike GtkRadioAction, we now have just
> one GAction to represent, for instance, 3 radio menu items. That GAction
> has a state, whose type you must choose. gtkmm has convenience methods
> to create string-based or integer-based radio actions. For instance:
>   m_refChoice = refActionGroup->add_action_radio_string("choice",
>     sigc::mem_fun(*this, &ExampleWindow::on_menu_choices),
>     "a"); //"a" is the default value.
> 
> Unlike with toggle items, we get the chosen state via the action's
> "parameter". Like toggle items, we need to actually set the state to see
> any visual effect. For instance:
>    void ExampleWindow::on_menu_choices(const Glib::ustring& parameter)
>    {
>      m_refChoice->change_state(parameter);
> 
> Again, I find this a bit tedious.
> 
> We specify the possible states in the XML, as "target" values for an
> <item>. Several radio items can have the same action name, but different
> target values. 
> 
> 
> * Summary
> 
> As a complete porting example, this commit replaces the use of UIManager
> +GtkMenu with Builder+GMenu in one of our examples:
> https://git.gnome.org/browse/gtkmm-documentation/commit/?id=9ce75deddf75822fe06406f1b86123661c64b02d
> And this one adds back the toolbar:
> https://git.gnome.org/browse/gtkmm-documentation/commit/?id=8ffa9a16fc773a472f6fa13d262cc20a9a31c318
> 
> 

-- 
Murray Cumming
murr...@murrayc.com
www.murrayc.com
www.openismus.com

_______________________________________________
gtkmm-list mailing list
gtkmm-list@gnome.org
https://mail.gnome.org/mailman/listinfo/gtkmm-list

Reply via email to