home *** CD-ROM | disk | FTP | other *** search
- # Source Generated with Decompyle++
- # File: in.pyo (Python 2.6)
-
- import wx
- from wx import Size, VERTICAL, HORIZONTAL, AutoBufferedPaintDC, Color, Rect, RectS
- LEFT_VCENTER = wx.ALIGN_LEFT | wx.ALIGN_CENTRE_VERTICAL
- from gui.textutil import GetTextExtent, DeAmp, TruncateText
- import UberEvents
- from gui import skin
- from gui.windowfx import ApplySmokeAndMirrors
- from util.primitives.funcs import do
- from gui.skin.skinobjects import SkinGradient, Margins
- from common import prefprop
- from gui.textutil import default_font
- from gui.uberwidgets import UberWidget
- NATIVE_BACKGROUNDS = [
- 4,
- 1,
- 3,
- 2,
- 3,
- 3,
- 2]
- from gui.uberwidgets.keycatcher import KeyCatcher
-
- class UberButton(UberWidget, wx.PyControl):
-
- 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):
- wx.PyControl.__init__(self, parent, id = id, pos = pos, style = wx.NO_BORDER | wx.FULL_REPAINT_ON_RESIZE)
- if type == 'combo':
- UberWidget.__init__(self, 'COMBOBOX')
- else:
- UberWidget.__init__(self, 'button')
- self.SetBackgroundStyle(wx.BG_STYLE_CUSTOM)
- self.label = label
- if label:
- self.RegAccel(label)
-
- self.notified = False
- self.active = False
- self.isdown = False
- self.hovered = False
- self.state = 1
- self.menu = None if type == 'menu' else None
- if menu is not None and hasattr(menu, 'OnDismiss'):
- (menu, menu.OnDismiss) += (lambda : self.AddPendingEvent(wx.MenuEvent(wx.wxEVT_MENU_CLOSE, menu.Id)))
-
- if icon:
- self.icon = icon
- self.MakeDicon()
- else:
- self.icon = None
- self.style = style
- self.type = type
- self.menubarmode = menubarmode
- self.ssize = wx.Size(0, 0)
- self.staticwidth = None
- if size:
- self.autoscale = False
- else:
- self.autoscale = True
- self.native = None
- self.Sizer = wx.BoxSizer(HORIZONTAL)
- self.SetSkinKey(skin, True)
- Bind = self.Bind
- (Bind((wx.EVT_MOVE,), (lambda e: self.Refresh())),)
- (Bind(wx.EVT_PAINT, self.OnPaint),)
- (Bind((wx.EVT_SET_FOCUS,), (lambda e: self.Refresh())),)
- (Bind(wx.EVT_KEY_DOWN, self.OnKeyDown),)
- (Bind(wx.EVT_KEY_UP, self.OnKeyUp),)
- (Bind(wx.EVT_KILL_FOCUS, self.OnKillFocus),)
- (Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown),)
- (Bind(wx.EVT_LEFT_DCLICK, self.OnLeftDown),)
- (Bind(wx.EVT_LEFT_UP, self.OnLeftUp),)
- (Bind(wx.EVT_ENTER_WINDOW, self.OnMouseIn),)
- (Bind(wx.EVT_LEAVE_WINDOW, self.OnMouseOut),)
- (Bind(wx.EVT_MOTION, self.OnMotion),)
- Bind((wx.EVT_MENU_CLOSE,), (lambda e: (self.Active(False), self.OnMouseOut())))
- Bind(wx.EVT_SHOW, self.OnShow)
- if onclick is not None:
- if not hasattr(onclick, '__call__'):
- raise TypeError('onclick must be callable')
- hasattr(onclick, '__call__')
- self.Bind((wx.EVT_BUTTON,), (lambda e: (e.Skip(), onclick())))
-
-
-
- def __repr__(self):
-
- try:
- return "<UberButton '%s'>" % self.label
- except:
- return '<UberButton %s>' % id(self)
-
-
-
- def SetAlignment(self, alignment):
- self.style = alignment
- self.Calcumalate()
-
-
- def GetAlignment(self):
- return self.style
-
- Alignment = property(GetAlignment, SetAlignment)
-
- def SetStaticWidth(self, width = None):
- self.staticwidth = width
- self.Calcumalate()
-
-
- def OnMotion(self, event):
- if self.native:
- event.Skip()
- return None
- r = RectS(self.Size)
- if self.HasCapture() and not event.LeftIsDown() and not r.Contains(event.Position):
- self.ReleaseAllCapture()
-
-
-
- def KeyCatcher(self):
-
- try:
- return self.Top._keycatcher
- except AttributeError:
- k = self.Top._keycatcher = KeyCatcher(self.Top)
- return k
-
-
- KeyCatcher = property(KeyCatcher)
-
- def UpdateSkin(self):
- key = self.skinkey
- native = not key
- if native and self.uxthemeable:
- self.rendernative = True
- self.destroy_native()
- self.OpenNativeTheme()
- skinget = skin.get
- self.menuicon = skinget('appdefaults.dropdownicon')
- self.padding = (5, 5)
- self.margins = Margins([
- 0,
- 0,
- 0,
- 0])
- self.Font = default_font()
- self.fontcolors = [
- wx.BLACK] * 7
- self.backgrounds = NATIVE_BACKGROUNDS
- self.Cut()
- elif native:
- if not self.native:
- self.native = wx.Button(self, style = wx.BU_EXACTFIT)
- self.native.SetLabel(self.label)
- self.Sizer.Add(self.native, 1, wx.EXPAND)
- self.Layout()
- self.Cut()
-
- else:
- self.rendernative = False
- self.destroy_native()
- skinget = skin.get
- skinroot = skin.get(key)
- s = skinroot.get
- self.menuicon = s('menuicon', skinget('appdefaults.dropdownicon'))
- self.padding = s('padding', (5, 5))
- self.margins = s('margins', Margins([
- 0,
- 0,
- 0,
- 0]))
- self.Font = s('font', default_font())
- fc = skinroot.get('fontcolors', { })
- s = fc.get
- self.fontcolors = [
- s('disabled', Color(125, 125, 125)),
- s('normal', wx.BLACK),
- s('active', wx.BLACK),
- s('hover', wx.BLACK),
- s('activehover', wx.BLACK),
- s('down', wx.BLACK),
- s('notify', wx.WHITE)]
- bgs = skinroot.get('backgrounds', { })
-
- def s(key, default):
-
- try:
- return bgs[key]
- except:
- return default()
-
-
- disabled = s('disabled', (lambda : SkinGradient('vertical', [
- Color(125, 125, 125),
- Color(237, 237, 237)])))
- normal = s('normal', (lambda : SkinGradient('vertical', [
- Color(200, 255, 200),
- Color(85, 255, 85)])))
- active = s('active', (lambda : SkinGradient('vertical', [
- Color(200, 255, 238),
- Color(85, 255, 238)])))
- hover = s(('hover',), (lambda : normal))
- activehover = s(('activehover',), (lambda : active))
- down = s('down', (lambda : SkinGradient('vertical', [
- Color(0, 125, 0),
- Color(0, 204, 0)])))
- notify = s('notify', (lambda : SkinGradient('vertical', [
- Color(255, 255, 200),
- Color(255, 255, 85)])))
- self.backgrounds = [
- disabled,
- normal,
- active,
- hover,
- activehover,
- down,
- notify]
- self.Calcumalate()
- self.Refresh()
-
-
- def destroy_native(self):
- if self.native:
- self.native.Show(False)
- self.Sizer.Detach(self.native)
- self.native.Destroy()
- self.native = None
-
-
-
- def Enable(self, switch = True):
- if not self.native:
- wx.PyControl.Enable(self, switch)
- if switch:
- events = [
- (wx.EVT_LEFT_DOWN, self.OnLeftDown),
- (wx.EVT_LEFT_DCLICK, self.OnLeftDown),
- (wx.EVT_LEFT_UP, self.OnLeftUp),
- (wx.EVT_ENTER_WINDOW, self.OnMouseIn),
- (wx.EVT_LEAVE_WINDOW, self.OnMouseOut)]
- (do,)((lambda .0: for event, method in .0:
- self.Bind(event, method))(events))
- else:
- events = [
- wx.EVT_LEFT_DOWN,
- wx.EVT_LEFT_DCLICK,
- wx.EVT_LEFT_UP,
- wx.EVT_ENTER_WINDOW,
- wx.EVT_LEAVE_WINDOW]
- (do,)((lambda .0: for event in .0:
- self.Unbind(event))(events))
- self.state = None if switch else 0
- if self.ScreenRect.Contains(wx.GetMousePosition()):
- self.GetHover()
- else:
- self.ReleaseHover()
- else:
- self.native.Enable(switch)
- self.Refresh()
-
-
- def SetMenuBarMode(self, switch = None):
- if switch:
- self.menubarmode = switch
- else:
- self.menubarmode = not (self.menubarmode)
-
-
- def MakeDicon(self):
- self.dicon = self.icon.Greyed.WXB
-
-
- def SetIcon(self, icon = None):
- if icon:
- self.icon = icon
- self.MakeDicon()
- else:
- self.icon = None
- self.dicon = None
- self.Calcumalate()
- self.Refresh()
-
-
- def SetNotify(self, switch):
- self.notified = switch
- self.Refresh()
-
-
- def RegAccel(self, label = ''):
- i = label.find('&')
- if i != -1 and i < len(label) - 1 and label[i + 1] != '&':
- self.KeyCatcher.OnDown('alt+%s' % label[i + 1], self.FakeClick)
-
-
-
- def SetLabel(self, label = ''):
- self.RegAccel(label)
- self.label = label
- if self.native:
- self.native.SetLabel(label)
-
- self.Calcumalate()
- self.Refresh()
-
-
- def GetLabel(self):
- return self.label
-
- Label = property(GetLabel, SetLabel)
-
- def FakeClick(self, event = None):
- if self.type == 'toggle':
- self.Active()
- self.SendButtonEvent(wx.wxEVT_COMMAND_TOGGLEBUTTON_CLICKED)
-
- if self.type == 'menu' and not (self.active):
- self.CallMenu()
- elif not self.type == 'menu':
- self.SendButtonEvent()
-
-
-
- def Calcumalate(self):
- if self.native:
- self.Size = self.MinSize = self.native.BestSize
- self.Parent.Layout()
- ApplySmokeAndMirrors(self)
- return None
- label = DeAmp(self.label)
- if self.icon:
- iconwidth = self.icon.Width
- iconheight = self.icon.Height
- else:
- (iconwidth, iconheight) = (0, 0)
- if label != '':
- labelwidth = GetTextExtent(label, self.Font)[0]
- labelheight = self.Font.Height
- else:
- (labelwidth, labelheight) = (0, 0)
- self.labelsize = Size(labelwidth, labelheight)
- margins = self.margins
- (sx, sy) = self.padding
- swidth = 0
- sheight = 0
- if self.icon and label != '':
- if self.style == HORIZONTAL:
- swidth += iconwidth + labelwidth + 3 * sx
- if iconheight > labelheight:
- sheight += iconheight + 2 * sy
- iy = sy
- else:
- sheight += labelheight + 2 * sy
- iy = sy + labelheight // 2 - iconheight // 2
- self.iconcurser = wx.Point(sx, iy)
- self.labelcurser = wx.Point(self.iconcurser.x + iconwidth + sx, self.iconcurser.y + iconheight / 2 - labelheight / 2)
- if self.menu and not (self.menubarmode) and self.menuicon:
- swidth += self.menuicon.Width + sx
-
- self.ssize = Size(margins.left + swidth + margins.right, margins.top + sheight + margins.bottom)
- elif self.style == VERTICAL:
- labelwin = labelwidth > iconwidth
- if labelwin:
- swidth += labelwidth + 2 * sx
- else:
- swidth += iconwidth + 2 * sx
- sheight += iconheight + labelheight + 3 * sy
- lx = sx
- if labelwin:
- self.iconcurser = wx.Point(lx + labelwidth / 2 - iconwidth / 2, sy)
- self.labelcurser = wx.Point(lx, self.iconcurser.y + iconheight + sy)
- else:
- self.iconcurser = wx.Point(lx, sy)
- self.labelcurser = wx.Point(lx + iconwidth / 2 - labelwidth / 2, self.iconcurser.y + iconheight + sy)
- if self.menu and not (self.menubarmode):
- swidth += self.menuicon.Width + sx
-
- self.ssize = Size(margins.left + swidth + margins.right, margins.top + sheight + margins.bottom)
-
- elif self.icon:
- swidth += iconwidth + 2 * sx
- sheight += iconheight + 2 * sy
- self.iconcurser = wx.Point(sx, sy)
- if self.menu and not (self.menubarmode):
- swidth += self.menuicon.Width + sx
-
- self.ssize = Size(margins.left + swidth + margins.right, margins.top + sheight + margins.bottom)
- elif label != '':
- swidth += labelwidth + 2 * sx
- sheight += labelheight + 2 * sy
- self.labelcurser = wx.Point(sx, sy)
- if self.menu and not (self.menubarmode):
- swidth += self.menuicon.Width + sx
-
- self.ssize = Size(margins.left + swidth + margins.right, margins.top + sheight + margins.bottom)
- elif self.menu is not None and not (self.menubarmode):
- swidth += self.menuicon.Width
- sheight += self.menuicon.Height
- self.ssize = Size(swidth + 2 * sx + margins.x, sheight + 2 * sy + margins.y)
- else:
- self.ssize = Size(16, 16)
- if self.staticwidth:
- self.ssize.width = self.staticwidth
-
- self.MinSize = self.ssize
- self.InvalidateBestSize()
- self.Parent.Layout()
-
-
- def DoGetBestSize(self):
- self.CacheBestSize(self.ssize)
- return self.ssize
-
- side_tabs = prefprop('tabs.side_tabs', False)
-
- def OnPaint(self, event):
- if self.native:
- event.Skip()
- return None
- rect = RectS(self.Size)
- parent = self.Parent
- grandparent = self.GrandParent
- if parent.__class__.__name__ == 'Tab' and self.side_tabs:
- cliptangle = RectS(self.Size)
- sy = self.Rect.y
- (sw, sh) = self.Size
- py = parent.Position.y
- pph = grandparent.Size.height - 16
- if parent.Position.y + parent.Size.height > grandparent.Size.height - 16 and sy + sh + py > pph:
- cliptangle = Rect(0, 0, sw, pph - (sy + py))
- dc = wx.PaintDC(self)
- dc.SetClippingRect(cliptangle)
-
- else:
- dc = AutoBufferedPaintDC(self)
- if self.isdown:
- pass
- elif self.state and self.notified:
- pass
- elif self.state:
- pass
-
- currentstate = 0
- if self.rendernative:
- nrect = None if self.type == 'combo' else rect.Inflate(1, 1)
- part = 1
- state = self.backgrounds[currentstate]
- self.DrawNativeLike(dc, part, state, nrect)
- else:
- background = self.backgrounds[currentstate]
- SplitImage4 = SplitImage4
- import cgui
- if isinstance(background, SplitImage4):
- ApplySmokeAndMirrors(self, background.GetBitmap(self.Size))
- else:
- ApplySmokeAndMirrors(self)
- background.Draw(dc, rect)
- if not self.type == 'combo' and self.rendernative:
- self.DrawContent(dc)
-
-
-
- def OnShow(self, e):
- if not e.GetShow() and self.menu and not wx.IsDestroyed(self.menu) and self.menu.IsShown():
- self.menu.Hide()
-
-
-
- def DrawContent(self, dc):
- if not not (self.menu):
- if self.label != '' and self.icon or self.style == VERTICAL or self.label == '':
- if self.label != '' and self.icon:
- pass
- offset = (None if not (self.style == HORIZONTAL) else 0, self.Size.height / 2 - self.ssize[1] / 2)
- (ml, mt, mr, mb) = self.margins
- if self.icon:
- None(dc.DrawBitmap if self.IsEnabled() else self.dicon, self.iconcurser[0] + offset[0] + ml, self.iconcurser[1] + offset[1] + mt, True)
-
- if self.label != '':
- dc.Font = self.Font
- if self.state and self.notified:
- pass
- elif self.isdown:
- pass
- elif self.state:
- pass
-
- currentstate = 0
- dc.TextForeground = self.fontcolors[currentstate]
- dc.Font = self.Font
- labelcurser = self.labelcurser
- loffset = (max(offset[0], 0), max(offset[1], 0))
- 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
- lrect = Rect(labelcurser.x + loffset[0] + ml, labelcurser.y + loffset[1] + mt, w, self.labelsize[1])
- dc.DrawLabel(TruncateText(self.label.replace('&', ''), w, None, dc), lrect, LEFT_VCENTER, indexAccel = self.label.find('&'))
-
- if self.type == 'menu' and not (self.menubarmode):
- 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)
-
-
-
- def Active(self, switch = None):
- if self.state:
- old_active = self.active
- self.active = None if switch is None else switch
- self.state = None if self.active else 1
- if old_active != self.active:
- self.Refresh(False)
-
-
-
-
- def IsActive(self):
- return self.active
-
-
- def OnKillFocus(self, event):
- if self.native:
- event.Skip()
- self.Refresh()
- return None
- if self.isdown:
- self.OnMouseOut(event)
-
- self.Refresh()
-
-
- def OnKeyDown(self, event):
- if self.native:
- event.Skip()
- self.Refresh()
- return None
- if event.KeyCode == wx.WXK_SPACE:
- if not (self.isdown) and not wx.LeftDown():
- self.OnLeftDown(event)
-
- else:
- event.Skip()
- self.Refresh()
-
-
- def OnKeyUp(self, event):
- if self.native:
- event.Skip()
- self.Refresh()
- return None
- if event.KeyCode == wx.WXK_SPACE:
- if self.isdown and not wx.LeftDown():
- self.OnLeftUp(event)
-
- else:
- event.Skip()
-
-
- def OnLeftDown(self, event = None):
- if self.native:
- self.isdown = True
- event.Skip()
- self.Refresh()
- return None
- if self.isdown:
- self.OnMouseOut(event)
- return None
- self.isdown = True
- self.SetFocus()
- if self.type == 'menu':
- if not self.active:
- self.CallMenu()
- elif self.menu:
- self.Active(False)
- self.menu.Dismiss()
-
-
- self.Refresh()
-
-
- def SendButtonEvent(self, type = None):
- if not type:
- pass
- eventType = wx.wxEVT_COMMAND_BUTTON_CLICKED
- evt = wx.CommandEvent(eventType, self.Id)
- evt.EventObject = self
- self.AddPendingEvent(evt)
-
-
- def OnLeftUp(self, event):
- if self.native:
- self.isdown = False
- event.Skip()
- self.Refresh()
- return None
- self.ReleaseAllCapture()
-
-
- def GetHover(self):
- self.hovered = True
- self.Refresh()
- event = UberEvents.UBOver(source = self)
- self.Parent.AddPendingEvent(event)
-
-
- def OnMouseIn(self, event):
- if not event.LeftIsDown() or self.menubarmode:
- self.GetHover()
-
- if self.native:
- event.Skip()
- return None
- if self.HasCapture():
- self.isdown = True
- self.Refresh()
-
-
-
- def OnMouseOut(self, event = None):
- self.isdown = False
- if self.native:
- event.Skip()
- return None
- if self.menubarmode:
- self.ReleaseAllCapture()
-
- self.ReleaseHover()
- self.Refresh()
-
-
- def ReleaseHover(self):
- self.hovered = False
- self.Refresh()
- event = UberEvents.UBOut(source = self)
- self.Parent.AddPendingEvent(event)
-
-
- def CallMenu(self):
- self.Active()
- if self.active:
- event = wx.MenuEvent(wx.wxEVT_MENU_OPEN, -1)
- event.SetEventObject(self.menu)
- self.Top.ProcessEvent(event)
- self.ReleaseAllCapture()
- self.menu.Display(self)
-
-
-
- def GetValue(self):
- return self.active
-
-
- def SetValue(self, v):
- self.active = v
- self.Refresh()
-
- Value = property(GetValue, SetValue)
-
- def AcceptsFocusFromKeyboard(self):
- return not (self.menubarmode)
-
-
- def AcceptsFocus(self):
- return not (self.menubarmode)
-
-
-