#!/usr/bin/python
# -*- coding: utf-8 -*-
#
# "Bretter übernehmen" for Nokia Internet Tablets
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# This is a finger-friendly (no stylus needed) tool
# to calculate and log widths and automatically
# carry out needed calculations.
#
# Copyright (c) 2008-02-22 Thomas Perl <thpinfo.com>
# License: GPLv3 or later <www.gnu.org/licenses/gpl-3.0.txt>
#

import os
import gtk
import gobject
import pango
import threading
import hildon

class Bretter(gtk.Window):
    font = pango.FontDescription('sans bold 20')
    font_big = pango.FontDescription('sans bold 24')
    font_biggest = pango.FontDescription('sans bold 40')
    padding = 10
    laengen = (3, 4, 5)

    def __init__(self):
        gtk.Window.__init__(self)
        self.set_title('Bretter')
        self.connect('destroy', lambda w: gtk.main_quit())

        # Vertikale Box
        self.vbox = gtk.VBox()
        self.add(self.vbox)

        # Horizontaler Main screen (liste + "rechner")
        self.main_hbox = gtk.HBox()
        self.list_vbox = gtk.VBox()
        self.treeview = gtk.TreeView()

        self.model = gtk.ListStore(int, str)
        self.treeview.set_model(self.model)
        column = gtk.TreeViewColumn('Breite')
        cell = gtk.CellRendererText()
        cell.set_property('alignment', pango.ALIGN_RIGHT)
        column.pack_end(self.set_font(cell, biggest=True))
        column.add_attribute(cell, 'text', 1)
        column.set_alignment(1.0)
        column.set_expand(True)
        self.treeview.append_column(column)
        self.treeview.set_rules_hint(True)
        self.treeview.set_headers_visible(False)

        sw = gtk.ScrolledWindow()
        sw.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC)
        hildon.hildon_helper_set_thumb_scrollbar(sw, True)
        sw.add(self.treeview)
        self.list_vbox.pack_start(sw)
        einf_entf = gtk.HBox()
        einf_entf.set_homogeneous(True)
        b = gtk.Button('')
        b.get_child().set_markup('<span foreground="#00aa00">Plus</span>')
        b.connect('clicked', self.insert_row)
        self.set_font(b.get_child(), biggest=True)
        einf_entf.pack_start(b)

        b = gtk.Button('')
        b.get_child().set_markup('<span foreground="#aa0000">Entf</span>')
        b.connect('clicked', self.remove_row)
        self.set_font(b.get_child(), biggest=True)
        einf_entf.pack_start(b)
        self.list_vbox.pack_end(einf_entf, expand=False)
        self.main_hbox.pack_start(self.list_vbox)
        self.main_hbox.pack_start(self.create_numpad())
        self.vbox.pack_start(self.main_hbox)

        # Einstellungen (unten)
        self.hbox = gtk.HBox()
        self.hbox.set_border_width(self.padding)
        
        # Länge der Bretter (in Meter)
        self.laenge_liststore = gtk.ListStore(int, str)
        for laenge in self.laengen:
            self.laenge_liststore.append((laenge, '%d mlg' % laenge))
        self.combo = gtk.ComboBox(self.laenge_liststore)
        cell = gtk.CellRendererText()
        self.combo.pack_start(self.set_font(cell, bigger=True))
        self.combo.add_attribute(cell, 'text', 1)
        self.combo.set_active(0)
        self.combo.connect('changed', self.recalculate)
        self.hbox.pack_start(self.combo, expand=False)
        self.hbox.pack_start(gtk.Label(''))

        # Aktuell
        self.hbox.pack_start(self.set_font(gtk.Label('Sum:')), expand=False)
        self.aktuell_label = self.set_font(gtk.Label('0.00 m²'), bigger=True, set_padding=False)
        self.hbox.pack_start(self.aktuell_label, expand=False)
        self.hbox.pack_start(gtk.Label(''))

        self.hbox.pack_start(self.set_font(gtk.Label('Reihen:')), expand=False)
        self.reihen_label = self.set_font(gtk.Label('0'), bigger=True, set_padding=False)
        self.hbox.pack_start(self.reihen_label, expand=False)
        self.hbox.pack_start(gtk.Label(''))

        # Beenden-Button
        self.close_button = gtk.Button('Beenden')
        self.set_font(self.close_button.get_child())
        self.close_button.connect('clicked', self.on_close_button_clicked)
        self.hbox.pack_end(self.close_button, expand=False)

        #self.vbox.pack_end(self.set_background_color(self.hbox, color='#99ffdd'), expand=False)
        self.vbox.pack_end(self.hbox, expand=False)
        self.vbox.pack_end(gtk.HSeparator(), expand=False)

        self.fullscreen()
        self.show_all()
        gtk.main()

    def set_font(self, widget, bigger=False, set_padding=True, biggest=False):
        if biggest:
            font = self.font_biggest
        elif bigger:
            font = self.font_big
        else:
            font = self.font
        if 'font-desc' in (p.name for p in gobject.list_properties(widget)):
            widget.set_property('font-desc', font)
        elif hasattr(widget, 'modify_font'):
            widget.modify_font(font)
        if set_padding and hasattr(widget, 'set_padding'):
            widget.set_padding(self.padding, self.padding)
        return widget
    
    def set_background_color(self, widget, color='white'):
        eb = gtk.EventBox()
        eb.add(widget)
        eb.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse(color))
        return eb

    def create_numpad(self):
        t = gtk.Table(rows=5, columns=3)
        t.set_homogeneous(True)
        t.set_border_width(self.padding)
        # entry looking stuff
        self.entry = gtk.Entry()
        t.attach(self.set_font(self.entry, biggest=True), 0, 3, 0, 1)

        for rid, row in enumerate(((7,8,9), (4,5,6), (1,2,3), ('C', 0, 'AC'))):
            for cid, column in enumerate(row):
                b = gtk.Button(str(column))
                b.connect('clicked', self.add_text)
                self.set_font(b.get_child(), biggest=True)
                if type(column) != int:
                    b.get_child().set_markup('<span foreground="red">'+column+'</span>')
                t.attach(b, cid, cid+1, rid+1, rid+2)

        return t

    def on_close_button_clicked(self, widget):
        self.destroy()

    def add_text(self, widget):
        text = widget.get_label()
        if text == 'C':
            self.entry.set_text(self.entry.get_text()[:-1])
        elif text == 'AC':
            self.entry.set_text('')
        else:
            self.entry.set_text(self.entry.get_text()+text)

    def say(self, s):
        os.system('flite -t "%s" &' % s)

    def insert_row(self, widget):
        text = self.entry.get_text()
        if text == '':
            hildon.hildon_banner_show_information(self, None, 'Bitte zuerst Zahl eingeben')
            return
        self.say(text)
        self.model.append((int(text), text))
        self.entry.set_text('')
        self.recalculate()
        self.treeview.scroll_to_cell(self.model.get_path(self.model_get_iter_last()))

    def model_get_iter_last(self):
        it = self.model.get_iter_first()
        while self.model.iter_next(it) is not None:
            it = self.model.iter_next(it)
        return it

    def remove_row(self, widget):
        if len(self.model) == 0:
            return
        it = self.model_get_iter_last()
        text = self.model.get_value(it, 1)
        self.say('minus %s' % text)
        self.model.remove(it)
        self.recalculate()

    def recalculate(self, widget=None):
        quadratmeter = 0.0
        for number, text in self.model:
            quadratmeter += float(number)/100.0
        active = self.combo.get_active()
        quadratmeter *= self.combo.get_model()[active][0]
        self.aktuell_label.set_text('%.2f m²' % quadratmeter)
        self.reihen_label.set_text(str(len(self.model)))


if __name__ == '__main__':
    Bretter()

