#----------------------------------------------------------------------------
# Name: wx.lib.mixins.inspect
-# Purpose: A mix-in class that can add PyCrust-based inspection of the app
+# Purpose: A mix-in class that can add PyCrust-based inspection of the
+# app's widgets and sizers.
#
# Author: Robin Dunn
#
# Licence: wxWindows license
#----------------------------------------------------------------------------
-# NOTE: This class is based on ideas sent to the wxPython-users
-# mail-list by Dan Eloff.
+# NOTE: This class was originally based on ideas sent to the
+# wxPython-users mail list by Dan Eloff.
-import wx.py
+import wx
+from wx.lib.inspect import InspectionTool
+
+
+#----------------------------------------------------------------------------
class InspectionMixin(object):
"""
This class is intended to be used as a mix-in with the wx.App
- object. When used it will add the ability to popup a PyCrust
- window where the widget under the mouse cursor will be loaded into
- the shell's namespace as 'win'.
+ class. When used it will add the ability to popup a
+ InspectionFrame window where the widget under the mouse cursor
+ will be selected in the tree and loaded into the shell's namespace
+ as 'obj'. The default key sequence to activate the inspector is
+ Ctrl-Alt-I (or Cmd-Alt-I on Mac) but this can be changed via
+ parameters to the `Init` method, or the application can call
+ `ShowInspectionTool` from other event handlers if desired.
To use this class simply derive a class from wx.App and
- InspectionMixin and then call the Init() method from the app's
+ InspectionMixin and then call the `Init` method from the app's
OnInit.
"""
- def Init(self, pos=(-1, -1), size=(-1, -1)):
+ def Init(self, pos=wx.DefaultPosition, size=wx.Size(850,700),
+ config=None, locals=None,
+ alt=True, cmd=True, shift=False, keyCode=ord('I')):
"""
- Make the event binding that will activate the PyCrust window.
+ Make the event binding that will activate the InspectionFrame window.
"""
- self.Bind(wx.EVT_KEY_DOWN, self.OnKeyPress)
- self._crust = None
- self._pos = pos
- self._size = size
+ self.Bind(wx.EVT_KEY_DOWN, self._OnKeyPress)
+ self._alt = alt
+ self._cmd = cmd
+ self._shift = shift
+ self._keyCode = keyCode
+ InspectionTool().Init(pos, size, config, locals, self)
-
- def OnKeyPress(self, evt):
+ def _OnKeyPress(self, evt):
"""
- Event handler
+ Event handler, check for our hot-key. Normally it is
+ Ctrl-Alt-I but that can be changed by what is passed to the
+ Init method.
"""
- if evt.AltDown() and evt.CmdDown() and evt.KeyCode == ord('I'):
- self.ShowShell()
+ if evt.AltDown() == self._alt and \
+ evt.CmdDown() == self._cmd and \
+ evt.ShiftDown() == self._shift and \
+ evt.GetKeyCode() == self._keyCode:
+ self.ShowInspectionTool()
else:
evt.Skip()
- def ShowShell(self):
+ def ShowInspectionTool(self):
"""
- Show the PyCrust window.
+ Show the Inspection tool, creating it if neccesary, setting it
+ to display the widget under the cursor.
"""
- if not self._crust:
- self._crust = wx.py.crust.CrustFrame(self.GetTopWindow(),
- pos = self._pos, size = self._size)
- self._crust.shell.interp.locals['app'] = self
- win = wx.FindWindowAtPointer()
- self._crust.shell.interp.locals['win'] = win
- self._crust.Show()
+ # get the current widget under the mouse
+ wnd = wx.FindWindowAtPointer()
+ InspectionTool().Show(wnd)
+
+
+#---------------------------------------------------------------------------
+
+class InspectableApp(wx.App, InspectionMixin):
+ """
+ A simple mix of wx.App and InspectionMixin that can be used stand-alone.
+ """
+
+ def OnInit(self):
+ self.Init()
+ return True
+
+#---------------------------------------------------------------------------
+