diff orpg/map/_lines.py @ 0:4385a7d0efd1 grumpy-goblin

Deleted and repushed it with the 'grumpy-goblin' branch. I forgot a y
author sirebral
date Tue, 14 Jul 2009 16:41:58 -0500
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/orpg/map/_lines.py	Tue Jul 14 16:41:58 2009 -0500
@@ -0,0 +1,157 @@
+from math import sqrt
+
+import wx
+
+import orpg.dirpath
+from orpg.orpgCore import *
+
+from _object import MapObject
+
+class MapLine(MapObject):
+    def __init__(self, canvas, start=wx.Point(0,0), width=1, color="#000000", points=[]):
+        MapObject.__init__(self, canvas=canvas)
+        self.start = wx.Point(start[0], start[1])
+        self.color = color
+        self.points = points
+        self.width = width
+
+        r, g, b = self.RGBHex.rgb_tuple(self.color)
+        self.hcolor = self.RGBHex.hexstring(r^255, g^255, b^255)
+
+        self.id = 'line-' + self.canvas.GetNewObjectId()
+
+
+    def Draw(self, dc):
+        path = dc.CreatePath()
+
+        if not self.highlighed:
+            c = self.color
+        else:
+            c = self.hcolor
+        r, g, b = self.RGBHex.rgb_tuple(c)
+
+        pen = wx.Pen(wx.Color(r, g, b, 0), self.width)
+        if self.IsShown():
+            pen = wx.Pen(wx.Color(r, g, b, 255), self.width)
+        elif self.canvas.toolWnd.gmToolBar.IsShown():
+            pen = wx.Pen(wx.Color(r, g, b, 40), self.width)
+        dc.SetPen(pen)
+
+        dc.DrawLines(self.points)
+
+        dc.SetBrush(wx.NullBrush)
+        dc.SetPen(wx.NullPen)
+
+        if self.selected:
+            self.DrawSelection(dc)
+
+    def DrawSelection(self, dc):
+        dc.SetBrush(wx.GREEN_BRUSH)
+        dc.SetPen(wx.GREEN_PEN)
+        path = dc.CreatePath()
+
+        dc.DrawPath(path)
+
+        dc.SetBrush(wx.NullBrush)
+        dc.SetPen(wx.NullPen)
+
+    def InObject(self, pos):
+        for point in self.points:
+            xd = (point[0]-pos.x)*(point[0]-pos.x)
+            yd = (point[1]-pos.y)*(point[1]-pos.y)
+            distance = sqrt(xd+yd)
+
+            if distance <= self.width+1:
+                return True
+
+        return False
+
+    def GetName(self):
+        return self.id + ' Color:' + self.color
+
+    def ShowProperties(self, event):
+        dlg = wx.Dialog(self.canvas, wx.ID_ANY, "Circle Properties")
+        sizer = wx.BoxSizer(wx.HORIZONTAL)
+
+        radius = wx.TextCtrl(dlg, wx.ID_ANY)
+        radius.SetValue(str(self.radius))
+
+        colorbtn = wx.Button(dlg, wx.ID_ANY, "Color")
+        colorbtn.SetForegroundColour(self.hcolor)
+
+        def ColorBtn(event):
+            newcolor = self.RGBHex.do_hex_color_dlg(self.canvas)
+            if newcolor == None:
+                return
+
+            colorbtn.SetForegroundColour(newcolor)
+            dlg.Unbind(wx.EVT_BUTTON)
+
+        dlg.Bind(wx.EVT_BUTTON, ColorBtn, colorbtn)
+
+        sizer.Add(wx.StaticText(dlg, wx.ID_ANY, "Radius:"), 0, wx.ALIGN_CENTER_VERTICAL|wx.ALL, 2)
+        sizer.Add(radius, 0, wx.EXPAND|wx.ALL, 3)
+        sizer.Add(colorbtn, 0, wx.ALL, 2)
+        sizer.Add(wx.Button(dlg, wx.ID_OK), 0, wx.ALL, 3)
+
+        dlg.SetSizer(sizer)
+        dlg.SetAutoLayout(True)
+        dlg.Fit()
+        dlg.Show()
+
+        if dlg.ShowModal() == wx.ID_OK:
+            self.radius = int(radius.GetValue())
+            r,g,b = colorbtn.GetForegroundColour().Get()
+            self.color = self.RGBHex.hexstring(r, g, b)
+            self.hcolor = self.RGBHex.hexstring(r^255, g^255, b^255)
+            self.Update(send=True, action="update")
+
+
+    def OnLeftDown(self, pos):
+        self.lastPoint = pos
+        self.start = pos
+        self.points.append((pos.x, pos.y))
+
+    def OnMotion(self, pos):
+        dc = wx.ClientDC(self.canvas)
+        self.canvas.PrepareDC(dc)
+
+        r,g,b = self.RGBHex.rgb_tuple(self.canvas.whiteboardColor)
+        pen = wx.Pen(wx.Color(r,g,b,255), int(self.canvas.toolWnd.LineWidth.GetStringSelection()))
+        dc.SetPen(pen)
+
+        xd = (self.lastPoint.x-pos.x)*(self.lastPoint.x-pos.x)
+        yd = (self.lastPoint.y-pos.y)*(self.lastPoint.y-pos.y)
+        distance = sqrt(xd+yd)
+
+        if distance > 5:
+            if self.canvas.toolWnd.currentLine == 'Free':
+                self.points.append((pos.x, pos.y))
+                self.lastPoint = pos
+                dc.DrawLines(self.points)
+            else:
+                dc.SetLogicalFunction(wx.INVERT)
+                dc.DrawLine(self.start.x, self.start.y, self.lastPoint.x, self.lastPoint.y)
+                dc.DrawLine(self.start.x, self.start.y, pos.x, pos.y)
+                dc.SetLogicalFunction(wx.COPY)
+                dc.DrawLines(self.points)
+                self.lastPoint = pos
+
+        dc.SetPen(wx.NullPen)
+
+    def OnLeftUp(self, pos):
+        if self.canvas.toolWnd.currentLine == 'Free' and len(self.points) > 2:
+            self.points.append((pos.x, pos.y))
+            self.canvas.zOrder['front'].append(MapLine(self.canvas, self.points[0], int(self.canvas.toolWnd.LineWidth.GetStringSelection()), self.canvas.whiteboardColor, self.points))
+            self.start = wx.Point(0,0)
+            self.points = []
+
+    def OnLeftDClick(self, pos):
+        if self.canvas.toolWnd.currentLine == 'Poly' and len(self.points) > 2:
+            self.points.append((pos.x, pos.y))
+            self.canvas.zOrder['front'].append(MapLine(self.canvas, self.points[0], int(self.canvas.toolWnd.LineWidth.GetStringSelection()), self.canvas.whiteboardColor, self.points))
+            self.points = []
+            self.start = wx.Point(0,0)
+
+    def _toxml(self, action="update"):
+        return ''
\ No newline at end of file