home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 2011 October / maximum-cd-2011-10.iso / DiscContents / digsby_setup.exe / lib / gui / uberwidgets / UberButton.pyo (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2011-06-22  |  21.4 KB  |  664 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.6)
  3.  
  4. import wx
  5. from wx import Size, VERTICAL, HORIZONTAL, AutoBufferedPaintDC, Color, Rect, RectS
  6. LEFT_VCENTER = wx.ALIGN_LEFT | wx.ALIGN_CENTRE_VERTICAL
  7. from gui.textutil import GetTextExtent, DeAmp, TruncateText
  8. import UberEvents
  9. from gui import skin
  10. from gui.windowfx import ApplySmokeAndMirrors
  11. from util.primitives.funcs import do
  12. from gui.skin.skinobjects import SkinGradient, Margins
  13. from common import prefprop
  14. from gui.textutil import default_font
  15. from gui.uberwidgets import UberWidget
  16. NATIVE_BACKGROUNDS = [
  17.     4,
  18.     1,
  19.     3,
  20.     2,
  21.     3,
  22.     3,
  23.     2]
  24. from gui.uberwidgets.keycatcher import KeyCatcher
  25.  
  26. class UberButton(UberWidget, wx.PyControl):
  27.     
  28.     def __init__(self, parent, id = -1, label = '', skin = None, icon = None, pos = wx.DefaultPosition, size = None, style = HORIZONTAL, type = None, menu = None, menubarmode = False, onclick = None):
  29.         wx.PyControl.__init__(self, parent, id = id, pos = pos, style = wx.NO_BORDER | wx.FULL_REPAINT_ON_RESIZE)
  30.         if type == 'combo':
  31.             UberWidget.__init__(self, 'COMBOBOX')
  32.         else:
  33.             UberWidget.__init__(self, 'button')
  34.         self.SetBackgroundStyle(wx.BG_STYLE_CUSTOM)
  35.         self.label = label
  36.         if label:
  37.             self.RegAccel(label)
  38.         
  39.         self.notified = False
  40.         self.active = False
  41.         self.isdown = False
  42.         self.hovered = False
  43.         self.state = 1
  44.         self.menu = None if type == 'menu' else None
  45.         if menu is not None and hasattr(menu, 'OnDismiss'):
  46.             (menu, menu.OnDismiss) += (lambda : self.AddPendingEvent(wx.MenuEvent(wx.wxEVT_MENU_CLOSE, menu.Id)))
  47.         
  48.         if icon:
  49.             self.icon = icon
  50.             self.MakeDicon()
  51.         else:
  52.             self.icon = None
  53.         self.style = style
  54.         self.type = type
  55.         self.menubarmode = menubarmode
  56.         self.ssize = wx.Size(0, 0)
  57.         self.staticwidth = None
  58.         if size:
  59.             self.autoscale = False
  60.         else:
  61.             self.autoscale = True
  62.         self.native = None
  63.         self.Sizer = wx.BoxSizer(HORIZONTAL)
  64.         self.SetSkinKey(skin, True)
  65.         Bind = self.Bind
  66.         (Bind((wx.EVT_MOVE,), (lambda e: self.Refresh())),)
  67.         (Bind(wx.EVT_PAINT, self.OnPaint),)
  68.         (Bind((wx.EVT_SET_FOCUS,), (lambda e: self.Refresh())),)
  69.         (Bind(wx.EVT_KEY_DOWN, self.OnKeyDown),)
  70.         (Bind(wx.EVT_KEY_UP, self.OnKeyUp),)
  71.         (Bind(wx.EVT_KILL_FOCUS, self.OnKillFocus),)
  72.         (Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown),)
  73.         (Bind(wx.EVT_LEFT_DCLICK, self.OnLeftDown),)
  74.         (Bind(wx.EVT_LEFT_UP, self.OnLeftUp),)
  75.         (Bind(wx.EVT_ENTER_WINDOW, self.OnMouseIn),)
  76.         (Bind(wx.EVT_LEAVE_WINDOW, self.OnMouseOut),)
  77.         (Bind(wx.EVT_MOTION, self.OnMotion),)
  78.         Bind((wx.EVT_MENU_CLOSE,), (lambda e: (self.Active(False), self.OnMouseOut())))
  79.         Bind(wx.EVT_SHOW, self.OnShow)
  80.         if onclick is not None:
  81.             if not hasattr(onclick, '__call__'):
  82.                 raise TypeError('onclick must be callable')
  83.             hasattr(onclick, '__call__')
  84.             self.Bind((wx.EVT_BUTTON,), (lambda e: (e.Skip(), onclick())))
  85.         
  86.  
  87.     
  88.     def __repr__(self):
  89.         
  90.         try:
  91.             return "<UberButton '%s'>" % self.label
  92.         except:
  93.             return '<UberButton %s>' % id(self)
  94.  
  95.  
  96.     
  97.     def SetAlignment(self, alignment):
  98.         self.style = alignment
  99.         self.Calcumalate()
  100.  
  101.     
  102.     def GetAlignment(self):
  103.         return self.style
  104.  
  105.     Alignment = property(GetAlignment, SetAlignment)
  106.     
  107.     def SetStaticWidth(self, width = None):
  108.         self.staticwidth = width
  109.         self.Calcumalate()
  110.  
  111.     
  112.     def OnMotion(self, event):
  113.         if self.native:
  114.             event.Skip()
  115.             return None
  116.         r = RectS(self.Size)
  117.         if self.HasCapture() and not event.LeftIsDown() and not r.Contains(event.Position):
  118.             self.ReleaseAllCapture()
  119.         
  120.  
  121.     
  122.     def KeyCatcher(self):
  123.         
  124.         try:
  125.             return self.Top._keycatcher
  126.         except AttributeError:
  127.             k = self.Top._keycatcher = KeyCatcher(self.Top)
  128.             return k
  129.  
  130.  
  131.     KeyCatcher = property(KeyCatcher)
  132.     
  133.     def UpdateSkin(self):
  134.         key = self.skinkey
  135.         native = not key
  136.         if native and self.uxthemeable:
  137.             self.rendernative = True
  138.             self.destroy_native()
  139.             self.OpenNativeTheme()
  140.             skinget = skin.get
  141.             self.menuicon = skinget('appdefaults.dropdownicon')
  142.             self.padding = (5, 5)
  143.             self.margins = Margins([
  144.                 0,
  145.                 0,
  146.                 0,
  147.                 0])
  148.             self.Font = default_font()
  149.             self.fontcolors = [
  150.                 wx.BLACK] * 7
  151.             self.backgrounds = NATIVE_BACKGROUNDS
  152.             self.Cut()
  153.         elif native:
  154.             if not self.native:
  155.                 self.native = wx.Button(self, style = wx.BU_EXACTFIT)
  156.                 self.native.SetLabel(self.label)
  157.                 self.Sizer.Add(self.native, 1, wx.EXPAND)
  158.                 self.Layout()
  159.                 self.Cut()
  160.             
  161.         else:
  162.             self.rendernative = False
  163.             self.destroy_native()
  164.             skinget = skin.get
  165.             skinroot = skin.get(key)
  166.             s = skinroot.get
  167.             self.menuicon = s('menuicon', skinget('appdefaults.dropdownicon'))
  168.             self.padding = s('padding', (5, 5))
  169.             self.margins = s('margins', Margins([
  170.                 0,
  171.                 0,
  172.                 0,
  173.                 0]))
  174.             self.Font = s('font', default_font())
  175.             fc = skinroot.get('fontcolors', { })
  176.             s = fc.get
  177.             self.fontcolors = [
  178.                 s('disabled', Color(125, 125, 125)),
  179.                 s('normal', wx.BLACK),
  180.                 s('active', wx.BLACK),
  181.                 s('hover', wx.BLACK),
  182.                 s('activehover', wx.BLACK),
  183.                 s('down', wx.BLACK),
  184.                 s('notify', wx.WHITE)]
  185.             bgs = skinroot.get('backgrounds', { })
  186.             
  187.             def s(key, default):
  188.                 
  189.                 try:
  190.                     return bgs[key]
  191.                 except:
  192.                     return default()
  193.  
  194.  
  195.             disabled = s('disabled', (lambda : SkinGradient('vertical', [
  196. Color(125, 125, 125),
  197. Color(237, 237, 237)])))
  198.             normal = s('normal', (lambda : SkinGradient('vertical', [
  199. Color(200, 255, 200),
  200. Color(85, 255, 85)])))
  201.             active = s('active', (lambda : SkinGradient('vertical', [
  202. Color(200, 255, 238),
  203. Color(85, 255, 238)])))
  204.             hover = s(('hover',), (lambda : normal))
  205.             activehover = s(('activehover',), (lambda : active))
  206.             down = s('down', (lambda : SkinGradient('vertical', [
  207. Color(0, 125, 0),
  208. Color(0, 204, 0)])))
  209.             notify = s('notify', (lambda : SkinGradient('vertical', [
  210. Color(255, 255, 200),
  211. Color(255, 255, 85)])))
  212.             self.backgrounds = [
  213.                 disabled,
  214.                 normal,
  215.                 active,
  216.                 hover,
  217.                 activehover,
  218.                 down,
  219.                 notify]
  220.         self.Calcumalate()
  221.         self.Refresh()
  222.  
  223.     
  224.     def destroy_native(self):
  225.         if self.native:
  226.             self.native.Show(False)
  227.             self.Sizer.Detach(self.native)
  228.             self.native.Destroy()
  229.             self.native = None
  230.         
  231.  
  232.     
  233.     def Enable(self, switch = True):
  234.         if not self.native:
  235.             wx.PyControl.Enable(self, switch)
  236.             if switch:
  237.                 events = [
  238.                     (wx.EVT_LEFT_DOWN, self.OnLeftDown),
  239.                     (wx.EVT_LEFT_DCLICK, self.OnLeftDown),
  240.                     (wx.EVT_LEFT_UP, self.OnLeftUp),
  241.                     (wx.EVT_ENTER_WINDOW, self.OnMouseIn),
  242.                     (wx.EVT_LEAVE_WINDOW, self.OnMouseOut)]
  243.                 (do,)((lambda .0: for event, method in .0:
  244. self.Bind(event, method))(events))
  245.             else:
  246.                 events = [
  247.                     wx.EVT_LEFT_DOWN,
  248.                     wx.EVT_LEFT_DCLICK,
  249.                     wx.EVT_LEFT_UP,
  250.                     wx.EVT_ENTER_WINDOW,
  251.                     wx.EVT_LEAVE_WINDOW]
  252.                 (do,)((lambda .0: for event in .0:
  253. self.Unbind(event))(events))
  254.             self.state = None if switch else 0
  255.             if self.ScreenRect.Contains(wx.GetMousePosition()):
  256.                 self.GetHover()
  257.             else:
  258.                 self.ReleaseHover()
  259.         else:
  260.             self.native.Enable(switch)
  261.         self.Refresh()
  262.  
  263.     
  264.     def SetMenuBarMode(self, switch = None):
  265.         if switch:
  266.             self.menubarmode = switch
  267.         else:
  268.             self.menubarmode = not (self.menubarmode)
  269.  
  270.     
  271.     def MakeDicon(self):
  272.         self.dicon = self.icon.Greyed.WXB
  273.  
  274.     
  275.     def SetIcon(self, icon = None):
  276.         if icon:
  277.             self.icon = icon
  278.             self.MakeDicon()
  279.         else:
  280.             self.icon = None
  281.             self.dicon = None
  282.         self.Calcumalate()
  283.         self.Refresh()
  284.  
  285.     
  286.     def SetNotify(self, switch):
  287.         self.notified = switch
  288.         self.Refresh()
  289.  
  290.     
  291.     def RegAccel(self, label = ''):
  292.         i = label.find('&')
  293.         if i != -1 and i < len(label) - 1 and label[i + 1] != '&':
  294.             self.KeyCatcher.OnDown('alt+%s' % label[i + 1], self.FakeClick)
  295.         
  296.  
  297.     
  298.     def SetLabel(self, label = ''):
  299.         self.RegAccel(label)
  300.         self.label = label
  301.         if self.native:
  302.             self.native.SetLabel(label)
  303.         
  304.         self.Calcumalate()
  305.         self.Refresh()
  306.  
  307.     
  308.     def GetLabel(self):
  309.         return self.label
  310.  
  311.     Label = property(GetLabel, SetLabel)
  312.     
  313.     def FakeClick(self, event = None):
  314.         if self.type == 'toggle':
  315.             self.Active()
  316.             self.SendButtonEvent(wx.wxEVT_COMMAND_TOGGLEBUTTON_CLICKED)
  317.         
  318.         if self.type == 'menu' and not (self.active):
  319.             self.CallMenu()
  320.         elif not self.type == 'menu':
  321.             self.SendButtonEvent()
  322.         
  323.  
  324.     
  325.     def Calcumalate(self):
  326.         if self.native:
  327.             self.Size = self.MinSize = self.native.BestSize
  328.             self.Parent.Layout()
  329.             ApplySmokeAndMirrors(self)
  330.             return None
  331.         label = DeAmp(self.label)
  332.         if self.icon:
  333.             iconwidth = self.icon.Width
  334.             iconheight = self.icon.Height
  335.         else:
  336.             (iconwidth, iconheight) = (0, 0)
  337.         if label != '':
  338.             labelwidth = GetTextExtent(label, self.Font)[0]
  339.             labelheight = self.Font.Height
  340.         else:
  341.             (labelwidth, labelheight) = (0, 0)
  342.         self.labelsize = Size(labelwidth, labelheight)
  343.         margins = self.margins
  344.         (sx, sy) = self.padding
  345.         swidth = 0
  346.         sheight = 0
  347.         if self.icon and label != '':
  348.             if self.style == HORIZONTAL:
  349.                 swidth += iconwidth + labelwidth + 3 * sx
  350.                 if iconheight > labelheight:
  351.                     sheight += iconheight + 2 * sy
  352.                     iy = sy
  353.                 else:
  354.                     sheight += labelheight + 2 * sy
  355.                     iy = sy + labelheight // 2 - iconheight // 2
  356.                 self.iconcurser = wx.Point(sx, iy)
  357.                 self.labelcurser = wx.Point(self.iconcurser.x + iconwidth + sx, self.iconcurser.y + iconheight / 2 - labelheight / 2)
  358.                 if self.menu and not (self.menubarmode) and self.menuicon:
  359.                     swidth += self.menuicon.Width + sx
  360.                 
  361.                 self.ssize = Size(margins.left + swidth + margins.right, margins.top + sheight + margins.bottom)
  362.             elif self.style == VERTICAL:
  363.                 labelwin = labelwidth > iconwidth
  364.                 if labelwin:
  365.                     swidth += labelwidth + 2 * sx
  366.                 else:
  367.                     swidth += iconwidth + 2 * sx
  368.                 sheight += iconheight + labelheight + 3 * sy
  369.                 lx = sx
  370.                 if labelwin:
  371.                     self.iconcurser = wx.Point(lx + labelwidth / 2 - iconwidth / 2, sy)
  372.                     self.labelcurser = wx.Point(lx, self.iconcurser.y + iconheight + sy)
  373.                 else:
  374.                     self.iconcurser = wx.Point(lx, sy)
  375.                     self.labelcurser = wx.Point(lx + iconwidth / 2 - labelwidth / 2, self.iconcurser.y + iconheight + sy)
  376.                 if self.menu and not (self.menubarmode):
  377.                     swidth += self.menuicon.Width + sx
  378.                 
  379.                 self.ssize = Size(margins.left + swidth + margins.right, margins.top + sheight + margins.bottom)
  380.             
  381.         elif self.icon:
  382.             swidth += iconwidth + 2 * sx
  383.             sheight += iconheight + 2 * sy
  384.             self.iconcurser = wx.Point(sx, sy)
  385.             if self.menu and not (self.menubarmode):
  386.                 swidth += self.menuicon.Width + sx
  387.             
  388.             self.ssize = Size(margins.left + swidth + margins.right, margins.top + sheight + margins.bottom)
  389.         elif label != '':
  390.             swidth += labelwidth + 2 * sx
  391.             sheight += labelheight + 2 * sy
  392.             self.labelcurser = wx.Point(sx, sy)
  393.             if self.menu and not (self.menubarmode):
  394.                 swidth += self.menuicon.Width + sx
  395.             
  396.             self.ssize = Size(margins.left + swidth + margins.right, margins.top + sheight + margins.bottom)
  397.         elif self.menu is not None and not (self.menubarmode):
  398.             swidth += self.menuicon.Width
  399.             sheight += self.menuicon.Height
  400.             self.ssize = Size(swidth + 2 * sx + margins.x, sheight + 2 * sy + margins.y)
  401.         else:
  402.             self.ssize = Size(16, 16)
  403.         if self.staticwidth:
  404.             self.ssize.width = self.staticwidth
  405.         
  406.         self.MinSize = self.ssize
  407.         self.InvalidateBestSize()
  408.         self.Parent.Layout()
  409.  
  410.     
  411.     def DoGetBestSize(self):
  412.         self.CacheBestSize(self.ssize)
  413.         return self.ssize
  414.  
  415.     side_tabs = prefprop('tabs.side_tabs', False)
  416.     
  417.     def OnPaint(self, event):
  418.         if self.native:
  419.             event.Skip()
  420.             return None
  421.         rect = RectS(self.Size)
  422.         parent = self.Parent
  423.         grandparent = self.GrandParent
  424.         if parent.__class__.__name__ == 'Tab' and self.side_tabs:
  425.             cliptangle = RectS(self.Size)
  426.             sy = self.Rect.y
  427.             (sw, sh) = self.Size
  428.             py = parent.Position.y
  429.             pph = grandparent.Size.height - 16
  430.             if parent.Position.y + parent.Size.height > grandparent.Size.height - 16 and sy + sh + py > pph:
  431.                 cliptangle = Rect(0, 0, sw, pph - (sy + py))
  432.                 dc = wx.PaintDC(self)
  433.                 dc.SetClippingRect(cliptangle)
  434.             
  435.         else:
  436.             dc = AutoBufferedPaintDC(self)
  437.         if self.isdown:
  438.             pass
  439.         elif self.state and self.notified:
  440.             pass
  441.         elif self.state:
  442.             pass
  443.         
  444.         currentstate = 0
  445.         if self.rendernative:
  446.             nrect = None if self.type == 'combo' else rect.Inflate(1, 1)
  447.             part = 1
  448.             state = self.backgrounds[currentstate]
  449.             self.DrawNativeLike(dc, part, state, nrect)
  450.         else:
  451.             background = self.backgrounds[currentstate]
  452.             SplitImage4 = SplitImage4
  453.             import cgui
  454.             if isinstance(background, SplitImage4):
  455.                 ApplySmokeAndMirrors(self, background.GetBitmap(self.Size))
  456.             else:
  457.                 ApplySmokeAndMirrors(self)
  458.             background.Draw(dc, rect)
  459.         if not self.type == 'combo' and self.rendernative:
  460.             self.DrawContent(dc)
  461.         
  462.  
  463.     
  464.     def OnShow(self, e):
  465.         if not e.GetShow() and self.menu and not wx.IsDestroyed(self.menu) and self.menu.IsShown():
  466.             self.menu.Hide()
  467.         
  468.  
  469.     
  470.     def DrawContent(self, dc):
  471.         if not not (self.menu):
  472.             if self.label != '' and self.icon or self.style == VERTICAL or self.label == '':
  473.                 if self.label != '' and self.icon:
  474.                     pass
  475.         offset = (None if not (self.style == HORIZONTAL) else 0, self.Size.height / 2 - self.ssize[1] / 2)
  476.         (ml, mt, mr, mb) = self.margins
  477.         if self.icon:
  478.             None(dc.DrawBitmap if self.IsEnabled() else self.dicon, self.iconcurser[0] + offset[0] + ml, self.iconcurser[1] + offset[1] + mt, True)
  479.         
  480.         if self.label != '':
  481.             dc.Font = self.Font
  482.             if self.state and self.notified:
  483.                 pass
  484.             elif self.isdown:
  485.                 pass
  486.             elif self.state:
  487.                 pass
  488.             
  489.             currentstate = 0
  490.             dc.TextForeground = self.fontcolors[currentstate]
  491.             dc.Font = self.Font
  492.             labelcurser = self.labelcurser
  493.             loffset = (max(offset[0], 0), max(offset[1], 0))
  494.             w = None(min, self.labelsize.x - self.Rect.Width - labelcurser.x - loffset[0] - self.padding[0] - mr if self.menu and not (self.menubarmode) else 0) + 2
  495.             lrect = Rect(labelcurser.x + loffset[0] + ml, labelcurser.y + loffset[1] + mt, w, self.labelsize[1])
  496.             dc.DrawLabel(TruncateText(self.label.replace('&', ''), w, None, dc), lrect, LEFT_VCENTER, indexAccel = self.label.find('&'))
  497.         
  498.         if self.type == 'menu' and not (self.menubarmode):
  499.             dc.DrawBitmapPoint(self.menuicon, wx.Point(self.Size.width - self.menuicon.Width - self.padding[0] - mr, (self.Size.height - (mt + mb)) / 2 + mt - self.menuicon.Height / 2), True)
  500.         
  501.  
  502.     
  503.     def Active(self, switch = None):
  504.         if self.state:
  505.             old_active = self.active
  506.             self.active = None if switch is None else switch
  507.             self.state = None if self.active else 1
  508.             if old_active != self.active:
  509.                 self.Refresh(False)
  510.             
  511.         
  512.  
  513.     
  514.     def IsActive(self):
  515.         return self.active
  516.  
  517.     
  518.     def OnKillFocus(self, event):
  519.         if self.native:
  520.             event.Skip()
  521.             self.Refresh()
  522.             return None
  523.         if self.isdown:
  524.             self.OnMouseOut(event)
  525.         
  526.         self.Refresh()
  527.  
  528.     
  529.     def OnKeyDown(self, event):
  530.         if self.native:
  531.             event.Skip()
  532.             self.Refresh()
  533.             return None
  534.         if event.KeyCode == wx.WXK_SPACE:
  535.             if not (self.isdown) and not wx.LeftDown():
  536.                 self.OnLeftDown(event)
  537.             
  538.         else:
  539.             event.Skip()
  540.             self.Refresh()
  541.  
  542.     
  543.     def OnKeyUp(self, event):
  544.         if self.native:
  545.             event.Skip()
  546.             self.Refresh()
  547.             return None
  548.         if event.KeyCode == wx.WXK_SPACE:
  549.             if self.isdown and not wx.LeftDown():
  550.                 self.OnLeftUp(event)
  551.             
  552.         else:
  553.             event.Skip()
  554.  
  555.     
  556.     def OnLeftDown(self, event = None):
  557.         if self.native:
  558.             self.isdown = True
  559.             event.Skip()
  560.             self.Refresh()
  561.             return None
  562.         if self.isdown:
  563.             self.OnMouseOut(event)
  564.             return None
  565.         self.isdown = True
  566.         self.SetFocus()
  567.         if self.type == 'menu':
  568.             if not self.active:
  569.                 self.CallMenu()
  570.             elif self.menu:
  571.                 self.Active(False)
  572.                 self.menu.Dismiss()
  573.             
  574.         
  575.         self.Refresh()
  576.  
  577.     
  578.     def SendButtonEvent(self, type = None):
  579.         if not type:
  580.             pass
  581.         eventType = wx.wxEVT_COMMAND_BUTTON_CLICKED
  582.         evt = wx.CommandEvent(eventType, self.Id)
  583.         evt.EventObject = self
  584.         self.AddPendingEvent(evt)
  585.  
  586.     
  587.     def OnLeftUp(self, event):
  588.         if self.native:
  589.             self.isdown = False
  590.             event.Skip()
  591.             self.Refresh()
  592.             return None
  593.         self.ReleaseAllCapture()
  594.  
  595.     
  596.     def GetHover(self):
  597.         self.hovered = True
  598.         self.Refresh()
  599.         event = UberEvents.UBOver(source = self)
  600.         self.Parent.AddPendingEvent(event)
  601.  
  602.     
  603.     def OnMouseIn(self, event):
  604.         if not event.LeftIsDown() or self.menubarmode:
  605.             self.GetHover()
  606.         
  607.         if self.native:
  608.             event.Skip()
  609.             return None
  610.         if self.HasCapture():
  611.             self.isdown = True
  612.             self.Refresh()
  613.         
  614.  
  615.     
  616.     def OnMouseOut(self, event = None):
  617.         self.isdown = False
  618.         if self.native:
  619.             event.Skip()
  620.             return None
  621.         if self.menubarmode:
  622.             self.ReleaseAllCapture()
  623.         
  624.         self.ReleaseHover()
  625.         self.Refresh()
  626.  
  627.     
  628.     def ReleaseHover(self):
  629.         self.hovered = False
  630.         self.Refresh()
  631.         event = UberEvents.UBOut(source = self)
  632.         self.Parent.AddPendingEvent(event)
  633.  
  634.     
  635.     def CallMenu(self):
  636.         self.Active()
  637.         if self.active:
  638.             event = wx.MenuEvent(wx.wxEVT_MENU_OPEN, -1)
  639.             event.SetEventObject(self.menu)
  640.             self.Top.ProcessEvent(event)
  641.             self.ReleaseAllCapture()
  642.             self.menu.Display(self)
  643.         
  644.  
  645.     
  646.     def GetValue(self):
  647.         return self.active
  648.  
  649.     
  650.     def SetValue(self, v):
  651.         self.active = v
  652.         self.Refresh()
  653.  
  654.     Value = property(GetValue, SetValue)
  655.     
  656.     def AcceptsFocusFromKeyboard(self):
  657.         return not (self.menubarmode)
  658.  
  659.     
  660.     def AcceptsFocus(self):
  661.         return not (self.menubarmode)
  662.  
  663.  
  664.