RubyLit - Ruby.del.litoral!
Notebook

Las Notebooks son unos widgets fantasticos, todos los programadores de guis alguna vez las tuvieron que usar, afortunadamente tambien estan disponibles en Ruby GTK.

El uso es simple y tienen una api muy desarrollada con muchos métodos interesantes, el siguiente programa muestra algunos de ellos.

screenshot notebook


require 'gtk2'

class Mi_app < Gtk::VBox
    def initialize()
        super()
        # Creo las solapas
        nb = Gtk::Notebook.new()
        nb.append_page(v1=Gtk::VBox.new(false,0), Gtk::Label.new("Hoja 1"))
        nb.append_page(v2=Gtk::VBox.new(false,0), Gtk::Label.new("Hoja 2"))
        nb.append_page(v3=Gtk::VBox.new(false,0), Gtk::Label.new("Hoja 3"))

        # Creo la barra de botones
        hcaja = Gtk::HBox.new()
        bt1 = Gtk::Button.new("Agregar")
        bt1.signal_connect( "button_press_event", Gdk::Event::BUTTON_PRESS ) { 
            nb.append_page(Gtk::VBox.new(false,0), Gtk::Label.new("Hoja "+ (nb.n_pages + 1).to_s))
            nb.show_all
        }

        bt2 = Gtk::Button.new("Eliminar")
        bt2.signal_connect( "button_press_event", Gdk::Event::BUTTON_PRESS ) { 
            num = nb.n_pages
            print "Paginas: #{num}\n" 
            if num > 0
                nb.remove_page((num-1))
            end
        }

        bt3 = Gtk::Button.new("Cambiar Pos")
        bt3.signal_connect( "button_press_event", Gdk::Event::BUTTON_PRESS ) { 
            num = nb.n_pages
            npos = (nb.tab_pos.to_i + 1) % 4
            if num > 0
                # tambien se puede especificar la posicion con constantes.
                #print Gtk::POS_BOTTOM.to_i, "\n" 
                #print Gtk::POS_TOP.to_i, "\n" 
                #print Gtk::POS_RIGHT.to_i, "\n" 
                #print Gtk::POS_LEFT.to_i, "\n" 
                nb.set_tab_pos(npos)
                print "La nueva posición es: #{npos}\n" 
            end
        }

        bt4 = Gtk::Button.new("Rotar")
        bt4.signal_connect( "button_press_event", Gdk::Event::BUTTON_PRESS ) { 
            #mueve la ultima pagina al principio
            num = nb.n_pages
            if num > 1
                child = nb.get_nth_page(num - 1)
                nb.reorder_child(child, 0)
                texto = nb.get_tab_label_text(child)
                print "se movió la '#{texto}' al primer lugar.\n" 
                nb.set_tab_label_text(child, texto + ">")
            end
        }

        hcaja.pack_start(bt1)
        hcaja.pack_start(bt2)
        hcaja.pack_start(bt3)
        hcaja.pack_start(bt4)

        pack_start( hcaja, false, false, 0)
        pack_start( nb, true, true, 0)
    end
end

class Viewer < Gtk::Window
  def initialize()
    super()
    set_title("App Base") 
    set_window_position(Gtk::Window::POS_CENTER)
    signal_connect("delete_event") { |i,a| Gtk::main_quit }
    set_default_size(250, 250)
    add(Mi_app.new)
  end
end

Gtk.init()

view = Viewer.new
view.show_all

Gtk.main()

Es claro que tambien se pueden agregar widgets dinamicamente en las paginas, la siguiente porción de código muestra como agregar unas tarjetas de visita (Label) en la segunda página desde un botón.

bt5 = Gtk::Button.new("Agr. Etiqueta")
bt5.signal_connect( "button_press_event", Gdk::Event::BUTTON_PRESS ) { 
    if nb.n_pages > 0
        child = nb.get_nth_page(0)

        l = Gtk::Label.new("Ruby GTK")
        child.pack_start(l,true)
        l.show
    end
}

pacquiao vs marquez Philippine Travel Travel Asia home ideas Fifa World Cup pacquiao vs marquez tickets donaire vs narvaez cotto vs margarito donaire vs narvaez tickets cotto vs margarito live streaming essay writing guide cotto vs margarito tickets st-pierre vs diaz st-pierre vs diaz tickets pacquiao vs marquez velasquez vs dos santos velasquez vs dos santos tickets