From 6231770f8935b3a2c5e27a32b9103287076d9191 Mon Sep 17 00:00:00 2001 From: Robin Dunn Date: Wed, 18 Oct 2006 22:09:18 +0000 Subject: [PATCH] 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 --- wxPython/wx/lib/flatnotebook.py | 150 ++++++++++++++++++-------------- 1 file changed, 83 insertions(+), 67 deletions(-) diff --git a/wxPython/wx/lib/flatnotebook.py b/wxPython/wx/lib/flatnotebook.py index aafa45172b..8d23496088 100644 --- a/wxPython/wx/lib/flatnotebook.py +++ b/wxPython/wx/lib/flatnotebook.py @@ -1788,6 +1788,39 @@ class FNBRenderer: 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 # A manager that handles all the renderers defined below and calls the @@ -3606,6 +3639,21 @@ class PageContainer(wx.Panel): 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 + break + + self._nFrom = fr + self.Refresh() # Call on paint event.Skip() @@ -3629,30 +3677,26 @@ class PageContainer(wx.Panel): def OnRightDown(self, event): """ 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(): - # Set the current tab to be active - self.SetSelection(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 - 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) - - event.Skip() + 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) + + event.Skip() def OnLeftDown(self, event): @@ -3892,22 +3936,18 @@ class PageContainer(wx.Panel): da_page.SetFocus() if not self.IsTabVisible(page): - - 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): - self._nFrom = page - - else: + # Try to remove one tab from start and try again + + if not self.CanFitToScreen(page): - if not self.CanFitToScreen(page): - # Redraw the tabs starting from page + if self._nFrom > page: self._nFrom = page - + else: + while self._nFrom < page: + self._nFrom += 1 + if self.CanFitToScreen(page): + break + self.Refresh() @@ -4107,6 +4147,9 @@ class PageContainer(wx.Panel): def GetLastVisibleTab(self): """ Returns the last visible tab. """ + if self._nFrom < 0: + return -1 + ii = 0 for ii in xrange(self._nFrom, len(self._pagesInfoVec)): @@ -4413,39 +4456,12 @@ class PageContainer(wx.Panel): style = self.GetParent().GetWindowStyleFlag() render = self._mgr.GetRenderer(style) - if not self.HasFlag(FNB_VC8): - rect = self.GetClientRect(); - clientWidth = rect.width; - tabHeight = render.CalcTabHeight(self) - tabWidth = render.CalcTabWidth(self, page, tabHeight) + vTabInfo = render.NumberTabsCanFit(self) - 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): - return False - - return True + if page - self._nFrom >= len(vTabInfo): + return False + + return True def GetNumOfVisibleTabs(self): -- 2.45.2