This commit was manufactured by cvs2svn to create tag 'WX_2_8_4'.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/tags/WX_2_8_4@46016 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Bryan Petty
2007-05-14 08:18:10 +00:00
parent e86fbab1ba
commit 50c46e10bb
840 changed files with 30344 additions and 96262 deletions

View File

@@ -11,7 +11,7 @@
# Python Code By:
#
# Andrea Gavana, @ 02 Oct 2006
# Latest Revision: 12 Oct 2006, 20.00 GMT
# Latest Revision: 16 Apr 2007, 11.00 GMT
#
#
# For All Kind Of Problems, Requests Of Enhancements And Bug Reports, Please
@@ -37,7 +37,7 @@ Some features:
- The scrolling is done for bulks of tabs (so, the scrolling is faster and better)
- The buttons area is never overdrawn by tabs (unlike many other implementations I saw)
- It is a generic control
- Currently there are 4 differnt styles - VC8, VC 71, Standard and Fancy
- Currently there are 5 differnt styles - VC8, VC 71, Standard, Fancy and Firefox 2;
- Mouse middle click can be used to close tabs
- A function to add right click menu for tabs (simple as SetRightClickMenu)
- All styles has bottom style as well (they can be drawn in the bottom of screen)
@@ -58,7 +58,7 @@ License And Version:
FlatNotebook Is Freeware And Distributed Under The wxPython License.
Latest Revision: Andrea Gavana @ 12 Oct 2006, 20.00 GMT
Latest Revision: Andrea Gavana @ 16 Apr 2007, 11.00 GMT
Version 2.0.
@@ -123,6 +123,10 @@ FNB_NODRAG = 128
FNB_VC8 = 256
"""Use Visual Studio 2005 (VC8) style for tabs"""
# Firefox 2 tabs style
FNB_FF2 = 131072
"""Use Firefox 2 style for tabs"""
# Place 'X' on a tab
FNB_X_ON_TAB = 512
"""Place 'X' close button on the active tab"""
@@ -198,8 +202,8 @@ FNB_DEFAULT_STYLE = FNB_MOUSE_MIDDLE_CLOSES_TABS | FNB_HIDE_ON_SINGLE_TAB
# wxEVT_FLATNOTEBOOK_PAGE_CLOSED: Event Fired When A Page Is Closed.
# wxEVT_FLATNOTEBOOK_PAGE_CONTEXT_MENU: Event Fired When A Menu Pops-up In A Tab.
wxEVT_FLATNOTEBOOK_PAGE_CHANGED = wx.NewEventType()
wxEVT_FLATNOTEBOOK_PAGE_CHANGING = wx.NewEventType()
wxEVT_FLATNOTEBOOK_PAGE_CHANGED = wx.wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED
wxEVT_FLATNOTEBOOK_PAGE_CHANGING = wx.wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING
wxEVT_FLATNOTEBOOK_PAGE_CLOSING = wx.NewEventType()
wxEVT_FLATNOTEBOOK_PAGE_CLOSED = wx.NewEventType()
wxEVT_FLATNOTEBOOK_PAGE_CONTEXT_MENU = wx.NewEventType()
@@ -208,10 +212,10 @@ wxEVT_FLATNOTEBOOK_PAGE_CONTEXT_MENU = wx.NewEventType()
# FlatNotebookEvent
#-----------------------------------#
EVT_FLATNOTEBOOK_PAGE_CHANGED = wx.PyEventBinder(wxEVT_FLATNOTEBOOK_PAGE_CHANGED, 1)
EVT_FLATNOTEBOOK_PAGE_CHANGED = wx.EVT_NOTEBOOK_PAGE_CHANGED
"""Notify client objects when the active page in L{FlatNotebook}
has changed."""
EVT_FLATNOTEBOOK_PAGE_CHANGING = wx.PyEventBinder(wxEVT_FLATNOTEBOOK_PAGE_CHANGING, 1)
EVT_FLATNOTEBOOK_PAGE_CHANGING = wx.EVT_NOTEBOOK_PAGE_CHANGING
"""Notify client objects when the active page in L{FlatNotebook}
is about to change."""
EVT_FLATNOTEBOOK_PAGE_CLOSING = wx.PyEventBinder(wxEVT_FLATNOTEBOOK_PAGE_CLOSING, 1)
@@ -716,6 +720,61 @@ def PaintStraightGradientBox(dc, rect, startColor, endColor, vertical=True):
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)
rightPt = wx.Point(rect.x + rect.width - 2, rect.y + (rect.height / 10)*8)
else:
leftPt = wx.Point(rect.x, rect.y + (rect.height / 10)*5)
rightPt = wx.Point(rect.x + rect.width - 2, rect.y + (rect.height / 10)*5)
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)
topEndColor = wx.SystemSettings_GetColour(wx.SYS_COLOUR_3DFACE)
bottomStartColor = topEndColor
bottomEndColor = topEndColor
# Incase we use bottom tabs, switch the colors
if upperTabs:
if focus:
PaintStraightGradientBox(dc, top, topStartColor, topEndColor)
PaintStraightGradientBox(dc, bottom, bottomStartColor, bottomEndColor)
else:
PaintStraightGradientBox(dc, top, topEndColor , topStartColor)
PaintStraightGradientBox(dc, bottom, bottomStartColor, bottomEndColor)
else:
if focus:
PaintStraightGradientBox(dc, bottom, topEndColor, bottomEndColor)
PaintStraightGradientBox(dc, top,topStartColor, topStartColor)
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
@@ -1148,7 +1207,7 @@ class TabNavigatorWindow(wx.Dialog):
def OnItemSelected(self, event):
"""Handles the wx.EVT_LISTBOX_DCLICK event for the wx.ListBox inside L{TabNavigatorWindow}. """
self.CloseDialog()
self.CloseDialog()
def CloseDialog(self):
@@ -1481,7 +1540,7 @@ class FNBRenderer:
return bmp
def DrawTabsLine(self, pageContainer, dc):
def DrawTabsLine(self, pageContainer, dc, selTabX1=-1, selTabX2=-1):
""" Draws a line over the tabs. """
pc = pageContainer
@@ -1489,38 +1548,70 @@ class FNBRenderer:
clntRect = pc.GetClientRect()
clientRect3 = wx.Rect(0, 0, clntRect.width, clntRect.height)
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)
if pc.HasFlag(FNB_FF2):
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:
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)
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)
dc.DrawLine(0, 0, clientRect.width, 0)
if pc.HasFlag(FNB_BOTTOM):
dc.DrawLine(clientRect.width - 1, 0, clientRect.width - 1, clientRect.height+1)
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):
@@ -1650,7 +1741,12 @@ class FNBRenderer:
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)
# Take 3 bitmaps for the background for the buttons
@@ -1683,7 +1779,9 @@ class FNBRenderer:
# We always draw the bottom/upper line of the tabs
# regradless the style
dc.SetPen(borderPen)
self.DrawTabsLine(pc, dc)
if not pc.HasFlag(FNB_FF2):
self.DrawTabsLine(pc, dc)
# Restore the pen
dc.SetPen(borderPen)
@@ -1727,10 +1825,13 @@ class FNBRenderer:
#----------------------------------------------------------
# Go over and draw the visible tabs
#----------------------------------------------------------
x1 = x2 = -1
for i in xrange(pc._nFrom, len(pc._pagesInfoVec)):
dc.SetPen(borderPen)
dc.SetBrush((i==pc.GetSelection() and [selBrush] or [noselBrush])[0])
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])
@@ -1759,6 +1860,10 @@ class FNBRenderer:
# 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)
@@ -1781,6 +1886,9 @@ class FNBRenderer:
self.DrawX(pc, dc)
self.DrawDropDownArrow(pc, dc)
if pc.HasFlag(FNB_FF2):
self.DrawTabsLine(pc, dc, x1, x2)
def DrawDragHint(self, pc, tabIdx):
"""
@@ -1846,16 +1954,12 @@ class FNBRendererMgr:
self._renderers.update({FNB_VC71: FNBRendererVC71()})
self._renderers.update({FNB_FANCY_TABS: FNBRendererFancy()})
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. """
# since we dont have a style for default tabs, we
# test for all others - FIXME: add style for default tabs
if not style & FNB_VC71 and not style & FNB_VC8 and not style & FNB_FANCY_TABS:
return self._renderers[-1]
if style & FNB_VC71:
return self._renderers[FNB_VC71]
@@ -1865,6 +1969,9 @@ class FNBRendererMgr:
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]
@@ -1992,6 +2099,106 @@ class FNBRendererDefault(FNBRenderer):
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
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)
self._tabXBgBmp = self._GetBitmap(dc, x_rect, self._tabXBgBmp)
# Draw the tab
self.DrawTabX(pc, dc, x_rect, tabIdx, btnStatus)
#------------------------------------------------------------------
# Visual studio 7.1
#------------------------------------------------------------------
@@ -2955,14 +3162,17 @@ class FlatNotebook(wx.Panel):
def SetImageList(self, imageList):
"""
Sets the image list for the page control. It does not take ownership
of the image list, you must delete it yourself.
"""
""" 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. """
@@ -3542,7 +3752,7 @@ class PageContainer(wx.Panel):
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_BTNSHADOW)
self._nonActiveTextColor = wx.SystemSettings_GetColour(wx.SYS_COLOUR_BTNTEXT)
self._tabAreaColor = wx.SystemSettings_GetColour(wx.SYS_COLOUR_BTNFACE)
self._nFrom = 0
@@ -3755,6 +3965,47 @@ class PageContainer(wx.Panel):
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
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
self.Refresh()
def RotateRight(self):
if self._nFrom >= len(self._pagesInfoVec) - 1:
return
# Make sure that the button was pressed before
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
self._nFrom += 1
self.Refresh()
def OnLeftUp(self, event):
""" Handles the wx.EVT_LEFT_UP events for L{PageContainer}. """
@@ -3764,49 +4015,10 @@ class PageContainer(wx.Panel):
where, tabIdx = self.HitTest(event.GetPosition())
if where == FNB_LEFT_ARROW:
if self._nFrom == 0:
return
# Make sure that the button was pressed before
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
self.Refresh()
self.RotateLeft()
elif where == FNB_RIGHT_ARROW:
if self._nFrom >= len(self._pagesInfoVec) - 1:
return
# Make sure that the button was pressed before
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[-1].GetPosition() != wx.Point(-1, -1):
return
lastVisibleTab = self.GetLastVisibleTab()
if lastVisibleTab < 0:
# Probably the screen is too small for displaying even a single
# tab, in this case we do nothing
return
self._nFrom += self.GetNumOfVisibleTabs()
self.Refresh()
self.RotateRight()
elif where == FNB_X:
@@ -3843,6 +4055,8 @@ class PageContainer(wx.Panel):
self.PopupTabsMenu()
event.Skip()
def HitTest(self, pt):
"""
@@ -4182,66 +4396,10 @@ class PageContainer(wx.Panel):
def GetNumTabsCanScrollLeft(self):
""" Returns the number of tabs than can be scrolled left. """
# Reserved area for the buttons (<>x)
rect = self.GetClientRect()
clientWidth = rect.width
posx = self._pParent._nPadding
numTabs = 0
pom = 0
# In case we have error prevent crash
if self._nFrom < 0:
return 0
if self._nFrom - 1 >= 0:
return 1
dc = wx.ClientDC(self)
style = self.GetParent().GetWindowStyleFlag()
render = self._mgr.GetRenderer(style)
for ii in xrange(self._nFrom, -1, -1):
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 6 pixels as padding
if style & FNB_VC71:
tabHeight = (style & FNB_BOTTOM and [tabHeight - 4] or [tabHeight])[0]
elif style & FNB_FANCY_TABS:
tabHeight = (style & FNB_BOTTOM and [tabHeight - 3] or [tabHeight])[0]
width, pom = dc.GetTextExtent(self.GetPageText(ii))
if style != FNB_VC71:
shapePoints = int(tabHeight*math.tan(float(self._pagesInfoVec[ii].GetTabAngle())/180.0*math.pi))
else:
shapePoints = 0
tabWidth = 2*self._pParent._nPadding + width
if not (style & FNB_VC71):
# Default style
tabWidth += 2*shapePoints
hasImage = self._ImageList != None and self._pagesInfoVec[ii].GetImageIndex() != -1
# For VC71 style, we only add the icon size (16 pixels)
if hasImage:
if not self.IsDefaultTabs():
tabWidth += 16 + self._pParent._nPadding
else:
# Default style
tabWidth += 16 + self._pParent._nPadding + shapePoints/2
if posx + tabWidth + render.GetButtonsAreaLength(self) >= clientWidth:
break
numTabs = numTabs + 1
posx += tabWidth
return numTabs
return 0
def IsDefaultTabs(self):
@@ -4381,7 +4539,7 @@ class PageContainer(wx.Panel):
elif self.GetParent().GetWindowStyleFlag() & FNB_ALLOW_FOREIGN_DND:
if wx.Platform in ["__WXMSW__", "__WXGTK__"]:
if wx.Platform in ["__WXMSW__", "__WXGTK__", "__WXMAC__"]:
if nTabPage >= 0:
window = oldNotebook.GetPage(nTabPage)
@@ -4550,10 +4708,16 @@ class PageContainer(wx.Panel):
def OnLeftDClick(self, event):
""" Handles the wx.EVT_LEFT_DCLICK event for L{PageContainer}. """
if self.HasFlag(FNB_DCLICK_CLOSES_TABS):
where, tabIdx = self.HitTest(event.GetPosition())
if where == FNB_RIGHT_ARROW:
self.RotateRight()
elif where == FNB_LEFT_ARROW:
self.RotateLeft()
elif self.HasFlag(FNB_DCLICK_CLOSES_TABS):
where, tabIdx = self.HitTest(event.GetPosition())
if where == FNB_TAB:
self.DeletePage(tabIdx)
@@ -4623,6 +4787,12 @@ class PageContainer(wx.Panel):
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. """
@@ -4663,3 +4833,4 @@ class PageContainer(wx.Panel):
where, tabIdx = self.HitTest(client_pt)
self._mgr.GetRenderer(self.GetParent().GetWindowStyleFlag()).DrawDragHint(self, tabIdx)