motion-kit 0.12.0 → 0.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +28 -8
- data/lib/{motion-kit → motion-kit-cocoa}/calculator/view_calculator.rb +0 -0
- data/lib/motion-kit-cocoa/constraints/constraint.rb +3 -1
- data/lib/motion-kit-cocoa/{layouts → helpers}/accessibility_compat.rb +0 -0
- data/lib/motion-kit-cocoa/{layouts → helpers}/cagradientlayer_helpers.rb +0 -0
- data/lib/motion-kit-cocoa/{layouts → helpers}/calayer_helpers.rb +0 -0
- data/lib/motion-kit-cocoa/{layouts → helpers}/sugarcube_compat.rb +0 -0
- data/lib/motion-kit-ios/{layouts → helpers}/constraints_helpers.rb +0 -0
- data/lib/motion-kit-ios/{layouts → helpers}/layout_device.rb +0 -0
- data/lib/motion-kit-ios/{layouts → helpers}/layout_orientation.rb +0 -0
- data/lib/motion-kit-ios/{layouts → helpers}/uibutton_helpers.rb +0 -0
- data/lib/motion-kit-ios/{layouts/uiview_layout_autoresizing.rb → helpers/uiview_autoresizing_helpers.rb} +0 -0
- data/lib/motion-kit-ios/{layouts/uiview_layout_constraints.rb → helpers/uiview_constraints_helpers.rb} +0 -0
- data/lib/motion-kit-ios/{layouts/uiview_layout_frame.rb → helpers/uiview_frame_helpers.rb} +0 -0
- data/lib/motion-kit-ios/{layouts/uiview_layout_gradient.rb → helpers/uiview_gradient_helpers.rb} +0 -0
- data/lib/motion-kit-ios/{layouts → helpers}/uiview_helpers.rb +0 -0
- data/lib/motion-kit-osx/{layouts → helpers}/constraints_helpers.rb +0 -0
- data/lib/motion-kit-osx/{layouts → helpers}/nsmenu_extensions.rb +0 -0
- data/lib/motion-kit-osx/{layouts → helpers}/nsmenu_helpers.rb +0 -0
- data/lib/motion-kit-osx/{layouts → helpers}/nsmenuitem_extensions.rb +0 -0
- data/lib/motion-kit-osx/{layouts → helpers}/nstablecolumn_helpers.rb +0 -0
- data/lib/motion-kit-osx/{layouts → helpers}/nstableview_helpers.rb +0 -0
- data/lib/motion-kit-osx/{layouts/nsview_layout_autoresizing.rb → helpers/nsview_autoresizing_helpers.rb} +0 -0
- data/lib/motion-kit-osx/{layouts/nsview_layout_constraints.rb → helpers/nsview_constraints_helpers.rb} +0 -0
- data/lib/motion-kit-osx/{layouts/nsview_layout_frame.rb → helpers/nsview_frame_helpers.rb} +0 -0
- data/lib/motion-kit-osx/{layouts → helpers}/nsview_helpers.rb +0 -0
- data/lib/motion-kit-osx/helpers/nswindow_frame_helpers.rb +361 -0
- data/lib/motion-kit-osx/{layouts → helpers}/nswindow_helpers.rb +0 -0
- data/lib/motion-kit/{layouts → helpers}/base_layout.rb +0 -0
- data/lib/motion-kit/{layouts → helpers}/base_layout_class_methods.rb +0 -0
- data/lib/motion-kit/{layouts → helpers}/parent.rb +0 -0
- data/lib/motion-kit/{layouts → helpers}/tree_layout.rb +21 -4
- data/lib/motion-kit/object.rb +11 -0
- data/lib/motion-kit/version.rb +1 -1
- data/spec/ios/layout_spec.rb +6 -6
- data/spec/ios/motion_kit_id_spec.rb +15 -0
- data/spec/ios/remove_layout_spec.rb +9 -5
- data/spec/osx/{frame_helper_spec.rb → nsview_frame_helper_spec.rb} +69 -69
- data/spec/osx/nswindow_frame_helper_spec.rb +1288 -0
- metadata +38 -34
- data/lib/motion-kit-osx/layouts/nswindow_frame.rb +0 -14
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2b2b7891f4a764ec64a5a015e75cb609f161d744
|
4
|
+
data.tar.gz: ca6b9958b22c9dbc6d78efe6eaf9281878e1db98
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 904f76837a3321502bccc36587931301d48d500ab597482df30d5541b218cb4de7cd7d21df78b3e4fa7d7e98b6d7e876e2926439ca4e761fa2345db9c258f419
|
7
|
+
data.tar.gz: c905dcff79b15598662c7cd2055ae8121cb763db31df07bca51d32002643b92ca942455242f514ddbdb14872a59c5326d73bb935fb11bea481a711bd392291bc
|
data/README.md
CHANGED
@@ -9,7 +9,7 @@
|
|
9
9
|
2. Simple, easy to learn DSL
|
10
10
|
3. Crossframework compatibility:
|
11
11
|
- [UIKit][readmore-uikit]
|
12
|
-
- [
|
12
|
+
- [AppKit][readmore-appkit]
|
13
13
|
- [AutoLayout][readmore-autolayout]
|
14
14
|
- [Frame geometry][readmore-frames]
|
15
15
|
- [CoreAnimation][readmore-coreanimation]
|
@@ -29,8 +29,9 @@
|
|
29
29
|
[SweetKit]: https://github.com/rubymotion/sweet-kit
|
30
30
|
|
31
31
|
[READMORE]: https://github.com/rubymotion/motion-kit/blob/master/READMORE.md
|
32
|
+
[readmore-migrating]: https://github.com/rubymotion/motion-kit/blob/master/READMORE.md#migrating-from-teacup
|
32
33
|
[readmore-uikit]: https://github.com/rubymotion/motion-kit/blob/master/READMORE.md#uikit
|
33
|
-
[readmore-
|
34
|
+
[readmore-appkit]: https://github.com/rubymotion/motion-kit/blob/master/READMORE.md#appkit
|
34
35
|
[readmore-coreanimation]: https://github.com/rubymotion/motion-kit/blob/master/READMORE.md#coreanimation
|
35
36
|
[readmore-frames]: https://github.com/rubymotion/motion-kit/blob/master/READMORE.md#frames
|
36
37
|
[readmore-autolayout]: https://github.com/rubymotion/motion-kit/blob/master/READMORE.md#autolayout
|
@@ -42,6 +43,10 @@
|
|
42
43
|
You can [read all about](#goodbye-teacup) why Colin decided that Teacup needed to
|
43
44
|
be replaced with a new project, rather than upgraded or refactored.
|
44
45
|
|
46
|
+
If you need to update your app to use MotionKit, see
|
47
|
+
[READMORE.md][readmore-migrating] for an example of migrating stylesheets,
|
48
|
+
styles, and constraints.
|
49
|
+
|
45
50
|
|
46
51
|
## Usage
|
47
52
|
|
@@ -188,7 +193,7 @@ class LoginLayout < MotionKit::Layout
|
|
188
193
|
frame [[10, 10], ['100% - 10', :auto]]
|
189
194
|
end
|
190
195
|
add UITextField, :password_input do
|
191
|
-
frame below(:username_input,
|
196
|
+
frame below(:username_input, down: 8)
|
192
197
|
end
|
193
198
|
end
|
194
199
|
end
|
@@ -241,10 +246,11 @@ include multiple stylesheets this way, just be careful around name collisions.
|
|
241
246
|
module LoginStyles
|
242
247
|
|
243
248
|
def login_button_style
|
249
|
+
# this example uses SugarCube to create UIColor and CGColor objects.
|
244
250
|
background_color '#51A8E7'.uicolor
|
245
251
|
title 'Log In'
|
246
252
|
# `layer` returns a CALayer, which in turn becomes the new context inside
|
247
|
-
# this block
|
253
|
+
# this block
|
248
254
|
layer do
|
249
255
|
corner_radius 7.0
|
250
256
|
shadow_color '#000000'.cgcolor
|
@@ -342,8 +348,11 @@ root view, so retain one yourself to prevent it from being deallocated.
|
|
342
348
|
If you've used RMQ's Stylers, you'll recognize a very similar pattern here. In
|
343
349
|
RMQ the 'style' methods are handed a 'Styler' instance, which wraps access to
|
344
350
|
the view. In MotionKit we make use of `method_missing` to call these methods
|
345
|
-
indirectly. That takes care of most methods related to styling,
|
346
|
-
|
351
|
+
indirectly. That takes care of most methods related to styling, but you might
|
352
|
+
want to write some "helper" methods so that your styling code is more concise.
|
353
|
+
Some examples are included in the MotionKit core, but the [SweetKit][] gem has
|
354
|
+
many more. If you are writing helpers for UIKit or AppKit, please consider
|
355
|
+
adding them to SweetKit, so we can all share in the productivity boost! :smiley:
|
347
356
|
|
348
357
|
```ruby
|
349
358
|
def login_label_style
|
@@ -356,6 +365,7 @@ that take multiple arguments. Those can get "helper" methods.
|
|
356
365
|
title 'Press me'
|
357
366
|
# this gets delegated to UIButtonHelpers#title(title), which in turn calls
|
358
367
|
# button.setTitle(title, forState: UIControlStateNormal)
|
368
|
+
# See uibutton_helpers.rb for implementation.
|
359
369
|
end
|
360
370
|
```
|
361
371
|
|
@@ -384,8 +394,8 @@ benchmarking it is insignificant and undetectable. Let us know if you find any
|
|
384
394
|
performance issues.
|
385
395
|
|
386
396
|
You can easily add your own helpers to MotionKit. They
|
387
|
-
|
388
|
-
`MotionKit::UILabelHelpers
|
397
|
+
should all be named consistenly, e.g. `MotionKit::UIViewHelpers`,
|
398
|
+
`MotionKit::UILabelHelpers`, etc. You just need to specify the "target class" that
|
389
399
|
your helper class is meant to work with. Each class can only have *one helper
|
390
400
|
class*.
|
391
401
|
|
@@ -926,6 +936,16 @@ annoying subtletees of the NSCell/NSControl dichotomy.
|
|
926
936
|
gem install sweet-kit
|
927
937
|
|
928
938
|
|
939
|
+
# Gotchas
|
940
|
+
|
941
|
+
### A Note on `add` and `remove`
|
942
|
+
|
943
|
+
When you use the `add` method to add a subview, that view will be retained by
|
944
|
+
the Layout *even if you remove it from the view hierarchy*. If you want the
|
945
|
+
Layout to forget all about the view, call `remove(view)` (which also calls
|
946
|
+
`removeFromSuperview`) or `forget(element_id)` (which only removes it from the
|
947
|
+
Layout) on the Layout.
|
948
|
+
|
929
949
|
# Contributing
|
930
950
|
|
931
951
|
We welcome your contributions! Please be sure to run the specs before you do,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
data/lib/motion-kit-ios/{layouts/uiview_layout_gradient.rb → helpers/uiview_gradient_helpers.rb}
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
@@ -0,0 +1,361 @@
|
|
1
|
+
# @requires MotionKit::NSWindowHelpers
|
2
|
+
module MotionKit
|
3
|
+
class NSWindowHelpers
|
4
|
+
|
5
|
+
def _fix_frame_value(value)
|
6
|
+
if value.is_a?(Hash) && value[:relative]
|
7
|
+
return value.merge(flipped: true)
|
8
|
+
end
|
9
|
+
return value
|
10
|
+
end
|
11
|
+
|
12
|
+
def frame(value, autosave_name=nil)
|
13
|
+
value = _fix_frame_value(value)
|
14
|
+
screen = target.screen || NSScreen.mainScreen
|
15
|
+
value = MotionKit.calculate(target, :frame, value, screen)
|
16
|
+
target.setFrame(value, display: true)
|
17
|
+
if autosave_name
|
18
|
+
target.setFrameAutosaveName(autosave_name)
|
19
|
+
end
|
20
|
+
return target.frame
|
21
|
+
end
|
22
|
+
|
23
|
+
def x(value)
|
24
|
+
value = _fix_frame_value(value)
|
25
|
+
f = target.frame
|
26
|
+
screen = target.screen || NSScreen.mainScreen
|
27
|
+
f.origin.x = MotionKit.calculate(target, :width, value, screen)
|
28
|
+
target.setFrame(f, display: true)
|
29
|
+
return CGRectGetMinX(f)
|
30
|
+
end
|
31
|
+
alias left x
|
32
|
+
|
33
|
+
def right(value)
|
34
|
+
value = _fix_frame_value(value)
|
35
|
+
f = target.frame
|
36
|
+
screen = target.screen || NSScreen.mainScreen
|
37
|
+
f.origin.x = MotionKit.calculate(target, :width, value, screen) - f.size.width
|
38
|
+
target.setFrame(f, display: true)
|
39
|
+
return CGRectGetMaxX(f)
|
40
|
+
end
|
41
|
+
|
42
|
+
def center_x(value)
|
43
|
+
value = _fix_frame_value(value)
|
44
|
+
f = target.frame
|
45
|
+
screen = target.screen || NSScreen.mainScreen
|
46
|
+
f.origin.x = MotionKit.calculate(target, :width, value, screen)
|
47
|
+
f.origin.x -= f.size.width / 2
|
48
|
+
target.setFrame(f, display: true)
|
49
|
+
return CGRectGetMidX(target.frame)
|
50
|
+
end
|
51
|
+
alias middle_x center_x
|
52
|
+
|
53
|
+
def y(value)
|
54
|
+
value = _fix_frame_value(value)
|
55
|
+
f = target.frame
|
56
|
+
screen = target.screen || NSScreen.mainScreen
|
57
|
+
f.origin.y = MotionKit.calculate(target, :height, value, screen)
|
58
|
+
target.setFrame(f, display: true)
|
59
|
+
return CGRectGetMinY(f)
|
60
|
+
end
|
61
|
+
|
62
|
+
def bottom(value)
|
63
|
+
value = _fix_frame_value(value)
|
64
|
+
f = target.frame
|
65
|
+
screen = target.screen || NSScreen.mainScreen
|
66
|
+
f.origin.y = MotionKit.calculate(target, :height, value, screen)
|
67
|
+
target.setFrame(f, display: true)
|
68
|
+
|
69
|
+
return CGRectGetMinY(target.frame)
|
70
|
+
end
|
71
|
+
|
72
|
+
def top(value)
|
73
|
+
value = _fix_frame_value(value)
|
74
|
+
f = target.frame
|
75
|
+
screen = target.screen || NSScreen.mainScreen
|
76
|
+
f.origin.y = MotionKit.calculate(target, :height, value, screen)
|
77
|
+
f.origin.y -= f.size.height
|
78
|
+
target.setFrame(f, display: true)
|
79
|
+
|
80
|
+
return CGRectGetMaxY(f)
|
81
|
+
end
|
82
|
+
|
83
|
+
def center_y(value)
|
84
|
+
value = _fix_frame_value(value)
|
85
|
+
f = target.frame
|
86
|
+
screen = target.screen || NSScreen.mainScreen
|
87
|
+
f.origin.y = MotionKit.calculate(target, :height, value, screen)
|
88
|
+
f.origin.y -= f.size.height / 2
|
89
|
+
target.setFrame(f, display: true)
|
90
|
+
return CGRectGetMidY(target.frame)
|
91
|
+
end
|
92
|
+
alias middle_y center_y
|
93
|
+
|
94
|
+
def width(value)
|
95
|
+
value = _fix_frame_value(value)
|
96
|
+
f = target.frame
|
97
|
+
screen = target.screen || NSScreen.mainScreen
|
98
|
+
f.size.width = MotionKit.calculate(target, :width, value, screen)
|
99
|
+
target.setFrame(f, display: true)
|
100
|
+
return CGRectGetWidth(f)
|
101
|
+
end
|
102
|
+
alias w width
|
103
|
+
|
104
|
+
def height(value)
|
105
|
+
value = _fix_frame_value(value)
|
106
|
+
f = target.frame
|
107
|
+
screen = target.screen || NSScreen.mainScreen
|
108
|
+
f.size.height = MotionKit.calculate(target, :height, value, screen)
|
109
|
+
target.setFrame(f, display: true)
|
110
|
+
return CGRectGetHeight(f)
|
111
|
+
end
|
112
|
+
alias h height
|
113
|
+
|
114
|
+
def origin(value)
|
115
|
+
value = _fix_frame_value(value)
|
116
|
+
f = target.frame
|
117
|
+
screen = target.screen || NSScreen.mainScreen
|
118
|
+
f.origin = MotionKit.calculate(target, :origin, value, screen)
|
119
|
+
target.setFrame(f, display: true)
|
120
|
+
return target.frame.origin
|
121
|
+
end
|
122
|
+
|
123
|
+
def center(value)
|
124
|
+
value = _fix_frame_value(value)
|
125
|
+
f = target.frame
|
126
|
+
screen = target.screen || NSScreen.mainScreen
|
127
|
+
center = MotionKit.calculate(target, :center, value, screen)
|
128
|
+
origin = CGPoint.new(center.x, center.y)
|
129
|
+
origin.x -= f.size.width / 2
|
130
|
+
origin.y -= f.size.height / 2
|
131
|
+
f.origin = origin
|
132
|
+
target.setFrame(f, display: true)
|
133
|
+
return center
|
134
|
+
end
|
135
|
+
alias middle center
|
136
|
+
|
137
|
+
def size(value)
|
138
|
+
value = _fix_frame_value(value)
|
139
|
+
f = target.frame
|
140
|
+
screen = target.screen || NSScreen.mainScreen
|
141
|
+
f.size = MotionKit.calculate(target, :size, value, screen)
|
142
|
+
target.setFrame(f, display: true)
|
143
|
+
return target.frame.size
|
144
|
+
end
|
145
|
+
|
146
|
+
def _calculate_frame(f, from: from_window, relative_to: point)
|
147
|
+
if from_window.is_a?(Symbol)
|
148
|
+
from_window = self.get_view(from_window)
|
149
|
+
end
|
150
|
+
|
151
|
+
from_window_size = from_window.frame.size
|
152
|
+
|
153
|
+
calculate_window = target
|
154
|
+
|
155
|
+
if point[:x] == :reset || point[:y] == :reset
|
156
|
+
calculate_window = NSWindow.alloc.init
|
157
|
+
calculate_window.setFrame([[0, 0], target.frame.size], display: false)
|
158
|
+
end
|
159
|
+
|
160
|
+
if f.is_a?(Hash)
|
161
|
+
f = f.merge(relative: true, flipped: true)
|
162
|
+
end
|
163
|
+
f = MotionKit.calculate(calculate_window, :frame, f, from_window)
|
164
|
+
if from_window.is_a?(NSWindow)
|
165
|
+
f.origin.x += from_window.frame.origin.x
|
166
|
+
f.origin.y += from_window.frame.origin.y
|
167
|
+
end
|
168
|
+
|
169
|
+
case point[:x]
|
170
|
+
when :min, :reset
|
171
|
+
# pass
|
172
|
+
when :mid
|
173
|
+
f.origin.x += (from_window_size.width - f.size.width) / 2.0
|
174
|
+
when :max
|
175
|
+
f.origin.x += from_window_size.width - f.size.width
|
176
|
+
when :before
|
177
|
+
f.origin.x -= f.size.width
|
178
|
+
when :after
|
179
|
+
f.origin.x += from_window_size.width
|
180
|
+
else
|
181
|
+
f.origin.x += point[:x]
|
182
|
+
end
|
183
|
+
|
184
|
+
case point[:y]
|
185
|
+
when :reset, :min
|
186
|
+
# pass
|
187
|
+
when :mid
|
188
|
+
f.origin.y += (from_window_size.height - f.size.height) / 2.0
|
189
|
+
when :max
|
190
|
+
f.origin.y += from_window_size.height - f.size.height
|
191
|
+
when :above
|
192
|
+
f.origin.y += from_window_size.height
|
193
|
+
when :below
|
194
|
+
f.origin.y -= f.size.height
|
195
|
+
else
|
196
|
+
f.origin.y += point[:y]
|
197
|
+
end
|
198
|
+
|
199
|
+
return f
|
200
|
+
end
|
201
|
+
|
202
|
+
# The first arg can be a window or a frame
|
203
|
+
# @example
|
204
|
+
# frame from_top_left(width: 80, height: 22)
|
205
|
+
# frame from_top_left(another_view, width: 80, height: 22)
|
206
|
+
def from_top_left(from_window=nil, f=nil)
|
207
|
+
if from_window.is_a?(Hash)
|
208
|
+
f = from_window
|
209
|
+
from_window = nil
|
210
|
+
end
|
211
|
+
f ||= {}
|
212
|
+
from_window ||= target.screen || NSScreen.mainScreen
|
213
|
+
_calculate_frame(f, from: from_window, relative_to: { x: :min, y: :max })
|
214
|
+
end
|
215
|
+
|
216
|
+
# The first arg can be a window or a frame
|
217
|
+
# @example
|
218
|
+
# frame from_top(width: 80, height: 22)
|
219
|
+
# frame from_top(another_view, width: 80, height: 22)
|
220
|
+
def from_top(from_window=nil, f=nil)
|
221
|
+
if from_window.is_a?(Hash)
|
222
|
+
f = from_window
|
223
|
+
from_window = nil
|
224
|
+
end
|
225
|
+
f ||= {}
|
226
|
+
from_window ||= target.screen || NSScreen.mainScreen
|
227
|
+
_calculate_frame(f, from: from_window, relative_to: { x: :mid, y: :max })
|
228
|
+
end
|
229
|
+
|
230
|
+
# The first arg can be a window or a frame
|
231
|
+
# @example
|
232
|
+
# frame from_top_right(width: 80, height: 22)
|
233
|
+
# frame from_top_right(another_view, width: 80, height: 22)
|
234
|
+
def from_top_right(from_window=nil, f=nil)
|
235
|
+
if from_window.is_a?(Hash)
|
236
|
+
f = from_window
|
237
|
+
from_window = nil
|
238
|
+
end
|
239
|
+
f ||= {}
|
240
|
+
from_window ||= target.screen || NSScreen.mainScreen
|
241
|
+
_calculate_frame(f, from: from_window, relative_to: { x: :max, y: :max })
|
242
|
+
end
|
243
|
+
|
244
|
+
# The first arg can be a window or a frame
|
245
|
+
# @example
|
246
|
+
# frame from_left(width: 80, height: 22)
|
247
|
+
# frame from_left(another_view, width: 80, height: 22)
|
248
|
+
def from_left(from_window=nil, f=nil)
|
249
|
+
if from_window.is_a?(Hash)
|
250
|
+
f = from_window
|
251
|
+
from_window = nil
|
252
|
+
end
|
253
|
+
f ||= {}
|
254
|
+
from_window ||= target.screen || NSScreen.mainScreen
|
255
|
+
_calculate_frame(f, from: from_window, relative_to: { x: :min, y: :mid })
|
256
|
+
end
|
257
|
+
|
258
|
+
# The first arg can be a window or a frame
|
259
|
+
# @example
|
260
|
+
# frame from_center(width: 80, height: 22)
|
261
|
+
# frame from_center(another_view, width: 80, height: 22)
|
262
|
+
def from_center(from_window=nil, f=nil)
|
263
|
+
if from_window.is_a?(Hash)
|
264
|
+
f = from_window
|
265
|
+
from_window = nil
|
266
|
+
end
|
267
|
+
f ||= {}
|
268
|
+
from_window ||= target.screen || NSScreen.mainScreen
|
269
|
+
_calculate_frame(f, from: from_window, relative_to: { x: :mid, y: :mid })
|
270
|
+
end
|
271
|
+
|
272
|
+
# The first arg can be a window or a frame
|
273
|
+
# @example
|
274
|
+
# frame from_right(width: 80, height: 22)
|
275
|
+
# frame from_right(another_view, width: 80, height: 22)
|
276
|
+
def from_right(from_window=nil, f=nil)
|
277
|
+
if from_window.is_a?(Hash)
|
278
|
+
f = from_window
|
279
|
+
from_window = nil
|
280
|
+
end
|
281
|
+
f ||= {}
|
282
|
+
from_window ||= target.screen || NSScreen.mainScreen
|
283
|
+
_calculate_frame(f, from: from_window, relative_to: { x: :max, y: :mid })
|
284
|
+
end
|
285
|
+
|
286
|
+
# The first arg can be a window or a frame
|
287
|
+
# @example
|
288
|
+
# frame from_bottom_left(width: 80, height: 22)
|
289
|
+
# frame from_bottom_left(another_view, width: 80, height: 22)
|
290
|
+
def from_bottom_left(from_window=nil, f=nil)
|
291
|
+
if from_window.is_a?(Hash)
|
292
|
+
f = from_window
|
293
|
+
from_window = nil
|
294
|
+
end
|
295
|
+
f ||= {}
|
296
|
+
from_window ||= target.screen || NSScreen.mainScreen
|
297
|
+
_calculate_frame(f, from: from_window, relative_to: { x: :min, y: :min })
|
298
|
+
end
|
299
|
+
|
300
|
+
# The first arg can be a window or a frame
|
301
|
+
# @example
|
302
|
+
# frame from_bottom(width: 80, height: 22)
|
303
|
+
# frame from_bottom(another_view, width: 80, height: 22)
|
304
|
+
def from_bottom(from_window=nil, f=nil)
|
305
|
+
if from_window.is_a?(Hash)
|
306
|
+
f = from_window
|
307
|
+
from_window = nil
|
308
|
+
end
|
309
|
+
f ||= {}
|
310
|
+
from_window ||= target.screen || NSScreen.mainScreen
|
311
|
+
_calculate_frame(f, from: from_window, relative_to: { x: :mid, y: :min })
|
312
|
+
end
|
313
|
+
|
314
|
+
# The first arg can be a window or a frame
|
315
|
+
# @example
|
316
|
+
# frame from_bottom_right(width: 80, height: 22)
|
317
|
+
# frame from_bottom_right(another_view, width: 80, height: 22)
|
318
|
+
def from_bottom_right(from_window=nil, f=nil)
|
319
|
+
if from_window.is_a?(Hash)
|
320
|
+
f = from_window
|
321
|
+
from_window = nil
|
322
|
+
end
|
323
|
+
f ||= {}
|
324
|
+
from_window ||= target.screen || NSScreen.mainScreen
|
325
|
+
_calculate_frame(f, from: from_window, relative_to: { x: :max, y: :min })
|
326
|
+
end
|
327
|
+
|
328
|
+
# The first arg can be a window or a frame
|
329
|
+
# @example
|
330
|
+
def above(from_window, f={})
|
331
|
+
_calculate_frame(f, from: from_window, relative_to: { x: :reset, y: :above })
|
332
|
+
end
|
333
|
+
|
334
|
+
# The first arg can be a window or a frame
|
335
|
+
# @example
|
336
|
+
def below(from_window, f={})
|
337
|
+
_calculate_frame(f, from: from_window, relative_to: { x: :reset, y: :below })
|
338
|
+
end
|
339
|
+
|
340
|
+
# The first arg can be a window or a frame
|
341
|
+
# @example
|
342
|
+
def before(from_window, f={})
|
343
|
+
_calculate_frame(f, from: from_window, relative_to: { x: :before, y: :reset })
|
344
|
+
end
|
345
|
+
alias left_of before
|
346
|
+
|
347
|
+
# The first arg can be a window or a frame
|
348
|
+
# @example
|
349
|
+
def after(from_window, f={})
|
350
|
+
_calculate_frame(f, from: from_window, relative_to: { x: :after, y: :reset })
|
351
|
+
end
|
352
|
+
alias right_of after
|
353
|
+
|
354
|
+
# The first arg must be a view
|
355
|
+
# @example
|
356
|
+
def relative_to(from_window, f)
|
357
|
+
_calculate_frame(f, from: from_window, relative_to: { x: :reset, y: :reset })
|
358
|
+
end
|
359
|
+
|
360
|
+
end
|
361
|
+
end
|