from gi.repository import Gio
from gi.repository import Gtk
import sys

menus_str ='''
<?xml version="1.0"?>
<interface>
  <menu id="appmenu">
    <section>
      <item>
        <attribute name="label" translatable="yes">Preferences</attribute>
        <attribute name="action">app.preferences</attribute>
      </item>
    </section>
    <section>
      <item>
        <attribute name="label" translatable="yes">About</attribute>
        <attribute name="action">app.about</attribute>
      </item>
      <item>
        <attribute name="label" translatable="yes">Quit</attribute>
        <attribute name="action">app.quit</attribute>
        <attribute name="accel">&lt;Primary&gt;q</attribute>
      </item>
    </section>
  </menu>
  <menu id="menubar">
    <submenu>
      <attribute name="label">_Help</attribute>
      <section>
        <item>
              <attribute name="label">_About</attribute>
              <attribute name="action">app.about</attribute>
            </item>
          </section>
        </submenu>
      </menu>
    </interface>
'''

if True:
    class App:
        def __init__(self):
            self.app = Gtk.Application.new('org.liulang.test', 0)
            self.app.connect('startup', self.on_app_startup)
            self.app.connect('activate', self.on_app_activate)
            self.app.connect('shutdown', self.on_app_shutdown)

        def run(self, argv):
            self.app.run(argv)

        def on_app_startup(self, app):
            self.window = Gtk.ApplicationWindow.new(app)
            self.window.set_default_size(640, 480)
            self.window.set_title('Gio Actions Demo')
            self.window.set_border_width(5)
            # no need to connect delete-event/destroy signal

            app.add_window(self.window)

            label = Gtk.Label('Hello, Gtk3')
            self.window.add(label)
            label.props.halign = Gtk.Align.CENTER
            label.props.valign = Gtk.Align.CENTER

            builder = Gtk.Builder()
            # It is better to load ui from a seperate file
            builder.add_from_string(menus_str)
            builder.connect_signals(self)
            appmenu = builder.get_object('appmenu')
            app.set_app_menu(appmenu)
            menubar = builder.get_object('menubar')
            app.set_menubar(menubar)

            self.add_simple_action('preferences',
                                   self.on_action_preferences_activated)
            self.add_simple_action('about', self.on_action_about_activated)
            self.add_simple_action('quit', self.on_action_quit_activated)

        def on_app_activate(self, app):
            self.window.show_all()

        def on_app_shutdown(self, app):
            # do some cleaning job here, like dumping configuration.
            pass

        def on_action_preferences_activated(self, action, user_data):
            print('will popup preferences dialog')

        def on_action_about_activated(self, action, user_data):
            print('will show about dialog')

        def on_action_quit_activated(self, action, user_data):
            # This will close the default gtk mainloop
            self.app.quit()

        def add_simple_action(self, name, callback):
            action = Gio.SimpleAction.new(name, None)
            action.connect('activate', callback)
            self.app.add_action(action)


    if __name__ == '__main__':
        app = App()
        app.run(sys.argv)
