Mercurial > traipse_dev
diff orpg/map/_circles.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/_circles.py Tue Jul 14 16:41:58 2009 -0500 @@ -0,0 +1,168 @@ +from math import sqrt + +import wx + +import orpg.dirpath +from orpg.orpgCore import * + +from _object import MapObject + +class MapCircle(MapObject): + def __init__(self, canvas, center=wx.Point(0,0), radius=0, color="#000000"): + MapObject.__init__(self, canvas=canvas) + self.start = center + self.radius = int(radius) + self.color = color + + r, g, b = self.RGBHex.rgb_tuple(self.color) + self.hcolor = self.RGBHex.hexstring(r^255, g^255, b^255) + + self.id = 'circle-' + 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.TRANSPARENT_PEN + brush = wx.TRANSPARENT_BRUSH + if self.IsShown(): + brush = wx.Brush(wx.Color(r, g, b, 128)) + pen = wx.Pen(wx.Color(r, g, b, 128)) + elif self.canvas.toolWnd.gmToolBar.IsShown(): + brush = wx.Brush(wx.Color(r, g, b, 40)) + pen = wx.Pen(wx.Color(r, g, b, 40)) + font = wx.Font(12, wx.DEFAULT, wx.NORMAL, wx.NORMAL) + dc.SetFont(font, wx.RED) + w, h = dc.GetTextExtent("Hidden") + dc.DrawText("Hidden", self.start.x-(w/2), self.start.y-(h/2), dc.CreateBrush(wx.WHITE_BRUSH)) + + dc.SetBrush(brush) + dc.SetPen(pen) + + path.AddCircle(self.start.x, self.start.y, self.radius) + path.CloseSubpath() + dc.DrawPath(path) + + 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() + + path.AddRectangle(self.start.x-self.radius, self.start.y-self.radius, 5, 5) + path.AddRectangle(self.start.x-self.radius, self.start.y+self.radius, 5, 5) + path.AddRectangle(self.start.x+self.radius, self.start.y-self.radius, 5, 5) + path.AddRectangle(self.start.x+self.radius, self.start.y+self.radius, 5, 5) + + path.MoveToPoint(self.start.x, self.start.y) + path.AddLineToPoint(self.start.x-10, self.start.y) + path.MoveToPoint(self.start.x, self.start.y) + path.AddLineToPoint(self.start.x, self.start.y+10) + path.MoveToPoint(self.start.x, self.start.y) + path.AddLineToPoint(self.start.x+10, self.start.y) + path.MoveToPoint(self.start.x, self.start.y) + path.AddLineToPoint(self.start.x, self.start.y-10) + + dc.DrawPath(path) + + dc.SetBrush(wx.NullBrush) + dc.SetPen(wx.NullPen) + + def InObject(self, pos): + xd = (self.start.x-pos.x)*(self.start.x-pos.x) + yd = (self.start.y-pos.y)*(self.start.y-pos.y) + distance = sqrt(xd+yd) + + if distance <= self.radius: + return True + + return False + + def GetName(self): + return 'Circle: ' + str(self.id) + ' Radius:' + str(self.radius) + ' 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.start = pos + self.lastRadius = 0 + self.radius = 0 + + def OnMotion(self, pos): + dc = wx.ClientDC(self.canvas) + self.canvas.PrepareDC(dc) + dc.SetLogicalFunction(wx.EQUIV) + dc.SetUserScale(self.canvas.zoomScale, self.canvas.zoomScale) + + + if self.radius > 0: + dc.DrawCircle(self.start.x, self.start.y, self.radius) + + xd = (self.start.x-pos.x)*(self.start.x-pos.x) + yd = (self.start.y-pos.y)*(self.start.y-pos.y) + self.radius = sqrt(xd+yd) + + #self.lastRadius = self.radius + dc.DrawCircle(self.start.x, self.start.y, self.radius) + + def OnLeftUp(self, pos): + xd = (self.start.x-pos.x)*(self.start.x-pos.x) + yd = (self.start.y-pos.y)*(self.start.y-pos.y) + radius = sqrt(xd+yd) + + if radius > 15: + self.canvas.zOrder['front'].append(MapCircle(self.canvas, self.start, radius, self.canvas.whiteboardColor)) + self.Update(send=True, action='new') + self.lastRadius = 0 + self.start = wx.Point(0,0) + self.radius = 0 + + def _toxml(self, action="update"): + return '' \ No newline at end of file