pybee
asked on
wx.lib.ogl ShapeCanvas question
How can I find out what shape on the shape canvas is currently selected?
I had a look at the API (http://www.wxpython.org/docs/api/wx.lib.ogl.ShapeCanvas-class.html) but it doesn't seem to have any method like GetSelectedShape.
I know that Shape has a method called Selected which returns True if a shape is selected. So I could possible do something like:
1. create a shape on the canvas
2. add it to a global array of created shapes
3. iterate through this array to see for which shape Selected returns true and return this shape
But is there a better way of doing things?
The reason I ask is because in my frame is defined a method which is a method that appears on the pop up menu when a shape is right clicked and I need this method to be able to access the shape that was right clicked....I can't find a way to pass along the information about what shape was selected from my Event Handler's OnRightClick method to the frame.PopupMenu(frame.shap e_menu) to the frame's self.Bind(wx.EVT_MENU, self.OnAddChild, id=1000) such that I can pass the shape as a parameter in def OnAddChild(self, event). I don't even know if this is something that can/should be done.
Phew! If that explanation sounded crazy please have a look at the relevant bits of code I attached for your perusal :)
Can anyone advise on what would be the best way to solve my issue?
Thanks
I had a look at the API (http://www.wxpython.org/docs/api/wx.lib.ogl.ShapeCanvas-class.html) but it doesn't seem to have any method like GetSelectedShape.
I know that Shape has a method called Selected which returns True if a shape is selected. So I could possible do something like:
1. create a shape on the canvas
2. add it to a global array of created shapes
3. iterate through this array to see for which shape Selected returns true and return this shape
But is there a better way of doing things?
The reason I ask is because in my frame is defined a method which is a method that appears on the pop up menu when a shape is right clicked and I need this method to be able to access the shape that was right clicked....I can't find a way to pass along the information about what shape was selected from my Event Handler's OnRightClick method to the frame.PopupMenu(frame.shap
Phew! If that explanation sounded crazy please have a look at the relevant bits of code I attached for your perusal :)
Can anyone advise on what would be the best way to solve my issue?
Thanks
import wx
import wx.lib.ogl as ogl
class MyEvtHandler(ogl.ShapeEvtHandler):
[SNIPPED FOR CLARITY]
def OnRightClick(self, x, y, *dontcare): #*dontcare
self.OnLeftClick(x, y, 0, 0)
shape = self.GetShape()
canvas = shape.GetCanvas()
frame = canvas.GetFrame()
frame.PopupMenu(frame.shape_menu)
class OGLCanvas(ogl.ShapeCanvas):
[SNIPPED FOR CLARITY]
#This is where I want to define the method that returns the shape current
# selected by the mouse
def GetSelectedShape(self):
pass
def MyAddShape(self, shape, x, y, pen, brush, text):
[SNIPPED FOR CLARITY]
evthandler = MyEvtHandler()
evthandler.SetShape(shape)
evthandler.SetPreviousHandler(shape.GetEventHandler())
shape.SetEventHandler(evthandler)
return shape
class OGLFrame(wx.Frame):
def __init__(self, *args, **kwds):
wx.Frame.__init__(self, *args, **kwds)
self.SetTitle("Testing right click")
self.SetBackgroundColour(wx.Colour(8, 197, 248))
self.canvas = OGLCanvas(self, self)
self.shape_menu = wx.Menu()
self.shape_menu.Append(1000, "Add Child")
self.shape_menu.Append(2000, "Add Text")
self.Bind(wx.EVT_MENU, self.OnAddChild, id=1000)
self.Bind(wx.EVT_MENU, self.OnAddText, id=2000)
def OnAddChild(self, event):
toShape = self.canvas.MyAddShape(ogl.TextShape(120, 45),
160, 35, wx.GREEN_PEN, wx.LIGHT_GREY_BRUSH, "node 1")
# this is where I need to use the method
fromShape = self.canvas.GetSelectedShape()
self.canvas.shapes.append(fromShape)
self.canvas.shapes.append(toShape)
self.canvas.MyAddLink()
self.canvas.Refresh(False)
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
"Selected" might mean something different than we think it does... not everything is selectable...
You could try hooking "mousein" / "mouseout"
You could try hooking "mousein" / "mouseout"
ASKER
Yes I was thinking the same...that perhaps selected does not mean what I think it means. Thanks for the mouse in/out suggestion as an alternative. At the moment though I'll stick with accessing the current shape from the frame since that seems to do the job and I don't think (or I hope not ) it is bad practice or anything...
In other words, I think that yes, i think you need to iterate over the shapes and check the flag, but don't create your own array; use the one the canvas already has..
However, all that being said... make sure that overlapping shapes don't BOTH get their selected bit set....
-john