Patch from Andrea: fixes no page chang* events with mouse right click,
plus a couple of other minor issues git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@42099 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -1788,6 +1788,39 @@ class FNBRenderer:
|
|||||||
pass
|
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
|
||||||
|
|
||||||
|
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
|
# Class FNBRendererMgr
|
||||||
# A manager that handles all the renderers defined below and calls the
|
# A manager that handles all the renderers defined below and calls the
|
||||||
@@ -3606,6 +3639,21 @@ class PageContainer(wx.Panel):
|
|||||||
def OnSize(self, event):
|
def OnSize(self, event):
|
||||||
""" Handles the wx.EVT_SIZE events for L{PageContainer}. """
|
""" 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
|
||||||
|
break
|
||||||
|
|
||||||
|
self._nFrom = fr
|
||||||
|
|
||||||
self.Refresh() # Call on paint
|
self.Refresh() # Call on paint
|
||||||
event.Skip()
|
event.Skip()
|
||||||
|
|
||||||
@@ -3630,21 +3678,14 @@ class PageContainer(wx.Panel):
|
|||||||
def OnRightDown(self, event):
|
def OnRightDown(self, event):
|
||||||
""" Handles the wx.EVT_RIGHT_DOWN events for L{PageContainer}. """
|
""" Handles the wx.EVT_RIGHT_DOWN events for L{PageContainer}. """
|
||||||
|
|
||||||
if self._pRightClickMenu:
|
|
||||||
|
|
||||||
where, tabIdx = self.HitTest(event.GetPosition())
|
where, tabIdx = self.HitTest(event.GetPosition())
|
||||||
|
|
||||||
if where in [FNB_TAB, FNB_TAB_X]:
|
if where in [FNB_TAB, FNB_TAB_X]:
|
||||||
|
|
||||||
if self._pagesInfoVec[tabIdx].GetEnabled():
|
if self._pagesInfoVec[tabIdx].GetEnabled():
|
||||||
# Set the current tab to be active
|
# Fire events and eventually (if allowed) change selection
|
||||||
self.SetSelection(tabIdx)
|
self.FireEvent(tabIdx)
|
||||||
|
|
||||||
# If the owner has defined a context menu for the tabs,
|
|
||||||
# popup the right click menu
|
|
||||||
if self._pRightClickMenu:
|
|
||||||
self.PopupMenu(self._pRightClickMenu)
|
|
||||||
else:
|
|
||||||
# send a message to popup a custom menu
|
# send a message to popup a custom menu
|
||||||
event = FlatNotebookEvent(wxEVT_FLATNOTEBOOK_PAGE_CONTEXT_MENU, self.GetParent().GetId())
|
event = FlatNotebookEvent(wxEVT_FLATNOTEBOOK_PAGE_CONTEXT_MENU, self.GetParent().GetId())
|
||||||
event.SetSelection(tabIdx)
|
event.SetSelection(tabIdx)
|
||||||
@@ -3652,6 +3693,9 @@ class PageContainer(wx.Panel):
|
|||||||
event.SetEventObject(self.GetParent())
|
event.SetEventObject(self.GetParent())
|
||||||
self.GetParent().GetEventHandler().ProcessEvent(event)
|
self.GetParent().GetEventHandler().ProcessEvent(event)
|
||||||
|
|
||||||
|
if self._pRightClickMenu:
|
||||||
|
self.PopupMenu(self._pRightClickMenu)
|
||||||
|
|
||||||
event.Skip()
|
event.Skip()
|
||||||
|
|
||||||
|
|
||||||
@@ -3892,21 +3936,17 @@ class PageContainer(wx.Panel):
|
|||||||
da_page.SetFocus()
|
da_page.SetFocus()
|
||||||
|
|
||||||
if not self.IsTabVisible(page):
|
if not self.IsTabVisible(page):
|
||||||
|
# Try to remove one tab from start and try again
|
||||||
|
|
||||||
if page == len(self._pagesInfoVec) - 1:
|
|
||||||
# Incase the added tab is last,
|
|
||||||
# the function IsTabVisible() will always return False
|
|
||||||
# and thus will cause an evil behaviour that the new
|
|
||||||
# tab will hide all other tabs, we need to check if the
|
|
||||||
# new selected tab can fit to the current screen
|
|
||||||
if not self.CanFitToScreen(page):
|
if not self.CanFitToScreen(page):
|
||||||
self._nFrom = page
|
|
||||||
|
|
||||||
|
if self._nFrom > page:
|
||||||
|
self._nFrom = page
|
||||||
else:
|
else:
|
||||||
|
while self._nFrom < page:
|
||||||
if not self.CanFitToScreen(page):
|
self._nFrom += 1
|
||||||
# Redraw the tabs starting from page
|
if self.CanFitToScreen(page):
|
||||||
self._nFrom = page
|
break
|
||||||
|
|
||||||
self.Refresh()
|
self.Refresh()
|
||||||
|
|
||||||
@@ -4107,6 +4147,9 @@ class PageContainer(wx.Panel):
|
|||||||
def GetLastVisibleTab(self):
|
def GetLastVisibleTab(self):
|
||||||
""" Returns the last visible tab. """
|
""" Returns the last visible tab. """
|
||||||
|
|
||||||
|
if self._nFrom < 0:
|
||||||
|
return -1
|
||||||
|
|
||||||
ii = 0
|
ii = 0
|
||||||
|
|
||||||
for ii in xrange(self._nFrom, len(self._pagesInfoVec)):
|
for ii in xrange(self._nFrom, len(self._pagesInfoVec)):
|
||||||
@@ -4413,34 +4456,7 @@ class PageContainer(wx.Panel):
|
|||||||
style = self.GetParent().GetWindowStyleFlag()
|
style = self.GetParent().GetWindowStyleFlag()
|
||||||
render = self._mgr.GetRenderer(style)
|
render = self._mgr.GetRenderer(style)
|
||||||
|
|
||||||
if not self.HasFlag(FNB_VC8):
|
vTabInfo = render.NumberTabsCanFit(self)
|
||||||
rect = self.GetClientRect();
|
|
||||||
clientWidth = rect.width;
|
|
||||||
tabHeight = render.CalcTabHeight(self)
|
|
||||||
tabWidth = render.CalcTabWidth(self, page, tabHeight)
|
|
||||||
|
|
||||||
posx = self._pParent._nPadding
|
|
||||||
|
|
||||||
if self._nFrom >= 0:
|
|
||||||
|
|
||||||
for i in xrange(self._nFrom, len(self._pagesInfoVec)):
|
|
||||||
|
|
||||||
if self._pagesInfoVec[i].GetPosition() == wx.Point(-1, -1):
|
|
||||||
break
|
|
||||||
|
|
||||||
posx += self._pagesInfoVec[i].GetSize().x
|
|
||||||
|
|
||||||
if posx + tabWidth + render.GetButtonsAreaLength(self) >= clientWidth:
|
|
||||||
return False
|
|
||||||
|
|
||||||
return True
|
|
||||||
|
|
||||||
else:
|
|
||||||
|
|
||||||
# TODO:: this is ugly and should be improved, we should *never* access the
|
|
||||||
# raw pointer directly like we do here (render.Get())
|
|
||||||
vc8_render = render
|
|
||||||
vTabInfo = vc8_render.NumberTabsCanFit(self)
|
|
||||||
|
|
||||||
if page - self._nFrom >= len(vTabInfo):
|
if page - self._nFrom >= len(vTabInfo):
|
||||||
return False
|
return False
|
||||||
|
Reference in New Issue
Block a user