11from Foundation import NSObject
2- from AppKit import NSTabView , NSTabViewItem , NSNoTabsNoBorder , NSFont
2+ from AppKit import NSViewController ,\
3+ NSTabViewController , NSTabView , NSTabViewItem ,\
4+ NSTabPositionTop ,\
5+ NSTabPositionNone ,\
6+ NSNoTabsNoBorder ,\
7+ NSViewControllerTransitionNone ,\
8+ NSViewControllerTransitionCrossfade ,\
9+ NSViewControllerTransitionSlideUp ,\
10+ NSViewControllerTransitionSlideDown ,\
11+ NSViewControllerTransitionSlideLeft ,\
12+ NSViewControllerTransitionSlideRight ,\
13+ NSViewControllerTransitionSlideForward ,\
14+ NSViewControllerTransitionSlideBackward ,\
15+ NSFont
316from vanilla .vanillaBase import VanillaBaseObject , _breakCycles , _sizeStyleMap , VanillaCallbackWrapper , \
4- _reverseSizeStyleMap
17+ _reverseSizeStyleMap
18+ from vanilla .nsSubclasses import getNSSubclass
19+
20+
21+ class VanillaTabView (NSTabView ):
22+
23+ def viewDidMoveToWindow (self ):
24+ if self .window () is not None :
25+ wrapper = self .vanillaWrapper ()
26+ wrapper ._positionViews ()
27+ super ().viewDidMoveToWindow ()
28+
29+
30+ class VanillaTabViewController (NSTabViewController ):
31+
32+ def tabView_didSelectTabViewItem_ (self , tabView , tabViewItem ):
33+ if hasattr (self , "_target" ):
34+ self ._target .action_ (tabView .vanillaWrapper ())
35+ super ().tabView_didSelectTabViewItem_ (tabView , tabViewItem )
536
637
738class VanillaTabItem (VanillaBaseObject ):
839
940 nsTabViewItemClass = NSTabViewItem
41+ nsViewControllerClass = NSViewController
1042
1143 def __init__ (self , title ):
1244 self ._autoLayoutViews = {}
13- self ._tabItem = self .nsTabViewItemClass .alloc ().initWithIdentifier_ (title )
45+ self ._tabItem = getNSSubclass (self .nsTabViewItemClass ).alloc ().initWithIdentifier_ (title )
46+ self ._tabItem .setVanillaWrapper_ (self )
1447 self ._tabItem .setLabel_ (title )
48+ viewController = getNSSubclass (self .nsViewControllerClass ).alloc ().init ()
49+ viewController .setView_ (self ._tabItem .view ())
50+ self ._tabItem .setViewController_ (viewController )
51+ self ._posSize = (0 , 0 , 0 , 0 )
52+ self ._nsObject = self ._tabItem .view ()
53+
54+ def getNSTabViewItem (self ):
55+ return self ._tabItem
1556
1657 def _getContentView (self ):
1758 return self ._tabItem .view ()
1859
1960 def _breakCycles (self ):
61+ self ._nsObject = None
2062 _breakCycles (self ._tabItem .view ())
2163 self ._autoLayoutViews .clear ()
2264
2365
24- class VanillaTabsDelegate (NSObject ):
25-
26- def tabView_didSelectTabViewItem_ (self , tabView , tabViewItem ):
27- if hasattr (self , "_target" ):
28- self ._target .action_ (tabView .vanillaWrapper ())
66+ _tabTransitionMap = {
67+ None : NSViewControllerTransitionNone ,
68+ "crossfade" : NSViewControllerTransitionCrossfade ,
69+ "slideUp" : NSViewControllerTransitionSlideUp ,
70+ "slideDown" : NSViewControllerTransitionSlideDown ,
71+ "slideLeft" : NSViewControllerTransitionSlideLeft ,
72+ "slideRight" : NSViewControllerTransitionSlideRight ,
73+ "slideForward" : NSViewControllerTransitionSlideForward ,
74+ "slideBackward" : NSViewControllerTransitionSlideBackward
75+ }
2976
3077
3178class Tabs (VanillaBaseObject ):
@@ -78,10 +125,35 @@ def __init__(self):
78125 +-----------+
79126 | "mini" |
80127 +-----------+
128+
129+ **showTabs** Boolean representing if the tabview should display tabs.
130+
131+ **transitionStyle** A string rerpresenting a transition style between tabs.
132+ The options are:
133+
134+ +-----------------+
135+ | None |
136+ +-----------------+
137+ | "crossfade" |
138+ +-----------------+
139+ | "slideUp" |
140+ +-----------------+
141+ | "slideDown" |
142+ +-----------------+
143+ | "slideLeft" |
144+ +-----------------+
145+ | "slideRight" |
146+ +-----------------+
147+ | "slideForward" |
148+ +-----------------+
149+ | "slideBackward" |
150+ +-----------------+
151+
81152 """
82153
83- nsTabViewClass = NSTabView
84- vanillaTabViewItemClass = VanillaTabItem
154+ nsTabViewClass = VanillaTabView
155+ nsTabViewControllerClass = VanillaTabViewController
156+ vanillaTabItemClass = VanillaTabItem
85157
86158 allFrameAdjustments = {
87159 # The sizeStyle will be part of the
@@ -91,17 +163,24 @@ def __init__(self):
91163 "Tabs-regular" : (- 7 , - 10 , 14 , 16 ),
92164 }
93165
94- def __init__ (self , posSize , titles = ["Tab" ], callback = None , sizeStyle = "regular" , showTabs = True ):
95- self ._setupView (self .nsTabViewClass , posSize ) # hold off on setting callback
166+ def __init__ (self , posSize , titles = ["Tab" ], callback = None , sizeStyle = "regular" ,
167+ showTabs = True , transitionStyle = None ,
168+ ):
169+ self ._setupView (self .nsTabViewClass , posSize , callback = None )
170+ self ._nsObject .setVanillaWrapper_ (self )
171+ self ._tabViewController = getNSSubclass (self .nsTabViewControllerClass ).alloc ().init ()
172+ self ._tabViewController .setTabView_ (self ._nsObject )
173+ self ._tabViewController .loadView ()
174+ if not showTabs :
175+ self ._nsObject .setTabPosition_ (NSTabPositionNone )
176+ self ._nsObject .setTabViewType_ (NSNoTabsNoBorder )
96177 self ._setSizeStyle (sizeStyle )
178+ self ._tabViewController .setTransitionOptions_ (_tabTransitionMap [transitionStyle ])
97179 self ._tabItems = []
98180 for title in titles :
99- tab = self .vanillaTabViewItemClass (title )
181+ tab = self .vanillaTabItemClass (title )
100182 self ._tabItems .append (tab )
101- self ._nsObject .addTabViewItem_ (tab ._tabItem )
102- if not showTabs :
103- self ._nsObject .setTabViewType_ (NSNoTabsNoBorder )
104- self ._nsObject .setDrawsBackground_ (False )
183+ self ._tabViewController .addTabViewItem_ (tab ._tabItem )
105184 # now that the tabs are all set, set the callback.
106185 # this is done because the callback will be called
107186 # while the tabs are being added.
@@ -116,6 +195,14 @@ def getNSTabView(self):
116195 """
117196 return self ._nsObject
118197
198+ def _positionViews (self ):
199+ contentRect = self .getNSTabView ().contentRect ()
200+ # only do after the first because
201+ # adjusting the first gives it
202+ # incorrect positioning
203+ for item in self ._tabItems [1 :]:
204+ item ._setFrame (contentRect )
205+
119206 def _adjustPosSize (self , frame ):
120207 if self ._nsObject .tabViewType () == NSNoTabsNoBorder :
121208 return frame
@@ -128,9 +215,6 @@ def _setCallback(self, callback):
128215 if callback is not None :
129216 self ._target = VanillaCallbackWrapper (callback )
130217 delegate = self ._nsObject .delegate ()
131- if delegate is None :
132- self ._delegate = delegate = VanillaTabsDelegate .alloc ().init ()
133- self ._nsObject .setDelegate_ (delegate )
134218 delegate ._target = self ._target
135219
136220 def _setSizeStyle (self , value ):
@@ -151,8 +235,7 @@ def get(self):
151235 """
152236 Get the index of the selected tab.
153237 """
154- item = self ._nsObject .selectedTabViewItem ()
155- index = self ._nsObject .indexOfTabViewItem_ (item )
238+ index = self ._tabViewController .selectedTabViewItemIndex ()
156239 return index
157240
158241 def set (self , value ):
@@ -161,4 +244,4 @@ def set(self, value):
161244
162245 **value** The index of the tab to be selected.
163246 """
164- self ._nsObject . selectTabViewItemAtIndex_ (value )
247+ self ._tabViewController . setSelectedTabViewItemIndex_ (value )
0 commit comments