Blame platform-demos/es/messagedialog.js.page

Packit 1470ea
Packit 1470ea
<page xmlns="http://projectmallard.org/1.0/" xmlns:its="http://www.w3.org/2005/11/its" xmlns:xi="http://www.w3.org/2001/XInclude" type="guide" style="task" id="messagedialog.js" xml:lang="es">
Packit 1470ea
  <info>
Packit 1470ea
  <title type="text">MessageDialog (JavaScript)</title>
Packit 1470ea
    <link type="guide" xref="beginner.js#windows"/>
Packit 1470ea
    <link type="seealso" xref="GtkApplicationWindow.js"/>
Packit 1470ea
    <link type="seealso" xref="gmenu.js"/>
Packit 1470ea
    <link type="seealso" xref="label.js"/>
Packit 1470ea
    <revision version="0.2" date="2012-06-25" status="draft"/>
Packit 1470ea
Packit 1470ea
    <credit type="author copyright">
Packit 1470ea
      <name>Taryn Fox</name>
Packit 1470ea
      <email its:translate="no">jewelfox@fursona.net</email>
Packit 1470ea
      <years>2012</years>
Packit 1470ea
    </credit>
Packit 1470ea
Packit 1470ea
    <desc>Una mensaje emergente acoplado a una ventana</desc>
Packit 1470ea
  
Packit 1470ea
    <mal:credit xmlns:mal="http://projectmallard.org/1.0/" type="translator copyright">
Packit 1470ea
      <mal:name>Daniel Mustieles</mal:name>
Packit 1470ea
      <mal:email>daniel.mustieles@gmail.com</mal:email>
Packit 1470ea
      <mal:years>2011 - 2017</mal:years>
Packit 1470ea
    </mal:credit>
Packit 1470ea
  
Packit 1470ea
    <mal:credit xmlns:mal="http://projectmallard.org/1.0/" type="translator copyright">
Packit 1470ea
      <mal:name>Nicolás Satragno</mal:name>
Packit 1470ea
      <mal:email>nsatragno@gmail.com</mal:email>
Packit 1470ea
      <mal:years>2012 - 2013</mal:years>
Packit 1470ea
    </mal:credit>
Packit 1470ea
  
Packit 1470ea
    <mal:credit xmlns:mal="http://projectmallard.org/1.0/" type="translator copyright">
Packit 1470ea
      <mal:name>Jorge González</mal:name>
Packit 1470ea
      <mal:email>jorgegonz@svn.gnome.org</mal:email>
Packit 1470ea
      <mal:years>2011</mal:years>
Packit 1470ea
    </mal:credit>
Packit 1470ea
  </info>
Packit 1470ea
Packit 1470ea
  <title>MessageDialog</title>
Packit 1470ea
  <media type="image" mime="image/png" src="media/messagedialog.png"/>
Packit 1470ea
  

Un «MessageDialog» es un diálogo de mensaje modal, es decir un diálogo emergente al que tiene que responder antes de volver a lo que estaba haciendo en la ventana a la que está vinculado. Este puede hacer que el mundo explote (o al menos eso dice). Para hacer que el diálogo aparezca cuando ejecute este ejemplo, pulse «Message» dentro de su menú de aplicación (el que aparece cuando pulsa en el nombre de la aplicación en la esquina superior izquierda, junto a «Actividades»).

Packit 1470ea
  <note>

La diferencia entre un «MessageDialog» y un <link xref="dialog.js">Dialog</link> es que un «Dialog» puede contener cualquier widget y tener el contenido que quiera, mientras que un «MessageDialog» es sólo una manera cómoda de hacer que aparezca un diálogo emergente con un mensaje básico y botones.

</note>
Packit 1470ea
    <links type="section"/>
Packit 1470ea
Packit 1470ea
  <section id="imports">
Packit 1470ea
    <title>Bibliotecas que importar</title>
Packit 1470ea
    
Packit 1470ea
#!/usr/bin/gjs
Packit 1470ea
Packit 1470ea
const Gio = imports.gi.Gio;
Packit 1470ea
const Gtk = imports.gi.Gtk;
Packit 1470ea
const Lang = imports.lang;
Packit 1470ea
Packit 1470ea
    

Estas son las bibliotecas que necesita importar para que esta aplicación se ejecute. Recuerde que la línea que le dice a GNOME que está usando Gjs siempre tiene que ir al principio.

Packit 1470ea
  </section>
Packit 1470ea
Packit 1470ea
  <section id="applicationwindow">
Packit 1470ea
    <title>Crear la ventana de la aplicación</title>
Packit 1470ea
    
Packit 1470ea
const MessageDialogExample = new Lang.Class ({
Packit 1470ea
    Name: 'MessageDialog Example',
Packit 1470ea
Packit 1470ea
    // Create the application itself
Packit 1470ea
    _init: function () {
Packit 1470ea
        this.application = new Gtk.Application ({
Packit 1470ea
            application_id: 'org.example.jsmessagedialog',
Packit 1470ea
            flags: Gio.ApplicationFlags.FLAGS_NONE });
Packit 1470ea
Packit 1470ea
        // Connect 'activate' and 'startup' signals to the callback functions
Packit 1470ea
        this.application.connect('activate', Lang.bind(this, this._onActivate));
Packit 1470ea
        this.application.connect('startup', Lang.bind(this, this._onStartup));
Packit 1470ea
    },
Packit 1470ea
Packit 1470ea
    // Callback function for 'activate' signal presents windows when active
Packit 1470ea
    _onActivate: function () {
Packit 1470ea
        this._window.present ();
Packit 1470ea
    },
Packit 1470ea
Packit 1470ea
    // Callback function for 'startup' signal initializes menus and builds the UI
Packit 1470ea
    _onStartup: function () {
Packit 1470ea
        this._initMenus();
Packit 1470ea
        this._buildUI ();
Packit 1470ea
    },
Packit 1470ea
Packit 1470ea
    

Todo el código de este ejemplo va en la clase «MessageDialogExample». El código anterior crea una <link href="http://www.roojs.com/seed/gir-1.2-gtk-3.0/gjs/Gtk.Application.html">Gtk.Application</link> para que vayan los widgets y la ventana.

Packit 1470ea
    <note>

Antes de llamar a «_buildUI» para crear la ventana y sus widgets, es necesario llamar a «_initMenus», que le dice a GNOME que cree el menú. Se puede poner el código de «_initMenus» después del código de «_buildUI», dado que no importa en qué orden se esté mientras que «_initMenus» se llame primero en «_onStartup».

</note>
Packit 1470ea
    
Packit 1470ea
    // Build the application's UI
Packit 1470ea
    _buildUI: function () {
Packit 1470ea
Packit 1470ea
        // Create the application window
Packit 1470ea
        this._window = new Gtk.ApplicationWindow  ({
Packit 1470ea
            application: this.application,
Packit 1470ea
            window_position: Gtk.WindowPosition.CENTER,
Packit 1470ea
            title: "Gtk.MessageDialog Example",
Packit 1470ea
            default_height: 200,
Packit 1470ea
            default_width: 400 });
Packit 1470ea
Packit 1470ea
    

La función _buildUI es donde se pone todo el código que crea la interfaz de usuario de la aplicación. El primer paso es crear una <link xref="GtkApplicationWindow.js">Gtk.ApplicationWindow</link> nueva para poner dentro todos los widgets.

Packit 1470ea
Packit 1470ea
    
Packit 1470ea
        // Create a silly warning message and add it to the window
Packit 1470ea
        this.warningLabel = new Gtk.Label ({
Packit 1470ea
            label: "This application goes boom! (Not really.)"});
Packit 1470ea
        this._window.add (this.warningLabel);
Packit 1470ea
Packit 1470ea
    

Para este ejemplo, todo lo que hay en la ventana de la que viene el diálogo emergente es una <link xref="label.js">Label</link> de advertencia tonta.

Packit 1470ea
  </section>
Packit 1470ea
Packit 1470ea
  <section id="menu">
Packit 1470ea
    <title>Crear el menú de la aplicación</title>
Packit 1470ea
    
Packit 1470ea
    // Build the application menu, including the button that calls the dialog
Packit 1470ea
    _initMenus: function() {
Packit 1470ea
        let menu = new Gio.Menu();
Packit 1470ea
        menu.append("Message",'app.message');
Packit 1470ea
        menu.append("Quit",'app.quit');
Packit 1470ea
        this.application.set_app_menu(menu);
Packit 1470ea
Packit 1470ea
        // This pops up a MessageDialog when "Message" is clicked in the menu
Packit 1470ea
        let messageAction = new Gio.SimpleAction ({ name: 'message' });
Packit 1470ea
        messageAction.connect('activate', Lang.bind(this,
Packit 1470ea
            function() {
Packit 1470ea
                this._showMessageDialog();
Packit 1470ea
            }));
Packit 1470ea
        this.application.add_action(messageAction);
Packit 1470ea
Packit 1470ea
        // This closes the window when "Quit" is clicked in the menu
Packit 1470ea
        let quitAction = new Gio.SimpleAction ({ name: 'quit' });
Packit 1470ea
        quitAction.connect('activate', Lang.bind(this,
Packit 1470ea
            function() {
Packit 1470ea
                this._window.destroy();
Packit 1470ea
            }));
Packit 1470ea
        this.application.add_action(quitAction);
Packit 1470ea
    },
Packit 1470ea
Packit 1470ea
    

Aquí, se construye el <link xref="gmenu.js">GMenu</link> donde se pondrá el botón «Message» que acciona el «MessageDialog» emergente. El «GMenu» es el menú que aparece cuando pulsa el nombre de la aplicación en la esquina superior izquierda de la pantalla, junto al menú «Actividades». Este menú sólo tiene dos opciones: «Message» y «Quit».

Packit 1470ea
  </section>
Packit 1470ea
Packit 1470ea
  <section id="messagedialog">
Packit 1470ea
    <title>Crear el «MessageDialog»</title>
Packit 1470ea
    
Packit 1470ea
    _showMessageDialog: function () {
Packit 1470ea
Packit 1470ea
        // Create a modal MessageDialog whose parent is the window
Packit 1470ea
        this._messageDialog = new Gtk.MessageDialog ({
Packit 1470ea
            transient_for: this._window,
Packit 1470ea
            modal: true,
Packit 1470ea
            buttons: Gtk.ButtonsType.OK_CANCEL,
Packit 1470ea
            message_type: Gtk.MessageType.WARNING,
Packit 1470ea
            text: "This action will cause the universe to stop existing." });
Packit 1470ea
Packit 1470ea
        this._messageDialog.connect ('response', Lang.bind(this, this._response_cb));
Packit 1470ea
        this._messageDialog.show();
Packit 1470ea
    },
Packit 1470ea
Packit 1470ea
    

Para hacer del «MessageDialog» un diálogo emergente vinculado a la ventana principal, se establece su propiedad «modal» a «true» y «transient_for» a «_window». Después, se puede configurar el tipo de botones que tiene y qué tipo de mensaje es (determinando el icono junto al mensaje), y escribir su texto, antes de conectar su señal «response» a la función de retorno de llamada que la maneja.

Packit 1470ea
    <note>

Aquí hay algunos recursos para hacer sus propios «MessageDialog»:

Packit 1470ea
      <list>
Packit 1470ea
        <item>

<link href="http://developer.gnome.org/gtk3/stable/GtkMessageDialog.html#GtkButtonsType">Lista de tipos de botones</link>

</item>
Packit 1470ea
        <item>

<link href="http://developer.gnome.org/gtk3/stable/GtkMessageDialog.html#GtkMessageType">Lista de tipos de mensajes</link>

</item>
Packit 1470ea
      </list>
Packit 1470ea
    </note>
Packit 1470ea
Packit 1470ea
    
Packit 1470ea
    // Callback function (aka signal handler) for the response signal
Packit 1470ea
    _response_cb: function (messagedialog, response_id) {
Packit 1470ea
Packit 1470ea
        // A simple switch that changes the main window's label
Packit 1470ea
        switch (response_id) {
Packit 1470ea
            case Gtk.ResponseType.OK:
Packit 1470ea
                this.warningLabel.set_label ("*BOOM*\n");
Packit 1470ea
                break;
Packit 1470ea
            case Gtk.ResponseType.CANCEL:
Packit 1470ea
                this.warningLabel.set_label ("Good choice!\n");
Packit 1470ea
                break;
Packit 1470ea
            case Gtk.ResponseType.DELETE_EVENT:
Packit 1470ea
                this.warningLabel.set_label ("Dialog closed or cancelled.\n");
Packit 1470ea
                break;
Packit 1470ea
        }
Packit 1470ea
Packit 1470ea
        this._messageDialog.destroy();
Packit 1470ea
Packit 1470ea
    }
Packit 1470ea
Packit 1470ea
});
Packit 1470ea
Packit 1470ea
    

Esta función toma dos parámetros, el «MessageDialog» y su «response_id», ambos proporcionados automáticamente (no tiene que pasarlos manualmente para que funcione). Aquí se usa un interruptor simple para cambiar el texto de la «etiqueta de advertencia», dependiendo de qué opción elija. «DELETE_EVENT» ocurre su presiona «Escape» para cancelar el «MessageDialog», en lugar de presionar «OK» o «Cancel». Elija lo que elija, el diálogo emergente de destruirá a continuación.

Packit 1470ea
Packit 1470ea
    
Packit 1470ea
// Run the application
Packit 1470ea
let app = new MessageDialogExample ();
Packit 1470ea
app.application.run (ARGV);
Packit 1470ea
Packit 1470ea
    

Finalmente, se crea una instancia nueva de la clase «MessageDialogExample» terminada, y se ejecuta la aplicación.

Packit 1470ea
  </section>
Packit 1470ea
Packit 1470ea
  <section id="complete">
Packit 1470ea
    <title>Código de ejemplo completo</title>
Packit 1470ea
#!/usr/bin/gjs
Packit 1470ea
Packit 1470ea
imports.gi.versions.Gtk = '3.0';
Packit 1470ea
Packit 1470ea
const Gio = imports.gi.Gio;
Packit 1470ea
const Gtk = imports.gi.Gtk;
Packit 1470ea
Packit 1470ea
class MessageDialogExample {
Packit 1470ea
Packit 1470ea
    // Create the application itself
Packit 1470ea
    constructor() {
Packit 1470ea
        this.application = new Gtk.Application({
Packit 1470ea
            application_id: 'org.example.jsmessagedialog',
Packit 1470ea
            flags: Gio.ApplicationFlags.FLAGS_NONE
Packit 1470ea
        });
Packit 1470ea
Packit 1470ea
        // Connect 'activate' and 'startup' signals to the callback functions
Packit 1470ea
        this.application.connect('activate', this._onActivate.bind(this));
Packit 1470ea
        this.application.connect('startup', this._onStartup.bind(this));
Packit 1470ea
    }
Packit 1470ea
Packit 1470ea
    // Callback function for 'activate' signal presents windows when active
Packit 1470ea
    _onActivate() {
Packit 1470ea
        this._window.present();
Packit 1470ea
    }
Packit 1470ea
Packit 1470ea
    // Callback function for 'startup' signal initializes menus and builds the UI
Packit 1470ea
    _onStartup() {
Packit 1470ea
        this._initMenus();
Packit 1470ea
        this._buildUI ();
Packit 1470ea
    }
Packit 1470ea
Packit 1470ea
    // Build the application's UI
Packit 1470ea
    _buildUI() {
Packit 1470ea
Packit 1470ea
        // Create the application window
Packit 1470ea
        this._window = new Gtk.ApplicationWindow({
Packit 1470ea
            application: this.application,
Packit 1470ea
            window_position: Gtk.WindowPosition.CENTER,
Packit 1470ea
            title: "Gtk.MessageDialog Example",
Packit 1470ea
            default_height: 200,
Packit 1470ea
            default_width: 400
Packit 1470ea
        });
Packit 1470ea
Packit 1470ea
        // Create a silly warning message and add it to the window
Packit 1470ea
        this.warningLabel = new Gtk.Label({
Packit 1470ea
            label: "This application goes boom! (Not really.)"
Packit 1470ea
        });
Packit 1470ea
        this._window.add (this.warningLabel);
Packit 1470ea
Packit 1470ea
        // Show the window and all child widgets
Packit 1470ea
        this._window.show_all();
Packit 1470ea
    }
Packit 1470ea
Packit 1470ea
    // Build the application menu, including the button that calls the dialog
Packit 1470ea
    _initMenus() {
Packit 1470ea
        let menu = new Gio.Menu();
Packit 1470ea
        menu.append("Message",'app.message');
Packit 1470ea
        menu.append("Quit",'app.quit');
Packit 1470ea
        this.application.set_app_menu(menu);
Packit 1470ea
Packit 1470ea
        // This pops up a MessageDialog when "Message" is clicked in the menu
Packit 1470ea
        let messageAction = new Gio.SimpleAction ({ name: 'message' });
Packit 1470ea
        messageAction.connect('activate', () => { this._showMessageDialog(); });
Packit 1470ea
        this.application.add_action(messageAction);
Packit 1470ea
Packit 1470ea
        // This closes the window when "Quit" is clicked in the menu
Packit 1470ea
        let quitAction = new Gio.SimpleAction ({ name: 'quit' });
Packit 1470ea
        quitAction.connect('activate', () => { this._window.destroy(); });
Packit 1470ea
        this.application.add_action(quitAction);
Packit 1470ea
    }
Packit 1470ea
Packit 1470ea
    _showMessageDialog() {
Packit 1470ea
Packit 1470ea
        // Create a modal MessageDialog whose parent is the window
Packit 1470ea
        this._messageDialog = new Gtk.MessageDialog ({
Packit 1470ea
            transient_for: this._window,
Packit 1470ea
            modal: true,
Packit 1470ea
            buttons: Gtk.ButtonsType.OK_CANCEL,
Packit 1470ea
            message_type: Gtk.MessageType.WARNING,
Packit 1470ea
            text: "This action will cause the universe to stop existing." });
Packit 1470ea
Packit 1470ea
        this._messageDialog.connect ('response', this._response_cb.bind(this));
Packit 1470ea
        this._messageDialog.show();
Packit 1470ea
    }
Packit 1470ea
Packit 1470ea
    // Callback function (aka signal handler) for the response signal
Packit 1470ea
    _response_cb(messagedialog, response_id) {
Packit 1470ea
Packit 1470ea
        // A simple switch that changes the main window's label
Packit 1470ea
        switch (response_id) {
Packit 1470ea
            case Gtk.ResponseType.OK:
Packit 1470ea
                this.warningLabel.set_label ("*BOOM*\n");
Packit 1470ea
                break;
Packit 1470ea
            case Gtk.ResponseType.CANCEL:
Packit 1470ea
                this.warningLabel.set_label ("Good choice!\n");
Packit 1470ea
                break;
Packit 1470ea
            case Gtk.ResponseType.DELETE_EVENT:
Packit 1470ea
                this.warningLabel.set_label ("Dialog closed or cancelled.\n");
Packit 1470ea
                break;
Packit 1470ea
        }
Packit 1470ea
Packit 1470ea
        this._messageDialog.destroy();
Packit 1470ea
Packit 1470ea
    }
Packit 1470ea
};
Packit 1470ea
Packit 1470ea
// Run the application
Packit 1470ea
let app = new MessageDialogExample ();
Packit 1470ea
app.application.run (ARGV);
Packit 1470ea
Packit 1470ea
  </section>
Packit 1470ea
Packit 1470ea
  <section id="in-depth">
Packit 1470ea
    <title>Documentación en profundidad</title>
Packit 1470ea

En este ejemplo se usa lo siguiente:

Packit 1470ea
<list>
Packit 1470ea
  <item>

<link href="http://developer.gnome.org/gio/unstable/GMenu.html">GMenu</link>

</item>
Packit 1470ea
  <item>

<link href="http://developer.gnome.org/gio/stable/GSimpleAction.html">GSimpleAction</link>

</item>
Packit 1470ea
  <item>

<link href="http://www.roojs.com/seed/gir-1.2-gtk-3.0/gjs/Gtk.Application.html">Gtk.Application</link>

</item>
Packit 1470ea
  <item>

<link href="http://developer.gnome.org/gtk3/stable/GtkApplicationWindow.html">Gtk.ApplicationWindow</link>

</item>
Packit 1470ea
  <item>

<link href="http://www.roojs.com/seed/gir-1.2-gtk-3.0/gjs/Gtk.MessageDialog.html">Gtk.MessageDialog</link>

</item>
Packit 1470ea
</list>
Packit 1470ea
  </section>
Packit 1470ea
</page>