diff src/parpg/gui/tabwidget.py @ 0:1fd2201f5c36

Initial commit of parpg-core.
author M. George Hansen <technopolitica@gmail.com>
date Sat, 14 May 2011 01:12:35 -0700
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/parpg/gui/tabwidget.py	Sat May 14 01:12:35 2011 -0700
@@ -0,0 +1,105 @@
+from fife.extensions.pychan.widgets import VBox, HBox, ScrollArea, Button
+from fife.extensions.pychan.tools import callbackWithArguments
+
+class TabWidget(VBox):
+    def min_size():
+        def fget(self):
+            return self._min_size
+        
+        def fset(self, min_size):
+            self._min_size = min_size
+            self.view.min_size = min_size
+            self.adaptLayout()
+        
+        return locals()
+    min_size = property(**min_size())
+    
+    def max_size():
+        def fget(self):
+            return self._max_size
+        
+        def fset(self, max_size):
+            self._max_size = max_size
+            self.view.max_size = max_size
+            self.adaptLayout()
+        
+        return locals()
+    max_size = property(**max_size())
+    
+    def opaque():
+        def fget(self):
+            return self._getOpaque()
+        
+        def fset(self, opaque):
+            self._setOpaque(opaque)
+            self.view.opaque = opaque
+            base_color = self.view.base_color
+            base_red = base_color.r
+            base_green = base_color.g
+            base_blue = base_color.b
+            background_color = self.view.background_color
+            background_red = background_color.r
+            background_green = background_color.g
+            background_blue = background_color.b
+            alpha = 255 if opaque else 0
+            self.view.base_color = (base_red, base_green, base_blue, alpha)
+            self.view.background_color = (background_red, background_green,
+                                          background_blue, alpha)
+        
+        return locals()
+    opaque = property(**opaque())
+    
+    def border_size():
+        def fget(self):
+            frame = self.findChild(name='frame')
+            return frame.border_size
+        
+        def fset(self, border_size):
+            frame = self.findChild(name='frame')
+            frame.border_size = border_size
+        
+        return locals()
+    border_color = property(**border_size())
+    
+    def __init__(self, min_size=(0, 0), max_size=(9999, 9999), border_size=1,
+                 **kwargs):
+        self._min_size = min_size
+        self._max_size = max_size
+        self.views = {}
+        tab_bar = HBox(name='tabBar')
+        tab_bar.min_size = (0, 20)
+        tab_bar.max_size = (9999, 20)
+        self.view = ScrollArea(name='view')
+        self.view.min_size = self._min_size
+        self.view.max_size = self._max_size
+        self.view.border_size = border_size
+        frame = VBox(name='frame')
+        frame.border_size = border_size
+        frame.opaque = 0
+        frame.addChild(self.view)
+        VBox.__init__(self, **kwargs)
+        self.padding = 0
+        VBox.addChild(self, tab_bar)
+        VBox.addChild(self, frame)
+        self.adaptLayout()
+    
+    def addTab(self, text):
+        text = unicode(text)
+        tab = Button(text=text)
+        tab_bar = self.findChild(name='tabBar')
+        tab_bar.addChild(tab)
+        tab.capture(callbackWithArguments(self.showView, text))
+        self.adaptLayout()
+    
+    def addChild(self, child):
+        name = child.name or unicode(str(child))
+        self.addTab(name)
+        self.views[name] = child
+        if len(self.views) == 1:
+            # Show the first view by default.
+            self.showView(name)
+    
+    def showView(self, name):
+        view = self.views[name]
+        self.view.content = view
+        self.adaptLayout()