Link to home
Start Free TrialLog in
Avatar of pybee
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.shape_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
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)

Open in new window

Avatar of jgordos
jgordos
Flag of United States of America image

Doesn't the canvas already have a collection that it's keeping the Shapes on the canvas in?

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

ASKER CERTIFIED SOLUTION
Avatar of pybee
pybee

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
"Selected" might mean something different than we think it does... not everything is selectable...

You could try hooking "mousein" / "mouseout"
Avatar of pybee
pybee

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...