home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 2009 June / maximum-cd-2009-06.iso / DiscContents / digsby_setup.exe / lib / gui / uberwidgets / UberBar.pyo (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2009-02-26  |  11.6 KB  |  306 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.5)
  3.  
  4. import wx
  5. from wx import Size, TOP, BOTTOM, EXPAND, ALIGN_LEFT, RIGHT, LEFT, HORIZONTAL, FULL_REPAINT_ON_RESIZE, BufferedPaintDC, RectS, Point
  6. from gui import skin
  7. from UberButton import UberButton
  8. from simplemenu import SimpleMenu, SimpleMenuItem
  9. from gui.uberwidgets.umenu import UMenu
  10. from gui.toolbox import OverflowShow
  11. from gui.uberwidgets import UberWidget
  12. from util import do
  13. from gui.skin.skinobjects import Margins, SkinColor
  14. from cgui import SimplePanel
  15. from util import Delegate
  16. wxWindow_Show = wx.Window.Show
  17. from config import platformName
  18.  
  19. class UberBar(SimplePanel, UberWidget):
  20.     
  21.     def __init__(self, parent, id = wx.ID_ANY, skinkey = None, overflowmode = False, name = 'UberBar', alignment = None):
  22.         SimplePanel.__init__(self, parent, FULL_REPAINT_ON_RESIZE)
  23.         UberWidget.__init__(self, 'toolbar')
  24.         self.ChildPaints = Delegate()
  25.         self.alignment = None if alignment and not overflowmode else ALIGN_LEFT
  26.         self.overflowmode = overflowmode
  27.         self.navimode = False
  28.         self.active = None
  29.         self.children = []
  30.         self.staticchildren = []
  31.         self.overflowed = []
  32.         self.focus = None
  33.         events = [
  34.             (wx.EVT_PAINT, self.OnBGPaint),
  35.             (wx.EVT_SIZE, self.OnReSize)]
  36.         (do,)((lambda .0: for event, method in .0:
  37. self.Bind(event, method))(events))
  38.         self.keyletters = { }
  39.         self.tlmargins = Size()
  40.         self.brmargins = Size()
  41.         self.SetSkinKey(skinkey, True)
  42.         self.content = wx.BoxSizer(HORIZONTAL)
  43.         sizer = self.Sizer = wx.GridBagSizer()
  44.         sizer.SetEmptyCellSize(wx.Size(0, 0))
  45.         sizer.AddGrowableCol(1, 1)
  46.         sizer.AddGrowableRow(1, 1)
  47.         contentFlag = None | TOP | BOTTOM if self.alignment == ALIGN_LEFT else self.alignment
  48.         sizer.Add(self.content, (1, 1), flag = contentFlag, border = self.padding.y)
  49.         sizer.Add(Size(self.margins.left, self.margins.top), (0, 0))
  50.         sizer.Add(Size(self.margins.right, self.margins.bottom), (2, 2))
  51.         if overflowmode:
  52.             self.overflowmenu = SimpleMenu(self, self.menuskin)
  53.             self.overflowbutton = UberButton(self, skin = self.buttonskin, type = 'menu', menu = self.overflowmenu)
  54.             self.content.Add((self.padding.x, 1), 1, EXPAND)
  55.             self.content.Add(self.overflowbutton, 0, RIGHT | EXPAND, self.padding.x)
  56.             self.staticchildren.append(self.overflowbutton)
  57.         else:
  58.             spacersizer = self.spacersizer = wx.BoxSizer(wx.HORIZONTAL)
  59.             spacersizer.Add((self.padding.x, 1), 0, EXPAND)
  60.             self.content.Add(spacersizer, 0, EXPAND)
  61.         self.GenWidthRestriction()
  62.  
  63.     
  64.     def UpdateSkin(self):
  65.         key = self.skinkey
  66.         self.native = not key
  67.         if self.native:
  68.             if self.uxthemeable:
  69.                 self.OpenNativeTheme()
  70.                 self.bg = None
  71.             else:
  72.                 self.bg = SkinColor(wx.SystemSettings_GetColour(wx.SYS_COLOUR_3DFACE))
  73.             self.padding = Point(2, 2)
  74.             self.margins = Margins([
  75.                 0,
  76.                 0,
  77.                 0,
  78.                 0])
  79.             self.buttonskin = None
  80.             self.menuskin = None
  81.         else:
  82.             self.CloseNativeTheme()
  83.             self.padding = skin.get(key + '.padding', Point(2, 2))
  84.             self.margins = skin.get(key + '.margins', Margins([
  85.                 0,
  86.                 0,
  87.                 0,
  88.                 0]))
  89.             self.bg = skin.get(key + '.background', (lambda : SkinColor(wx.SystemSettings_GetColour(wx.SYS_COLOUR_3DFACE))))
  90.             self.buttonskin = skin.get(key + '.buttonskin', None)
  91.             self.menuskin = skin.get(key + '.menuskin', None)
  92.         s = self.Sizer
  93.         if s:
  94.             s.Detach(1)
  95.             s.Detach(1)
  96.             s.Add(Size(self.margins.left, self.margins.top), (0, 0))
  97.             s.Add(Size(self.margins.right, self.margins.bottom), (2, 2))
  98.             s.Children[0].SetBorder(self.padding.y)
  99.             for child in self.content.Children:
  100.                 child.SetBorder(self.padding.x)
  101.             
  102.         
  103.         (do,)((lambda .0: for item in .0:
  104. if isinstance(item, UberButton):
  105. item.SetSkinKey(self.buttonskin)continue)(self.children))
  106.         (do,)((lambda .0: for item in .0:
  107. if isinstance(item, UberButton) and item.menu:
  108. item.menu.SetSkinKey(self.menuskin)item.menu)(self.children))
  109.         if hasattr(self, 'overflowbutton'):
  110.             self.overflowbutton.SetSkinKey(self.buttonskin)
  111.             self.overflowmenu.SetSkinKey(self.menuskin)
  112.         
  113.         if not (self.overflowmode) and hasattr(self, 'content'):
  114.             spacersizer = self.spacersizer
  115.             spacersizer.Detach(0)
  116.             spacersizer.Add((self.padding.x, 1), 0, EXPAND)
  117.         
  118.         wx.CallAfter(self.Layout)
  119.  
  120.     
  121.     def GentAltCals(self):
  122.         self.keyletters = { }
  123.         for child in self.children:
  124.             amp_idx = child.label.find('&')
  125.             if isinstance(child, UberButton) and amp_idx != -1:
  126.                 self.keyletters[child.label[amp_idx + 1].upper()] = child
  127.                 continue
  128.         
  129.  
  130.     
  131.     def Add(self, object, expand = False, calcSize = True):
  132.         return self.Insert(len(self.children), object, expand, calcSize = calcSize)
  133.  
  134.     
  135.     def AddMany(self, objects, expand = False):
  136.         for object in objects:
  137.             self.Add(object, expand)
  138.         
  139.  
  140.     
  141.     def AddStatic(self, object, expand = False):
  142.         if self.overflowmode:
  143.             if isinstance(object, UMenu):
  144.                 object = UberButton(self, -1, object.GetTitle(), self.buttonskin, type = 'menu', menu = object)
  145.             elif isinstance(object, UberButton):
  146.                 object.SetSkinKey(self.buttonskin, True)
  147.             else:
  148.                 raise TypeError('Only buttons can be added to UberBar in overflow mode.')
  149.             self.content.Add(object, expand, RIGHT | EXPAND, self.padding.x)
  150.             self.staticchildren.append(object)
  151.             self.GenWidthRestriction()
  152.         else:
  153.             raise AssertionError('Static items are only availible in OverFlowMode')
  154.  
  155.     
  156.     def AddMenuItem(self, item):
  157.         if self.overflowmode:
  158.             self.overflowmenu.AppendItem(item)
  159.         
  160.  
  161.     
  162.     def AddSpacer(self):
  163.         if not self.overflowmode:
  164.             self.content.Add((4 * self.padding.x, 1), 1, EXPAND)
  165.             self.GenWidthRestriction()
  166.         
  167.  
  168.     
  169.     def AddStretchSpacer(self, prop = 1):
  170.         self.content.AddStretchSpacer(prop)
  171.         self.GenWidthRestriction()
  172.  
  173.     
  174.     def InsertSpacer(self, pos):
  175.         if not self.overflowmode:
  176.             self.content.Insert(pos, (4 * self.padding.x, 1), 1, EXPAND)
  177.             self.GenWidthRestriction()
  178.         
  179.  
  180.     
  181.     def Remove(self, object):
  182.         self.content.Detach(object)
  183.         self.children.remove(object)
  184.         self.OnUBSize()
  185.  
  186.     
  187.     def InsertNew(self, pos, thingy, id = -1, label = '', **args):
  188.         object = thingy(self, id = id, label = label, **args)
  189.         self.Insert(pos, object)
  190.         return id
  191.  
  192.     
  193.     def Insert(self, pos, object, expand = False, calcSize = True):
  194.         if isinstance(object, UMenu):
  195.             object = UberButton(self, -1, object.GetTitle(), self.buttonskin, type = 'menu', menu = object)
  196.         elif self.overflowmode:
  197.             if not isinstance(object, UberButton):
  198.                 raise TypeError('Can only add buttons or menus to an UberBar in overflow mode silly!')
  199.             
  200.             object.menuitem = None
  201.             object.shouldshow = True
  202.             object.Show = OverflowShow
  203.         
  204.         if isinstance(object, UberButton):
  205.             object.SetSkinKey(self.buttonskin, True)
  206.         
  207.         self.content.Insert(pos, object, expand, LEFT | EXPAND, self.padding.x)
  208.         self.children.insert(pos, object)
  209.         if calcSize:
  210.             self.OnUBSize()
  211.         
  212.  
  213.     
  214.     def OnBGPaint(self, event):
  215.         dc = BufferedPaintDC(self)
  216.         if self.bg:
  217.             rect = RectS(self.Size)
  218.             self.bg.Draw(dc, rect)
  219.         else:
  220.             self.DrawNativeLike(dc, 0, 0, wx.RectS(self.Size))
  221.         self.ChildPaints(dc)
  222.  
  223.     
  224.     def OnUBSize(self, event = None):
  225.         self.GenWidthRestriction()
  226.  
  227.     
  228.     def SetAlignment(self, alignment):
  229.         if self.alignment != alignment:
  230.             self.alignment = alignment
  231.             self.Sizer.Detach(self.content)
  232.             None(self.Sizer.Add, self.content if alignment == ALIGN_LEFT else 0, self.alignment)
  233.             self.Sizer.Layout()
  234.         
  235.  
  236.     
  237.     def OnReSize(self, event = None):
  238.         if event is not None:
  239.             event.Skip()
  240.         
  241.         self.GenWidthRestriction()
  242.         self.Parent.Layout()
  243.  
  244.     
  245.     def GenWidthRestriction(self, flushoverflow = False):
  246.         if not self.overflowmode:
  247.             return None
  248.         
  249.         children = _[1]
  250.         staticchildren = self.staticchildren
  251.         overflowed = self.overflowed
  252.         omenu = self.overflowmenu
  253.         if flushoverflow:
  254.             for thing in overflowed[:]:
  255.                 wxWindow_Show(thing, thing.shouldshow)
  256.                 overflowed.remove(thing)
  257.                 thing.overflowed = False
  258.                 while omenu.spine.items[0].id == -1:
  259.                     omenu.RemoveItem(0)
  260.                     continue
  261.                     None if thing.menuitem else []
  262.                 self.Layout()
  263.             
  264.         
  265.         if children:
  266.             i = len(children) - len(overflowed) - 1
  267.             laterchild = children[i]
  268.             cutoffpoint = self.Size.width - (sum((lambda .0: for staticchild in .0:
  269. staticchild.Size.width)(staticchildren)) + (len(staticchildren) + 1) * self.padding.x)
  270.             while len(children) > len(overflowed) and laterchild.Rect.Right >= cutoffpoint:
  271.                 if not len(overflowed) and omenu.spine.items and not (omenu.spine.items[0].id == -1):
  272.                     omenu.Insert(0, id = -1)
  273.                 
  274.                 overflowed.insert(0, laterchild)
  275.                 menu_title = getattr(laterchild, 'overflow_label', laterchild.label)
  276.                 menu_cb = getattr(laterchild, 'overflow_callback', laterchild.SendButtonEvent)
  277.                 print menu_title, menu_cb
  278.                 laterchild.menuitem = SimpleMenuItem(menu_title, method = (lambda i, mcb = menu_cb: mcb()))
  279.                 omenu.InsertItem(0, laterchild.menuitem)
  280.                 wxWindow_Show(laterchild, False)
  281.                 i = len(children) - len(overflowed) - 1
  282.                 laterchild = children[i]
  283.             while overflowed and None - cutoffpoint if len(overflowed) == len(children) else laterchild.Rect.Right > overflowed[0].Size.width + self.padding.x:
  284.                 furtherchild = overflowed[0]
  285.                 omenu.RemoveItem(furtherchild.menuitem)
  286.                 furtherchild.menuitem = None
  287.                 wxWindow_Show(furtherchild, True)
  288.                 overflowed.remove(furtherchild)
  289.                 i = len(children) - len(overflowed) - 1
  290.                 laterchild = children[i]
  291.                 while omenu.spine.items[0].id == -1:
  292.                     omenu.RemoveItem(0)
  293.         
  294.         self.Layout()
  295.         self.Top.Layout()
  296.  
  297.     
  298.     def MarkFocus(self, item):
  299.         index = self.children.index(item)
  300.         if self.focus is not None and self.focus != index:
  301.             self.children[self.focus].ReleaseHover()
  302.         
  303.         self.focus = index
  304.  
  305.  
  306.