controls/CustomTree.py
changeset 814 5743cbdff669
child 1164 8fd44bc05aae
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/controls/CustomTree.py	Fri Sep 07 16:45:55 2012 +0200
@@ -0,0 +1,104 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+#This library is free software; you can redistribute it and/or
+#modify it under the terms of the GNU General Public
+#License as published by the Free Software Foundation; either
+#version 2.1 of the License, or (at your option) any later version.
+#
+#This library is distributed in the hope that it will be useful,
+#but WITHOUT ANY WARRANTY; without even the implied warranty of
+#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+#General Public License for more details.
+#
+#You should have received a copy of the GNU General Public
+#License along with this library; if not, write to the Free Software
+#Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+import wx
+
+class CustomTree(wx.TreeCtrl):
+    
+    def __init__(self, *args, **kwargs):
+        wx.TreeCtrl.__init__(self, *args, **kwargs)
+        self.SetBackgroundStyle(wx.BG_STYLE_CUSTOM)
+        
+        self.BackgroundBitmap = None
+        self.BackgroundAlign = wx.ALIGN_LEFT|wx.ALIGN_TOP
+        
+        self.AddMenu = None
+        self.Enabled = False
+        
+        if wx.Platform == '__WXMSW__':
+            self.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBackground)
+        else:
+            self.Bind(wx.EVT_PAINT, self.OnPaint)
+            self.Bind(wx.EVT_SIZE, self.OnResize)
+            self.Bind(wx.EVT_SCROLL, self.OnScroll)
+        self.Bind(wx.EVT_LEFT_UP, self.OnLeftUp)
+    
+    def SetBackgroundBitmap(self, bitmap, align):
+        self.BackgroundBitmap = bitmap
+        self.BackgroundAlign = align
+    
+    def SetAddMenu(self, add_menu):
+        self.AddMenu = add_menu
+    
+    def Enable(self, enabled):
+        self.Enabled = enabled
+    
+    def GetBitmapRect(self):
+        client_size = self.GetClientSize()
+        bitmap_size = self.BackgroundBitmap.GetSize()
+        
+        if self.BackgroundAlign & wx.ALIGN_RIGHT:
+            x = client_size[0] - bitmap_size[0]
+        elif self.BackgroundAlign & wx.ALIGN_CENTER_HORIZONTAL:
+            x = (client_size[0] - bitmap_size[0]) / 2
+        else:
+            x = 0
+        
+        if self.BackgroundAlign & wx.ALIGN_BOTTOM:
+            y = client_size[1] - bitmap_size[1]
+        elif self.BackgroundAlign & wx.ALIGN_CENTER_VERTICAL:
+            y = (client_size[1] - bitmap_size[1]) / 2
+        else:
+            y = 0
+        
+        return wx.Rect(x, y, bitmap_size[0], bitmap_size[1])
+    
+    def RefreshBackground(self, refresh_base=False):
+        dc = wx.ClientDC(self)
+        dc.Clear()
+        
+        bitmap_rect = self.GetBitmapRect()
+        dc.DrawBitmap(self.BackgroundBitmap, bitmap_rect.x, bitmap_rect.y)
+        
+        if refresh_base:
+            self.Refresh(False)
+    
+    def OnEraseBackground(self, event):
+        self.RefreshBackground(True)
+    
+    def OnLeftUp(self, event):
+        if self.Enabled:
+            pos = event.GetPosition()
+            item, flags = self.HitTest(pos)
+            
+            bitmap_rect = self.GetBitmapRect()
+            if (bitmap_rect.InsideXY(pos.x, pos.y) or 
+                flags & wx.TREE_HITTEST_NOWHERE) and self.AddMenu is not None:
+                self.PopupMenuXY(self.AddMenu, pos.x, pos.y)
+        event.Skip()
+
+    def OnScroll(self, event):
+        self.RefreshBackground(True)
+        event.Skip()
+
+    def OnResize(self, event):
+        self.RefreshBackground(True)
+        event.Skip()
+    
+    def OnPaint(self, event):
+        self.RefreshBackground()
+        event.Skip()
\ No newline at end of file