MoonScript - Agenda telefônica semifuncional em 101 linhas

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

[ Hits: 3.256 ]

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

gitignore para gerenciar dotfiles

Raízes - Fortran

Conectar o gns3 na Internet

app

Programação para sistemas embarcados em Assembly


  

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