#!/usr/bin/env gjs
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-

imports.gi.versions = { Gdk: '3.0', Gtk: '3.0' };
const { Gdk, Gio, GLib, Gtk } = imports.gi;

function do_action(action, parameter) {
    print ("Action '" + action.name + "' invoked");
}

function do_action_param(action, parameter) {
    print ("Action '" + action.name + "' invoked with parameter " + parameter.print(true));
}

function do_action_toggle(action) {
    action.set_state(GLib.Variant.new('b', !action.state.deepUnpack()));
    print ("Toggled");
}

function do_action_state_change(action) {
    print ("Action '" + action.name + "' has now state " + action.state.print(true));
}

function main() {
    Gtk.init(null);
    Gdk.set_program_class('test-gjsgapp');

    let app = new Gtk.Application({ application_id: 'org.gnome.Shell.GtkApplicationTest' });
    app.connect('activate', () => {
        print ("Activated");
    });

    let action = new Gio.SimpleAction({ name: 'one' });
    action.connect('activate', do_action);
    app.add_action(action);

    action = new Gio.SimpleAction({ name: 'two' });
    action.connect('activate', do_action);
    app.add_action(action);

    action = new Gio.SimpleAction({ name: 'toggle', state: GLib.Variant.new('b', false) });
    action.connect('activate', do_action_toggle);
    action.connect('notify::state', do_action_state_change);
    app.add_action(action);

    action = new Gio.SimpleAction({ name: 'disable', enabled: false });
    action.set_enabled(false);
    action.connect('activate', do_action);
    app.add_action(action);

    action = new Gio.SimpleAction({ name: 'parameter-int', parameter_type: GLib.VariantType.new('u') });
    action.connect('activate', do_action_param);
    app.add_action(action);

    action = new Gio.SimpleAction({ name: 'parameter-string', parameter_type: GLib.VariantType.new('s') });
    action.connect('activate', do_action_param);
    app.add_action(action);

    let menu = new Gio.Menu();
    menu.append('An action', 'app.one');

    let section = new Gio.Menu();
    section.append('Another action', 'app.two');
    section.append('Same as above', 'app.two');
    menu.append_section(null, section);

    // another section, to check separators
    section = new Gio.Menu();
    section.append('Checkbox', 'app.toggle');
    section.append('Disabled', 'app.disable');
    section.append('Missing Action', 'app.no-action');
    menu.append_section('Subsection', section);

    // empty sections or submenus should be invisible
    menu.append_section('Empty section', new Gio.Menu());
    menu.append_submenu('Empty submenu', new Gio.Menu());

    let submenu = new Gio.Menu();
    submenu.append('Open c:\\', 'app.parameter-string::c:\\');
    submenu.append('Open /home', 'app.parameter-string::/home');
    menu.append_submenu('Recent files', submenu);

    let item = Gio.MenuItem.new('Say 42', null);
    item.set_action_and_target_value('app.parameter-int', GLib.Variant.new('u', 42));
    menu.append_item(item);

    item = Gio.MenuItem.new('Say 43', null);
    item.set_action_and_target_value('app.parameter-int', GLib.Variant.new('u', 43));
    menu.append_item(item);

    let window = null;

    app.connect_after('startup', app => {
        app.set_app_menu(menu);
        window = new Gtk.ApplicationWindow({ title: "Test Application", application: app });
    });
    app.connect('activate', app => {
        window.present();
    });

    app.run(null);
}

main();
