Skip to content

Commit 049493e

Browse files
authored
Merge pull request #177 from robotools/tabs
Fix Tabs for Ventura.
2 parents 3f2f311 + a9a5c76 commit 049493e

File tree

2 files changed

+114
-27
lines changed

2 files changed

+114
-27
lines changed

Lib/vanilla/vanillaBase.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ class VanillaWarning(Warning): pass
3737
if platform.system() != "Darwin":
3838
macVersion = "0.0"
3939
osVersionCurrent = version(macVersion)
40-
osVersion12_0 = version("12.0")
40+
osVersion12_0 = version("12.0")
4141
osVersion10_16 = version("10.16") # macOS11 Big Sur seems to be 10.16
4242
osVersion10_15 = version("10.15")
4343
osVersion10_14 = version("10.14")
@@ -66,10 +66,14 @@ def __delattr__(self, attr):
6666
_delAttr(VanillaBaseObject, self, attr)
6767

6868
def _setupView(self, classOrName, posSize, callback=None):
69-
self._autoLayoutViews = {}
70-
self._testForDeprecatedAttributes()
7169
cls = getNSSubclass(classOrName)
72-
self._nsObject = cls(self)
70+
view = cls(self)
71+
self._setupInstantiatedView(view, posSize, callback=callback)
72+
73+
def _setupInstantiatedView(self, view, posSize, callback=None):
74+
self._testForDeprecatedAttributes()
75+
self._autoLayoutViews = {}
76+
self._nsObject = view
7377
self._posSize = posSize
7478
self._setCallback(callback)
7579
self._setAutosizingFromPosSize(posSize)

Lib/vanilla/vanillaTabs.py

Lines changed: 106 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,78 @@
11
from 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
316
from 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

738
class 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

3178
class 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

Comments
 (0)