# simu - Robot simulation. {{{
#
# Copyright (C) 2009 Nicolas Schodet
#
# APBTeam:
#        Web: http://apbteam.org/
#      Email: team AT apbteam DOT org
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#
# }}}
"""Simulation interface."""
from simu.inter.drawable import *
from Tkinter import *

class TableView (DrawableCanvas):
    """This class handle the view of the table and every items inside it."""

    TABLE_WIDTH = 3000
    TABLE_HEIGHT = 2100
    MARGIN = 150

    def __init__ (self, master = None,
            width = TABLE_WIDTH, height = TABLE_HEIGHT):
        DrawableCanvas.__init__ (self,
                width + 2 * self.MARGIN, height + 2 * self.MARGIN,
                -width / 2, -height / 2,
                master, borderwidth = 1, relief = 'sunken',
                background = 'white')

class ActuatorView (DrawableCanvas):
    """This class handle the view of the actuators inside the robot."""

    UNIT = 120

    def __init__ (self, master = None):
        DrawableCanvas.__init__ (self, 1, 1, 0, 0, master,
                borderwidth = 1, relief = 'sunken', background = 'white')
        self.configure (width = self.UNIT, height = self.UNIT)
        self.size = 0.0

    def add_view (self, width = 1.0, height = 1.0):
        """Return a drawable suitable for an actuator view."""
        ratio = float (height) / float (width)
        self.size += ratio
        self.resize (1, self.size, 0, self.size / 2)
        self.configure (width = self.UNIT, height = self.UNIT * self.size)
        d = Drawable (self)
        d.trans_translate ((0, - self.size + ratio / 2))
        d.trans_scale (1.0 / width)
        return d

class Inter (Frame):
    """Robot simulation interface."""

    def __init__ (self, master = None):
        Frame.__init__ (self, master)
        self.pack (expand = True, fill = 'both')
        self.create_widgets ()

    def create_widgets (self):
        # Main layout.
        self.right_frame = Frame (self)
        self.right_frame.pack (side = 'right', fill = 'y')
        self.quit_button = Button (self.right_frame, text = 'Quit',
                command = self.quit)
        self.quit_button.pack (side = 'top')
        # Actuator view.
        self.actuator_view = ActuatorView (self.right_frame)
        self.actuator_view.pack (side = 'bottom', fill = 'x')
        # Sensor frame.
        self.sensor_frame = Frame (self.right_frame, borderwidth = 1,
                relief = 'sunken')
        self.sensor_frame.pack (side = 'bottom', fill = 'x')
        # Table view.
        self.table_view = TableView (self)
        self.table_view.pack (expand = True, fill = 'both')

    def update (self, *args):
        self.table_view.update ()
        self.actuator_view.update ()

if __name__ == '__main__':
    class TestTable (Drawable):
        def __init__ (self, onto, w, h):
            Drawable.__init__ (self, onto)
            self.w, self.h = w, h
        def draw (self):
            self.reset ()
            w, h = self.w, self.h
            self.draw_rectangle ((0, 0), (w, h), fill = 'blue')
            Drawable.draw (self)
    class TestRectangle (Drawable):
        def __init__ (self, onto, w, h, c1, c2):
            Drawable.__init__ (self, onto)
            self.w, self.h = 0.9 * w, 0.9 * h
            self.c1, self.c2 = c1, c2
        def draw (self):
            self.reset ()
            w, h = self.w, self.h
            self.draw_rectangle ((-w/2, -h/2), (w/2, h/2), fill = self.c1)
            self.draw_rectangle ((0, 0), (w/2, h/2), fill = self.c2)
            Drawable.draw (self)
    class TestSensor:
        def __init__ (self, master):
            self.button = Checkbutton (master, text = 'Sensor',
                    indicatoron = False)
            self.button.pack (side = 'top')
    app = Inter ()
    TestTable (app.table_view, 3000, 2100)
    TestRectangle (app.actuator_view.add_view (1, 1), 1, 1, 'red', 'green')
    TestRectangle (app.actuator_view.add_view (2, 1), 2, 1, 'green', 'blue')
    TestRectangle (app.actuator_view.add_view (1, 2), 1, 2, 'blue', 'red')
    TestSensor (app.sensor_frame)
    app.mainloop ()
