diff -r 1460273f40ed -r 5743cbdff669 controls/CustomTree.py --- /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