# HG changeset patch # User sirebral # Date 1250908822 18000 # Node ID fdcca00696ea06e64090d7e876af15a8e4055310 # Parent 7b752c9d0c28d79e1383b097bf70567f6d1310c8 Continuing the code refinement. diff -r 7b752c9d0c28 -r fdcca00696ea orpg/gametree/nodehandlers/dnd3e.py --- a/orpg/gametree/nodehandlers/dnd3e.py Thu Aug 20 08:41:29 2009 -0500 +++ b/orpg/gametree/nodehandlers/dnd3e.py Fri Aug 21 21:40:22 2009 -0500 @@ -143,12 +143,14 @@ # r- resolved # o- open # -import orpg.tools.orpg_settings #Not used?? + +#import orpg.tools.orpg_settings #Not used?? import orpg.minidom -from core import * +from core import component from containers import * from string import * #a 1.6003 -from inspect import * #a 1.9001 +from inspect import * #a 1.9001 +from orpg.dirpath import dir_struct dnd3e_EXPORT = wx.NewId() ############Global Stuff############## @@ -305,7 +307,7 @@ return html_str def about(self): - html_str = "" #m 1.6000 was hard coded. html_str += "
by Dj Gilcrease
digitalxero@gmail.com" @@ -919,7 +921,7 @@ def on_add(self,evt): if not self.temp_dom: - tmp = open(orpg.dirpath.dir_struct["dnd3e"]+"dnd3eclasses.xml","r") + tmp = open(dir_struct["dnd3e"]+"dnd3eclasses.xml","r") xml_dom = parseXml_with_dlg(self,tmp.read()) xml_dom = xml_dom._get_firstChild() tmp.close() @@ -1550,12 +1552,12 @@ def on_add(self,evt): if not self.temp_dom: - tmp = open(orpg.dirpath.dir_struct["dnd3e"]+"dnd3efeats.xml","r") + tmp = open(dir_struct["dnd3e"]+"dnd3efeats.xml","r") xml_dom = parseXml_with_dlg(self,tmp.read()) xml_dom = xml_dom._get_firstChild() tmp.close() - self.temp_dom = xml_dom - f_list = self.temp_dom.getElementsByTagName('feat') + temp_dom = xml_dom + f_list = temp_dom.getElementsByTagName('feat') opts = [] for f in f_list: opts.append(f.getAttribute('name') + " - [" + @@ -1815,7 +1817,7 @@ def updateFootN(self,n):#a 1.5012 this whole function if not self.temp_dom: - tmp = open(orpg.dirpath.dir_struct["dnd3e"]+"dnd3eweapons.xml","r") + tmp = open(dir_struct["dnd3e"]+"dnd3eweapons.xml","r") #tmp = open("c:\clh\codeSamples\sample1.xml","r") #a (debug) 1.5012 self.temp_dom = xml.dom.minidom.parse(tmp) @@ -2248,7 +2250,7 @@ fnFrame = wx.Frame(masterFrame, -1, title) fnFrame.panel = wx.html.HtmlWindow(fnFrame,-1) if not self.temp_dom: - tmp = open(orpg.dirpath.dir_struct["dnd3e"]+ + tmp = open(dir_struct["dnd3e"]+ "dnd3eweapons.xml","r") #tmp = open("c:\clh\codeSamples\sample1.xml","r") xml_dom = parseXml_with_dlg(self,tmp.read()) @@ -2354,7 +2356,7 @@ def on_add(self,evt): if not self.temp_dom: - tmp = open(orpg.dirpath.dir_struct["dnd3e"]+"dnd3eweapons.xml","r") + tmp = open(dir_struct["dnd3e"]+"dnd3eweapons.xml","r") #tmp = open("c:\clh\codeSamples\sample1.xml","r") #a (debug) 1.5012 xml_dom = parseXml_with_dlg(self,tmp.read()) xml_dom = xml_dom._get_firstChild() @@ -2581,7 +2583,7 @@ def on_add(self,evt): if not self.temp_dom: - tmp = open(orpg.dirpath.dir_struct["dnd3e"]+"dnd3earmor.xml","r") + tmp = open(dir_struct["dnd3e"]+"dnd3earmor.xml","r") xml_dom = parseXml_with_dlg(self,tmp.read()) xml_dom = xml_dom._get_firstChild() tmp.close() @@ -2844,7 +2846,7 @@ def on_add(self,evt): if not self.temp_dom: - tmp = open(orpg.dirpath.dir_struct["dnd3e"]+"dnd3espells.xml","r") + tmp = open(dir_struct["dnd3e"]+"dnd3espells.xml","r") xml_dom = parseXml_with_dlg(self,tmp.read()) xml_dom = xml_dom._get_firstChild() tmp.close() @@ -3051,7 +3053,7 @@ def on_add(self,evt): if not self.temp_dom: - tmp = open(orpg.dirpath.dir_struct["dnd3e"]+"dnd3edivine.xml","r") + tmp = open(dir_struct["dnd3e"]+"dnd3edivine.xml","r") xml_dom = parseXml_with_dlg(self,tmp.read()) xml_dom = xml_dom._get_firstChild() @@ -3288,7 +3290,7 @@ def on_add(self,evt): if not self.temp_dom: - tmp = open(orpg.dirpath.dir_struct["dnd3e"]+"dnd3epowers.xml","r") + tmp = open(dir_struct["dnd3e"]+"dnd3epowers.xml","r") xml_dom = parseXml_with_dlg(self,tmp.read()) xml_dom = xml_dom._get_firstChild() diff -r 7b752c9d0c28 -r fdcca00696ea orpg/main.py --- a/orpg/main.py Thu Aug 20 08:41:29 2009 -0500 +++ b/orpg/main.py Fri Aug 21 21:40:22 2009 -0500 @@ -34,33 +34,27 @@ from orpg_version import * from orpg.orpg_windows import * -from orpg.dirpath import dir_struct - +import wx.py from orpg import minidom - import orpg.player_list - import orpg.tools.pluginui as pluginUI import orpg.tools.aliaslib import orpg.tools.toolBars import orpg.tools.orpg_sound import orpg.tools.rgbhex - import orpg.gametree.gametree import orpg.chat.chatwnd - import orpg.networking.gsclient import orpg.networking.mplay_client - import orpg.mapper.map import orpg.mapper.images import upmana.updatemana import upmana.manifest as manifest -import wx.py +from orpg.dirpath import dir_struct from orpg.dieroller.utils import DiceManager -from orpg.tools.orpg_settings import settings #imported, not used yet +from orpg.tools.orpg_settings import settings from orpg.tools.validate import validate from orpg.tools.passtool import PassTool from orpg.tools.orpg_log import logger @@ -72,7 +66,6 @@ from orpg.orpg_xml import xml #to be replaced by etree - #################################### ## Main Frame #################################### @@ -82,11 +75,9 @@ @debugging def __init__(self, parent, id, title): wx.Frame.__init__(self, parent, id, title, wx.Point(100, 100), wx.Size(600,420), style=wx.DEFAULT_FRAME_STYLE) - self.orpgLog = component.get('log') - self.xml = component.get("xml") self.validate = component.get("validate") - self.orpgLog.log("Enter orpgFrame", ORPG_DEBUG) - self.rgbcovert = orpg.tools.rgbhex.RGBHex() + logger.debug("Enter orpgFrame") + self.rgb = orpg.tools.rgbhex.RGBHex() self._mgr = AUI.AuiManager(self) # Determine which icon format to use @@ -130,7 +121,7 @@ component.add("map",self.map) component.add("alias", self.aliaslib) - self.orpgLog.log("openrpg components all added", ORPG_DEBUG) + logger.debug("openrpg components all added") self.tree.load_tree(settings.get_setting("gametree")) logger.debug("Tree Loaded") self.players.size_cols() @@ -291,11 +282,11 @@ if kwargs.has_key('style'): newstyle = kwargs['style'] else: try: newstyle = args[1] - except: self.orpgLog.log('Invalid Syntax for orpgFrame->SetTabStyles(self, *args, **kwargs)', ORPG_GENERAL); return + except: logger.general('Invalid Syntax for orpgFrame->SetTabStyles(self, *args, **kwargs)'); return if kwargs.has_key('menu'): menu = kwargs['menu'] else: try: menu = args[0] - except: self.orpgLog.log('Invalid Syntax for orpgFrame->SetTabStyles(self, *args, **kwargs)', ORPG_GENERAL); return + except: logger.general('Invalid Syntax for orpgFrame->SetTabStyles(self, *args, **kwargs)'); return if kwargs.has_key('graidentTo'): graidentTo = kwargs['graidentTo'] else: graidentTo = None @@ -306,7 +297,6 @@ #Run though the current tabbed window list and remove those that have been closed tabbedwindows = component.get("tabbedWindows") - rgbc = orpg.tools.rgbhex.RGBHex() new = [] for wnd in tabbedwindows: try: style = wnd.GetWindowStyleFlag(); new.append(wnd) @@ -316,8 +306,7 @@ #Run though the new list and set the proper styles tabbg = settings.get_setting('TabBackgroundGradient') - rgbc = orpg.tools.rgbhex.RGBHex() - (red, green, blue) = rgbc.rgb_tuple(tabbg) + (red, green, blue) = self.rgb.rgb_tuple(tabbg) for wnd in tabbedwindows: style = wnd.GetWindowStyleFlag() @@ -363,15 +352,14 @@ def OnMB_OpenRPGTabStylesSlantedCustom(self): if self.mainmenu.GetMenuState("OpenRPGTabStylesSlantedCustom"): settings.set_setting('TabTheme', 'customslant') - rgbc = orpg.tools.rgbhex.RGBHex() gfrom = settings.get_setting('TabGradientFrom') - (fred, fgreen, fblue) = rgbc.rgb_tuple(gfrom) + (fred, fgreen, fblue) = self.rgb.rgb_tuple(gfrom) gto = settings.get_setting('TabGradientTo') - (tored, togreen, toblue) = rgbc.rgb_tuple(gto) + (tored, togreen, toblue) = self.rgb.rgb_tuple(gto) tabtext = settings.get_setting('TabTextColor') - (tred, tgreen, tblue) = rgbc.rgb_tuple(tabtext) + (tred, tgreen, tblue) = self.rgb.rgb_tuple(tabtext) tabbg = settings.get_setting('TabBackgroundGradient') - (red, green, blue) = rgbc.rgb_tuple(tabbg) + (red, green, blue) = self.rgb.rgb_tuple(tabbg) self.SetTabStyles("OpenRPGTabStylesSlantedCustom", FNB.FNB_VC8, graidentTo=wx.Color(tored, togreen, toblue), graidentFrom=wx.Color(fred, fgreen, fblue), textColor=wx.Color(tred, tgreen, tblue)) @@ -397,15 +385,14 @@ def OnMB_OpenRPGTabStylesFlatCustom(self): if self.mainmenu.GetMenuState("OpenRPGTabStylesFlatCustom"): settings.set_setting('TabTheme', 'customflat') - rgbc = orpg.tools.rgbhex.RGBHex() gfrom = settings.get_setting('TabGradientFrom') - (fred, fgreen, fblue) = rgbc.rgb_tuple(gfrom) + (fred, fgreen, fblue) = self.rgb.rgb_tuple(gfrom) gto = settings.get_setting('TabGradientTo') - (tored, togreen, toblue) = rgbc.rgb_tuple(gto) + (tored, togreen, toblue) = self.rgb.rgb_tuple(gto) tabtext = settings.get_setting('TabTextColor') - (tred, tgreen, tblue) = rgbc.rgb_tuple(tabtext) + (tred, tgreen, tblue) = self.rgb.rgb_tuple(tabtext) tabbg = settings.get_setting('TabBackgroundGradient') - (red, green, blue) = rgbc.rgb_tuple(tabbg) + (red, green, blue) = self.rgb.rgb_tuple(tabbg) self.SetTabStyles("OpenRPGTabStylesFlatCustom", FNB.FNB_FANCY_TABS, graidentTo=wx.Color(tored, togreen, toblue), graidentFrom=wx.Color(fred, fgreen, fblue), textColor=wx.Color(tred, tgreen, tblue)) @@ -608,7 +595,6 @@ ################################# @debugging def build_gui(self): - self.orpgLog.log("Enter orpgFrame->build_gui()", ORPG_DEBUG) self.Freeze() self.validate.config_file("layout.xml","default_layout.xml") @@ -625,7 +611,6 @@ base = etree.getroot() """ - self.windowsmenu = wx.Menu() self.mainwindows = {} @@ -633,7 +618,7 @@ self.pluginsFrame = pluginUI.PluginFrame(self) component.add("plugins", self.get_activeplugins()) component.add("startplugs", self.get_startplugins()) - self.orpgLog.log("Menu Created", ORPG_DEBUG) + logger.debug("Menu Created") h = int(xml_dom.getAttribute("height")) w = int(xml_dom.getAttribute("width")) posx = int(xml_dom.getAttribute("posx")) @@ -646,7 +631,7 @@ self.manifest = manifest.ManifestChanges() self.updateMana = upmana.updatemana.updaterFrame(self, "OpenRPG Update Manager Beta 0.7.2", component, self.manifest, True) - self.orpgLog.log("Menu Created", ORPG_DEBUG) + logger.debug("Menu Created") h = int(xml_dom.getAttribute("height")) w = int(xml_dom.getAttribute("width")) posx = int(xml_dom.getAttribute("posx")) @@ -713,7 +698,7 @@ self._mgr.AddPane(self.mapToolBar, wndinfo) logger.debug("Map Tool Bar Created") - #Create the Browse Server Window + #Create the Browse Server Window #Turn into frame, as with others. self.gs = orpg.networking.gsclient.game_server_panel(self) wndinfo = AUI.AuiPaneInfo() wndinfo.DestroyOnClose(False) @@ -749,11 +734,11 @@ self._mgr.LoadPerspective(textnode._get_nodeValue()) except: pass xml_dom.unlink() - self.orpgLog.log("Perspective Loaded", ORPG_DEBUG) + logger.debug("Perspective Loaded") self._mgr.GetPane("Browse Server Window").Hide() self._mgr.Update() self.Maximize(maximized) - self.orpgLog.log("GUI is all created", ORPG_DEBUG) + logger.debug("GUI is all created") self.Thaw() @debugging @@ -779,7 +764,7 @@ def build_window(self, xml_dom, parent_wnd): name = xml_dom._get_nodeName() if name == "DockLayout" or name == "dock": return - dir = xml_dom.getAttribute("direction") + dirc = xml_dom.getAttribute("direction") #should NOT use dir, it is a built in function. pos = xml_dom.getAttribute("pos") height = xml_dom.getAttribute("height") width = xml_dom.getAttribute("width") @@ -834,11 +819,11 @@ wndinfo.Caption(cap) # Lambda here should work! (future dev) - if dir.lower() == 'top': wndinfo.Top() - elif dir.lower() == 'bottom': wndinfo.Bottom() - elif dir.lower() == 'left': wndinfo.Left() - elif dir.lower() == 'right': wndinfo.Right() - elif dir.lower() == 'center': wndinfo.Center(); wndinfo.CaptionVisible(False) + if dirc.lower() == 'top': wndinfo.Top() + elif dirc.lower() == 'bottom': wndinfo.Bottom() + elif dirc.lower() == 'left': wndinfo.Left() + elif dirc.lower() == 'right': wndinfo.Right() + elif dirc.lower() == 'center': wndinfo.Center(); wndinfo.CaptionVisible(False) if dockable != 1: wndinfo.Dockable(False) @@ -847,12 +832,10 @@ wndinfo.Position(int(pos)) wndinfo.Show() self._mgr.AddPane(temp_wnd, wndinfo) - self.orpgLog.log("Exit orpgFrame->build_window(" + name + ")", ORPG_DEBUG) return temp_wnd @debugging def onPaneClose(self, evt): - self.orpgLog.log("Enter orpgFrame->onPaneClose()", ORPG_DEBUG) pane = evt.GetPane() #Arbitrary If ELIF fix. Items had incorrect ID's set. Finding correct ID will fix it for the iteration. #Adding ID also fixed docking. Go figure. @@ -866,11 +849,9 @@ if pane.name == wname: self.windowsmenu.Check(wndid, False); break evt.Skip() self._mgr.Update() - self.orpgLog.log("Exit orpgFrame->onPaneClose()", ORPG_DEBUG) @debugging def saveLayout(self): - self.orpgLog.log("Enter orpgFrame->saveLayout()", ORPG_DEBUG) filename = dir_struct["user"] + "layout.xml" temp_file = open(filename) txt = temp_file.read() @@ -898,53 +879,41 @@ temp_file = open(filename, "w") temp_file.write(xml_dom.toxml(1)) temp_file.close() - self.orpgLog.log("Exit saveLayout()", ORPG_DEBUG) @debugging def build_hotkeys(self): - self.orpgLog.log("Enter orpgFrame->build_hotkeys(self)", ORPG_DEBUG) self.mainmenu.accel.xaccel.extend(self.chat.get_hot_keys()) self.mainmenu.accel.xaccel.extend(self.map.get_hot_keys()) - self.orpgLog.log("Exit orpgFrame->build_hotkeys(self)", ORPG_DEBUG) @debugging def start_timer(self): - self.orpgLog.log("Enter orpgFrame->start_timer(self)", ORPG_DEBUG) self.poll_timer.Start(100) s = component.get('settings') if s.get_setting("Heartbeat") == "1": self.ping_timer.Start(1000*60) - self.orpgLog.log("starting heartbeat...", ORPG_DEBUG, True) - self.orpgLog.log("Exit orpgFrame->start_timer(self)", ORPG_DEBUG) + logger.debug("starting heartbeat...", True) @debugging def kill_mplay_session(self): - self.orpgLog.log("Enter orpgFrame->kill_mplay_session(self)", ORPG_DEBUG) self.game_name = "" self.session.start_disconnect() - self.orpgLog.log("Exit orpgFrame->kill_mplay_session(self)", ORPG_DEBUG) @debugging def quit_game(self, evt): - self.orpgLog.log("Enter orpgFrame->quit_game(self, evt)", ORPG_DEBUG) dlg = wx.MessageDialog(self,"Exit gaming session?","Game Session",wx.YES_NO) if dlg.ShowModal() == wx.ID_YES: self.session.exitCondition.notifyAll() dlg.Destroy() self.kill_mplay_session() - self.orpgLog.log("Exit orpgFrame->quit_game(self, evt)", ORPG_DEBUG) @debugging def on_status_event(self, evt): - self.orpgLog.log("Enter orpgFrame->on_status_event(self, evt)", ORPG_DEBUG) id = evt.get_id() status = evt.get_data() if id == orpg.networking.mplay_client.STATUS_SET_URL: self.status.set_url(status) - self.orpgLog.log("Exit orpgFrame->on_status_event(self, evt)", ORPG_DEBUG) @debugging def on_player_event(self, evt): - self.orpgLog.log("Enter orpgFrame->on_player_event(self, evt)", ORPG_DEBUG) id = evt.get_id() player = evt.get_data() display_name = self.chat.chat_display_name(player) @@ -958,32 +927,26 @@ elif id == orpg.networking.mplay_client.PLAYER_UPDATE: self.players.update_player(player) self.players.Refresh() - self.orpgLog.log("Exit orpgFrame->on_player_event(self, evt)", ORPG_DEBUG) @debugging def on_group_event(self, evt): - self.orpgLog.log("Enter orpgFrame->on_group_event(self, evt)", ORPG_DEBUG) id = evt.get_id() data = evt.get_data() - if id == orpg.networking.mplay_client.GROUP_NEW: self.gs.add_room(data) elif id == orpg.networking.mplay_client.GROUP_DEL: self.password_manager.RemoveGroupData(data) self.gs.del_room(data) elif id == orpg.networking.mplay_client.GROUP_UPDATE: self.gs.update_room(data) - self.orpgLog.log("Exit orpgFrame->on_group_event(self, evt)", ORPG_DEBUG) @debugging def on_receive(self, data, player): - self.orpgLog.log("Enter orpgFrame->on_receive(self, data, player)", ORPG_DEBUG) - # see if we are ignoring this user (ignore_id,ignore_name) = self.session.get_ignore_list() for m in ignore_id: if m == player[2]: logger.debug("ignoring message from player:" + player[0], True); return # ok we are not ignoring this message - #recvSound = "RecvSound" # this will be the default sound. Whisper will change this below + #recvSound = "RecvSound" # this will be the default sound. Whisper will change this below if player: display_name = self.chat.chat_display_name(player) else: display_name = "Server Administrator" @@ -1182,11 +1145,11 @@ component.add('validate', validate) component.add("tabbedWindows", []) + logger._set_log_level = int(settings.get_setting('LoggingLevel')) + logger._set_log_to_console(False) + self.manifest = manifest.ManifestChanges() - self.orpgLog = component.get('log') - self.validate = component.get('validate') - logger.log_level = int(settings.get_setting('LoggingLevel')) self.called = False wx.InitAllImageHandlers() self.splash = orpgSplashScreen(None, dir_struct["icon"] + 'splash13.jpg', 3000, self.AfterSplash) @@ -1228,7 +1191,7 @@ @debugging def OnExit_CleanUp(self): - self.orpgLog.log("Preforming cleanup\n", ORPG_DEBUG) + logger.debug("Preforming cleanup\n") try: del os.environ["OPENRPG_BASE"] except: pass try: os.remove(os.environ["OPENRPG_BASE"] + os.sep + 'orpg' + os.sep + 'dirpath' + os.sep + 'approot.py') @@ -1240,4 +1203,4 @@ def OnExit(self): self.OnExit_CleanUp() #Exit - self.orpgLog.log("Main Application Exit\n\n", ORPG_DEBUG) + logger.debug("Main Application Exit\n\n") diff -r 7b752c9d0c28 -r fdcca00696ea orpg/orpg_version.py --- a/orpg/orpg_version.py Thu Aug 20 08:41:29 2009 -0500 +++ b/orpg/orpg_version.py Fri Aug 21 21:40:22 2009 -0500 @@ -4,7 +4,7 @@ #BUILD NUMBER FORMAT: "YYMMDD-##" where ## is the incremental daily build index (if needed) DISTRO = "Traipse Dev" DIS_VER = "Ornery Orc" -BUILD = "090820-02" +BUILD = "090821-00" # This version is for network capability. PROTOCOL_VERSION = "1.2" diff -r 7b752c9d0c28 -r fdcca00696ea orpg/tools/FlatNotebook.py --- a/orpg/tools/FlatNotebook.py Thu Aug 20 08:41:29 2009 -0500 +++ b/orpg/tools/FlatNotebook.py Fri Aug 21 21:40:22 2009 -0500 @@ -642,29 +642,23 @@ def GetMondrianBitmap(): return wx.BitmapFromImage(GetMondrianImage().Scale(16, 16)) - def GetMondrianImage(): import cStringIO stream = cStringIO.StringIO(GetMondrianData()) return wx.ImageFromStream(stream) - def GetMondrianIcon(): icon = wx.EmptyIcon() icon.CopyFromBitmap(GetMondrianBitmap()) return icon #---------------------------------------------------------------------- - def LightColour(color, percent): """ Brighten input colour by percent. """ - end_color = wx.WHITE - rd = end_color.Red() - color.Red() gd = end_color.Green() - color.Green() bd = end_color.Blue() - color.Blue() - high = 100 # We take the percent way of the color from color -. white @@ -674,66 +668,43 @@ b = color.Blue() + ((i*bd*100)/high)/100 return wx.Colour(r, g, b) - def RandomColour(): """ Creates a random colour. """ - r = random.randint(0, 255) # Random value betweem 0-255 g = random.randint(0, 255) # Random value betweem 0-255 b = random.randint(0, 255) # Random value betweem 0-255 - return wx.Colour(r, g, b) - def PaintStraightGradientBox(dc, rect, startColor, endColor, vertical=True): """ Draws a gradient colored box from startColor to endColor. """ - rd = endColor.Red() - startColor.Red() gd = endColor.Green() - startColor.Green() bd = endColor.Blue() - startColor.Blue() - # Save the current pen and brush savedPen = dc.GetPen() savedBrush = dc.GetBrush() - - if vertical: - high = rect.GetHeight()-1 - else: - high = rect.GetWidth()-1 - - if high < 1: - return - + if vertical: high = rect.GetHeight()-1 + else: high = rect.GetWidth()-1 + if high < 1: return for i in xrange(high+1): - r = startColor.Red() + ((i*rd*100)/high)/100 g = startColor.Green() + ((i*gd*100)/high)/100 b = startColor.Blue() + ((i*bd*100)/high)/100 - p = wx.Pen(wx.Colour(r, g, b)) dc.SetPen(p) - - if vertical: - dc.DrawLine(rect.x, rect.y+i, rect.x+rect.width, rect.y+i) - else: - dc.DrawLine(rect.x+i, rect.y, rect.x+i, rect.y+rect.height) - + if vertical: dc.DrawLine(rect.x, rect.y+i, rect.x+rect.width, rect.y+i) + else: dc.DrawLine(rect.x+i, rect.y, rect.x+i, rect.y+rect.height) # Restore the pen and brush dc.SetPen(savedPen) dc.SetBrush(savedBrush) - - -# ----------------------------------------------------------------------------- +""" # Util functions -# ----------------------------------------------------------------------------- - +""" def DrawButton(dc, rect, focus, upperTabs): - # Define the rounded rectangle base on the given rect # we need an array of 9 points for it regPts = [wx.Point() for indx in xrange(9)] - if focus: if upperTabs: leftPt = wx.Point(rect.x, rect.y + (rect.height / 10)*8) @@ -744,16 +715,11 @@ else: leftPt = wx.Point(rect.x, rect.y + (rect.height / 2)) rightPt = wx.Point(rect.x + rect.width - 2, rect.y + (rect.height / 2)) - # Define the top region top = wx.RectPP(rect.GetTopLeft(), rightPt) bottom = wx.RectPP(leftPt, rect.GetBottomRight()) - topStartColor = wx.WHITE - - if not focus: - topStartColor = LightColour(wx.SystemSettings_GetColour(wx.SYS_COLOUR_3DFACE), 50) - + if not focus: topStartColor = LightColour(wx.SystemSettings_GetColour(wx.SYS_COLOUR_3DFACE), 50) topEndColor = wx.SystemSettings_GetColour(wx.SYS_COLOUR_3DFACE) bottomStartColor = topEndColor bottomEndColor = topEndColor @@ -766,7 +732,6 @@ else: PaintStraightGradientBox(dc, top, topEndColor , topStartColor) PaintStraightGradientBox(dc, bottom, bottomStartColor, bottomEndColor) - else: if focus: PaintStraightGradientBox(dc, bottom, topEndColor, bottomEndColor) @@ -774,107 +739,83 @@ else: PaintStraightGradientBox(dc, bottom, bottomStartColor, bottomEndColor) PaintStraightGradientBox(dc, top, topEndColor, topStartColor) - dc.SetBrush(wx.TRANSPARENT_BRUSH) -# ---------------------------------------------------------------------------- # +""" # Class FNBDropSource # Gives Some Custom UI Feedback during the DnD Operations -# ---------------------------------------------------------------------------- # - +""" class FNBDropSource(wx.DropSource): """ Give some custom UI feedback during the drag and drop operation in this function. It is called on each mouse move, so your implementation must not be too slow. """ - def __init__(self, win): """ Default class constructor. Used internally. """ - wx.DropSource.__init__(self, win) self._win = win - def GiveFeedback(self, effect): """ Provides user with a nice feedback when tab is being dragged. """ - self._win.DrawDragHint() return False -# ---------------------------------------------------------------------------- # +""" # Class FNBDragInfo # Stores All The Information To Allow Drag And Drop Between Different # FlatNotebooks. -# ---------------------------------------------------------------------------- # - +""" class FNBDragInfo: - _map = weakref.WeakValueDictionary() - def __init__(self, container, pageindex): """ Default class constructor. """ - self._id = id(container) FNBDragInfo._map[self._id] = container self._pageindex = pageindex - def GetContainer(self): """ Returns the L{FlatNotebook} page (usually a panel). """ - return FNBDragInfo._map.get(self._id, None) - def GetPageIndex(self): """ Returns the page index associated with a page. """ - return self._pageindex -# ---------------------------------------------------------------------------- # +""" # Class FNBDropTarget # Simply Used To Handle The OnDrop() Method When Dragging And Dropping Between # Different FlatNotebooks. -# ---------------------------------------------------------------------------- # - +""" class FNBDropTarget(wx.DropTarget): - def __init__(self, parent): """ Default class constructor. """ - wx.DropTarget.__init__(self) - self._parent = parent self._dataobject = wx.CustomDataObject(wx.CustomDataFormat("FlatNotebook")) self.SetDataObject(self._dataobject) - def OnData(self, x, y, dragres): """ Handles the OnData() method to call the real DnD routine. """ - if not self.GetData(): return wx.DragNone - draginfo = self._dataobject.GetData() drginfo = cPickle.loads(draginfo) - return self._parent.OnDropTarget(x, y, drginfo.GetPageIndex(), drginfo.GetContainer()) -# ---------------------------------------------------------------------------- # +""" # Class PageInfo # Contains parameters for every FlatNotebook page -# ---------------------------------------------------------------------------- # - +""" class PageInfo: """ This class holds all the information (caption, image, etc...) belonging to a single tab in L{FlatNotebook}. """ - def __init__(self, caption="", imageindex=-1, tabangle=0, enabled=True): """ Default Class Constructor. @@ -885,7 +826,6 @@ @param tabangle: the tab angle (only on standard tabs, from 0 to 15 degrees); @param enabled: sets enabled or disabled the tab. """ - self._strCaption = caption self._TabAngle = tabangle self._ImageIndex = imageindex @@ -897,119 +837,82 @@ self._color = None self._hasFocus = False - def SetCaption(self, value): """ Sets the tab caption. """ - self._strCaption = value - def GetCaption(self): """ Returns the tab caption. """ - return self._strCaption - def SetPosition(self, value): """ Sets the tab position. """ - self._pos = value - def GetPosition(self): """ Returns the tab position. """ - return self._pos - def SetSize(self, value): """ Sets the tab size. """ - self._size = value - def GetSize(self): """ Returns the tab size. """ - return self._size - def SetTabAngle(self, value): """ Sets the tab header angle (0 <= tab <= 15 degrees). """ - self._TabAngle = min(45, value) - def GetTabAngle(self): """ Returns the tab angle. """ - return self._TabAngle - def SetImageIndex(self, value): """ Sets the tab image index. """ - self._ImageIndex = value - def GetImageIndex(self): """ Returns the tab umage index. """ - return self._ImageIndex - def GetEnabled(self): """ Returns whether the tab is enabled or not. """ - return self._bEnabled - def EnableTab(self, enabled): """ Sets the tab enabled or disabled. """ - self._bEnabled = enabled - def SetRegion(self, points=[]): """ Sets the tab region. """ - self._region = wx.RegionFromPoints(points) - def GetRegion(self): """ Returns the tab region. """ - return self._region - def SetXRect(self, xrect): """ Sets the button 'X' area rect. """ - self._xRect = xrect - def GetXRect(self): """ Returns the button 'X' area rect. """ - return self._xRect - def GetColour(self): """ Returns the tab colour. """ - return self._color - def SetColour(self, color): """ Sets the tab colour. """ - self._color = color -# ---------------------------------------------------------------------------- # +""" # Class FlatNotebookEvent -# ---------------------------------------------------------------------------- # - +""" class FlatNotebookEvent(wx.PyCommandEvent): """ This events will be sent when a EVT_FLATNOTEBOOK_PAGE_CHANGED, @@ -1017,68 +920,48 @@ EVT_FLATNOTEBOOK_PAGE_CLOSED and EVT_FLATNOTEBOOK_PAGE_CONTEXT_MENU is mapped in the parent. """ - def __init__(self, eventType, id=1, nSel=-1, nOldSel=-1): """ Default class constructor. """ - wx.PyCommandEvent.__init__(self, eventType, id) self._eventType = eventType - self.notify = wx.NotifyEvent(eventType, id) - def GetNotifyEvent(self): """Returns the actual wx.NotifyEvent.""" - return self.notify - def IsAllowed(self): """Returns whether the event is allowed or not.""" - return self.notify.IsAllowed() - def Veto(self): """Vetos the event.""" - self.notify.Veto() - def Allow(self): """The event is allowed.""" - self.notify.Allow() - def SetSelection(self, nSel): """ Sets event selection. """ - self._selection = nSel - def SetOldSelection(self, nOldSel): """ Sets old event selection. """ - self._oldselection = nOldSel - def GetSelection(self): """ Returns event selection. """ - return self._selection - def GetOldSelection(self): """ Returns old event selection """ - return self._oldselection -# ---------------------------------------------------------------------------- # +""" # Class TabNavigatorWindow -# ---------------------------------------------------------------------------- # - +""" class TabNavigatorWindow(wx.Dialog): """ This class is used to create a modal dialog that enables "Smart Tabbing", @@ -1087,39 +970,26 @@ def __init__(self, parent=None, icon=None): """ Default class constructor. Used internally.""" - wx.Dialog.__init__(self, parent, wx.ID_ANY, "", style=0) - self._selectedItem = -1 self._indexMap = [] - - if icon is None: - self._bmp = GetMondrianBitmap() - else: - self._bmp = icon - + if icon is None: self._bmp = GetMondrianBitmap() + else: self._bmp = icon sz = wx.BoxSizer(wx.VERTICAL) - self._listBox = wx.ListBox(self, wx.ID_ANY, wx.DefaultPosition, wx.Size(200, 150), [], wx.LB_SINGLE | wx.NO_BORDER) - mem_dc = wx.MemoryDC() mem_dc.SelectObject(wx.EmptyBitmap(1,1)) font = wx.SystemSettings_GetFont(wx.SYS_DEFAULT_GUI_FONT) font.SetWeight(wx.BOLD) mem_dc.SetFont(font) - panelHeight = mem_dc.GetCharHeight() panelHeight += 4 # Place a spacer of 2 pixels # Out signpost bitmap is 24 pixels - if panelHeight < 24: - panelHeight = 24 - + if panelHeight < 24: panelHeight = 24 self._panel = wx.Panel(self, wx.ID_ANY, wx.DefaultPosition, wx.Size(200, panelHeight)) - sz.Add(self._panel) sz.Add(self._listBox, 1, wx.EXPAND) - self.SetSizer(sz) # Connect events to the list box @@ -1130,114 +1000,76 @@ # Connect paint event to the panel self._panel.Bind(wx.EVT_PAINT, self.OnPanelPaint) self._panel.Bind(wx.EVT_ERASE_BACKGROUND, self.OnPanelEraseBg) - self.SetBackgroundColour(wx.SystemSettings_GetColour(wx.SYS_COLOUR_3DFACE)) self._listBox.SetBackgroundColour(wx.SystemSettings_GetColour(wx.SYS_COLOUR_3DFACE)) self.PopulateListControl(parent) - self.GetSizer().Fit(self) self.GetSizer().SetSizeHints(self) self.GetSizer().Layout() self.Centre() - def OnKeyUp(self, event): """Handles the wx.EVT_KEY_UP for the L{TabNavigatorWindow}.""" - - if event.GetKeyCode() == wx.WXK_CONTROL: - self.CloseDialog() - + if event.GetKeyCode() == wx.WXK_CONTROL: self.CloseDialog() def OnNavigationKey(self, event): """Handles the wx.EVT_NAVIGATION_KEY for the L{TabNavigatorWindow}. """ - selected = self._listBox.GetSelection() bk = self.GetParent() maxItems = bk.GetPageCount() - if event.GetDirection(): - # Select next page - if selected == maxItems - 1: - itemToSelect = 0 - else: - itemToSelect = selected + 1 - + if selected == maxItems - 1: itemToSelect = 0 + else: itemToSelect = selected + 1 else: - # Previous page - if selected == 0: - itemToSelect = maxItems - 1 - else: - itemToSelect = selected - 1 - + if selected == 0: itemToSelect = maxItems - 1 + else: itemToSelect = selected - 1 self._listBox.SetSelection(itemToSelect) - def PopulateListControl(self, book): """Populates the L{TabNavigatorWindow} listbox with a list of tabs.""" - selection = book.GetSelection() count = book.GetPageCount() - self._listBox.Append(book.GetPageText(selection)) self._indexMap.append(selection) - prevSel = book.GetPreviousSelection() - if prevSel != wx.NOT_FOUND: - # Insert the previous selection as second entry self._listBox.Append(book.GetPageText(prevSel)) self._indexMap.append(prevSel) - for c in xrange(count): - # Skip selected page - if c == selection: - continue - + if c == selection: continue # Skip previous selected page as well - if c == prevSel: - continue - + if c == prevSel: continue self._listBox.Append(book.GetPageText(c)) self._indexMap.append(c) - # Select the next entry after the current selection self._listBox.SetSelection(0) dummy = wx.NavigationKeyEvent() dummy.SetDirection(True) self.OnNavigationKey(dummy) - def OnItemSelected(self, event): """Handles the wx.EVT_LISTBOX_DCLICK event for the wx.ListBox inside L{TabNavigatorWindow}. """ - self.CloseDialog() - def CloseDialog(self): """Closes the L{TabNavigatorWindow} dialog, setting selection in L{FlatNotebook}.""" - bk = self.GetParent() self._selectedItem = self._listBox.GetSelection() iter = self._indexMap[self._selectedItem] bk._pages.FireEvent(iter) self.EndModal(wx.ID_OK) - def OnPanelPaint(self, event): """Handles the wx.EVT_PAINT event for L{TabNavigatorWindow} top panel. """ - dc = wx.PaintDC(self._panel) rect = self._panel.GetClientRect() - bmp = wx.EmptyBitmap(rect.width, rect.height) - mem_dc = wx.MemoryDC() mem_dc.SelectObject(bmp) - endColour = wx.SystemSettings_GetColour(wx.SYS_COLOUR_BTNSHADOW) startColour = LightColour(endColour, 50) PaintStraightGradientBox(mem_dc, rect, startColour, endColour) @@ -1254,41 +1086,34 @@ font.SetWeight(wx.BOLD) mem_dc.SetFont(font) fontHeight = mem_dc.GetCharHeight() - txtPt.x = bmpPt.x + self._bmp.GetWidth() + 4 txtPt.y = (rect.height - fontHeight)/2 mem_dc.SetTextForeground(wx.WHITE) mem_dc.DrawText("Opened tabs:", txtPt.x, txtPt.y) mem_dc.SelectObject(wx.NullBitmap) - dc.DrawBitmap(bmp, 0, 0) - def OnPanelEraseBg(self, event): """Handles the wx.EVT_ERASE_BACKGROUND event for L{TabNavigatorWindow} top panel. """ - pass - -# ---------------------------------------------------------------------------- # +""" # Class FNBRenderer -# ---------------------------------------------------------------------------- # - +""" class FNBRenderer: """ Parent class for the 4 renderers defined: I{Standard}, I{VC71}, I{Fancy} and I{VC8}. This class implements the common methods of all 4 renderers. """ - def __init__(self): """Default class constructor. """ - self._tabHeight = None - if wx.Platform == "__WXMAC__": + """ # Hack to get proper highlight color for focus rectangle from # current theme by creating a theme brush and getting its color. # kThemeBrushFocusHighlight is available on Mac OS 8.5 and higher + """ brush = wx.BLACK_BRUSH brush.MacSetTheme(Carbon.Appearance.kThemeBrushFocusHighlight) self._focusPen = wx.Pen(brush.GetColour(), 2, wx.SOLID) @@ -1297,417 +1122,266 @@ self._focusPen.SetDashes([1, 1]) self._focusPen.SetCap(wx.CAP_BUTT) - def GetLeftButtonPos(self, pageContainer): """ Returns the left button position in the navigation area. """ - pc = pageContainer style = pc.GetParent().GetWindowStyleFlag() rect = pc.GetClientRect() clientWidth = rect.width - - if style & FNB_NO_X_BUTTON: - return clientWidth - 38 - else: - return clientWidth - 54 - + if style & FNB_NO_X_BUTTON: return clientWidth - 38 + else: return clientWidth - 54 def GetRightButtonPos(self, pageContainer): """ Returns the right button position in the navigation area. """ - pc = pageContainer style = pc.GetParent().GetWindowStyleFlag() rect = pc.GetClientRect() clientWidth = rect.width - - if style & FNB_NO_X_BUTTON: - return clientWidth - 22 - else: - return clientWidth - 38 - + if style & FNB_NO_X_BUTTON: return clientWidth - 22 + else: return clientWidth - 38 def GetDropArrowButtonPos(self, pageContainer): """ Returns the drop down button position in the navigation area. """ - return self.GetRightButtonPos(pageContainer) - def GetXPos(self, pageContainer): """ Returns the 'X' button position in the navigation area. """ - pc = pageContainer style = pc.GetParent().GetWindowStyleFlag() rect = pc.GetClientRect() clientWidth = rect.width - - if style & FNB_NO_X_BUTTON: - return clientWidth - else: - return clientWidth - 22 - + if style & FNB_NO_X_BUTTON: return clientWidth + else: return clientWidth - 22 def GetButtonsAreaLength(self, pageContainer): """ Returns the navigation area width. """ - pc = pageContainer style = pc.GetParent().GetWindowStyleFlag() - # '' - if style & FNB_NO_NAV_BUTTONS and style & FNB_NO_X_BUTTON and not style & FNB_DROPDOWN_TABS_LIST: - return 0 - + if style & FNB_NO_NAV_BUTTONS and style & FNB_NO_X_BUTTON and not style & FNB_DROPDOWN_TABS_LIST: return 0 # 'x' - elif style & FNB_NO_NAV_BUTTONS and not style & FNB_NO_X_BUTTON and not style & FNB_DROPDOWN_TABS_LIST: - return 22 - + elif style & FNB_NO_NAV_BUTTONS and not style & FNB_NO_X_BUTTON and not style & FNB_DROPDOWN_TABS_LIST: return 22 # '<>' - if not style & FNB_NO_NAV_BUTTONS and style & FNB_NO_X_BUTTON and not style & FNB_DROPDOWN_TABS_LIST: - return 53 - 16 - + if not style & FNB_NO_NAV_BUTTONS and style & FNB_NO_X_BUTTON and not style & FNB_DROPDOWN_TABS_LIST: return 53 - 16 # 'vx' - if style & FNB_DROPDOWN_TABS_LIST and not style & FNB_NO_X_BUTTON: - return 22 + 16 - + if style & FNB_DROPDOWN_TABS_LIST and not style & FNB_NO_X_BUTTON: return 22 + 16 # 'v' - if style & FNB_DROPDOWN_TABS_LIST and style & FNB_NO_X_BUTTON: - return 22 - + if style & FNB_DROPDOWN_TABS_LIST and style & FNB_NO_X_BUTTON: return 22 # '<>x' return 53 - def DrawArrowAccordingToState(self, dc, pc, rect): - lightFactor = (pc.HasFlag(FNB_BACKGROUND_GRADIENT) and [70] or [0])[0] PaintStraightGradientBox(dc, rect, pc._tabAreaColor, LightColour(pc._tabAreaColor, lightFactor)) - def DrawLeftArrow(self, pageContainer, dc): """ Draw the left navigation arrow. """ - pc = pageContainer - style = pc.GetParent().GetWindowStyleFlag() - if style & FNB_NO_NAV_BUTTONS: - return - + if style & FNB_NO_NAV_BUTTONS: return # Make sure that there are pages in the container - if not pc._pagesInfoVec: - return - + if not pc._pagesInfoVec: return # Set the bitmap according to the button status - if pc._nLeftButtonStatus == FNB_BTN_HOVER: - arrowBmp = wx.BitmapFromXPMData(left_arrow_hilite_xpm) - elif pc._nLeftButtonStatus == FNB_BTN_PRESSED: - arrowBmp = wx.BitmapFromXPMData(left_arrow_pressed_xpm) - else: - arrowBmp = wx.BitmapFromXPMData(left_arrow_xpm) - + if pc._nLeftButtonStatus == FNB_BTN_HOVER: arrowBmp = wx.BitmapFromXPMData(left_arrow_hilite_xpm) + elif pc._nLeftButtonStatus == FNB_BTN_PRESSED: arrowBmp = wx.BitmapFromXPMData(left_arrow_pressed_xpm) + else: arrowBmp = wx.BitmapFromXPMData(left_arrow_xpm) if pc._nFrom == 0: # Handle disabled arrow arrowBmp = wx.BitmapFromXPMData(left_arrow_disabled_xpm) - arrowBmp.SetMask(wx.Mask(arrowBmp, MASK_COLOR)) - # Erase old bitmap posx = self.GetLeftButtonPos(pc) self.DrawArrowAccordingToState(dc, pc, wx.Rect(posx, 6, 16, 14)) - # Draw the new bitmap dc.DrawBitmap(arrowBmp, posx, 6, True) - def DrawRightArrow(self, pageContainer, dc): """ Draw the right navigation arrow. """ - pc = pageContainer - style = pc.GetParent().GetWindowStyleFlag() - if style & FNB_NO_NAV_BUTTONS: - return - + if style & FNB_NO_NAV_BUTTONS: return # Make sure that there are pages in the container - if not pc._pagesInfoVec: - return + if not pc._pagesInfoVec: return # Set the bitmap according to the button status - if pc._nRightButtonStatus == FNB_BTN_HOVER: - arrowBmp = wx.BitmapFromXPMData(right_arrow_hilite_xpm) - elif pc._nRightButtonStatus == FNB_BTN_PRESSED: - arrowBmp = wx.BitmapFromXPMData(right_arrow_pressed_xpm) - else: - arrowBmp = wx.BitmapFromXPMData(right_arrow_xpm) + if pc._nRightButtonStatus == FNB_BTN_HOVER: arrowBmp = wx.BitmapFromXPMData(right_arrow_hilite_xpm) + elif pc._nRightButtonStatus == FNB_BTN_PRESSED: arrowBmp = wx.BitmapFromXPMData(right_arrow_pressed_xpm) + else: arrowBmp = wx.BitmapFromXPMData(right_arrow_xpm) # Check if the right most tab is visible, if it is # don't rotate right anymore if pc._pagesInfoVec[-1].GetPosition() != wx.Point(-1, -1): arrowBmp = wx.BitmapFromXPMData(right_arrow_disabled_xpm) - arrowBmp.SetMask(wx.Mask(arrowBmp, MASK_COLOR)) - # erase old bitmap posx = self.GetRightButtonPos(pc) self.DrawArrowAccordingToState(dc, pc, wx.Rect(posx, 6, 16, 14)) - # Draw the new bitmap dc.DrawBitmap(arrowBmp, posx, 6, True) - def DrawDropDownArrow(self, pageContainer, dc): """ Draws the drop-down arrow in the navigation area. """ - pc = pageContainer - # Check if this style is enabled style = pc.GetParent().GetWindowStyleFlag() - if not style & FNB_DROPDOWN_TABS_LIST: - return - + if not style & FNB_DROPDOWN_TABS_LIST: return # Make sure that there are pages in the container - if not pc._pagesInfoVec: - return - - if pc._nArrowDownButtonStatus == FNB_BTN_HOVER: - downBmp = wx.BitmapFromXPMData(down_arrow_hilite_xpm) - elif pc._nArrowDownButtonStatus == FNB_BTN_PRESSED: - downBmp = wx.BitmapFromXPMData(down_arrow_pressed_xpm) - else: - downBmp = wx.BitmapFromXPMData(down_arrow_xpm) - + if not pc._pagesInfoVec: return + if pc._nArrowDownButtonStatus == FNB_BTN_HOVER: downBmp = wx.BitmapFromXPMData(down_arrow_hilite_xpm) + elif pc._nArrowDownButtonStatus == FNB_BTN_PRESSED: downBmp = wx.BitmapFromXPMData(down_arrow_pressed_xpm) + else: downBmp = wx.BitmapFromXPMData(down_arrow_xpm) downBmp.SetMask(wx.Mask(downBmp, MASK_COLOR)) - # erase old bitmap posx = self.GetDropArrowButtonPos(pc) self.DrawArrowAccordingToState(dc, pc, wx.Rect(posx, 6, 16, 14)) - # Draw the new bitmap dc.DrawBitmap(downBmp, posx, 6, True) - def DrawX(self, pageContainer, dc): """ Draw the 'X' navigation button in the navigation area. """ - pc = pageContainer - # Check if this style is enabled style = pc.GetParent().GetWindowStyleFlag() - if style & FNB_NO_X_BUTTON: - return - + if style & FNB_NO_X_BUTTON: return # Make sure that there are pages in the container - if not pc._pagesInfoVec: - return - + if not pc._pagesInfoVec: return # Set the bitmap according to the button status - if pc._nXButtonStatus == FNB_BTN_HOVER: - xbmp = wx.BitmapFromXPMData(x_button_hilite_xpm) - elif pc._nXButtonStatus == FNB_BTN_PRESSED: - xbmp = wx.BitmapFromXPMData(x_button_pressed_xpm) - else: - xbmp = wx.BitmapFromXPMData(x_button_xpm) - + if pc._nXButtonStatus == FNB_BTN_HOVER: xbmp = wx.BitmapFromXPMData(x_button_hilite_xpm) + elif pc._nXButtonStatus == FNB_BTN_PRESSED: xbmp = wx.BitmapFromXPMData(x_button_pressed_xpm) + else: xbmp = wx.BitmapFromXPMData(x_button_xpm) xbmp.SetMask(wx.Mask(xbmp, MASK_COLOR)) - # erase old bitmap posx = self.GetXPos(pc) self.DrawArrowAccordingToState(dc, pc, wx.Rect(posx, 6, 16, 14)) - # Draw the new bitmap dc.DrawBitmap(xbmp, posx, 6, True) - def DrawTabX(self, pageContainer, dc, rect, tabIdx, btnStatus): """ Draws the 'X' in the selected tab. """ - pc = pageContainer - if not pc.HasFlag(FNB_X_ON_TAB): - return - + if not pc.HasFlag(FNB_X_ON_TAB): return # We draw the 'x' on the active tab only - if tabIdx != pc.GetSelection() or tabIdx < 0: - return - + if tabIdx != pc.GetSelection() or tabIdx < 0: return # Set the bitmap according to the button status - - if btnStatus == FNB_BTN_HOVER: - xBmp = wx.BitmapFromXPMData(x_button_hilite_xpm) - elif btnStatus == FNB_BTN_PRESSED: - xBmp = wx.BitmapFromXPMData(x_button_pressed_xpm) - else: - xBmp = wx.BitmapFromXPMData(x_button_xpm) - + if btnStatus == FNB_BTN_HOVER: xBmp = wx.BitmapFromXPMData(x_button_hilite_xpm) + elif btnStatus == FNB_BTN_PRESSED: xBmp = wx.BitmapFromXPMData(x_button_pressed_xpm) + else: xBmp = wx.BitmapFromXPMData(x_button_xpm) # Set the masking xBmp.SetMask(wx.Mask(xBmp, MASK_COLOR)) - # Draw the new bitmap dc.DrawBitmap(xBmp, rect.x, rect.y, True) - # Update the vector rr = wx.Rect(rect.x, rect.y, 14, 13) pc._pagesInfoVec[tabIdx].SetXRect(rr) - def DrawTabsLine(self, pageContainer, dc, selTabX1=-1, selTabX2=-1): """ Draws a line over the tabs. """ - pc = pageContainer - clntRect = pc.GetClientRect() clientRect3 = wx.Rect(0, 0, clntRect.width, clntRect.height) - if pc.HasFlag(FNB_FF2): - if not pc.HasFlag(FNB_BOTTOM): - fillColor = wx.SystemSettings_GetColour(wx.SYS_COLOUR_3DFACE) - else: - fillColor = wx.WHITE - + if not pc.HasFlag(FNB_BOTTOM): fillColor = wx.SystemSettings_GetColour(wx.SYS_COLOUR_3DFACE) + else: fillColor = wx.WHITE dc.SetPen(wx.Pen(fillColor)) - if pc.HasFlag(FNB_BOTTOM): - dc.DrawLine(1, 0, clntRect.width-1, 0) dc.DrawLine(1, 1, clntRect.width-1, 1) - dc.SetPen(wx.Pen(wx.SystemSettings_GetColour(wx.SYS_COLOUR_BTNSHADOW))) dc.DrawLine(1, 2, clntRect.width-1, 2) - dc.SetPen(wx.Pen(fillColor)) dc.DrawLine(selTabX1 + 2, 2, selTabX2 - 1, 2) - else: - dc.DrawLine(1, clntRect.height, clntRect.width-1, clntRect.height) dc.DrawLine(1, clntRect.height-1, clntRect.width-1, clntRect.height-1) - dc.SetPen(wx.Pen(wx.SystemSettings_GetColour(wx.SYS_COLOUR_BTNSHADOW))) dc.DrawLine(1, clntRect.height-2, clntRect.width-1, clntRect.height-2) - dc.SetPen(wx.Pen(wx.SystemSettings_GetColour(wx.SYS_COLOUR_3DFACE))) dc.DrawLine(selTabX1 + 2, clntRect.height-2, selTabX2-1, clntRect.height-2) - else: if pc.HasFlag(FNB_BOTTOM): - clientRect = wx.Rect(0, 2, clntRect.width, clntRect.height - 2) clientRect2 = wx.Rect(0, 1, clntRect.width, clntRect.height - 1) - else: - clientRect = wx.Rect(0, 0, clntRect.width, clntRect.height - 2) clientRect2 = wx.Rect(0, 0, clntRect.width, clntRect.height - 1) - dc.SetBrush(wx.TRANSPARENT_BRUSH) dc.SetPen(wx.Pen(pc.GetSingleLineBorderColour())) dc.DrawRectangleRect(clientRect2) dc.DrawRectangleRect(clientRect3) - dc.SetPen(wx.Pen(wx.SystemSettings_GetColour(wx.SYS_COLOUR_BTNSHADOW))) dc.DrawRectangleRect(clientRect) - if not pc.HasFlag(FNB_TABS_BORDER_SIMPLE): - dc.SetPen(wx.Pen((pc.HasFlag(FNB_VC71) and [wx.Colour(247, 243, 233)] or [pc._tabAreaColor])[0])) dc.DrawLine(0, 0, 0, clientRect.height+1) - if pc.HasFlag(FNB_BOTTOM): - dc.DrawLine(0, clientRect.height+1, clientRect.width, clientRect.height+1) - else: - dc.DrawLine(0, 0, clientRect.width, 0) - dc.DrawLine(clientRect.width - 1, 0, clientRect.width - 1, clientRect.height+1) - def CalcTabWidth(self, pageContainer, tabIdx, tabHeight): """ Calculates the width of the input tab. """ - pc = pageContainer dc = wx.MemoryDC() dc.SelectObject(wx.EmptyBitmap(1,1)) - boldFont = wx.SystemSettings_GetFont(wx.SYS_DEFAULT_GUI_FONT) boldFont.SetWeight(wx.FONTWEIGHT_BOLD) - if pc.IsDefaultTabs(): shapePoints = int(tabHeight*math.tan(float(pc._pagesInfoVec[tabIdx].GetTabAngle())/180.0*math.pi)) - # Calculate the text length using the bold font, so when selecting a tab # its width will not change dc.SetFont(boldFont) width, pom = dc.GetTextExtent(pc.GetPageText(tabIdx)) - # Set a minimum size to a tab - if width < 20: - width = 20 - + if width < 20: width = 20 tabWidth = 2*pc._pParent.GetPadding() + width - # Style to add a small 'x' button on the top right # of the tab if pc.HasFlag(FNB_X_ON_TAB) and tabIdx == pc.GetSelection(): # The xpm image that contains the 'x' button is 9 pixels spacer = 9 - if pc.HasFlag(FNB_VC8): - spacer = 4 - + if pc.HasFlag(FNB_VC8): spacer = 4 tabWidth += pc._pParent.GetPadding() + spacer - if pc.IsDefaultTabs(): # Default style tabWidth += 2*shapePoints - hasImage = pc._ImageList != None and pc._pagesInfoVec[tabIdx].GetImageIndex() != -1 # For VC71 style, we only add the icon size (16 pixels) if hasImage: - if not pc.IsDefaultTabs(): tabWidth += 16 + pc._pParent.GetPadding() else: # Default style tabWidth += 16 + pc._pParent.GetPadding() + shapePoints/2 - return tabWidth - def CalcTabHeight(self, pageContainer): """ Calculates the height of the input tab. """ - if self._tabHeight: return self._tabHeight - pc = pageContainer dc = wx.MemoryDC() dc.SelectObject(wx.EmptyBitmap(1,1)) - # For GTK it seems that we must do this steps in order # for the tabs will get the proper height on initialization # on MSW, preforming these steps yields wierd results normalFont = wx.SystemSettings_GetFont(wx.SYS_DEFAULT_GUI_FONT) boldFont = normalFont - if "__WXGTK__" in wx.PlatformInfo: boldFont.SetWeight(wx.FONTWEIGHT_BOLD) dc.SetFont(boldFont) - height = dc.GetCharHeight() - tabHeight = height + FNB_HEIGHT_SPACER # We use 8 pixels as padding if "__WXGTK__" in wx.PlatformInfo: # On GTK the tabs are should be larger tabHeight += 6 - self._tabHeight = tabHeight - return tabHeight - def DrawTabs(self, pageContainer, dc): """ Actually draws the tabs in L{FlatNotebook}.""" - pc = pageContainer if "__WXMAC__" in wx.PlatformInfo: # Works well on MSW & GTK, however this lines should be skipped on MAC @@ -1718,23 +1392,16 @@ # Get the text hight tabHeight = self.CalcTabHeight(pageContainer) style = pc.GetParent().GetWindowStyleFlag() - # Calculate the number of rows required for drawing the tabs rect = pc.GetClientRect() clientWidth = rect.width - # Set the maximum client size pc.SetSizeHints(self.GetButtonsAreaLength(pc), tabHeight) borderPen = wx.Pen(wx.SystemSettings_GetColour(wx.SYS_COLOUR_BTNSHADOW)) - - if style & FNB_VC71: - backBrush = wx.Brush(wx.Colour(247, 243, 233)) - else: - backBrush = wx.Brush(pc._tabAreaColor) - + if style & FNB_VC71: backBrush = wx.Brush(wx.Colour(247, 243, 233)) + else: backBrush = wx.Brush(pc._tabAreaColor) noselBrush = wx.Brush(wx.SystemSettings_GetColour(wx.SYS_COLOUR_BTNFACE)) selBrush = wx.Brush(pc._activeTabColor) - size = pc.GetSize() # Background @@ -1748,29 +1415,23 @@ else: colr = (pc.HasFlag(FNB_VC71) and [wx.Colour(247, 243, 233)] or [pc.GetBackgroundColour()])[0] dc.SetPen(wx.Pen(colr)) - if pc.HasFlag(FNB_FF2): lightFactor = (pc.HasFlag(FNB_BACKGROUND_GRADIENT) and [70] or [0])[0] PaintStraightGradientBox(dc, pc.GetClientRect(), pc._tabAreaColor, LightColour(pc._tabAreaColor, lightFactor)) dc.SetBrush(wx.TRANSPARENT_BRUSH) - dc.DrawRectangle(0, 0, size.x, size.y) # We always draw the bottom/upper line of the tabs # regradless the style dc.SetPen(borderPen) - if not pc.HasFlag(FNB_FF2): self.DrawTabsLine(pc, dc) # Restore the pen dc.SetPen(borderPen) - if pc.HasFlag(FNB_VC71): - greyLineYVal = (pc.HasFlag(FNB_BOTTOM) and [0] or [size.y - 2])[0] whiteLineYVal = (pc.HasFlag(FNB_BOTTOM) and [3] or [size.y - 3])[0] - pen = wx.Pen(wx.SystemSettings_GetColour(wx.SYS_COLOUR_3DFACE)) dc.SetPen(pen) @@ -1778,7 +1439,6 @@ # the tab area for num in xrange(3): dc.DrawLine(0, greyLineYVal + num, size.x, greyLineYVal + num) - wbPen = (pc.HasFlag(FNB_BOTTOM) and [wx.BLACK_PEN] or [wx.WHITE_PEN])[0] dc.SetPen(wbPen) dc.DrawLine(1, whiteLineYVal, size.x - 1, whiteLineYVal) @@ -1791,69 +1451,55 @@ boldFont = wx.SystemSettings_GetFont(wx.SYS_DEFAULT_GUI_FONT) boldFont.SetWeight(wx.FONTWEIGHT_BOLD) dc.SetFont(boldFont) - posx = pc._pParent.GetPadding() # Update all the tabs from 0 to 'pc._nFrom' to be non visible for i in xrange(pc._nFrom): - pc._pagesInfoVec[i].SetPosition(wx.Point(-1, -1)) pc._pagesInfoVec[i].GetRegion().Clear() - count = pc._nFrom - #---------------------------------------------------------- + """ # Go over and draw the visible tabs - #---------------------------------------------------------- + """ x1 = x2 = -1 for i in xrange(pc._nFrom, len(pc._pagesInfoVec)): - dc.SetPen(borderPen) - if not pc.HasFlag(FNB_FF2): dc.SetBrush((i==pc.GetSelection() and [selBrush] or [noselBrush])[0]) # Now set the font to the correct font dc.SetFont((i==pc.GetSelection() and [boldFont] or [normalFont])[0]) - + """ # Add the padding to the tab width # Tab width: # +-----------------------------------------------------------+ # | PADDING | IMG | IMG_PADDING | TEXT | PADDING | x |PADDING | # +-----------------------------------------------------------+ + """ tabWidth = self.CalcTabWidth(pageContainer, i, tabHeight) - # Check if we can draw more - if posx + tabWidth + self.GetButtonsAreaLength(pc) >= clientWidth: - break - + if posx + tabWidth + self.GetButtonsAreaLength(pc) >= clientWidth: break count = count + 1 - # By default we clean the tab region pc._pagesInfoVec[i].GetRegion().Clear() - # Clean the 'x' buttn on the tab. # A 'Clean' rectangle, is a rectangle with width or height # with values lower than or equal to 0 pc._pagesInfoVec[i].GetXRect().SetSize(wx.Size(-1, -1)) - # Draw the tab (border, text, image & 'x' on tab) self.DrawTab(pc, dc, posx, i, tabWidth, tabHeight, pc._nTabXButtonStatus) - if pc.GetSelection() == i: x1 = posx x2 = posx + tabWidth + 2 # Restore the text forground dc.SetTextForeground(pc._activeTextColor) - # Update the tab position & size posy = (pc.HasFlag(FNB_BOTTOM) and [0] or [VERTICAL_BORDER_PADDING])[0] - pc._pagesInfoVec[i].SetPosition(wx.Point(posx, posy)) pc._pagesInfoVec[i].SetSize(wx.Size(tabWidth, tabHeight)) self.DrawFocusRectangle(dc, pc, pc._pagesInfoVec[i]) - posx += tabWidth # Update all tabs that can not fit into the screen as non-visible @@ -1867,92 +1513,66 @@ self.DrawRightArrow(pc, dc) self.DrawX(pc, dc) self.DrawDropDownArrow(pc, dc) - - if pc.HasFlag(FNB_FF2): - self.DrawTabsLine(pc, dc, x1, x2) - + if pc.HasFlag(FNB_FF2): self.DrawTabsLine(pc, dc, x1, x2) def DrawFocusRectangle(self, dc, pageContainer, page): """ Draws a focus rectangle like the native Notebooks. """ - if not page._hasFocus: return - tabPos = wx.Point(*page.GetPosition()) if pageContainer.GetParent().GetWindowStyleFlag() & FNB_VC8: vc8ShapeLen = self.CalcTabHeight(pageContainer) - VERTICAL_BORDER_PADDING - 2 tabPos.x += vc8ShapeLen - rect = wx.RectPS(tabPos, page.GetSize()) rect = wx.Rect(rect.x+2, rect.y+2, rect.width-4, rect.height-8) - if wx.Platform == '__WXMAC__': rect.SetWidth(rect.GetWidth() + 1) - dc.SetBrush(wx.TRANSPARENT_BRUSH) dc.SetPen(self._focusPen) dc.DrawRoundedRectangleRect(rect, 2) - def DrawDragHint(self, pc, tabIdx): """ Draws tab drag hint, the default implementation is to do nothing. You can override this function to provide a nice feedback to user. """ - pass def NumberTabsCanFit(self, pageContainer, fr=-1): - pc = pageContainer - rect = pc.GetClientRect() clientWidth = rect.width - vTabInfo = [] - tabHeight = self.CalcTabHeight(pageContainer) - # The drawing starts from posx posx = pc._pParent.GetPadding() - - if fr < 0: - fr = pc._nFrom - + if fr < 0: fr = pc._nFrom for i in xrange(fr, len(pc._pagesInfoVec)): - tabWidth = self.CalcTabWidth(pageContainer, i, tabHeight) if posx + tabWidth + self.GetButtonsAreaLength(pc) >= clientWidth: break; - # Add a result to the returned vector tabRect = wx.Rect(posx, VERTICAL_BORDER_PADDING, tabWidth , tabHeight) vTabInfo.append(tabRect) - # Advance posx posx += tabWidth + FNB_HEIGHT_SPACER - return vTabInfo -# ---------------------------------------------------------------------------- # +""" # Class FNBRendererMgr # A manager that handles all the renderers defined below and calls the # appropriate one when drawing is needed -# ---------------------------------------------------------------------------- # - +""" class FNBRendererMgr: """ This class represents a manager that handles all the 4 renderers defined and calls the appropriate one when drawing is needed. """ - def __init__(self): """ Default class constructor. """ - # register renderers - self._renderers = {} self._renderers.update({-1: FNBRendererDefault()}) self._renderers.update({FNB_VC71: FNBRendererVC71()}) @@ -1960,99 +1580,69 @@ self._renderers.update({FNB_VC8: FNBRendererVC8()}) self._renderers.update({FNB_FF2: FNBRendererFirefox2()}) - def GetRenderer(self, style): """ Returns the current renderer based on the style selected. """ - - if style & FNB_VC71: - return self._renderers[FNB_VC71] - - if style & FNB_FANCY_TABS: - return self._renderers[FNB_FANCY_TABS] - - if style & FNB_VC8: - return self._renderers[FNB_VC8] - - if style & FNB_FF2: - return self._renderers[FNB_FF2] - + if style & FNB_VC71: return self._renderers[FNB_VC71] + if style & FNB_FANCY_TABS: return self._renderers[FNB_FANCY_TABS] + if style & FNB_VC8: return self._renderers[FNB_VC8] + if style & FNB_FF2: return self._renderers[FNB_FF2] # the default is to return the default renderer return self._renderers[-1] -#------------------------------------------ +""" # Default renderer -#------------------------------------------ - +""" class FNBRendererDefault(FNBRenderer): """ This class handles the drawing of tabs using the I{Standard} renderer. """ - def __init__(self): """ Default class constructor. """ - FNBRenderer.__init__(self) - def DrawTab(self, pageContainer, dc, posx, tabIdx, tabWidth, tabHeight, btnStatus): """ Draws a tab using the I{Standard} style. """ - # Default style borderPen = wx.Pen(wx.SystemSettings_GetColour(wx.SYS_COLOUR_BTNSHADOW)) pc = pageContainer - tabPoints = [wx.Point() for ii in xrange(7)] tabPoints[0].x = posx tabPoints[0].y = (pc.HasFlag(FNB_BOTTOM) and [2] or [tabHeight - 2])[0] - tabPoints[1].x = int(posx+(tabHeight-2)*math.tan(float(pc._pagesInfoVec[tabIdx].GetTabAngle())/180.0*math.pi)) tabPoints[1].y = (pc.HasFlag(FNB_BOTTOM) and [tabHeight - (VERTICAL_BORDER_PADDING+2)] or [(VERTICAL_BORDER_PADDING+2)])[0] - tabPoints[2].x = tabPoints[1].x+2 tabPoints[2].y = (pc.HasFlag(FNB_BOTTOM) and [tabHeight - VERTICAL_BORDER_PADDING] or [VERTICAL_BORDER_PADDING])[0] - tabPoints[3].x = int(posx+tabWidth-(tabHeight-2)*math.tan(float(pc._pagesInfoVec[tabIdx].GetTabAngle())/180.0*math.pi))-2 tabPoints[3].y = (pc.HasFlag(FNB_BOTTOM) and [tabHeight - VERTICAL_BORDER_PADDING] or [VERTICAL_BORDER_PADDING])[0] - tabPoints[4].x = tabPoints[3].x+2 tabPoints[4].y = (pc.HasFlag(FNB_BOTTOM) and [tabHeight - (VERTICAL_BORDER_PADDING+2)] or [(VERTICAL_BORDER_PADDING+2)])[0] - tabPoints[5].x = int(tabPoints[4].x+(tabHeight-2)*math.tan(float(pc._pagesInfoVec[tabIdx].GetTabAngle())/180.0*math.pi)) tabPoints[5].y = (pc.HasFlag(FNB_BOTTOM) and [2] or [tabHeight - 2])[0] - tabPoints[6].x = tabPoints[0].x tabPoints[6].y = tabPoints[0].y - if tabIdx == pc.GetSelection(): - # Draw the tab as rounded rectangle dc.DrawPolygon(tabPoints) - else: - if tabIdx != pc.GetSelection() - 1: - # Draw a vertical line to the right of the text pt1x = tabPoints[5].x pt1y = (pc.HasFlag(FNB_BOTTOM) and [4] or [tabHeight - 6])[0] pt2x = tabPoints[5].x pt2y = (pc.HasFlag(FNB_BOTTOM) and [tabHeight - 4] or [4])[0] dc.DrawLine(pt1x, pt1y, pt2x, pt2y) - if tabIdx == pc.GetSelection(): - savePen = dc.GetPen() whitePen = wx.Pen(wx.WHITE) whitePen.SetWidth(1) dc.SetPen(whitePen) - secPt = wx.Point(tabPoints[5].x + 1, tabPoints[5].y) dc.DrawLine(tabPoints[0].x, tabPoints[0].y, secPt.x, secPt.y) - # Restore the pen dc.SetPen(savePen) + """ # ----------------------------------- # Text and image drawing # ----------------------------------- @@ -2061,211 +1651,236 @@ # rectangle # The width of the images are 16 pixels + """ padding = pc.GetParent().GetPadding() shapePoints = int(tabHeight*math.tan(float(pc._pagesInfoVec[tabIdx].GetTabAngle())/180.0*math.pi)) hasImage = pc._pagesInfoVec[tabIdx].GetImageIndex() != -1 imageYCoord = (pc.HasFlag(FNB_BOTTOM) and [6] or [8])[0] - if hasImage: - textOffset = 2*pc._pParent._nPadding + 16 + shapePoints/2 - else: - textOffset = pc._pParent._nPadding + shapePoints/2 - + if hasImage: textOffset = 2*pc._pParent._nPadding + 16 + shapePoints/2 + else: textOffset = pc._pParent._nPadding + shapePoints/2 textOffset += 2 - if tabIdx != pc.GetSelection(): - # Set the text background to be like the vertical lines dc.SetTextForeground(pc._pParent.GetNonActiveTabTextColour()) - if hasImage: - imageXOffset = textOffset - 16 - padding pc._ImageList.Draw(pc._pagesInfoVec[tabIdx].GetImageIndex(), dc, posx + imageXOffset, imageYCoord, wx.IMAGELIST_DRAW_TRANSPARENT, True) - dc.DrawText(pc.GetPageText(tabIdx), posx + textOffset, imageYCoord) - # draw 'x' on tab (if enabled) if pc.HasFlag(FNB_X_ON_TAB) and tabIdx == pc.GetSelection(): - textWidth, textHeight = dc.GetTextExtent(pc.GetPageText(tabIdx)) tabCloseButtonXCoord = posx + textOffset + textWidth + 1 - # take a bitmap from the position of the 'x' button (the x on tab button) # this bitmap will be used later to delete old buttons tabCloseButtonYCoord = imageYCoord x_rect = wx.Rect(tabCloseButtonXCoord, tabCloseButtonYCoord, 16, 16) - # Draw the tab self.DrawTabX(pc, dc, x_rect, tabIdx, btnStatus) -#------------------------------------------ +""" # Firefox2 renderer -#------------------------------------------ +""" class FNBRendererFirefox2(FNBRenderer): """ This class handles the drawing of tabs using the I{Firefox 2} renderer. """ - def __init__(self): """ Default class constructor. """ - FNBRenderer.__init__(self) - def DrawTab(self, pageContainer, dc, posx, tabIdx, tabWidth, tabHeight, btnStatus): """ Draws a tab using the I{Firefox 2} style. """ - borderPen = wx.Pen(wx.SystemSettings_GetColour(wx.SYS_COLOUR_BTNSHADOW)) pc = pageContainer - tabPoints = [wx.Point() for indx in xrange(7)] tabPoints[0].x = posx + 2 tabPoints[0].y = (pc.HasFlag(FNB_BOTTOM) and [2] or [tabHeight - 2])[0] - tabPoints[1].x = tabPoints[0].x tabPoints[1].y = (pc.HasFlag(FNB_BOTTOM) and [tabHeight - (VERTICAL_BORDER_PADDING+2)] or [(VERTICAL_BORDER_PADDING+2)])[0] - tabPoints[2].x = tabPoints[1].x+2 tabPoints[2].y = (pc.HasFlag(FNB_BOTTOM) and [tabHeight - VERTICAL_BORDER_PADDING] or [VERTICAL_BORDER_PADDING])[0] - tabPoints[3].x = posx + tabWidth - 2 tabPoints[3].y = (pc.HasFlag(FNB_BOTTOM) and [tabHeight - VERTICAL_BORDER_PADDING] or [VERTICAL_BORDER_PADDING])[0] - tabPoints[4].x = tabPoints[3].x + 2 tabPoints[4].y = (pc.HasFlag(FNB_BOTTOM) and [tabHeight - (VERTICAL_BORDER_PADDING+2)] or [(VERTICAL_BORDER_PADDING+2)])[0] - tabPoints[5].x = tabPoints[4].x tabPoints[5].y = (pc.HasFlag(FNB_BOTTOM) and [2] or [tabHeight - 2])[0] - tabPoints[6].x = tabPoints[0].x tabPoints[6].y = tabPoints[0].y - #------------------------------------ + """ # Paint the tab with gradient - #------------------------------------ + """ rr = wx.RectPP(tabPoints[2], tabPoints[5]) DrawButton(dc, rr, pc.GetSelection() == tabIdx , not pc.HasFlag(FNB_BOTTOM)) - dc.SetBrush(wx.TRANSPARENT_BRUSH) dc.SetPen(borderPen) - # Draw the tab as rounded rectangle dc.DrawPolygon(tabPoints) - - # ----------------------------------- + """ # Text and image drawing - # ----------------------------------- - + """ # The width of the images are 16 pixels padding = pc.GetParent().GetPadding() shapePoints = int(tabHeight*math.tan(float(pc._pagesInfoVec[tabIdx].GetTabAngle())/180.0*math.pi)) hasImage = pc._pagesInfoVec[tabIdx].GetImageIndex() != -1 imageYCoord = (pc.HasFlag(FNB_BOTTOM) and [6] or [8])[0] - - if hasImage: - textOffset = 2*padding + 16 + shapePoints/2 - else: - textOffset = padding + shapePoints/2 - + if hasImage: textOffset = 2*padding + 16 + shapePoints/2 + else: textOffset = padding + shapePoints/2 textOffset += 2 - if tabIdx != pc.GetSelection(): - # Set the text background to be like the vertical lines dc.SetTextForeground(pc._pParent.GetNonActiveTabTextColour()) - if hasImage: imageXOffset = textOffset - 16 - padding pc._ImageList.Draw(pc._pagesInfoVec[tabIdx].GetImageIndex(), dc, posx + imageXOffset, imageYCoord, wx.IMAGELIST_DRAW_TRANSPARENT, True) - dc.DrawText(pc.GetPageText(tabIdx), posx + textOffset, imageYCoord) - # draw 'x' on tab (if enabled) if pc.HasFlag(FNB_X_ON_TAB) and tabIdx == pc.GetSelection(): - textWidth, textHeight = dc.GetTextExtent(pc.GetPageText(tabIdx)) tabCloseButtonXCoord = posx + textOffset + textWidth + 1 - # take a bitmap from the position of the 'x' button (the x on tab button) # this bitmap will be used later to delete old buttons tabCloseButtonYCoord = imageYCoord x_rect = wx.Rect(tabCloseButtonXCoord, tabCloseButtonYCoord, 16, 16) - # Draw the tab self.DrawTabX(pc, dc, x_rect, tabIdx, btnStatus) -#------------------------------------------------------------------ +""" # Visual studio 7.1 -#------------------------------------------------------------------ - +""" class FNBRendererVC71(FNBRenderer): """ This class handles the drawing of tabs using the I{VC71} renderer. """ - def __init__(self): """ Default class constructor. """ - FNBRenderer.__init__(self) - def DrawTab(self, pageContainer, dc, posx, tabIdx, tabWidth, tabHeight, btnStatus): """ Draws a tab using the I{VC71} style. """ - # Visual studio 7.1 style borderPen = wx.Pen(wx.SystemSettings_GetColour(wx.SYS_COLOUR_BTNSHADOW)) pc = pageContainer dc.SetPen((tabIdx == pc.GetSelection() and [wx.Pen(wx.SystemSettings_GetColour(wx.SYS_COLOUR_3DFACE))] or [borderPen])[0]) dc.SetBrush((tabIdx == pc.GetSelection() and [wx.Brush(wx.SystemSettings_GetColour(wx.SYS_COLOUR_3DFACE))] or [wx.Brush(wx.Colour(247, 243, 233))])[0]) - if tabIdx == pc.GetSelection(): - posy = (pc.HasFlag(FNB_BOTTOM) and [0] or [VERTICAL_BORDER_PADDING])[0] tabH = (pc.HasFlag(FNB_BOTTOM) and [tabHeight - 5] or [tabHeight - 3])[0] dc.DrawRectangle(posx, posy, tabWidth, tabH) - # Draw a black line on the left side of the # rectangle dc.SetPen(wx.BLACK_PEN) - blackLineY1 = VERTICAL_BORDER_PADDING blackLineY2 = tabH dc.DrawLine(posx + tabWidth, blackLineY1, posx + tabWidth, blackLineY2) - + """ # To give the tab more 3D look we do the following # Incase the tab is on top, # Draw a thik white line on topof the rectangle # Otherwise, draw a thin (1 pixel) black line at the bottom - + """ pen = wx.Pen((pc.HasFlag(FNB_BOTTOM) and [wx.BLACK] or [wx.WHITE])[0]) dc.SetPen(pen) whiteLinePosY = (pc.HasFlag(FNB_BOTTOM) and [blackLineY2] or [VERTICAL_BORDER_PADDING ])[0] dc.DrawLine(posx , whiteLinePosY, posx + tabWidth + 1, whiteLinePosY) - # Draw a white vertical line to the left of the tab dc.SetPen(wx.WHITE_PEN) if not pc.HasFlag(FNB_BOTTOM): blackLineY2 += 1 - dc.DrawLine(posx, blackLineY1, posx, blackLineY2) - else: # We dont draw a rectangle for non selected tabs, but only # vertical line on the left - blackLineY1 = (pc.HasFlag(FNB_BOTTOM) and [VERTICAL_BORDER_PADDING + 2] or [VERTICAL_BORDER_PADDING + 1])[0] blackLineY2 = pc.GetSize().y - 5 dc.DrawLine(posx + tabWidth, blackLineY1, posx + tabWidth, blackLineY2) - + """ + # ----------------------------------- + # Text and image drawing + # ----------------------------------- + """ + # Text drawing offset from the left border of the + # rectangle + + # The width of the images are 16 pixels + padding = pc.GetParent().GetPadding() + hasImage = pc._pagesInfoVec[tabIdx].GetImageIndex() != -1 + imageYCoord = (pc.HasFlag(FNB_BOTTOM) and [5] or [8])[0] + + if hasImage: textOffset = 2*pc._pParent._nPadding + 16 + else: textOffset = pc._pParent._nPadding + if tabIdx != pc.GetSelection(): + # Set the text background to be like the vertical lines + dc.SetTextForeground(pc._pParent.GetNonActiveTabTextColour()) + if hasImage: + imageXOffset = textOffset - 16 - padding + pc._ImageList.Draw(pc._pagesInfoVec[tabIdx].GetImageIndex(), dc, + posx + imageXOffset, imageYCoord, + wx.IMAGELIST_DRAW_TRANSPARENT, True) + dc.DrawText(pc.GetPageText(tabIdx), posx + textOffset, imageYCoord) + + # draw 'x' on tab (if enabled) + if pc.HasFlag(FNB_X_ON_TAB) and tabIdx == pc.GetSelection(): + textWidth, textHeight = dc.GetTextExtent(pc.GetPageText(tabIdx)) + tabCloseButtonXCoord = posx + textOffset + textWidth + 1 + # take a bitmap from the position of the 'x' button (the x on tab button) + # this bitmap will be used later to delete old buttons + tabCloseButtonYCoord = imageYCoord + x_rect = wx.Rect(tabCloseButtonXCoord, tabCloseButtonYCoord, 16, 16) + # Draw the tab + self.DrawTabX(pc, dc, x_rect, tabIdx, btnStatus) + + +""" +# Fancy style +""" +class FNBRendererFancy(FNBRenderer): + """ + This class handles the drawing of tabs using the I{Fancy} renderer. + """ + def __init__(self): + """ Default class constructor. """ + FNBRenderer.__init__(self) + + def DrawTab(self, pageContainer, dc, posx, tabIdx, tabWidth, tabHeight, btnStatus): + """ Draws a tab using the I{Fancy} style, similar to VC71 but with gradients. """ + # Fancy tabs - like with VC71 but with the following differences: + # - The Selected tab is colored with gradient color + borderPen = wx.Pen(wx.SystemSettings_GetColour(wx.SYS_COLOUR_BTNSHADOW)) + pc = pageContainer + pen = (tabIdx == pc.GetSelection() and [wx.Pen(pc._pParent.GetBorderColour())] or [wx.Pen(wx.SystemSettings_GetColour(wx.SYS_COLOUR_3DFACE))])[0] + + if tabIdx == pc.GetSelection(): + posy = (pc.HasFlag(FNB_BOTTOM) and [2] or [VERTICAL_BORDER_PADDING])[0] + th = tabHeight - 5 + rect = wx.Rect(posx, posy, tabWidth, th) + col2 = (pc.HasFlag(FNB_BOTTOM) and [pc._pParent.GetGradientColourTo()] or [pc._pParent.GetGradientColourFrom()])[0] + col1 = (pc.HasFlag(FNB_BOTTOM) and [pc._pParent.GetGradientColourFrom()] or [pc._pParent.GetGradientColourTo()])[0] + PaintStraightGradientBox(dc, rect, col1, col2) + dc.SetBrush(wx.TRANSPARENT_BRUSH) + dc.SetPen(pen) + dc.DrawRectangleRect(rect) + + # erase the bottom/top line of the rectangle + dc.SetPen(wx.Pen(pc._pParent.GetGradientColourFrom())) + if pc.HasFlag(FNB_BOTTOM): dc.DrawLine(rect.x, 2, rect.x + rect.width, 2) + else: dc.DrawLine(rect.x, rect.y + rect.height - 1, rect.x + rect.width, rect.y + rect.height - 1) + else: + # We dont draw a rectangle for non selected tabs, but only + # vertical line on the left + dc.SetPen(borderPen) + dc.DrawLine(posx + tabWidth, VERTICAL_BORDER_PADDING + 3, posx + tabWidth, tabHeight - 4) + """ # ----------------------------------- # Text and image drawing # ----------------------------------- @@ -2274,303 +1889,157 @@ # rectangle # The width of the images are 16 pixels + """ padding = pc.GetParent().GetPadding() hasImage = pc._pagesInfoVec[tabIdx].GetImageIndex() != -1 - imageYCoord = (pc.HasFlag(FNB_BOTTOM) and [5] or [8])[0] - - if hasImage: - textOffset = 2*pc._pParent._nPadding + 16 - else: - textOffset = pc._pParent._nPadding - + imageYCoord = (pc.HasFlag(FNB_BOTTOM) and [6] or [8])[0] + + if hasImage: textOffset = 2*pc._pParent._nPadding + 16 + else: textOffset = pc._pParent._nPadding + textOffset += 2 if tabIdx != pc.GetSelection(): - # Set the text background to be like the vertical lines dc.SetTextForeground(pc._pParent.GetNonActiveTabTextColour()) - if hasImage: - imageXOffset = textOffset - 16 - padding pc._ImageList.Draw(pc._pagesInfoVec[tabIdx].GetImageIndex(), dc, posx + imageXOffset, imageYCoord, wx.IMAGELIST_DRAW_TRANSPARENT, True) - dc.DrawText(pc.GetPageText(tabIdx), posx + textOffset, imageYCoord) - # draw 'x' on tab (if enabled) if pc.HasFlag(FNB_X_ON_TAB) and tabIdx == pc.GetSelection(): - textWidth, textHeight = dc.GetTextExtent(pc.GetPageText(tabIdx)) tabCloseButtonXCoord = posx + textOffset + textWidth + 1 - # take a bitmap from the position of the 'x' button (the x on tab button) # this bitmap will be used later to delete old buttons tabCloseButtonYCoord = imageYCoord x_rect = wx.Rect(tabCloseButtonXCoord, tabCloseButtonYCoord, 16, 16) - # Draw the tab self.DrawTabX(pc, dc, x_rect, tabIdx, btnStatus) -#------------------------------------------------------------------ -# Fancy style -#------------------------------------------------------------------ - -class FNBRendererFancy(FNBRenderer): - """ - This class handles the drawing of tabs using the I{Fancy} renderer. - """ - - def __init__(self): - """ Default class constructor. """ - - FNBRenderer.__init__(self) - - - def DrawTab(self, pageContainer, dc, posx, tabIdx, tabWidth, tabHeight, btnStatus): - """ Draws a tab using the I{Fancy} style, similar to VC71 but with gradients. """ - - # Fancy tabs - like with VC71 but with the following differences: - # - The Selected tab is colored with gradient color - borderPen = wx.Pen(wx.SystemSettings_GetColour(wx.SYS_COLOUR_BTNSHADOW)) - pc = pageContainer - - pen = (tabIdx == pc.GetSelection() and [wx.Pen(pc._pParent.GetBorderColour())] or [wx.Pen(wx.SystemSettings_GetColour(wx.SYS_COLOUR_3DFACE))])[0] - - if tabIdx == pc.GetSelection(): - - posy = (pc.HasFlag(FNB_BOTTOM) and [2] or [VERTICAL_BORDER_PADDING])[0] - th = tabHeight - 5 - - rect = wx.Rect(posx, posy, tabWidth, th) - - col2 = (pc.HasFlag(FNB_BOTTOM) and [pc._pParent.GetGradientColourTo()] or [pc._pParent.GetGradientColourFrom()])[0] - col1 = (pc.HasFlag(FNB_BOTTOM) and [pc._pParent.GetGradientColourFrom()] or [pc._pParent.GetGradientColourTo()])[0] - - PaintStraightGradientBox(dc, rect, col1, col2) - dc.SetBrush(wx.TRANSPARENT_BRUSH) - dc.SetPen(pen) - dc.DrawRectangleRect(rect) - - # erase the bottom/top line of the rectangle - dc.SetPen(wx.Pen(pc._pParent.GetGradientColourFrom())) - if pc.HasFlag(FNB_BOTTOM): - dc.DrawLine(rect.x, 2, rect.x + rect.width, 2) - else: - dc.DrawLine(rect.x, rect.y + rect.height - 1, rect.x + rect.width, rect.y + rect.height - 1) - - else: - - # We dont draw a rectangle for non selected tabs, but only - # vertical line on the left - dc.SetPen(borderPen) - dc.DrawLine(posx + tabWidth, VERTICAL_BORDER_PADDING + 3, posx + tabWidth, tabHeight - 4) - - - # ----------------------------------- - # Text and image drawing - # ----------------------------------- - - # Text drawing offset from the left border of the - # rectangle - - # The width of the images are 16 pixels - padding = pc.GetParent().GetPadding() - hasImage = pc._pagesInfoVec[tabIdx].GetImageIndex() != -1 - imageYCoord = (pc.HasFlag(FNB_BOTTOM) and [6] or [8])[0] - - if hasImage: - textOffset = 2*pc._pParent._nPadding + 16 - else: - textOffset = pc._pParent._nPadding - - textOffset += 2 - - if tabIdx != pc.GetSelection(): - - # Set the text background to be like the vertical lines - dc.SetTextForeground(pc._pParent.GetNonActiveTabTextColour()) - - if hasImage: - - imageXOffset = textOffset - 16 - padding - pc._ImageList.Draw(pc._pagesInfoVec[tabIdx].GetImageIndex(), dc, - posx + imageXOffset, imageYCoord, - wx.IMAGELIST_DRAW_TRANSPARENT, True) - - dc.DrawText(pc.GetPageText(tabIdx), posx + textOffset, imageYCoord) - - # draw 'x' on tab (if enabled) - if pc.HasFlag(FNB_X_ON_TAB) and tabIdx == pc.GetSelection(): - - textWidth, textHeight = dc.GetTextExtent(pc.GetPageText(tabIdx)) - tabCloseButtonXCoord = posx + textOffset + textWidth + 1 - - # take a bitmap from the position of the 'x' button (the x on tab button) - # this bitmap will be used later to delete old buttons - tabCloseButtonYCoord = imageYCoord - x_rect = wx.Rect(tabCloseButtonXCoord, tabCloseButtonYCoord, 16, 16) - - # Draw the tab - self.DrawTabX(pc, dc, x_rect, tabIdx, btnStatus) - - -#------------------------------------------------------------------ +""" # Visual studio 2005 (VS8) -#------------------------------------------------------------------ +""" class FNBRendererVC8(FNBRenderer): """ This class handles the drawing of tabs using the I{VC8} renderer. """ - def __init__(self): """ Default class constructor. """ - FNBRenderer.__init__(self) self._first = True self._factor = 1 - def DrawTabs(self, pageContainer, dc): """ Draws all the tabs using VC8 style. Overloads The DrawTabs method in parent class. """ - pc = pageContainer - if "__WXMAC__" in wx.PlatformInfo: # Works well on MSW & GTK, however this lines should be skipped on MAC if not pc._pagesInfoVec or pc._nFrom >= len(pc._pagesInfoVec): pc.Hide() return - # Get the text hight tabHeight = self.CalcTabHeight(pageContainer) - # Set the font for measuring the tab height normalFont = wx.SystemSettings_GetFont(wx.SYS_DEFAULT_GUI_FONT) boldFont = wx.SystemSettings_GetFont(wx.SYS_DEFAULT_GUI_FONT) boldFont.SetWeight(wx.FONTWEIGHT_BOLD) - # Calculate the number of rows required for drawing the tabs rect = pc.GetClientRect() - # Set the maximum client size pc.SetSizeHints(self.GetButtonsAreaLength(pc), tabHeight) borderPen = wx.Pen(wx.SystemSettings_GetColour(wx.SYS_COLOUR_BTNSHADOW)) - # Create brushes backBrush = wx.Brush(pc._tabAreaColor) noselBrush = wx.Brush(wx.SystemSettings_GetColour(wx.SYS_COLOUR_BTNFACE)) selBrush = wx.Brush(pc._activeTabColor) size = pc.GetSize() - # Background dc.SetTextBackground(pc.GetBackgroundColour()) dc.SetTextForeground(pc._activeTextColor) - # If border style is set, set the pen to be border pen - if pc.HasFlag(FNB_TABS_BORDER_SIMPLE): - dc.SetPen(borderPen) - else: - dc.SetPen(wx.TRANSPARENT_PEN) - + if pc.HasFlag(FNB_TABS_BORDER_SIMPLE): dc.SetPen(borderPen) + else: dc.SetPen(wx.TRANSPARENT_PEN) lightFactor = (pc.HasFlag(FNB_BACKGROUND_GRADIENT) and [70] or [0])[0] - # For VC8 style, we color the tab area in gradient coloring lightcolour = LightColour(pc._tabAreaColor, lightFactor) PaintStraightGradientBox(dc, pc.GetClientRect(), pc._tabAreaColor, lightcolour) - dc.SetBrush(wx.TRANSPARENT_BRUSH) dc.DrawRectangle(0, 0, size.x, size.y) - # We always draw the bottom/upper line of the tabs # regradless the style dc.SetPen(borderPen) self.DrawTabsLine(pc, dc) - # Restore the pen dc.SetPen(borderPen) - # Draw labels dc.SetFont(boldFont) - # Update all the tabs from 0 to 'pc.self._nFrom' to be non visible for i in xrange(pc._nFrom): - pc._pagesInfoVec[i].SetPosition(wx.Point(-1, -1)) pc._pagesInfoVec[i].GetRegion().Clear() - # Draw the visible tabs, in VC8 style, we draw them from right to left vTabsInfo = self.NumberTabsCanFit(pc) - activeTabPosx = 0 activeTabWidth = 0 activeTabHeight = 0 - for cur in xrange(len(vTabsInfo)-1, -1, -1): - # 'i' points to the index of the currently drawn tab # in pc.GetPageInfoVector() vector i = pc._nFrom + cur dc.SetPen(borderPen) dc.SetBrush((i==pc.GetSelection() and [selBrush] or [noselBrush])[0]) - # Now set the font to the correct font dc.SetFont((i==pc.GetSelection() and [boldFont] or [normalFont])[0]) - + """ # Add the padding to the tab width # Tab width: # +-----------------------------------------------------------+ # | PADDING | IMG | IMG_PADDING | TEXT | PADDING | x |PADDING | # +-----------------------------------------------------------+ - + """ tabWidth = self.CalcTabWidth(pageContainer, i, tabHeight) posx = vTabsInfo[cur].x - + """ # By default we clean the tab region # incase we use the VC8 style which requires # the region, it will be filled by the function # drawVc8Tab + """ pc._pagesInfoVec[i].GetRegion().Clear() - + """ # Clean the 'x' buttn on the tab # 'Clean' rectanlge is a rectangle with width or height # with values lower than or equal to 0 + """ pc._pagesInfoVec[i].GetXRect().SetSize(wx.Size(-1, -1)) - + """ # Draw the tab # Incase we are drawing the active tab # we need to redraw so it will appear on top # of all other tabs - + """ # when using the vc8 style, we keep the position of the active tab so we will draw it again later if i == pc.GetSelection() and pc.HasFlag(FNB_VC8): - activeTabPosx = posx activeTabWidth = tabWidth activeTabHeight = tabHeight - else: - self.DrawTab(pc, dc, posx, i, tabWidth, tabHeight, pc._nTabXButtonStatus) - # Restore the text forground dc.SetTextForeground(pc._activeTextColor) - # Update the tab position & size pc._pagesInfoVec[i].SetPosition(wx.Point(posx, VERTICAL_BORDER_PADDING)) pc._pagesInfoVec[i].SetSize(wx.Size(tabWidth, tabHeight)) # Incase we are in VC8 style, redraw the active tab (incase it is visible) if pc.GetSelection() >= pc._nFrom and pc.GetSelection() < pc._nFrom + len(vTabsInfo): - self.DrawTab(pc, dc, activeTabPosx, pc.GetSelection(), activeTabWidth, activeTabHeight, pc._nTabXButtonStatus) - # Update all tabs that can not fit into the screen as non-visible for xx in xrange(pc._nFrom + len(vTabsInfo), len(pc._pagesInfoVec)): - pc._pagesInfoVec[xx].SetPosition(wx.Point(-1, -1)) pc._pagesInfoVec[xx].GetRegion().Clear() - # Draw the left/right/close buttons # Left arrow self.DrawLeftArrow(pc, dc) @@ -2578,14 +2047,12 @@ self.DrawX(pc, dc) self.DrawDropDownArrow(pc, dc) - def DrawTab(self, pageContainer, dc, posx, tabIdx, tabWidth, tabHeight, btnStatus): """ Draws a tab using VC8 style. """ - pc = pageContainer borderPen = wx.Pen(pc._pParent.GetBorderColour()) tabPoints = [wx.Point() for ii in xrange(8)] - + """ # If we draw the first tab or the active tab, # we draw a full tab, else we draw a truncated tab # @@ -2597,31 +2064,23 @@ # X(0),(7) X(6) # # - + """ tabPoints[0].x = (pc.HasFlag(FNB_BOTTOM) and [posx] or [posx+self._factor])[0] tabPoints[0].y = (pc.HasFlag(FNB_BOTTOM) and [2] or [tabHeight - 3])[0] - tabPoints[1].x = tabPoints[0].x + tabHeight - VERTICAL_BORDER_PADDING - 3 - self._factor tabPoints[1].y = (pc.HasFlag(FNB_BOTTOM) and [tabHeight - (VERTICAL_BORDER_PADDING+2)] or [(VERTICAL_BORDER_PADDING+2)])[0] - tabPoints[2].x = tabPoints[1].x + 4 tabPoints[2].y = (pc.HasFlag(FNB_BOTTOM) and [tabHeight - VERTICAL_BORDER_PADDING] or [VERTICAL_BORDER_PADDING])[0] - tabPoints[3].x = tabPoints[2].x + tabWidth - 2 tabPoints[3].y = (pc.HasFlag(FNB_BOTTOM) and [tabHeight - VERTICAL_BORDER_PADDING] or [VERTICAL_BORDER_PADDING])[0] - tabPoints[4].x = tabPoints[3].x + 1 tabPoints[4].y = (pc.HasFlag(FNB_BOTTOM) and [tabPoints[3].y - 1] or [tabPoints[3].y + 1])[0] - tabPoints[5].x = tabPoints[4].x + 1 tabPoints[5].y = (pc.HasFlag(FNB_BOTTOM) and [(tabPoints[4].y - 1)] or [tabPoints[4].y + 1])[0] - tabPoints[6].x = tabPoints[2].x + tabWidth tabPoints[6].y = tabPoints[0].y - tabPoints[7].x = tabPoints[0].x tabPoints[7].y = tabPoints[0].y - pc._pagesInfoVec[tabIdx].SetRegion(tabPoints) # Draw the polygon @@ -2633,9 +2092,7 @@ # Restore the brush dc.SetBrush(br) rect = pc.GetClientRect() - if tabIdx != pc.GetSelection() and not pc.HasFlag(FNB_BOTTOM): - # Top default tabs dc.SetPen(wx.Pen(pc._pParent.GetBorderColour())) lineY = rect.height @@ -2647,57 +2104,46 @@ # Incase we are drawing the selected tab, we draw the border of it as well # but without the bottom (upper line incase of wxBOTTOM) if tabIdx == pc.GetSelection(): - borderPen = wx.Pen(wx.SystemSettings_GetColour(wx.SYS_COLOUR_BTNSHADOW)) dc.SetPen(borderPen) dc.SetBrush(wx.TRANSPARENT_BRUSH) dc.DrawPolygon(tabPoints) - # Delete the bottom line (or the upper one, incase we use wxBOTTOM) dc.SetPen(wx.WHITE_PEN) dc.DrawLine(tabPoints[0].x, tabPoints[0].y, tabPoints[6].x, tabPoints[6].y) - self.FillVC8GradientColour(pc, dc, tabPoints, tabIdx == pc.GetSelection(), tabIdx) - # Draw a thin line to the right of the non-selected tab if tabIdx != pc.GetSelection(): - dc.SetPen(wx.Pen(wx.SystemSettings_GetColour(wx.SYS_COLOUR_3DFACE))) dc.DrawLine(tabPoints[4].x-1, tabPoints[4].y, tabPoints[5].x-1, tabPoints[5].y) dc.DrawLine(tabPoints[5].x-1, tabPoints[5].y, tabPoints[6].x-1, tabPoints[6].y) - + """ # Text drawing offset from the left border of the # rectangle # The width of the images are 16 pixels + """ vc8ShapeLen = tabHeight - VERTICAL_BORDER_PADDING - 2 - if pc.TabHasImage(tabIdx): - textOffset = 2*pc._pParent.GetPadding() + 16 + vc8ShapeLen - else: - textOffset = pc._pParent.GetPadding() + vc8ShapeLen + if pc.TabHasImage(tabIdx): textOffset = 2*pc._pParent.GetPadding() + 16 + vc8ShapeLen + else: textOffset = pc._pParent.GetPadding() + vc8ShapeLen # Draw the image for the tab if any imageYCoord = (pc.HasFlag(FNB_BOTTOM) and [6] or [8])[0] - if pc.TabHasImage(tabIdx): - imageXOffset = textOffset - 16 - pc._pParent.GetPadding() pc._ImageList.Draw(pc._pagesInfoVec[tabIdx].GetImageIndex(), dc, posx + imageXOffset, imageYCoord, wx.IMAGELIST_DRAW_TRANSPARENT, True) - boldFont = wx.SystemSettings_GetFont(wx.SYS_DEFAULT_GUI_FONT) # if selected tab, draw text in bold if tabIdx == pc.GetSelection(): boldFont.SetWeight(wx.FONTWEIGHT_BOLD) - dc.SetFont(boldFont) dc.DrawText(pc.GetPageText(tabIdx), posx + textOffset, imageYCoord) # draw 'x' on tab (if enabled) if pc.HasFlag(FNB_X_ON_TAB) and tabIdx == pc.GetSelection(): - textWidth, textHeight = dc.GetTextExtent(pc.GetPageText(tabIdx)) tabCloseButtonXCoord = posx + textOffset + textWidth + 1 @@ -2707,81 +2153,57 @@ x_rect = wx.Rect(tabCloseButtonXCoord, tabCloseButtonYCoord, 16, 16) # Draw the tab self.DrawTabX(pc, dc, x_rect, tabIdx, btnStatus) - self.DrawFocusRectangle(dc, pc, pc._pagesInfoVec[tabIdx]) - def FillVC8GradientColour(self, pageContainer, dc, tabPoints, bSelectedTab, tabIdx): """ Fills a tab with a gradient shading. """ - # calculate gradient coefficients pc = pageContainer - if self._first: self._first = False pc._colorTo = LightColour(wx.SystemSettings_GetColour(wx.SYS_COLOUR_3DFACE), 0) pc._colorFrom = LightColour(wx.SystemSettings_GetColour(wx.SYS_COLOUR_3DFACE), 60) - col2 = pc._pParent.GetGradientColourTo() col1 = pc._pParent.GetGradientColourFrom() # If colorful tabs style is set, override the tab color if pc.HasFlag(FNB_COLORFUL_TABS): - if not pc._pagesInfoVec[tabIdx].GetColour(): - # First time, generate color, and keep it in the vector tabColor = RandomColour() pc._pagesInfoVec[tabIdx].SetColour(tabColor) - if pc.HasFlag(FNB_BOTTOM): - col2 = LightColour(pc._pagesInfoVec[tabIdx].GetColour(), 50) col1 = LightColour(pc._pagesInfoVec[tabIdx].GetColour(), 80) - else: - col1 = LightColour(pc._pagesInfoVec[tabIdx].GetColour(), 50) col2 = LightColour(pc._pagesInfoVec[tabIdx].GetColour(), 80) - size = abs(tabPoints[2].y - tabPoints[0].y) - 1 - rf, gf, bf = 0, 0, 0 rstep = float(col2.Red() - col1.Red())/float(size) gstep = float(col2.Green() - col1.Green())/float(size) bstep = float(col2.Blue() - col1.Blue())/float(size) - y = tabPoints[0].y - + """ # If we are drawing the selected tab, we need also to draw a line # from 0.tabPoints[0].x and tabPoints[6].x . end, we achieve this # by drawing the rectangle with transparent brush # the line under the selected tab will be deleted by the drwaing loop + """ if bSelectedTab: self.DrawTabsLine(pc, dc) - while 1: - if pc.HasFlag(FNB_BOTTOM): - - if y > tabPoints[0].y + size: - break - + if y > tabPoints[0].y + size: break else: - - if y < tabPoints[0].y - size: - break - + if y < tabPoints[0].y - size: break currCol = wx.Colour(col1.Red() + rf, col1.Green() + gf, col1.Blue() + bf) - dc.SetPen((bSelectedTab and [wx.Pen(pc._activeTabColor)] or [wx.Pen(currCol)])[0]) startX = self.GetStartX(tabPoints, y, pc.GetParent().GetWindowStyleFlag()) endX = self.GetEndX(tabPoints, y, pc.GetParent().GetWindowStyleFlag()) dc.DrawLine(startX, y, endX, y) - # Draw the border using the 'edge' point dc.SetPen(wx.Pen((bSelectedTab and [wx.SystemSettings_GetColour(wx.SYS_COLOUR_BTNSHADOW)] or [pc._colorBorder])[0])) - dc.DrawPoint(startX, y) dc.DrawPoint(endX, y) @@ -2789,166 +2211,111 @@ rf += rstep gf += gstep bf += bstep - - if pc.HasFlag(FNB_BOTTOM): - y = y + 1 - else: - y = y - 1 - + if pc.HasFlag(FNB_BOTTOM): y = y + 1 + else: y = y - 1 def GetStartX(self, tabPoints, y, style): """ Returns the x start position of a tab. """ - x1, x2, y1, y2 = 0.0, 0.0, 0.0, 0.0 # We check the 3 points to the left - bBottomStyle = (style & FNB_BOTTOM and [True] or [False])[0] match = False - if bBottomStyle: - for i in xrange(3): - if y >= tabPoints[i].y and y < tabPoints[i+1].y: - x1 = tabPoints[i].x x2 = tabPoints[i+1].x y1 = tabPoints[i].y y2 = tabPoints[i+1].y match = True break - else: - for i in xrange(3): - if y <= tabPoints[i].y and y > tabPoints[i+1].y: - x1 = tabPoints[i].x x2 = tabPoints[i+1].x y1 = tabPoints[i].y y2 = tabPoints[i+1].y match = True break - - if not match: - return tabPoints[2].x - + if not match: return tabPoints[2].x + """ # According to the equation y = ax + b => x = (y-b)/a # We know the first 2 points - - if x2 == x1: - return x2 - else: - a = (y2 - y1)/(x2 - x1) - + """ + if x2 == x1: return x2 + else: a = (y2 - y1)/(x2 - x1) b = y1 - ((y2 - y1)/(x2 - x1))*x1 - - if a == 0: - return int(x1) - + if a == 0: return int(x1) x = (y - b)/a - return int(x) - def GetEndX(self, tabPoints, y, style): """ Returns the x end position of a tab. """ - x1, x2, y1, y2 = 0.0, 0.0, 0.0, 0.0 - # We check the 3 points to the left bBottomStyle = (style & FNB_BOTTOM and [True] or [False])[0] match = False - if bBottomStyle: - for i in xrange(7, 3, -1): - if y >= tabPoints[i].y and y < tabPoints[i-1].y: - x1 = tabPoints[i].x x2 = tabPoints[i-1].x y1 = tabPoints[i].y y2 = tabPoints[i-1].y match = True break - else: - for i in xrange(7, 3, -1): - if y <= tabPoints[i].y and y > tabPoints[i-1].y: - x1 = tabPoints[i].x x2 = tabPoints[i-1].x y1 = tabPoints[i].y y2 = tabPoints[i-1].y match = True break - if not match: return tabPoints[3].x - + """ # According to the equation y = ax + b => x = (y-b)/a # We know the first 2 points # Vertical line - if x1 == x2: - return int(x1) - + """ + if x1 == x2: return int(x1) a = (y2 - y1)/(x2 - x1) b = y1 - ((y2 - y1)/(x2 - x1))*x1 - - if a == 0: - return int(x1) - + if a == 0: return int(x1) x = (y - b)/a - return int(x) - def NumberTabsCanFit(self, pageContainer, fr=-1): """ Returns the number of tabs that can fit in the visible area. """ - pc = pageContainer - rect = pc.GetClientRect() clientWidth = rect.width - # Empty results vTabInfo = [] tabHeight = self.CalcTabHeight(pageContainer) - # The drawing starts from posx posx = pc._pParent.GetPadding() - - if fr < 0: - fr = pc._nFrom - + if fr < 0: fr = pc._nFrom for i in xrange(fr, len(pc._pagesInfoVec)): - vc8glitch = tabHeight + FNB_HEIGHT_SPACER tabWidth = self.CalcTabWidth(pageContainer, i, tabHeight) - - if posx + tabWidth + vc8glitch + self.GetButtonsAreaLength(pc) >= clientWidth: - break - + if posx + tabWidth + vc8glitch + self.GetButtonsAreaLength(pc) >= clientWidth: break # Add a result to the returned vector tabRect = wx.Rect(posx, VERTICAL_BORDER_PADDING, tabWidth, tabHeight) vTabInfo.append(tabRect) - # Advance posx posx += tabWidth + FNB_HEIGHT_SPACER - return vTabInfo -# ---------------------------------------------------------------------------- # +""" # Class FlatNotebook -# ---------------------------------------------------------------------------- # - +""" class FlatNotebook(wx.PyPanel): """ Display one or more windows in a notebook. @@ -2976,7 +2343,6 @@ 'style': this can be assigned to whatever combination of FNB_* styles. """ - self._bForceSelection = False self._nPadding = 6 self._nFrom = 0 @@ -2985,91 +2351,69 @@ self._windows = [] self._popupWin = None self._naviIcon = None - wx.PyPanel.__init__(self, parent, id, pos, size, style) - self._pages = PageContainer(self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, style) - self.Bind(wx.EVT_NAVIGATION_KEY, self.OnNavigationKey) - self.Init() def Init(self): """ Initializes all the class attributes. """ - self._pages._colorBorder = wx.SystemSettings_GetColour(wx.SYS_COLOUR_BTNSHADOW) - self._mainSizer = wx.BoxSizer(wx.VERTICAL) self.SetSizer(self._mainSizer) - + """ # The child panels will inherit this bg color, so leave it at the default value #self.SetBackgroundColour(wx.SystemSettings_GetColour(wx.SYS_COLOUR_APPWORKSPACE)) # Set default page height + """ dc = wx.ClientDC(self) - if "__WXGTK__" in wx.PlatformInfo: + """ # For GTK it seems that we must do this steps in order # for the tabs will get the proper height on initialization # on MSW, preforming these steps yields wierd results + """ boldFont = wx.SystemSettings_GetFont(wx.SYS_DEFAULT_GUI_FONT) boldFont.SetWeight(wx.FONTWEIGHT_BOLD) dc.SetFont(boldFont) - height = dc.GetCharHeight() - tabHeight = height + FNB_HEIGHT_SPACER # We use 8 pixels as padding - - if "__WXGTK__" in wx.PlatformInfo: - tabHeight += 6 - + if "__WXGTK__" in wx.PlatformInfo: tabHeight += 6 self._pages.SetSizeHints(-1, tabHeight) # Add the tab container to the sizer self._mainSizer.Insert(0, self._pages, 0, wx.EXPAND) self._mainSizer.Layout() - self._pages._nFrom = self._nFrom self._pDropTarget = FNBDropTarget(self) self.SetDropTarget(self._pDropTarget) - def DoGetBestSize(self): """ Overrides DoGetBestSize to handle sizers nicely. """ - if not self._windows: # Something is better than nothing... no pages! return wx.Size(20, 20) - maxWidth = maxHeight = 0 tabHeight = self.GetPageBestSize().height - for win in self._windows: # Loop over all the windows to get their best size width, height = win.GetBestSize() maxWidth, maxHeight = max(maxWidth, width), max(maxHeight, height) - return wx.Size(maxWidth, maxHeight+tabHeight) - def SetActiveTabTextColour(self, textColour): """ Sets the text colour for the active tab. """ - self._pages._activeTextColor = textColour - def OnDropTarget(self, x, y, nTabPage, wnd_oldContainer): """ Handles the drop action from a DND operation. """ - return self._pages.OnDropTarget(x, y, nTabPage, wnd_oldContainer) - def GetPreviousSelection(self): """ Returns the previous selection. """ - return self._pages._iPreviousActivePage - def AddPage(self, page, text, select=True, imageId=-1): """ Add a page to the L{FlatNotebook}. @@ -3082,96 +2426,65 @@ Return value: True if successful, False otherwise. """ - # sanity check - if not page: - return False - + if not page: return False # reparent the window to us page.Reparent(self) - # Add tab bSelected = select or len(self._windows) == 0 - if bSelected: - bSelected = False - # Check for selection and send events oldSelection = self._pages._iActivePage tabIdx = len(self._windows) - event = FlatNotebookEvent(wxEVT_FLATNOTEBOOK_PAGE_CHANGING, self.GetId()) event.SetSelection(tabIdx) event.SetOldSelection(oldSelection) event.SetEventObject(self) - if not self.GetEventHandler().ProcessEvent(event) or event.IsAllowed() or len(self._windows) == 0: bSelected = True - curSel = self._pages.GetSelection() - if not self._pages.IsShown(): self._pages.Show() - self._pages.AddPage(text, bSelected, imageId) self._windows.append(page) - self.Freeze() # Check if a new selection was made if bSelected: - if curSel >= 0: - # Remove the window from the main sizer self._mainSizer.Detach(self._windows[curSel]) self._windows[curSel].Hide() - if self.GetWindowStyleFlag() & FNB_BOTTOM: - self._mainSizer.Insert(0, page, 1, wx.EXPAND) - else: - # We leave a space of 1 pixel around the window self._mainSizer.Add(page, 1, wx.EXPAND) - # Fire a wxEVT_FLATNOTEBOOK_PAGE_CHANGED event event.SetEventType(wxEVT_FLATNOTEBOOK_PAGE_CHANGED) event.SetOldSelection(oldSelection) self.GetEventHandler().ProcessEvent(event) - else: - # Hide the page page.Hide() - self.Thaw() self._mainSizer.Layout() self.Refresh() - return True - def SetImageList(self, imageList): """ Sets the image list for the page control. """ - self._pages.SetImageList(imageList) - def AssignImageList(self, imageList): """ Assigns the image list for the page control. """ - self._pages.AssignImageList(imageList) - def GetImageList(self): """ Returns the associated image list. """ - return self._pages.GetImageList() - def InsertPage(self, indx, page, text, select=True, imageId=-1): """ Inserts a new page at the specified position. @@ -3185,137 +2498,92 @@ Return value: True if successful, False otherwise. """ - # sanity check - if not page: - return False - + if not page: return False # reparent the window to us page.Reparent(self) - if not self._windows: - self.AddPage(page, text, select, imageId) return True - # Insert tab bSelected = select or not self._windows curSel = self._pages.GetSelection() - indx = max(0, min(indx, len(self._windows))) - - if indx <= len(self._windows): - - self._windows.insert(indx, page) - - else: - - self._windows.append(page) - + if indx <= len(self._windows): self._windows.insert(indx, page) + else: self._windows.append(page) if bSelected: - bSelected = False # Check for selection and send events oldSelection = self._pages._iActivePage - event = FlatNotebookEvent(wxEVT_FLATNOTEBOOK_PAGE_CHANGING, self.GetId()) event.SetSelection(indx) event.SetOldSelection(oldSelection) event.SetEventObject(self) - if not self.GetEventHandler().ProcessEvent(event) or event.IsAllowed() or len(self._windows) == 0: bSelected = True - self._pages.InsertPage(indx, text, bSelected, imageId) - - if indx <= curSel: - curSel = curSel + 1 - + if indx <= curSel: curSel = curSel + 1 self.Freeze() # Check if a new selection was made if bSelected: - if curSel >= 0: # Remove the window from the main sizer self._mainSizer.Detach(self._windows[curSel]) self._windows[curSel].Hide() - self._pages.SetSelection(indx) # Fire a wxEVT_FLATNOTEBOOK_PAGE_CHANGED event event.SetEventType(wxEVT_FLATNOTEBOOK_PAGE_CHANGED) event.SetOldSelection(oldSelection) self.GetEventHandler().ProcessEvent(event) - else: - # Hide the page page.Hide() - self.Thaw() self._mainSizer.Layout() self.Refresh() - return True - def SetSelection(self, page): """ Sets the selection for the given page. The call to this function generates the page changing events """ - - if page >= len(self._windows) or not self._windows: - return - + if page >= len(self._windows) or not self._windows: return # Support for disabed tabs if not self._pages.GetEnabled(page) and len(self._windows) > 1 and not self._bForceSelection: return - curSel = self._pages.GetSelection() - # program allows the page change self.Freeze() if curSel >= 0: - # Remove the window from the main sizer self._mainSizer.Detach(self._windows[curSel]) self._windows[curSel].Hide() - if self.GetWindowStyleFlag() & FNB_BOTTOM: - self._mainSizer.Insert(0, self._windows[page], 1, wx.EXPAND) - else: - # We leave a space of 1 pixel around the window self._mainSizer.Add(self._windows[page], 1, wx.EXPAND) - self._windows[page].Show() self.Thaw() - self._mainSizer.Layout() - if page != self._pages._iActivePage: # there is a real page changing self._pages._iPreviousActivePage = self._pages._iActivePage - self._pages._iActivePage = page self._pages.DoSetSelection(page) - def DeletePage(self, page): """ Deletes the specified page, and the associated window. The call to this function generates the page changing events. """ - if page >= len(self._windows) or page < 0: return - # Fire a closing event event = FlatNotebookEvent(wxEVT_FLATNOTEBOOK_PAGE_CLOSING, self.GetId()) event.SetSelection(page) @@ -3325,7 +2593,6 @@ # The event handler allows it? if not event.IsAllowed(): return - self.Freeze() # Delete the requested page @@ -3333,17 +2600,14 @@ # If the page is the current window, remove it from the sizer # as well - if page == self._pages.GetSelection(): - self._mainSizer.Detach(pageRemoved) + if page == self._pages.GetSelection(): self._mainSizer.Detach(pageRemoved) # Remove it from the array as well self._windows.pop(page) # Now we can destroy it in wxWidgets use Destroy instead of delete pageRemoved.Destroy() - self.Thaw() - self._pages.DoDeletePage(page) self.Refresh() self.Update() @@ -3354,72 +2618,46 @@ closedEvent.SetEventObject(self) self.GetEventHandler().ProcessEvent(closedEvent) - def DeleteAllPages(self): """ Deletes all the pages. """ - - if not self._windows: - return False - + if not self._windows: return False self.Freeze() - - for page in self._windows: - page.Destroy() - + for page in self._windows: page.Destroy() self._windows = [] self.Thaw() - # Clear the container of the tabs as well self._pages.DeleteAllPages() return True - def GetCurrentPage(self): """ Returns the currently selected notebook page or None. """ - sel = self._pages.GetSelection() - if sel < 0: - return None - + if sel < 0: return None return self._windows[sel] - def GetPage(self, page): """ Returns the window at the given page position, or None. """ - - if page >= len(self._windows): - return None - + if page >= len(self._windows): return None return self._windows[page] - def GetPageIndex(self, win): """ Returns the index at which the window is found. """ - - try: - return self._windows.index(win) - except: - return -1 - + try: return self._windows.index(win) + except: return -1 def GetSelection(self): """ Returns the currently selected page, or -1 if none was selected. """ - return self._pages.GetSelection() - def AdvanceSelection(self, forward=True): """ Cycles through the tabs. The call to this function generates the page changing events. """ - self._pages.AdvanceSelection(forward) - def GetPageCount(self): """ Returns the number of pages in the L{FlatNotebook} control. """ - return self._pages.GetPageCount() def SetNavigatorIcon(self, bmp): @@ -3431,15 +2669,12 @@ img.Rescale(16, 16, wx.IMAGE_QUALITY_HIGH) bmp = wx.BitmapFromImage(img) self._naviIcon = bmp - else: - raise TypeError, "SetNavigatorIcon requires a valid bitmap" + else: raise TypeError, "SetNavigatorIcon requires a valid bitmap" def OnNavigationKey(self, event): """ Handles the wx.EVT_NAVIGATION_KEY event for L{FlatNotebook}. """ - if event.IsWindowChange(): - if len(self._windows) == 0: - return + if len(self._windows) == 0: return # change pages if self.HasFlag(FNB_SMART_TABS): if not self._popupWin: @@ -3455,292 +2690,198 @@ else: # change pages self.AdvanceSelection(event.GetDirection()) - - else: - event.Skip() - + else: event.Skip() def GetPageShapeAngle(self, page_index): """ Returns the angle associated to a tab. """ - - if page_index < 0 or page_index >= len(self._pages._pagesInfoVec): - return None, False - + if page_index < 0 or page_index >= len(self._pages._pagesInfoVec): return None, False result = self._pages._pagesInfoVec[page_index].GetTabAngle() return result, True - def SetPageShapeAngle(self, page_index, angle): """ Sets the angle associated to a tab. """ - - if page_index < 0 or page_index >= len(self._pages._pagesInfoVec): - return - - if angle > 15: - return - + if page_index < 0 or page_index >= len(self._pages._pagesInfoVec): return + if angle > 15: return self._pages._pagesInfoVec[page_index].SetTabAngle(angle) - def SetAllPagesShapeAngle(self, angle): """ Sets the angle associated to all the tab. """ - - if angle > 15: - return - - for ii in xrange(len(self._pages._pagesInfoVec)): - self._pages._pagesInfoVec[ii].SetTabAngle(angle) - + if angle > 15: return + for ii in xrange(len(self._pages._pagesInfoVec)): self._pages._pagesInfoVec[ii].SetTabAngle(angle) self.Refresh() - def GetPageBestSize(self): """ Return the page best size. """ - return self._pages.GetClientSize() - def SetPageText(self, page, text): """ Sets the text for the given page. """ - bVal = self._pages.SetPageText(page, text) self._pages.Refresh() - return bVal - def SetPadding(self, padding): """ Sets the amount of space around each page's icon and label, in pixels. NB: only the horizontal padding is considered. """ - self._nPadding = padding.GetWidth() - def GetTabArea(self): """ Returns the associated page. """ - return self._pages - def GetPadding(self): """ Returns the amount of space around each page's icon and label, in pixels. """ - return self._nPadding - def SetWindowStyleFlag(self, style): """ Sets the L{FlatNotebook} window style flags. """ - wx.PyPanel.SetWindowStyleFlag(self, style) renderer = self._pages._mgr.GetRenderer(self.GetWindowStyleFlag()) renderer._tabHeight = None - if self._pages: - # For changing the tab position (i.e. placing them top/bottom) # refreshing the tab container is not enough self.SetSelection(self._pages._iActivePage) - if not self._pages.HasFlag(FNB_HIDE_ON_SINGLE_TAB): #For Redrawing the Tabs once you remove the Hide tyle self._pages._ReShow() - def RemovePage(self, page): """ Deletes the specified page, without deleting the associated window. """ - - if page >= len(self._windows): - return False - + if page >= len(self._windows): return False # Fire a closing event event = FlatNotebookEvent(wxEVT_FLATNOTEBOOK_PAGE_CLOSING, self.GetId()) event.SetSelection(page) event.SetEventObject(self) self.GetEventHandler().ProcessEvent(event) - # The event handler allows it? - if not event.IsAllowed(): - return False - + if not event.IsAllowed(): return False self.Freeze() # Remove the requested page pageRemoved = self._windows[page] - # If the page is the current window, remove it from the sizer # as well - if page == self._pages.GetSelection(): - self._mainSizer.Detach(pageRemoved) - + if page == self._pages.GetSelection(): self._mainSizer.Detach(pageRemoved) # Remove it from the array as well self._windows.pop(page) self.Thaw() - self._pages.DoDeletePage(page) - return True - def SetRightClickMenu(self, menu): """ Sets the popup menu associated to a right click on a tab. """ - self._pages._pRightClickMenu = menu - def GetPageText(self, nPage): """ Returns the tab caption. """ - return self._pages.GetPageText(nPage) - def SetGradientColours(self, fr, to, border): """ Sets the gradient colours for the tab. """ - self._pages._colorFrom = fr self._pages._colorTo = to self._pages._colorBorder = border - def SetGradientColourFrom(self, fr): """ Sets the starting colour for the gradient. """ - self._pages._colorFrom = fr - def SetGradientColourTo(self, to): """ Sets the ending colour for the gradient. """ - self._pages._colorTo = to - def SetGradientColourBorder(self, border): """ Sets the tab border colour. """ - self._pages._colorBorder = border - def GetGradientColourFrom(self): """ Gets first gradient colour. """ - return self._pages._colorFrom - def GetGradientColourTo(self): """ Gets second gradient colour. """ - return self._pages._colorTo - def GetGradientColourBorder(self): """ Gets the tab border colour. """ - return self._pages._colorBorder - def GetBorderColour(self): """ Returns the border colour. """ - return self._pages._colorBorder - def GetActiveTabTextColour(self): """ Get the active tab text colour. """ - return self._pages._activeTextColor - def SetPageImage(self, page, image): """ Sets the image index for the given page. Image is an index into the image list which was set with SetImageList. """ - self._pages.SetPageImage(page, image) - def GetPageImage(self, nPage): """ Returns the image index for the given page. Image is an index into the image list which was set with SetImageList. """ - return self._pages.GetPageImage(nPage) - def GetEnabled(self, page): """ Returns whether a tab is enabled or not. """ - return self._pages.GetEnabled(page) - def EnableTab(self, page, enabled=True): """ Enables or disables a tab. """ - - if page >= len(self._windows): - return - + if page >= len(self._windows): return self._windows[page].Enable(enabled) self._pages.EnableTab(page, enabled) - def GetNonActiveTabTextColour(self): """ Returns the non active tabs text colour. """ - return self._pages._nonActiveTextColor - def SetNonActiveTabTextColour(self, color): """ Sets the non active tabs text colour. """ - self._pages._nonActiveTextColor = color - def SetTabAreaColour(self, color): """ Sets the area behind the tabs colour. """ - self._pages._tabAreaColor = color - def GetTabAreaColour(self): """ Returns the area behind the tabs colour. """ - return self._pages._tabAreaColor - def SetActiveTabColour(self, color): """ Sets the active tab colour. """ - self._pages._activeTabColor = color - def GetActiveTabColour(self): """ Returns the active tab colour. """ - return self._pages._activeTabColor -# ---------------------------------------------------------------------------- # +""" # Class PageContainer # Acts as a container for the pages you add to FlatNotebook -# ---------------------------------------------------------------------------- # - +""" class PageContainer(wx.Panel): """ This class acts as a container for the pages you add to L{FlatNotebook}. """ - def __init__(self, parent, id=wx.ID_ANY, pos=wx.DefaultPosition, size=wx.DefaultSize, style=0): """ Default class constructor. """ - self._ImageList = None self._iActivePage = -1 self._pDropTarget = None self._nLeftClickZone = FNB_NOWHERE self._iPreviousActivePage = -1 - self._pRightClickMenu = None self._nXButtonStatus = FNB_BTN_NONE self._nArrowDownButtonStatus = FNB_BTN_NONE @@ -3748,38 +2889,30 @@ self._nRightButtonStatus = FNB_BTN_NONE self._nLeftButtonStatus = FNB_BTN_NONE self._nTabXButtonStatus = FNB_BTN_NONE - self._pagesInfoVec = [] - self._colorTo = wx.SystemSettings_GetColour(wx.SYS_COLOUR_ACTIVECAPTION) self._colorFrom = wx.WHITE self._activeTabColor = wx.WHITE self._activeTextColor = wx.SystemSettings_GetColour(wx.SYS_COLOUR_BTNTEXT) self._nonActiveTextColor = wx.SystemSettings_GetColour(wx.SYS_COLOUR_BTNTEXT) self._tabAreaColor = wx.SystemSettings_GetColour(wx.SYS_COLOUR_BTNFACE) - self._nFrom = 0 self._isdragging = False # Set default page height, this is done according to the system font memDc = wx.MemoryDC() memDc.SelectObject(wx.EmptyBitmap(1,1)) - if "__WXGTK__" in wx.PlatformInfo: boldFont = wx.SystemSettings_GetFont(wx.SYS_DEFAULT_GUI_FONT) boldFont.SetWeight(wx.BOLD) memDc.SetFont(boldFont) - height = memDc.GetCharHeight() tabHeight = height + FNB_HEIGHT_SPACER # We use 10 pixels as padding - wx.Panel.__init__(self, parent, id, pos, wx.Size(size.x, tabHeight), style|wx.NO_BORDER|wx.NO_FULL_REPAINT_ON_RESIZE|wx.WANTS_CHARS) - self._pDropTarget = FNBDropTarget(self) self.SetDropTarget(self._pDropTarget) self._mgr = FNBRendererMgr() - self.Bind(wx.EVT_PAINT, self.OnPaint) self.Bind(wx.EVT_SIZE, self.OnSize) self.Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown) @@ -3795,33 +2928,26 @@ self.Bind(wx.EVT_KILL_FOCUS, self.OnKillFocus) self.Bind(wx.EVT_KEY_DOWN, self.OnKeyDown) - def OnEraseBackground(self, event): """ Handles the wx.EVT_ERASE_BACKGROUND event for L{PageContainer} (does nothing).""" - pass - def _ReShow(self): """ Handles the Redraw of the tabs when the FNB_HIDE_ON_SINGLE_TAB has been removed """ self.Show() self.GetParent()._mainSizer.Layout() self.Refresh() - def OnPaint(self, event): """ Handles the wx.EVT_PAINT event for L{PageContainer}.""" - dc = wx.BufferedPaintDC(self) renderer = self._mgr.GetRenderer(self.GetParent().GetWindowStyleFlag()) renderer.DrawTabs(self, dc) - if self.HasFlag(FNB_HIDE_ON_SINGLE_TAB) and len(self._pagesInfoVec) <= 1: self.Hide() self.GetParent()._mainSizer.Layout() self.Refresh() - def AddPage(self, caption, selected=True, imgindex=-1): """ Add a page to the L{FlatNotebook}. @@ -3834,18 +2960,14 @@ Return value: True if successful, False otherwise. """ - if selected: - self._iPreviousActivePage = self._iActivePage self._iActivePage = len(self._pagesInfoVec) - # Create page info and add it to the vector pageInfo = PageInfo(caption, imgindex) self._pagesInfoVec.append(pageInfo) self.Refresh() - def InsertPage(self, indx, text, selected=True, imgindex=-1): """ Inserts a new page at the specified position. @@ -3859,93 +2981,62 @@ Return value: True if successful, False otherwise. """ - if selected: - self._iPreviousActivePage = self._iActivePage self._iActivePage = len(self._pagesInfoVec) - self._pagesInfoVec.insert(indx, PageInfo(text, imgindex)) - self.Refresh() return True - def OnSize(self, event): """ Handles the wx.EVT_SIZE events for L{PageContainer}. """ - # When resizing the control, try to fit to screen as many tabs as we can style = self.GetParent().GetWindowStyleFlag() renderer = self._mgr.GetRenderer(style) - fr = 0 page = self.GetSelection() - for fr in xrange(self._nFrom): vTabInfo = renderer.NumberTabsCanFit(self, fr) - if page - fr >= len(vTabInfo): - continue + if page - fr >= len(vTabInfo): continue break - self._nFrom = fr - self.Refresh() # Call on paint event.Skip() - def OnMiddleDown(self, event): """ Handles the wx.EVT_MIDDLE_DOWN events for L{PageContainer}. """ - # Test if this style is enabled style = self.GetParent().GetWindowStyleFlag() - - if not style & FNB_MOUSE_MIDDLE_CLOSES_TABS: - return - + if not style & FNB_MOUSE_MIDDLE_CLOSES_TABS: return where, tabIdx = self.HitTest(event.GetPosition()) - - if where == FNB_TAB: - self.DeletePage(tabIdx) - + if where == FNB_TAB: self.DeletePage(tabIdx) event.Skip() - def OnRightDown(self, event): """ Handles the wx.EVT_RIGHT_DOWN events for L{PageContainer}. """ - where, tabIdx = self.HitTest(event.GetPosition()) - if where in [FNB_TAB, FNB_TAB_X]: - if self._pagesInfoVec[tabIdx].GetEnabled(): # Fire events and eventually (if allowed) change selection self.FireEvent(tabIdx) - # send a message to popup a custom menu event = FlatNotebookEvent(wxEVT_FLATNOTEBOOK_PAGE_CONTEXT_MENU, self.GetParent().GetId()) event.SetSelection(tabIdx) event.SetOldSelection(self._iActivePage) event.SetEventObject(self.GetParent()) self.GetParent().GetEventHandler().ProcessEvent(event) - - if self._pRightClickMenu: - self.PopupMenu(self._pRightClickMenu) - + if self._pRightClickMenu: self.PopupMenu(self._pRightClickMenu) event.Skip() - def OnLeftDown(self, event): """ Handles the wx.EVT_LEFT_DOWN events for L{PageContainer}. """ - # Reset buttons status self._nXButtonStatus = FNB_BTN_NONE self._nLeftButtonStatus = FNB_BTN_NONE self._nRightButtonStatus = FNB_BTN_NONE self._nTabXButtonStatus = FNB_BTN_NONE self._nArrowDownButtonStatus = FNB_BTN_NONE - self._nLeftClickZone, tabIdx = self.HitTest(event.GetPosition()) - if self._nLeftClickZone == FNB_DROP_DOWN_ARROW: self._nArrowDownButtonStatus = FNB_BTN_PRESSED self.Refresh() @@ -3961,387 +3052,244 @@ elif self._nLeftClickZone == FNB_TAB_X: self._nTabXButtonStatus = FNB_BTN_PRESSED self.Refresh() - elif self._nLeftClickZone == FNB_TAB: - if self._iActivePage != tabIdx: - # In case the tab is disabled, we dont allow to choose it - if self._pagesInfoVec[tabIdx].GetEnabled(): - self.FireEvent(tabIdx) - + if self._pagesInfoVec[tabIdx].GetEnabled(): self.FireEvent(tabIdx) def RotateLeft(self): - if self._nFrom == 0: return - # Make sure that the button was pressed before - if self._nLeftButtonStatus != FNB_BTN_PRESSED: - return - + if self._nLeftButtonStatus != FNB_BTN_PRESSED: return self._nLeftButtonStatus = FNB_BTN_HOVER - # We scroll left with bulks of 5 scrollLeft = self.GetNumTabsCanScrollLeft() - self._nFrom -= scrollLeft - if self._nFrom < 0: - self._nFrom = 0 - + if self._nFrom < 0: self._nFrom = 0 self.Refresh() - def RotateRight(self): - - if self._nFrom >= len(self._pagesInfoVec) - 1: - return - + if self._nFrom >= len(self._pagesInfoVec) - 1: return # Make sure that the button was pressed before - if self._nRightButtonStatus != FNB_BTN_PRESSED: - return - + if self._nRightButtonStatus != FNB_BTN_PRESSED: return self._nRightButtonStatus = FNB_BTN_HOVER - # Check if the right most tab is visible, if it is # don't rotate right anymore - if self._pagesInfoVec[len(self._pagesInfoVec)-1].GetPosition() != wx.Point(-1, -1): - return - + if self._pagesInfoVec[len(self._pagesInfoVec)-1].GetPosition() != wx.Point(-1, -1): return self._nFrom += 1 self.Refresh() - def OnLeftUp(self, event): """ Handles the wx.EVT_LEFT_UP events for L{PageContainer}. """ - # forget the zone that was initially clicked self._nLeftClickZone = FNB_NOWHERE - where, tabIdx = self.HitTest(event.GetPosition()) - # Make sure selected tab has focus self.SetFocus() - - if where == FNB_LEFT_ARROW: - self.RotateLeft() - - elif where == FNB_RIGHT_ARROW: - self.RotateRight() - + if where == FNB_LEFT_ARROW: self.RotateLeft() + elif where == FNB_RIGHT_ARROW: self.RotateRight() elif where == FNB_X: - # Make sure that the button was pressed before - if self._nXButtonStatus != FNB_BTN_PRESSED: - return - + if self._nXButtonStatus != FNB_BTN_PRESSED: return self._nXButtonStatus = FNB_BTN_HOVER - self.DeletePage(self._iActivePage) - elif where == FNB_TAB_X: - # Make sure that the button was pressed before - if self._nTabXButtonStatus != FNB_BTN_PRESSED: - return - + if self._nTabXButtonStatus != FNB_BTN_PRESSED: return self._nTabXButtonStatus = FNB_BTN_HOVER - self.DeletePage(self._iActivePage) - elif where == FNB_DROP_DOWN_ARROW: - # Make sure that the button was pressed before - if self._nArrowDownButtonStatus != FNB_BTN_PRESSED: - return - + if self._nArrowDownButtonStatus != FNB_BTN_PRESSED: return self._nArrowDownButtonStatus = FNB_BTN_NONE - # Refresh the button status renderer = self._mgr.GetRenderer(self.GetParent().GetWindowStyleFlag()) dc = wx.ClientDC(self) renderer.DrawDropDownArrow(self, dc) - self.PopupTabsMenu() - event.Skip() - def HitTest(self, pt): """ HitTest method for L{PageContainer}. Returns the flag (if any) and the hit page (if any). """ - style = self.GetParent().GetWindowStyleFlag() render = self._mgr.GetRenderer(style) - fullrect = self.GetClientRect() btnLeftPos = render.GetLeftButtonPos(self) btnRightPos = render.GetRightButtonPos(self) btnXPos = render.GetXPos(self) - tabIdx = -1 - - if len(self._pagesInfoVec) == 0: - return FNB_NOWHERE, tabIdx - + if len(self._pagesInfoVec) == 0: return FNB_NOWHERE, tabIdx rect = wx.Rect(btnXPos, 8, 16, 16) - if rect.Contains(pt): - return (style & FNB_NO_X_BUTTON and [FNB_NOWHERE] or [FNB_X])[0], tabIdx - + if rect.Contains(pt): return (style & FNB_NO_X_BUTTON and [FNB_NOWHERE] or [FNB_X])[0], tabIdx rect = wx.Rect(btnRightPos, 8, 16, 16) if style & FNB_DROPDOWN_TABS_LIST: rect = wx.Rect(render.GetDropArrowButtonPos(self), 8, 16, 16) - if rect.Contains(pt): - return FNB_DROP_DOWN_ARROW, tabIdx - + if rect.Contains(pt): return FNB_DROP_DOWN_ARROW, tabIdx if rect.Contains(pt): return (style & FNB_NO_NAV_BUTTONS and [FNB_NOWHERE] or [FNB_RIGHT_ARROW])[0], tabIdx - rect = wx.Rect(btnLeftPos, 8, 16, 16) if rect.Contains(pt): return (style & FNB_NO_NAV_BUTTONS and [FNB_NOWHERE] or [FNB_LEFT_ARROW])[0], tabIdx - # Test whether a left click was made on a tab bFoundMatch = False - for cur in xrange(self._nFrom, len(self._pagesInfoVec)): - pgInfo = self._pagesInfoVec[cur] - if pgInfo.GetPosition() == wx.Point(-1, -1): continue - if style & FNB_X_ON_TAB and cur == self.GetSelection(): # 'x' button exists on a tab if self._pagesInfoVec[cur].GetXRect().Contains(pt): return FNB_TAB_X, cur - if style & FNB_VC8: - if self._pagesInfoVec[cur].GetRegion().Contains(pt.x, pt.y): - if bFoundMatch or cur == self.GetSelection(): - return FNB_TAB, cur - + if bFoundMatch or cur == self.GetSelection(): return FNB_TAB, cur tabIdx = cur bFoundMatch = True - else: - tabRect = wx.Rect(pgInfo.GetPosition().x, pgInfo.GetPosition().y, pgInfo.GetSize().x, pgInfo.GetSize().y) - if tabRect.Contains(pt): # We have a match return FNB_TAB, cur - - if bFoundMatch: - return FNB_TAB, tabIdx - + if bFoundMatch: return FNB_TAB, tabIdx if self._isdragging: # We are doing DND, so check also the region outside the tabs # try before the first tab pgInfo = self._pagesInfoVec[0] tabRect = wx.Rect(0, pgInfo.GetPosition().y, pgInfo.GetPosition().x, self.GetParent().GetSize().y) - if tabRect.Contains(pt): - return FNB_TAB, 0 - + if tabRect.Contains(pt): return FNB_TAB, 0 # try after the last tab pgInfo = self._pagesInfoVec[-1] startpos = pgInfo.GetPosition().x+pgInfo.GetSize().x tabRect = wx.Rect(startpos, pgInfo.GetPosition().y, fullrect.width-startpos, self.GetParent().GetSize().y) - - if tabRect.Contains(pt): - return FNB_TAB, len(self._pagesInfoVec) - + if tabRect.Contains(pt): return FNB_TAB, len(self._pagesInfoVec) # Default return FNB_NOWHERE, -1 - def SetSelection(self, page): """ Sets the selected page. """ - book = self.GetParent() book.SetSelection(page) self.DoSetSelection(page) - def DoSetSelection(self, page): """ Does the actual selection of a page. """ - if page < len(self._pagesInfoVec): #! fix for tabfocus da_page = self._pParent.GetPage(page) - - if da_page != None: - da_page.SetFocus() - + if da_page != None: da_page.SetFocus() if not self.IsTabVisible(page): # Try to remove one tab from start and try again - if not self.CanFitToScreen(page): - - if self._nFrom > page: - self._nFrom = page + if self._nFrom > page: self._nFrom = page else: while self._nFrom < page: self._nFrom += 1 - if self.CanFitToScreen(page): - break - + if self.CanFitToScreen(page): break self.Refresh() - def DeletePage(self, page): """ Delete the specified page from L{FlatNotebook}. """ - book = self.GetParent() book.DeletePage(page) book.Refresh() - def IsTabVisible(self, page): """ Returns whether a tab is visible or not. """ - iLastVisiblePage = self.GetLastVisibleTab() return page <= iLastVisiblePage and page >= self._nFrom - def DoDeletePage(self, page): """ Does the actual page deletion. """ - # Remove the page from the vector book = self.GetParent() self._pagesInfoVec.pop(page) - # Thanks to Yiaanis AKA Mandrav if self._iActivePage >= page: self._iActivePage = self._iActivePage - 1 self._iPreviousActivePage = -1 - # The delete page was the last first on the array, # but the book still has more pages, so we set the # active page to be the first one (0) if self._iActivePage < 0 and len(self._pagesInfoVec) > 0: self._iActivePage = 0 self._iPreviousActivePage = -1 - # Refresh the tabs if self._iActivePage >= 0: - book._bForceSelection = True - # Check for selection and send event event = FlatNotebookEvent(wxEVT_FLATNOTEBOOK_PAGE_CHANGING, self.GetParent().GetId()) event.SetSelection(self._iActivePage) event.SetOldSelection(self._iPreviousActivePage) event.SetEventObject(self.GetParent()) - book.SetSelection(self._iActivePage) book._bForceSelection = False - # Fire a wxEVT_FLATNOTEBOOK_PAGE_CHANGED event event.SetEventType(wxEVT_FLATNOTEBOOK_PAGE_CHANGED) event.SetOldSelection(self._iPreviousActivePage) self.GetParent().GetEventHandler().ProcessEvent(event) - if not self._pagesInfoVec: # Erase the page container drawings dc = wx.ClientDC(self) dc.Clear() - def DeleteAllPages(self): """ Deletes all the pages. """ - self._iActivePage = -1 self._iPreviousActivePage = -1 self._nFrom = 0 self._pagesInfoVec = [] - # Erase the page container drawings dc = wx.ClientDC(self) dc.Clear() - def OnMouseMove(self, event): """ Handles the wx.EVT_MOTION for L{PageContainer}. """ - if self._pagesInfoVec and self.IsShown(): - xButtonStatus = self._nXButtonStatus xTabButtonStatus = self._nTabXButtonStatus rightButtonStatus = self._nRightButtonStatus leftButtonStatus = self._nLeftButtonStatus dropDownButtonStatus = self._nArrowDownButtonStatus - style = self.GetParent().GetWindowStyleFlag() - self._nXButtonStatus = FNB_BTN_NONE self._nRightButtonStatus = FNB_BTN_NONE self._nLeftButtonStatus = FNB_BTN_NONE self._nTabXButtonStatus = FNB_BTN_NONE self._nArrowDownButtonStatus = FNB_BTN_NONE - where, tabIdx = self.HitTest(event.GetPosition()) - if where == FNB_X: if event.LeftIsDown(): - self._nXButtonStatus = (self._nLeftClickZone==FNB_X and [FNB_BTN_PRESSED] or [FNB_BTN_NONE])[0] - - else: - - self._nXButtonStatus = FNB_BTN_HOVER - + else: self._nXButtonStatus = FNB_BTN_HOVER elif where == FNB_DROP_DOWN_ARROW: if event.LeftIsDown(): - self._nArrowDownButtonStatus = (self._nLeftClickZone==FNB_DROP_DOWN_ARROW and [FNB_BTN_PRESSED] or [FNB_BTN_NONE])[0] - - else: - - self._nArrowDownButtonStatus = FNB_BTN_HOVER - + else: self._nArrowDownButtonStatus = FNB_BTN_HOVER elif where == FNB_TAB_X: if event.LeftIsDown(): - self._nTabXButtonStatus = (self._nLeftClickZone==FNB_TAB_X and [FNB_BTN_PRESSED] or [FNB_BTN_NONE])[0] - - else: - - self._nTabXButtonStatus = FNB_BTN_HOVER - + else: self._nTabXButtonStatus = FNB_BTN_HOVER elif where == FNB_RIGHT_ARROW: if event.LeftIsDown(): - self._nRightButtonStatus = (self._nLeftClickZone==FNB_RIGHT_ARROW and [FNB_BTN_PRESSED] or [FNB_BTN_NONE])[0] - - else: - - self._nRightButtonStatus = FNB_BTN_HOVER - + else: self._nRightButtonStatus = FNB_BTN_HOVER elif where == FNB_LEFT_ARROW: if event.LeftIsDown(): - self._nLeftButtonStatus = (self._nLeftClickZone==FNB_LEFT_ARROW and [FNB_BTN_PRESSED] or [FNB_BTN_NONE])[0] - - else: - - self._nLeftButtonStatus = FNB_BTN_HOVER - + else: self._nLeftButtonStatus = FNB_BTN_HOVER elif where == FNB_TAB: # Call virtual method for showing tooltip self.ShowTabTooltip(tabIdx) - if not self.GetEnabled(tabIdx): # Set the cursor to be 'No-entry' wx.SetCursor(wx.StockCursor(wx.CURSOR_NO_ENTRY)) - # Support for drag and drop if event.Dragging() and not (style & FNB_NODRAG): - self._isdragging = True draginfo = FNBDragInfo(self, tabIdx) drginfo = cPickle.dumps(draginfo) @@ -4350,123 +3298,70 @@ dragSource = FNBDropSource(self) dragSource.SetData(dataobject) dragSource.DoDragDrop(wx.Drag_DefaultMove) - bRedrawX = self._nXButtonStatus != xButtonStatus bRedrawRight = self._nRightButtonStatus != rightButtonStatus bRedrawLeft = self._nLeftButtonStatus != leftButtonStatus bRedrawTabX = self._nTabXButtonStatus != xTabButtonStatus bRedrawDropArrow = self._nArrowDownButtonStatus != dropDownButtonStatus - render = self._mgr.GetRenderer(style) - if (bRedrawX or bRedrawRight or bRedrawLeft or bRedrawTabX or bRedrawDropArrow): - dc = wx.ClientDC(self) - - if bRedrawX: - - render.DrawX(self, dc) - - if bRedrawLeft: - - render.DrawLeftArrow(self, dc) - - if bRedrawRight: - - render.DrawRightArrow(self, dc) - - if bRedrawTabX: - - self.Refresh() - - if bRedrawDropArrow: - - render.DrawDropDownArrow(self, dc) - + if bRedrawX: render.DrawX(self, dc) + if bRedrawLeft: render.DrawLeftArrow(self, dc) + if bRedrawRight: render.DrawRightArrow(self, dc) + if bRedrawTabX: self.Refresh() + if bRedrawDropArrow: render.DrawDropDownArrow(self, dc) event.Skip() - def GetLastVisibleTab(self): """ Returns the last visible tab. """ - - if self._nFrom < 0: - return -1 - + if self._nFrom < 0: return -1 ii = 0 - for ii in xrange(self._nFrom, len(self._pagesInfoVec)): - - if self._pagesInfoVec[ii].GetPosition() == wx.Point(-1, -1): - break - + if self._pagesInfoVec[ii].GetPosition() == wx.Point(-1, -1): break return ii-1 - def GetNumTabsCanScrollLeft(self): """ Returns the number of tabs than can be scrolled left. """ - - if self._nFrom - 1 >= 0: - return 1 - + if self._nFrom - 1 >= 0: return 1 return 0 - def IsDefaultTabs(self): """ Returns whether a tab has a default style. """ - style = self.GetParent().GetWindowStyleFlag() res = (style & FNB_VC71) or (style & FNB_FANCY_TABS) or (style & FNB_VC8) return not res - def AdvanceSelection(self, bForward=True): """ Cycles through the tabs. The call to this function generates the page changing events. """ - nSel = self.GetSelection() - - if nSel < 0: - return - + if nSel < 0: return nMax = self.GetPageCount() - 1 - - if bForward: - newSelection = (nSel == nMax and [0] or [nSel + 1])[0] - else: - newSelection = (nSel == 0 and [nMax] or [nSel - 1])[0] - - if not self._pagesInfoVec[newSelection].GetEnabled(): - return - + if bForward: newSelection = (nSel == nMax and [0] or [nSel + 1])[0] + else: newSelection = (nSel == 0 and [nMax] or [nSel - 1])[0] + if not self._pagesInfoVec[newSelection].GetEnabled(): return self.FireEvent(newSelection) - def OnMouseLeave(self, event): """ Handles the wx.EVT_LEAVE_WINDOW event for L{PageContainer}. """ - self._nLeftButtonStatus = FNB_BTN_NONE self._nXButtonStatus = FNB_BTN_NONE self._nRightButtonStatus = FNB_BTN_NONE self._nTabXButtonStatus = FNB_BTN_NONE self._nArrowDownButtonStatus = FNB_BTN_NONE - style = self.GetParent().GetWindowStyleFlag() render = self._mgr.GetRenderer(style) - dc = wx.ClientDC(self) - render.DrawX(self, dc) render.DrawLeftArrow(self, dc) render.DrawRightArrow(self, dc) - selection = self.GetSelection() - if selection == -1: event.Skip() return - if not self.IsTabVisible(selection): if selection == len(self._pagesInfoVec) - 1: if not self.CanFitToScreen(selection): @@ -4478,151 +3373,96 @@ render.DrawTabX(self, dc, self._pagesInfoVec[selection].GetXRect(), selection, self._nTabXButtonStatus) render.DrawFocusRectangle(dc, self, self._pagesInfoVec[selection]) - event.Skip() - def OnMouseEnterWindow(self, event): """ Handles the wx.EVT_ENTER_WINDOW event for L{PageContainer}. """ - self._nLeftButtonStatus = FNB_BTN_NONE self._nXButtonStatus = FNB_BTN_NONE self._nRightButtonStatus = FNB_BTN_NONE self._nLeftClickZone = FNB_BTN_NONE self._nArrowDownButtonStatus = FNB_BTN_NONE - event.Skip() - def ShowTabTooltip(self, tabIdx): """ Shows a tab tooltip. """ - pWindow = self._pParent.GetPage(tabIdx) - if pWindow: pToolTip = pWindow.GetToolTip() if pToolTip and pToolTip.GetWindow() == pWindow: self.SetToolTipString(pToolTip.GetTip()) - def SetPageImage(self, page, imgindex): """ Sets the image index associated to a page. """ - if page < len(self._pagesInfoVec): - self._pagesInfoVec[page].SetImageIndex(imgindex) self.Refresh() - def GetPageImage(self, page): """ Returns the image index associated to a page. """ - - if page < len(self._pagesInfoVec): - - return self._pagesInfoVec[page].GetImageIndex() - + if page < len(self._pagesInfoVec): return self._pagesInfoVec[page].GetImageIndex() return -1 - def OnDropTarget(self, x, y, nTabPage, wnd_oldContainer): """ Handles the drop action from a DND operation. """ - # Disable drag'n'drop for disabled tab - if not wnd_oldContainer._pagesInfoVec[nTabPage].GetEnabled(): - return wx.DragCancel - + if not wnd_oldContainer._pagesInfoVec[nTabPage].GetEnabled(): return wx.DragCancel self._isdragging = True oldContainer = wnd_oldContainer nIndex = -1 - where, nIndex = self.HitTest(wx.Point(x, y)) - oldNotebook = oldContainer.GetParent() newNotebook = self.GetParent() - if oldNotebook == newNotebook: - if nTabPage >= 0: - - if where == FNB_TAB: - self.MoveTabPage(nTabPage, nIndex) - + if where == FNB_TAB: self.MoveTabPage(nTabPage, nIndex) elif self.GetParent().GetWindowStyleFlag() & FNB_ALLOW_FOREIGN_DND: - if wx.Platform in ["__WXMSW__", "__WXGTK__", "__WXMAC__"]: if nTabPage >= 0: - window = oldNotebook.GetPage(nTabPage) - if window: where, nIndex = newNotebook._pages.HitTest(wx.Point(x, y)) caption = oldContainer.GetPageText(nTabPage) imageindex = oldContainer.GetPageImage(nTabPage) oldNotebook.RemovePage(nTabPage) window.Reparent(newNotebook) - if imageindex >= 0: - bmp = oldNotebook.GetImageList().GetBitmap(imageindex) newImageList = newNotebook.GetImageList() - if not newImageList: xbmp, ybmp = bmp.GetWidth(), bmp.GetHeight() newImageList = wx.ImageList(xbmp, ybmp) imageindex = 0 - else: - imageindex = newImageList.GetImageCount() - + else: imageindex = newImageList.GetImageCount() newImageList.Add(bmp) newNotebook.SetImageList(newImageList) - newNotebook.InsertPage(nIndex, window, caption, True, imageindex) - self._isdragging = False - return wx.DragMove - def MoveTabPage(self, nMove, nMoveTo): """ Moves a tab inside the same L{FlatNotebook}. """ - - if nMove == nMoveTo: - return - - elif nMoveTo < len(self._pParent._windows): - nMoveTo = nMoveTo + 1 - + if nMove == nMoveTo: return + elif nMoveTo < len(self._pParent._windows): nMoveTo = nMoveTo + 1 self._pParent.Freeze() - # Remove the window from the main sizer nCurSel = self._pParent._pages.GetSelection() self._pParent._mainSizer.Detach(self._pParent._windows[nCurSel]) self._pParent._windows[nCurSel].Hide() - pWindow = self._pParent._windows[nMove] self._pParent._windows.pop(nMove) self._pParent._windows.insert(nMoveTo-1, pWindow) - pgInfo = self._pagesInfoVec[nMove] - self._pagesInfoVec.pop(nMove) self._pagesInfoVec.insert(nMoveTo - 1, pgInfo) - # Add the page according to the style pSizer = self._pParent._mainSizer style = self.GetParent().GetWindowStyleFlag() - - if style & FNB_BOTTOM: - - pSizer.Insert(0, pWindow, 1, wx.EXPAND) - + if style & FNB_BOTTOM: pSizer.Insert(0, pWindow, 1, wx.EXPAND) else: - # We leave a space of 1 pixel around the window pSizer.Add(pWindow, 1, wx.EXPAND) - pWindow.Show() - pSizer.Layout() self._iActivePage = nMoveTo - 1 self._iPreviousActivePage = -1 @@ -4630,128 +3470,79 @@ self.Refresh() self._pParent.Thaw() - def CanFitToScreen(self, page): """ Returns wheter a tab can fit in the left space in the screen or not. """ - # Incase the from is greater than page, # we need to reset the self._nFrom, so in order # to force the caller to do so, we return false - if self._nFrom > page: - return False - + if self._nFrom > page: return False style = self.GetParent().GetWindowStyleFlag() render = self._mgr.GetRenderer(style) - vTabInfo = render.NumberTabsCanFit(self) - - if page - self._nFrom >= len(vTabInfo): - return False - + if page - self._nFrom >= len(vTabInfo): return False return True - def GetNumOfVisibleTabs(self): """ Returns the number of visible tabs. """ - count = 0 for ii in xrange(self._nFrom, len(self._pagesInfoVec)): - if self._pagesInfoVec[ii].GetPosition() == wx.Point(-1, -1): - break + if self._pagesInfoVec[ii].GetPosition() == wx.Point(-1, -1): break count = count + 1 - return count - def GetEnabled(self, page): """ Returns whether a tab is enabled or not. """ - - if page >= len(self._pagesInfoVec): - return True # Seems strange, but this is the default - + if page >= len(self._pagesInfoVec): return True # Seems strange, but this is the default return self._pagesInfoVec[page].GetEnabled() - def EnableTab(self, page, enabled=True): """ Enables or disables a tab. """ - - if page >= len(self._pagesInfoVec): - return - + if page >= len(self._pagesInfoVec): return self._pagesInfoVec[page].EnableTab(enabled) - def GetSingleLineBorderColour(self): """ Returns the colour for the single line border. """ - - if self.HasFlag(FNB_FANCY_TABS): - return self._colorFrom - + if self.HasFlag(FNB_FANCY_TABS): return self._colorFrom return wx.WHITE - def HasFlag(self, flag): """ Returns whether a flag is present in the L{FlatNotebook} style. """ - style = self.GetParent().GetWindowStyleFlag() res = (style & flag and [True] or [False])[0] return res - def ClearFlag(self, flag): """ Deletes a flag from the L{FlatNotebook} style. """ - style = self.GetParent().GetWindowStyleFlag() style &= ~flag self.SetWindowStyleFlag(style) - def TabHasImage(self, tabIdx): """ Returns whether a tab has an associated image index or not. """ - if self._ImageList: return self._pagesInfoVec[tabIdx].GetImageIndex() != -1 - return False - def OnLeftDClick(self, event): """ Handles the wx.EVT_LEFT_DCLICK event for L{PageContainer}. """ - where, tabIdx = self.HitTest(event.GetPosition()) - - if where == FNB_RIGHT_ARROW: - self.RotateRight() - - elif where == FNB_LEFT_ARROW: - self.RotateLeft() - + if where == FNB_RIGHT_ARROW: self.RotateRight() + elif where == FNB_LEFT_ARROW: self.RotateLeft() elif self.HasFlag(FNB_DCLICK_CLOSES_TABS): - - if where == FNB_TAB: - self.DeletePage(tabIdx) - - else: - - event.Skip() - + if where == FNB_TAB: self.DeletePage(tabIdx) + else: event.Skip() def OnSetFocus(self, event): """ Handles the wx.EVT_SET_FOCUS event for L{PageContainer}. """ - if self._iActivePage < 0: event.Skip() return - self.SetFocusedPage(self._iActivePage) - def OnKillFocus(self, event): """ Handles the wx.EVT_KILL_FOCUS event for L{PageContainer}. """ - self.SetFocusedPage() - def OnKeyDown(self, event): """ When the PageContainer has the focus tabs can be changed with @@ -4770,125 +3561,92 @@ else: event.Skip() - def SetFocusedPage(self, pageIndex=-1): """ Sets/Unsets the focus on the appropriate page. If pageIndex is defaulted, we have lost focus and no focus indicator is drawn. """ - for indx, page in enumerate(self._pagesInfoVec): if indx == pageIndex: page._hasFocus = True else: page._hasFocus = False - self.Refresh() - def PopupTabsMenu(self): """ Pops up the menu activated with the drop down arrow in the navigation area. """ - popupMenu = wx.Menu() - for i in xrange(len(self._pagesInfoVec)): pi = self._pagesInfoVec[i] item = wx.MenuItem(popupMenu, i+1, pi.GetCaption(), pi.GetCaption(), wx.ITEM_NORMAL) self.Bind(wx.EVT_MENU, self.OnTabMenuSelection, item) - # There is an alignment problem with wx2.6.3 & Menus so only use # images for versions above 2.6.3 if wx.VERSION > (2, 6, 3, 0) and self.TabHasImage(i): item.SetBitmap(self.GetImageList().GetBitmap(pi.GetImageIndex())) - popupMenu.AppendItem(item) item.Enable(pi.GetEnabled()) - self.PopupMenu(popupMenu) - def OnTabMenuSelection(self, event): """ Handles the wx.EVT_MENU event for L{PageContainer}. """ - selection = event.GetId() - 1 self.FireEvent(selection) - def FireEvent(self, selection): """ Fires the wxEVT_FLATNOTEBOOK_PAGE_CHANGING and wxEVT_FLATNOTEBOOK_PAGE_CHANGED events called from other methods (from menu selection or Smart Tabbing). Utility function. """ - if selection == self._iActivePage: # No events for the same selection return - oldSelection = self._iActivePage - event = FlatNotebookEvent(wxEVT_FLATNOTEBOOK_PAGE_CHANGING, self.GetParent().GetId()) event.SetSelection(selection) event.SetOldSelection(oldSelection) event.SetEventObject(self.GetParent()) - if not self.GetParent().GetEventHandler().ProcessEvent(event) or event.IsAllowed(): - self.SetSelection(selection) - # Fire a wxEVT_FLATNOTEBOOK_PAGE_CHANGED event event.SetEventType(wxEVT_FLATNOTEBOOK_PAGE_CHANGED) event.SetOldSelection(oldSelection) self.GetParent().GetEventHandler().ProcessEvent(event) self.SetFocus() - def SetImageList(self, imglist): """ Sets the image list for the page control. """ - self._ImageList = imglist - def AssignImageList(self, imglist): """ Assigns the image list for the page control. """ - self._ImageList = imglist - def GetImageList(self): """ Returns the image list for the page control. """ - return self._ImageList - def GetSelection(self): """ Returns the current selected page. """ return self._iActivePage - def GetPageCount(self): """ Returns the number of tabs in the L{FlatNotebook} control. """ - return len(self._pagesInfoVec) - def GetPageText(self, page): """ Returns the tab caption of the page. """ - return self._pagesInfoVec[page].GetCaption() - def SetPageText(self, page, text): """ Sets the tab caption of the page. """ - self._pagesInfoVec[page].SetCaption(text) return True - def DrawDragHint(self): """ Draws small arrow at the place that the tab will be placed. """ - # get the index of tab that will be replaced with the dragged tab pt = wx.GetMousePosition() client_pt = self.ScreenToClient(pt) diff -r 7b752c9d0c28 -r fdcca00696ea upmana/updatemana.py --- a/upmana/updatemana.py Thu Aug 20 08:41:29 2009 -0500 +++ b/upmana/updatemana.py Fri Aug 21 21:40:22 2009 -0500 @@ -1,13 +1,12 @@ import wx import manifest -from orpg.orpgCore import * -#import tempfile import shutil - +from orpg.orpgCore import component from orpg.dirpath import dir_struct from orpg.tools.orpg_log import logger from orpg.tools.decorators import debugging from upmana.validate import validate +from orpg.dirpath import dir_struct from mercurial import ui, hg, commands, repo, revlog, cmdutil, util @@ -22,7 +21,7 @@ self.c = self.repo.changectx('tip') self.manifest = manifest self.parent = parent - #logger.debug("Enter updaterFrame") #Need to set logging level + logger.debug("Enter updaterFrame") self.SetBackgroundColour(wx.WHITE) self.sizer = wx.GridBagSizer(hgap=1, vgap=1) self.changelog = wx.TextCtrl(self, wx.ID_ANY, size=(325, -1), style=wx.TE_MULTILINE | wx.TE_READONLY) @@ -94,12 +93,13 @@ self.filename = dir_struct["home"] + 'upmana' + os.sep + filename component.get('validate').config_file(filename, "default_ignorelist.txt") self.mana = self.LoadDoc() + temp = dir_struct["home"] + 'upmana' + os.sep + 'tmp' + os.sep for ignore in self.ignorelist: - shutil.copy(ignore, dir_struct["home"] + 'upmana' + os.sep + 'tmp' + os.sep +ignore.split('/')[len(ignore.split('/')) - 1]) + shutil.copy(ignore, temp + ignore.split('/')[len(ignore.split('/')) - 1]) hg.clean(self.repo, self.current) for ignore in self.ignorelist: - shutil.copyfile(dir_struct["home"] + 'upmana' + os.sep + 'tmp' + os.sep + ignore.split('/')[len(ignore.split('/')) - 1], ignore) - os.remove(dir_struct["home"] + 'upmana' + os.sep + 'tmp' + os.sep + ignore.split('/')[len(ignore.split('/')) - 1]) + shutil.copyfile(temp + ignore.split('/')[len(ignore.split('/')) - 1], ignore) + os.remove(temp + ignore.split('/')[len(ignore.split('/')) - 1]) def LoadDoc(self): ignore = open(self.filename) @@ -370,8 +370,8 @@ self.manifestlist.sort() self.SetBackgroundColour(wx.WHITE) self.sizer = wx.GridBagSizer(hgap=1, vgap=1) - self.manifestlog = wx.CheckListBox( self, -1, wx.DefaultPosition, wx.DefaultSize, self.manifestlist, - wx.LC_REPORT|wx.SUNKEN_BORDER|wx.EXPAND|wx.LC_HRULES) + self.manifestlog = wx.CheckListBox( self, -1, wx.DefaultPosition, wx.DefaultSize, + self.manifestlist, wx.LC_REPORT|wx.SUNKEN_BORDER|wx.EXPAND|wx.LC_HRULES) filename = 'ignorelist.txt' self.filename = dir_struct["home"] + 'upmana' + os.sep + filename component.get('validate').config_file(filename, "default_ignorelist.txt") @@ -445,7 +445,8 @@ revlistcp = wx.Panel(self) self.revlistcp = wx.GridBagSizer(hgap=1, vgap=1) - self.revlist1 = wx.ListCtrl(revlistcp, -1, wx.DefaultPosition, size=(290, 240), style=wx.LC_REPORT|wx.SUNKEN_BORDER|wx.LC_HRULES) + self.revlist1 = wx.ListCtrl(revlistcp, -1, wx.DefaultPosition, size=(290, 240), + style=wx.LC_REPORT|wx.SUNKEN_BORDER|wx.LC_HRULES) self.revlist1.InsertColumn(0, 'Revs', 145) self.revlist1.InsertColumn(1, 'Revs', 145) self.revlistcp.Add(self.revlist1, (0,0), span=(1,2), flag=wx.EXPAND) @@ -559,8 +560,8 @@ class updateApp(wx.App): def OnInit(self): self.main = False - #logger.setLogToConsol(False) - #logger. ??? ("Updater Start", ORPG_NOTE) + logger._set_log_to_console(False) + logger.note(Updater Start", ORPG_NOTE) self.manifest = manifest.ManifestChanges() component.add('validate', validate) self.updater = updaterFrame(self, "OpenRPG Update Manager 0.7.2 (open beta)", @@ -589,15 +590,15 @@ filename = 'ignorelist.txt' self.filename = dir_struct["home"] + 'upmana' + os.sep + filename component.get('validate').config_file(filename, "default_ignorelist.txt") - self.mana = self.LoadDoc() + temp = dir_struct["home"] + 'upmana' + os.sep + 'tmp' + os.sep for ignore in self.ignorelist: - shutil.copy(ignore, dir_struct["home"] + 'upmana' + os.sep + 'tmp' + os.sep +ignore.split('/')[len(ignore.split('/')) - 1]) + shutil.copy(ignore, temp + ignore.split('/')[len(ignore.split('/')) - 1]) hg.clean(self.repo, self.current) for ignore in self.ignorelist: print ignore.split('/')[len(ignore.split('/')) - 1] - shutil.copyfile(dir_struct["home"] + 'upmana' + os.sep + 'tmp' + os.sep + ignore.split('/')[len(ignore.split('/')) - 1], ignore) - os.remove(dir_struct["home"] + 'upmana' + os.sep + 'tmp' + os.sep + ignore.split('/')[len(ignore.split('/')) - 1]) + shutil.copyfile(temp + ignore.split('/')[len(ignore.split('/')) - 1], ignore) + os.remove(temp + ignore.split('/')[len(ignore.split('/')) - 1]) else: print 'No default repository set, skipping Auto Update!' #Add better warning! def LoadDoc(self):