MoonScript - Agenda telefônica semifuncional em 101 linhas

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

[ Hits: 3.283 ]

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

Perguntas e respostas com Assembly e NASM

Adicionar proxy no Internet Explorer na inicialização

Criação de .deb do Avidemux

Bubble Sort em Scilab

Tranposta da matriz em Haskell


  

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