Re: GtkApplicationWindow and its menubar



Test you stuff in python first, then move it to c/c++ if need be.  This
allows for rapid testing of what you really need to do.  Whatever you
are trying to do, it is possible, for complete menubar, menus, menuitems
on any platform.  Windowing APIs for windows, linux, mac all can handle
this.

gtk3-demo has tool-palette sample.
The gtk api jargon has set/unset, remove, append, show.
http://www.pygtk.org/pygtk2tutorial/sec-Toolbar.html
http://www.pygtk.org/pygtk2tutorial/examples/toolbar.py

Don't forget to disconnect callbacks before unsetting toolbars, menus,
menu items. Rule of thumb: if you connect it, you have to disconnect it
if you change the gui dynamically.  Don't rely on
smart-pointers/garbage-collection to take care of these things.
http://zetcode.com/tutorials/gtktutorial/gtkevents/

This is a tweaked applicationmenu.py
#!/usr/bin/env python

import gtk

class ApplicationMenu:
    def __init__(self):
        window = gtk.Window()

        menubar = gtk.MenuBar()

        self.menu_file = gtk.Menu()
        self.menu_edit = gtk.Menu()
        self.menu_help = gtk.Menu()

        item_open = gtk.MenuItem("Open")
        item_save = gtk.MenuItem("Save")
        item_quit = gtk.MenuItem("Quit")
        self.menu_file.append(item_open)
        self.menu_file.append(item_save)
        self.menu_file.append(item_quit)

        item_cut = gtk.MenuItem("Cut")
        item_copy = gtk.MenuItem("Copy")
        item_paste = gtk.MenuItem("Paste")
        item_change_menus = gtk.MenuItem("Change Menus")
        self.menu_edit.append(item_cut)
        self.menu_edit.append(item_copy)
        self.menu_edit.append(item_paste)
        self.menu_edit.append(item_change_menus)

        item_about = gtk.MenuItem("About")
        self.menu_help.append(item_about)

        item_file = gtk.MenuItem("File")
        item_edit = gtk.MenuItem("Edit")
        item_help = gtk.MenuItem("Help")

        item_file.set_submenu(self.menu_file)
        item_edit.set_submenu(self.menu_edit)
        item_help.set_submenu(self.menu_help)

        menubar.append(item_file)
        menubar.append(item_edit)
        menubar.append(item_help)

        window.connect("destroy", lambda w: gtk.main_quit())
        item_change_menus.connect("activate", self.menu_change_menus)

        window.add(menubar)
        window.show_all()


    def menu_foo(self, widget):
            print "menu_foo clicked"


    def menu_change_menus(self, widget):
        print "menu_change_menus clicked"
        for widget in self.menu_edit.get_children():
            self.menu_edit.remove(widget)
        self.item_foo1 = gtk.MenuItem("foo1")
        self.item_foo2 = gtk.MenuItem("foo2")
        self.item_foo3 = gtk.MenuItem("foo3")
        self.item_foo1.connect("activate", self.menu_foo)
        self.item_foo2.connect("activate", self.menu_foo)
        self.item_foo3.connect("activate", self.menu_foo)
        self.menu_edit.append(self.item_foo1)
        self.menu_edit.append(self.item_foo2)
        self.menu_edit.append(self.item_foo3)
        self.item_foo1.show()
        self.item_foo2.show()
        self.item_foo3.show()
        self.menu_edit.show()


ApplicationMenu()
gtk.main()

On 05/11/2014 12:29 PM, Pierre Wieser wrote:
Hi all,

I am starting with a small app which will handle documents. 
I want this app has two different menubars :
- a first one when there is no document
- another one when the document is opened.

I have tried to use gtk_application_set_menubar with two
different GMenuModel, but no luck: the GtkApplicationWindow
menubar never changes.

After having searched in the sources, I found that the GtkWidget 
menubar is automatically rebuilt from a GMenu menubar_section.
But the menubar_section itself is initially built in real_realize,
thenonly rebuilt when some gtk-shell settings changes 
(notify::gtk-shell-shows-menubar exactly, but this not relevant here).

So it appears to me that it is just impossible to replace the menubar.
Am I right ? Is it the expected behavior ?
As a side effect, I do not understand the rationale behind
gtk_application_set_menubar: why are we allowed to change the GMenuModel
if the visible GtkWidget is not updated ?

Thanks for some explanations..
Regards
Pierre

_______________________________________________
gtk-app-devel-list mailing list
gtk-app-devel-list gnome org
https://mail.gnome.org/mailman/listinfo/gtk-app-devel-list




[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]