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

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