Ir al contenido principal

Agregando un Popover a una aplicación Ruby Gtk

La aplicación Pomarola es un poquito distinta a los demás relojes pomodoro que he visto, básicamente la idea era generar un diario de trabajo basado en la cantidad de pomodoros trabajados por día. Es por eso que al fin me puse manos a la obra para poder guardarlos en un formato JSON. Para ello quería añadir un menu a mi aplicación. Resulta que los nuevos menues gtk son algo poco intuitivo de cara al desarrollo y por eso me costo bastante encontrarle la vuelta. Es por eso que aquí hay un pequeño tutorial de como agregar un menú tipo popover a nuestra aplicación.

![fit-width](/static/uploads/1471723826_Pantallazo-2016-08-20 17-06-14.png )

El boton de menu

Es conveniente utilizar el botón de menu provisto por GTK (GtkMenuButton), esto nos permitirá definir si lo que queremos es un menu popover. Para ello en las opciones del MenuButton seleccionamos "Ventana Emergente" y haciendo click en el pequeño icono de la entrada de texto creamos una nueva ventana emergente (nuestro popover). Este nos servirá en el código, más no podremos editarlo directamente desde aquí.

fit-width

Los archivos UI

Un popover no es simplemente un menú tradicional (en cuyo caso simplemente utilizariamos un TreeModel y lo poblaríamos. Sino más bien un widget contenedor con widgets hijos. Es por eso que debemos diseñar y guardar en un archivo ui aparte el contenedor de la siguiente manera:

fit-width

El código

Creamos nuestro popover en Glade, así como el archivo UI necesario, es por eso que ahora deberemos indicar en nuestro código que queremos utilizar este archivo para poblar los contenidos de nuestro popover:

  def generate_popover()
    @popover = @ui.get_object "popover1"
    @popover_ui = Gtk::Builder.new(:file => "./ui/menu.ui")
    @popover_contents = @popover_ui["popover"]

    @popover_ui.connect_signals do |handler|
        method(handler)
    end


    @popover.add @popover_contents
  end

Paso a paso

Obtenemos de nuestro archivo UI principal el objeto con el ID "popover1", este es el widget que mostrará el GtkMenuButton al pulsarlo, pero ahora mismo se encuentra vacío

    @popover = @ui.get_object "popover1"

Cargamos nuestro archivo de menu, y seleccionamos el widget con el ID "popover" dentro de el (quizás debería haber utilizado nombres distintos para evitar confusión)

    @popover_ui = Gtk::Builder.new(:file => "./ui/menu.ui")
    @popover_contents = @popover_ui["popover"]

Conectamos las señales de los widgets del popover (no es necesario hacerlo de esta forma)

    @popover_ui.connect_signals do |handler|
        method(handler)
    end

Añadimos los contenidos de este nuevo archivo UI a nuestro popover.

    @popover.add @popover_contents

Y listo! Como dije anteriormente el contenido de los popover es básicamente un Container Gtk (creo que más especificamente un Gtk::bin), por lo tanto podremos añadir dentro de el grillas, cajas, barras de progreso y botones esto posibilita menus complejos como los nuevos menues de gEdit y los de otras nuevas aplicaciones de Gnome.

Comentarios

Comments powered by Disqus