summaryrefslogtreecommitdiffhomepage
path: root/host/inter/drawable.py
diff options
context:
space:
mode:
authorNicolas Schodet2008-04-04 00:33:39 +0200
committerNicolas Schodet2008-04-04 00:33:39 +0200
commitbcebcf4f38ce6abb6658bcb6bf1911b78afaf75e (patch)
tree5cbcefa7f85ba3362bbff93079da378c931c8c58 /host/inter/drawable.py
parent93212cae352eeda68c18de406bfd696fb976cdaf (diff)
* host/inter:
- added Drawable class.
Diffstat (limited to 'host/inter/drawable.py')
-rw-r--r--host/inter/drawable.py107
1 files changed, 107 insertions, 0 deletions
diff --git a/host/inter/drawable.py b/host/inter/drawable.py
new file mode 100644
index 00000000..52f28dd5
--- /dev/null
+++ b/host/inter/drawable.py
@@ -0,0 +1,107 @@
+from math import sqrt, degrees
+import trans_matrix
+import Tkinter
+
+__all__ = ('Drawable', 'DrawableCanvas')
+
+class Drawable:
+ """Define a drawable area with embeded transformations."""
+
+ def __init__ (self, onto):
+ """Initialise the drawable."""
+ self.onto = onto
+ self.trans_matrix = trans_matrix.TransMatrix ()
+ self.items = [ ]
+ self.trans_apply = self.trans_matrix.apply
+ self.trans_apply_angle = self.trans_matrix.apply_angle
+ self.trans_apply_distance = self.trans_matrix.apply_distance
+ self.trans_rotate = self.trans_matrix.rotate
+ self.trans_translate = self.trans_matrix.translate
+ self.trans_scale = self.trans_matrix.scale
+
+ def __draw_rectangle (self, p1, p2, **kw):
+ p = self.trans_apply (p1, (p2[0], p1[1]), p2, (p1[0], p2[1]))
+ return self.onto.__draw_polygon (*p, **kw)
+
+ def __draw_line (self, *p, **kw):
+ p = self.trans_apply (*p)
+ return self.onto.__draw_line (*p, **kw)
+
+ def __draw_polygon (self, *p, **kw):
+ p = self.trans_apply (*p)
+ return self.onto.__draw_polygon (*p, **kw)
+
+ def __draw_circle (self, p, r, **kw):
+ p = self.trans_apply (p)
+ r = self.trans_apply_distance (r)
+ return self.onto.__draw_circle (p, r, **kw)
+
+ def __draw_arc (self, p, r, **kw):
+ p = self.trans_apply (p)
+ r = self.trans_apply_distance (r)
+ if 'start' in kw:
+ kw = kw.copy ()
+ kw['start'] = self.trans_apply_angle (kw['start'])
+ import math
+ return self.onto.__draw_arc (p, r, **kw)
+
+ def draw_rectangle (self, *p, **kw):
+ """Draw a rectangle."""
+ self.items.append (self.__draw_rectangle (*p, **kw))
+
+ def draw_line (self, *p, **kw):
+ """Draw a line."""
+ self.items.append (self.__draw_line (*p, **kw))
+
+ def draw_polygon (self, *p, **kw):
+ """Draw a line."""
+ self.items.append (self.__draw_polygon (*p, **kw))
+
+ def draw_circle (self, p, r, **kw):
+ """Draw a circle of the given radius centered on p."""
+ self.items.append (self.__draw_circle (p, r, **kw))
+
+ def draw_arc (self, p, r, **kw):
+ """Draw a arc of the given radius centered on p."""
+ self.items.append (self.__draw_arc (p, r, **kw))
+
+ def trans_reset (self):
+ """Reset transformations."""
+ self.trans_matrix.identity ()
+
+ def reset (self):
+ self.__delete (*self.items)
+ self.items = [ ]
+ self.trans_reset ()
+
+ def __delete (self, *list):
+ """Delete a list of items."""
+ self.onto.__delete (*list)
+
+
+class DrawableCanvas(Tkinter.Canvas):
+ """Extend a Tkinter.Canvas to use Drawable on it."""
+
+ def _Drawable__draw_line (self, *p, **kw):
+ return self.create_line (*p, **kw)
+
+ def _Drawable__draw_polygon (self, *p, **kw):
+ return self.create_polygon (*p, **kw)
+
+ def _Drawable__draw_circle (self, p, r, **kw):
+ p1 = (p[0] - r, p[1] - r)
+ p2 = (p[0] + r, p[1] + r)
+ return self.create_oval (p1, p2, **kw)
+
+ def _Drawable__draw_arc (self, p, r, **kw):
+ p1 = (p[0] - r, p[1] - r)
+ p2 = (p[0] + r, p[1] + r)
+ for k in ('start', 'extent'):
+ if k in kw:
+ kw = kw.copy ()
+ # Tk is working upside down.
+ kw[k] = -degrees (kw[k])
+ return self.create_arc (p1, p2, **kw)
+
+ def _Drawable__delete (self, *list):
+ self.delete (*list)