MoonScript - Agenda telefônica semifuncional em 101 linhas

Publicado por Ramon (última atualização em 02/12/2013)

[ Hits: 3.284 ]

Download gtk_OMG.moon




O MoonScript é uma "linguagem" de programação, que faz cross-compile (ou seja, traduz seu código) para Lua (sim, a linguagem brasileira, usada no WoW). Porém, uma maneira de descrevê-la melhor é uma linguagem que faz algo como o CoffeeScript faz com o JavaScript.

Para testar a funcionalidade da linguagem, a testei fazendo uma mini-agenda-telefônica (quebrada, só adiciona contatos...) para ver se ela é "boa mesmo", e rendeu em surpreendentes 101 linhas um programa funcional.

Ah, só mais uma coisa. Olhe a TreeView. Quem já programou em GTK sem o Builder, e usou TreeViews, alguma vez ficará boquiaberto.

  



Esconder código-fonte

require "moon.all"
lgi = require "lgi"
import Gtk, GObject from lgi
require "lsqlite3"

-- General program logic

PhoneColumns = { NAME: 1, NUMBER: 2 }
database = sqlite3.open "database.db"
assert(database\exec("CREATE TABLE IF NOT EXISTS phones(name text, number text)") == sqlite3.OK)

-- Insert Window Logic
-- Yep, classes - neat!
class InsertWindow
    new: (db, on_add_callback) =>
        @name_input = Gtk.Entry!
        @number_input = Gtk.Entry!
        @database = db
        @on_add_callback = on_add_callback

        @window = Gtk.Window {
            title: "Insert",
            Gtk.Grid {
                orientation: Gtk.Orientation.VERTICAL,
                Gtk.Grid {
                    orientation: Gtk.Orientation.HORIZONTAL,
                    Gtk.Label {label: "Name: "},
                    @name_input
                },
                Gtk.Grid {
                    orientation: Gtk.Orientation.HORIZONTAL,
                    Gtk.Label {label: "Number: "},
                    @number_input
                },
                Gtk.Button {
                    label: "Insert",
                    on_pressed: ->
                        stmt = @database\prepare "INSERT INTO phones VALUES(?, ?)"
                        stmt\bind(1, @name_input.text)
                        stmt\bind(2, @number_input.text)
                        stmt\step!
                        stmt\reset!
                        @window\hide!
                        @on_add_callback!
                }
            }
        }

    clear: =>
        @name_input.text = ""
        @number_input.text = ""

-- Main Window Logic

fill_liststore_with_data = (database, store using nil) ->
    store\clear!
    for row in database\nrows("SELECT * FROM phones")
        store\append {
            [PhoneColumns.NAME]: row.name,
            [PhoneColumns.NUMBER]: row.number
        }

store = Gtk.ListStore.new {
    [PhoneColumns.NAME]: GObject.Type.STRING,
    [PhoneColumns.NUMBER]: GObject.Type.STRING
}

insert_window = InsertWindow(database, -> fill_liststore_with_data(database, store))

fill_liststore_with_data(database, store)

view = Gtk.TreeView {
    model: store,
    Gtk.TreeViewColumn {
        title: "Name",
        { Gtk.CellRendererText({}), { text: PhoneColumns.NAME } }
    },
    Gtk.TreeViewColumn {
        title: "Number",
        { Gtk.CellRendererText({}), { text: PhoneColumns.NUMBER } }
    }
}

button = Gtk.Button {
    label: "Insert contact",
    on_pressed: ->
        insert_window.window\show_all()
}

window = Gtk.Window {
    title: "Test",
    on_destroy: Gtk.main_quit,
    Gtk.Grid {
        orientation: Gtk.Orientation.VERTICAL,
        view,
        button
    }
}

window\show_all!
Gtk.main!

Scripts recomendados

Método de Jacobi em SCILAB

gitignore para gerenciar dotfiles

impressora brother

Perguntas e respostas com Assembly e NASM

Código "Vírus do Atalho"


  

Comentários

Nenhum comentário foi encontrado.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts