Criar  Editar  FrontPage  Índices  Buscar  Alterações  History  RSS  Login

tut-gtk2-packing-demo

Programa de Demonstração de Posicionamento

#!/usr/bin/env ruby

require 'gtk2'

# Cria uma nova caixa hbox preenchida com botões-rótulos. Os areumentos para Gtk::HBox.new e 
# Gtk::Box#pack_start em que estamos interessados são passados para este método.
def make_box(homogeneous, spacing, expand, fill, padding)
    box = Gtk::HBox.new(homogeneous, spacing)

    "Gtk::Box#pack_start (button, #{expand}, #{fill}, #{padding})".split(/ /).each do |s|
        button = Gtk::Button.new(s)
        box.pack_start(button, expand, fill, padding)
    end
    box
end

# "Parse" o argumento de linha de comando.
which = ARGV.shift
unless which
    $stderr.puts "uso: #{$0} num"
    $stderr.puts "	onde num é 1, 2, ou 3."
    exit 1
end

# Cria a janela principal.
window = Gtk::Window.new

# Você deve sempre lembrar-se de conectar o sinal delete_event
# a janela principal. Isso é bastante importante para comportamento intuitivo apropriado.
window.signal_connect("delete_event") do
    Gtk::main_quit
    false
end
window.border_width = 10

# A gente cria uma caixa vertical (vbox) e posiciona as caixas horizontais dentro (criado por make_box).
# Isso nos permite empilhar as caixas horizontais preenchidas com botões uma sobre a outra nesta vbox.
box1 = Gtk::VBox.new(false, 0)

case which.to_i
when 1
    # Cria e alinha um novo rótulo ao lado esquerdo.  
    # Discutiremos esta função e outras na seção sobre atributos de componentes.
    label = Gtk::Label.new("Gtk::HBox.new(false, 0)")
    label.set_alignment(0, 0)
    box1.pack_start(label, false, false, 0)

    # As primeiras 2 entradas são para os parâmetros homogêneo e espaçamento para Gtk::HBox.new.
    # As 3 últimas entradas são para os argumentos "expandir", "preencher" e espaço_externo para Gtk::HBox#pack_start.
    [
        [false, 0, false, false, 0],
        [false, 0, true,  false, 0],
        [false, 0, true,  true,  0],
    ].each do |args|
        # Cria uma caixa horizontal com os parâmetros especificados 
        # e o posiciona acima da caixa vertical.

        box2 = make_box(*args)
        box1.pack_start(box2, false, false, 0)
    end

    # Insere um separador na caixa vertical.
    separator = Gtk::HSeparator.new
    box1.pack_start(separator, false, true, 5)

    # Mesmo do anterior.
    label = Gtk::Label.new("Gtk::HBox.new(true, 0)")
    label.set_alignment(0, 0)
    box1.pack_start(label, false, false, 0)
    [
        [true, 0, true, false, 0],
        [true, 0, true, true,  0],
    ].each do |args|
        box2 = make_box(*args)
        box1.pack_start(box2, false, false, 0)
    end

    separator = Gtk::HSeparator.new
    box1.pack_start(separator, false, true, 5)

when 2
    label = Gtk::Label.new("Gtk::HBox.new(false, 10)")
    label.set_alignment(0, 0)
    box1.pack_start(label, false, false, 0)

    [
        [false, 10, true, false, 0],
        [false, 10, true, true,  0],
    ].each do |args|
        box2 = make_box(*args)
        box1.pack_start(box2, false, false, 0)
    end

    separator = Gtk::HSeparator.new
    box1.pack_start(separator, false, true, 5)

    label = Gtk::Label.new("Gtk::HBox.new(false, 0)")
    label.set_alignment(0, 0)
    box1.pack_start(label, false, false, 0)

    [
        [false, 0, true, false, 10],
        [false, 0, true, true,  10],
    ].each do |args|
        box2 = make_box(*args)
        box1.pack_start(box2, false, false, 0)
    end

    separator = Gtk::HSeparator.new
    box1.pack_start(separator, false, true, 5)

when 3
    # Isto demonstra a habilidade de usar Gtk::Box#pack_end para justificar
    # a direita os componentes. Primeiramente, a gente cria uma nova caixa como antes.
    box2 = make_box(false, 0, false, false, 0);

    # Cria um rótulo que será colocado no fim.
    label = Gtk::Label.new("fim")
    box2.pack_end(label, false, false, 0)
    box1.pack_start(box2, false, false, 0)

    # Um separador para o botão.
    separator = Gtk::HSeparator.new

    # Isto explicitamente configura o separador para 400 pixels de largura por 5 de altura.
    # Isto é para que a caixa hbox que a gente criou seja também 400 pixels de largura,
    # e o rótulo "fim" seja separado dos outros rótulos na caixa hbox.
    # De outra maneira, todos os componentes na hbox seriam posicionados tão próximos 
    # uns dos outros quanto possível. 

    separator.set_size_request(400, 5)
    box1.pack_start(separator, false, true, 5)
end

# Cria uma nova caixa box, e posiciona um botão 'Sair' a ela.
# Esse botão pode ser usado para terminar o programa, exatamente como o X da janela.
quitbox = Gtk::HBox.new(false, 0)
button = Gtk::Button.new("Sair")
button.signal_connect("clicked") do
    Gtk.main_quit
end 

quitbox.pack_start(button, true, false, 0)
box1.pack_start(quitbox, true, false, 0)
window.add(box1)

# Mostra todos os componentes.
window.show_all

# Como sempre, a gente termina ao entrar no loop principal, com Gtk.main.
Gtk.main
Last modified:2006/07/02 15:09:31
Keyword(s):
References:[tut-gtk]