summaryrefslogtreecommitdiff
path: root/host
diff options
context:
space:
mode:
authorNicolas Schodet2008-04-04 00:34:00 +0200
committerNicolas Schodet2008-04-04 00:34:00 +0200
commit53db3573797d0df57dd95b326343c11a03daf6a4 (patch)
treeb279a33d824890483d2062c1ac3fea10aa4dc08a /host
parentbcebcf4f38ce6abb6658bcb6bf1911b78afaf75e (diff)
* host/inter:
- added virtual coordinates to DrawableCanvas.
Diffstat (limited to 'host')
-rw-r--r--host/inter/drawable.py40
-rw-r--r--host/inter/test/test_drawable.py13
2 files changed, 41 insertions, 12 deletions
diff --git a/host/inter/drawable.py b/host/inter/drawable.py
index 52f28dd5..f2f0226b 100644
--- a/host/inter/drawable.py
+++ b/host/inter/drawable.py
@@ -5,7 +5,7 @@ import Tkinter
__all__ = ('Drawable', 'DrawableCanvas')
class Drawable:
- """Define a drawable area with embeded transformations."""
+ """Define a drawable area with embedded transformations."""
def __init__ (self, onto):
"""Initialise the drawable."""
@@ -80,28 +80,60 @@ class Drawable:
class DrawableCanvas(Tkinter.Canvas):
- """Extend a Tkinter.Canvas to use Drawable on it."""
+ """Extend a Tkinter.Canvas to use Drawable on it. User should implement
+ the draw method."""
+
+ def __init__ (self, width, height, xorigin, yorigin, master = None, **kw):
+ """Initialise a DrawableCanvas. The width and height parameters
+ define the requested drawable area virtual size. The xorigin and
+ yorigin parameters define origin of the virtual coordinates relative
+ to the drawable center."""
+ Tkinter.Canvas.__init__ (self, master, **kw)
+ self.__width = width
+ self.__height = height
+ self.__xorigin = xorigin
+ self.__yorigin = yorigin
+ self.bind ('<Configure>', self.__resize)
+
+ def __resize (self, ev):
+ # Compute new scale.
+ w, h = float (ev.width), float (ev.height)
+ self.__scale = min (w / self.__width, h / self.__height)
+ self.__xoffset = w / 2 + self.__xorigin * self.__scale
+ self.__yoffset = h / 2 - self.__yorigin * self.__scale
+ # Redraw.
+ self.draw ()
def _Drawable__draw_line (self, *p, **kw):
+ p = self.__coord (*p)
return self.create_line (*p, **kw)
def _Drawable__draw_polygon (self, *p, **kw):
+ p = self.__coord (*p)
return self.create_polygon (*p, **kw)
def _Drawable__draw_circle (self, p, r, **kw):
+ p, = self.__coord (p)
+ r = r * self.__scale
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):
+ p, = self.__coord (p)
+ r = r * self.__scale
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])
+ kw[k] = degrees (kw[k])
return self.create_arc (p1, p2, **kw)
def _Drawable__delete (self, *list):
self.delete (*list)
+
+ def __coord (self, *args):
+ return [ (i[0] * self.__scale + self.__xoffset,
+ -i[1] * self.__scale + self.__yoffset) for i in args ]
+
diff --git a/host/inter/test/test_drawable.py b/host/inter/test/test_drawable.py
index ab1f8d05..31200252 100644
--- a/host/inter/test/test_drawable.py
+++ b/host/inter/test/test_drawable.py
@@ -7,6 +7,7 @@ from math import pi
class Test (Drawable):
def draw (self):
+ self.draw_rectangle ((-100, -100), (100, 100), fill = '', outline = 'gray')
self.draw_rectangle ((0, 0), (5, 5), fill = 'red')
self.draw_rectangle ((20, 20), (50, 50), fill = '', outline = 'blue')
self.draw_line ((20, 20), (25, 25), (80, 0), (0, 80), fill = 'green')
@@ -17,28 +18,24 @@ class Test (Drawable):
class App (DrawableCanvas):
def __init__ (self, master = None):
- DrawableCanvas.__init__ (self, master)
+ DrawableCanvas.__init__ (self, 300, 300, 20, 20, master)
self.pack (expand = True, fill = 'both')
self.test = Test (self)
- self.bind ('<Configure>', self.resize)
self.animated = False
self.i = 0
def animate (self):
+ # Real user should reset at each redraw.
self.after (500, self.animate)
+ self.test.draw ()
self.test.trans_rotate (-pi/12)
self.test.trans_translate ((10, 10))
self.test.trans_scale (1.05)
- self.test.trans_translate ((self.w / 2, self.h / 2))
- self.test.draw ()
- self.test.trans_translate ((-self.w / 2, -self.h / 2))
self.i += 1
if self.i == 10:
self.test.reset ()
- def resize (self, ev):
- self.w, self.h = ev.width, ev.height
- self.test.reset ()
+ def draw (self):
if not self.animated:
self.animate ()
self.animated = True