motion-kit 0.10.9 → 0.10.10
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 +3 -0
- data/lib/motion-kit/layouts/base_layout.rb +23 -10
- data/lib/motion-kit/layouts/tree_layout.rb +20 -20
- data/lib/motion-kit/version.rb +1 -1
- data/spec/ios/memory_leak_spec.rb +74 -0
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bc88d9d5ae26923a6a1537869a7decb22435fa71
|
4
|
+
data.tar.gz: 232df310d55a46eb997ddb1c343edf58aa8c193c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9115565f3d88b37e5ea4f637bf1d67f5641133a12f42504072db87a3306373efbd6231abf018faae85e79889b1519314ef8a7799fa3715afd7d0fd5ed49bbecf
|
7
|
+
data.tar.gz: bde50f100e9705156cb5ec8897ac683466679a478b1f48202ac97e18a566d3960c64363e1663e95fd27b9eaabc342792f02f35b1c46b413995009f390997a6ab
|
data/README.md
CHANGED
@@ -1,5 +1,8 @@
|
|
1
1
|
# MotionKit
|
2
2
|
|
3
|
+
[](https://travis-ci.org/motion-kit/motion-kit)
|
4
|
+
[](https://rubygems.org/gems/motion-kit)
|
5
|
+
|
3
6
|
*The RubyMotion layout and styling gem.*
|
4
7
|
|
5
8
|
1. Crossplatform compatibility: iOS, OSX, and planned support for Android
|
@@ -18,7 +18,7 @@ module MotionKit
|
|
18
18
|
|
19
19
|
def initialize(args={})
|
20
20
|
# @layout is the object we look in for style methods
|
21
|
-
@layout =
|
21
|
+
@layout = nil
|
22
22
|
# the Layout object that implements custom style methods. Leave this as nil
|
23
23
|
# in the initializer.
|
24
24
|
@layout_delegate = nil
|
@@ -27,22 +27,30 @@ module MotionKit
|
|
27
27
|
# Explicit roots will not have a strong reference from
|
28
28
|
# MotionKit, so retain one yourself from your controller
|
29
29
|
# or other view to prevent deallocation.
|
30
|
-
@preset_root =
|
30
|
+
@preset_root = args[:root]
|
31
31
|
end
|
32
32
|
|
33
33
|
def set_layout(layout)
|
34
34
|
@layout = WeakRef.new(layout)
|
35
35
|
end
|
36
36
|
|
37
|
+
def parent_layout
|
38
|
+
@layout || self
|
39
|
+
end
|
40
|
+
|
41
|
+
def is_parent_layout?
|
42
|
+
@layout.nil? || @layout == self
|
43
|
+
end
|
44
|
+
|
37
45
|
def target
|
38
|
-
if
|
46
|
+
if is_parent_layout?
|
39
47
|
# only the "root layout" instance is allowed to change the context.
|
40
48
|
# if there isn't a context set, try and create a root instance; this
|
41
49
|
# will fail if we're not in a state that allows the root to be created
|
42
50
|
@context ||= create_default_root_context
|
43
51
|
else
|
44
52
|
# child layouts get the context from the root layout
|
45
|
-
|
53
|
+
parent_layout.target
|
46
54
|
end
|
47
55
|
end
|
48
56
|
def v ; target ; end
|
@@ -76,7 +84,7 @@ module MotionKit
|
|
76
84
|
return target unless block
|
77
85
|
# this little line is incredibly important; the context is only set on
|
78
86
|
# the top-level Layout object.
|
79
|
-
return
|
87
|
+
return parent_layout.context(target, &block) unless is_parent_layout?
|
80
88
|
|
81
89
|
if target.is_a?(Symbol)
|
82
90
|
target = self.get(target)
|
@@ -92,7 +100,7 @@ module MotionKit
|
|
92
100
|
end
|
93
101
|
@parent = MK::Parent.new(context_was)
|
94
102
|
@context = target
|
95
|
-
@context.motion_kit_meta[:delegate] ||= Layout.layout_for(
|
103
|
+
@context.motion_kit_meta[:delegate] ||= Layout.layout_for(parent_layout, @context.class)
|
96
104
|
@layout_delegate = @context.motion_kit_meta[:delegate]
|
97
105
|
yield
|
98
106
|
@layout_delegate, @context, @parent = delegate_was, context_was, parent_was
|
@@ -108,7 +116,7 @@ module MotionKit
|
|
108
116
|
# after a call to Layout#layout.
|
109
117
|
def deferred(context=nil, &block)
|
110
118
|
context ||= @context
|
111
|
-
return
|
119
|
+
return parent_layout.add_deferred_block(context, &block)
|
112
120
|
end
|
113
121
|
|
114
122
|
# Only intended for private use
|
@@ -201,7 +209,7 @@ module MotionKit
|
|
201
209
|
objc_method_name, objc_method_args = objc_version(method_name, args)
|
202
210
|
ruby_method_name = ruby_version(method_name)
|
203
211
|
|
204
|
-
@layout_delegate ||= Layout.layout_for(
|
212
|
+
@layout_delegate ||= Layout.layout_for(parent_layout, target.class)
|
205
213
|
if objc_method_name && @layout_delegate.respond_to?(objc_method_name)
|
206
214
|
return @layout_delegate.send(objc_method_name, *objc_method_args, &block)
|
207
215
|
elsif @layout_delegate.respond_to?(ruby_method_name)
|
@@ -269,8 +277,6 @@ module MotionKit
|
|
269
277
|
end
|
270
278
|
end
|
271
279
|
|
272
|
-
public
|
273
|
-
|
274
280
|
class << self
|
275
281
|
|
276
282
|
# Prevents infinite loops when methods that are defined on Object/Kernel
|
@@ -295,6 +301,13 @@ module MotionKit
|
|
295
301
|
|
296
302
|
end
|
297
303
|
|
304
|
+
protected
|
305
|
+
|
306
|
+
def preset_root
|
307
|
+
# Set in the initializer
|
308
|
+
# TreeLayout.new(root: some_view)
|
309
|
+
@preset_root
|
310
|
+
end
|
298
311
|
|
299
312
|
end
|
300
313
|
|
@@ -50,8 +50,8 @@ module MotionKit
|
|
50
50
|
|
51
51
|
# The main view. This method builds the layout and returns the root view.
|
52
52
|
def view
|
53
|
-
|
54
|
-
return
|
53
|
+
unless is_parent_layout?
|
54
|
+
return parent_layout.view
|
55
55
|
end
|
56
56
|
@view ||= build_view
|
57
57
|
end
|
@@ -142,9 +142,9 @@ module MotionKit
|
|
142
142
|
|
143
143
|
def call_style_method(element, element_id)
|
144
144
|
style_method = "#{element_id}_style"
|
145
|
-
if
|
146
|
-
|
147
|
-
|
145
|
+
if parent_layout.respond_to?(style_method)
|
146
|
+
parent_layout.context(element) do
|
147
|
+
parent_layout.send(style_method)
|
148
148
|
end
|
149
149
|
end
|
150
150
|
return element
|
@@ -214,8 +214,8 @@ module MotionKit
|
|
214
214
|
# with this element_id in the tree, where *first* means the view closest to
|
215
215
|
# the root view. Aliased to `first` to distinguish it from `last`.
|
216
216
|
def get(element_id)
|
217
|
-
|
218
|
-
return
|
217
|
+
unless is_parent_layout?
|
218
|
+
return parent_layout.get(element_id)
|
219
219
|
end
|
220
220
|
self.get(element_id, in: self._root)
|
221
221
|
end
|
@@ -231,8 +231,8 @@ module MotionKit
|
|
231
231
|
# with this element_id, where last means the view deepest and furthest from
|
232
232
|
# the root view.
|
233
233
|
def last(element_id)
|
234
|
-
|
235
|
-
return
|
234
|
+
unless is_parent_layout?
|
235
|
+
return parent_layout.last(element_id)
|
236
236
|
end
|
237
237
|
self.last(element_id, in: self._root)
|
238
238
|
end
|
@@ -244,8 +244,8 @@ module MotionKit
|
|
244
244
|
|
245
245
|
# Returns all the elements with a given element_id in the view tree.
|
246
246
|
def all(element_id)
|
247
|
-
|
248
|
-
return
|
247
|
+
unless is_parent_layout?
|
248
|
+
return parent_layout.all(element_id)
|
249
249
|
end
|
250
250
|
self.all(element_id, in: self._root)
|
251
251
|
end
|
@@ -268,8 +268,8 @@ module MotionKit
|
|
268
268
|
# Removes a view (or several with the same name) from the hierarchy
|
269
269
|
# and forgets it entirely. Returns the views that were removed.
|
270
270
|
def remove(element_id)
|
271
|
-
|
272
|
-
return
|
271
|
+
unless is_parent_layout?
|
272
|
+
return parent_layout.remove(element_id)
|
273
273
|
end
|
274
274
|
self.remove(element_id, from: self._root)
|
275
275
|
end
|
@@ -297,12 +297,6 @@ module MotionKit
|
|
297
297
|
|
298
298
|
protected
|
299
299
|
|
300
|
-
def preset_root
|
301
|
-
# Set in the initializer
|
302
|
-
# TreeLayout.new(root: some_view)
|
303
|
-
@preset_root
|
304
|
-
end
|
305
|
-
|
306
300
|
# This method builds the layout and returns the root view.
|
307
301
|
def build_view
|
308
302
|
# Only in the 'layout' method will we allow default container to be
|
@@ -314,6 +308,7 @@ module MotionKit
|
|
314
308
|
unless @view
|
315
309
|
if @assign_root
|
316
310
|
create_default_root_context
|
311
|
+
@view = @context
|
317
312
|
else
|
318
313
|
NSLog('Warning! No root view was set in TreeLayout#layout. Did you mean to call `root`?')
|
319
314
|
end
|
@@ -326,6 +321,11 @@ module MotionKit
|
|
326
321
|
# it's previous value
|
327
322
|
@context = nil
|
328
323
|
|
324
|
+
if @preset_root
|
325
|
+
@view = WeakRef.new(@view)
|
326
|
+
@preset_root = nil
|
327
|
+
end
|
328
|
+
|
329
329
|
@view
|
330
330
|
end
|
331
331
|
|
@@ -350,7 +350,7 @@ module MotionKit
|
|
350
350
|
# `ViewLayout`, which returns the root view.
|
351
351
|
def initialize_element(elem)
|
352
352
|
if elem.is_a?(Class) && elem < TreeLayout
|
353
|
-
elem = elem.new_child(
|
353
|
+
elem = elem.new_child(parent_layout).view
|
354
354
|
elsif elem.is_a?(Class)
|
355
355
|
elem = elem.new
|
356
356
|
elsif elem.is_a?(TreeLayout)
|
data/lib/motion-kit/version.rb
CHANGED
@@ -0,0 +1,74 @@
|
|
1
|
+
describe 'MemoryLeaks' do
|
2
|
+
|
3
|
+
before do
|
4
|
+
window = UIWindow.alloc.initWithFrame(UIScreen.mainScreen.bounds)
|
5
|
+
@controller = UINavigationController.new
|
6
|
+
@controller.viewControllers = [UIViewController.new, TestMemoryLeakController.new]
|
7
|
+
window.rootViewController = @controller
|
8
|
+
window.makeKeyAndVisible
|
9
|
+
|
10
|
+
@did_dealloc_controller = false
|
11
|
+
@did_dealloc_layout = false
|
12
|
+
@did_dealloc_cell = false
|
13
|
+
@did_dealloc_cell_layout = false
|
14
|
+
|
15
|
+
@observe_controller = NSNotificationCenter.defaultCenter.addObserverForName('TestMemoryLeakController dealloc', object: nil, queue: nil, usingBlock: -> notification do
|
16
|
+
@did_dealloc_controller = true
|
17
|
+
end)
|
18
|
+
@observe_layout = NSNotificationCenter.defaultCenter.addObserverForName('TestMemoryLeakLayout dealloc', object: nil, queue: nil, usingBlock: -> notification do
|
19
|
+
@did_dealloc_layout = true
|
20
|
+
end)
|
21
|
+
@observe_cell = NSNotificationCenter.defaultCenter.addObserverForName('TestMemoryLeakCell dealloc', object: nil, queue: nil, usingBlock: -> notification do
|
22
|
+
@did_dealloc_cell = true
|
23
|
+
end)
|
24
|
+
@observe_cell_layout = NSNotificationCenter.defaultCenter.addObserverForName('TestMemoryLeakCellLayout dealloc', object: nil, queue: nil, usingBlock: -> notification do
|
25
|
+
@did_dealloc_cell_layout = true
|
26
|
+
end)
|
27
|
+
end
|
28
|
+
|
29
|
+
after do
|
30
|
+
NSNotificationCenter.defaultCenter.removeObserver(@observe_controller)
|
31
|
+
NSNotificationCenter.defaultCenter.removeObserver(@observe_layout)
|
32
|
+
NSNotificationCenter.defaultCenter.removeObserver(@observe_cell)
|
33
|
+
NSNotificationCenter.defaultCenter.removeObserver(@observe_cell_layout)
|
34
|
+
end
|
35
|
+
|
36
|
+
describe 'When popping a controller' do
|
37
|
+
|
38
|
+
before do
|
39
|
+
wait 0.1 do
|
40
|
+
@controller.popViewControllerAnimated(false)
|
41
|
+
|
42
|
+
# window = UIWindow.alloc.initWithFrame(UIScreen.mainScreen.bounds)
|
43
|
+
# window.rootViewController = @controller
|
44
|
+
# window.makeKeyAndVisible
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
it 'should release the TestMemoryLeakController' do
|
49
|
+
wait 0.1 do
|
50
|
+
@did_dealloc_controller.should == true
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
it 'should release the TestMemoryLeakLayout' do
|
55
|
+
wait 0.1 do
|
56
|
+
@did_dealloc_layout.should == true
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
it 'should release the TestMemoryLeakCell' do
|
61
|
+
wait 0.1 do
|
62
|
+
@did_dealloc_cell.should == true
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
it 'should release the TestMemoryLeakCellLayout' do
|
67
|
+
wait 0.1 do
|
68
|
+
@did_dealloc_cell_layout.should == true
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
end
|
73
|
+
|
74
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: motion-kit
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.10.
|
4
|
+
version: 0.10.10
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Colin T.A. Gray
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-07-
|
12
|
+
date: 2014-07-09 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: dbt
|
@@ -109,6 +109,7 @@ files:
|
|
109
109
|
- spec/ios/layout_extensions_spec.rb
|
110
110
|
- spec/ios/layout_spec.rb
|
111
111
|
- spec/ios/layout_state_spec.rb
|
112
|
+
- spec/ios/memory_leak_spec.rb
|
112
113
|
- spec/ios/motionkit_util_spec.rb
|
113
114
|
- spec/ios/objc_selectors_spec.rb
|
114
115
|
- spec/ios/orientation_helper_specs.rb
|
@@ -187,6 +188,7 @@ test_files:
|
|
187
188
|
- spec/ios/layout_extensions_spec.rb
|
188
189
|
- spec/ios/layout_spec.rb
|
189
190
|
- spec/ios/layout_state_spec.rb
|
191
|
+
- spec/ios/memory_leak_spec.rb
|
190
192
|
- spec/ios/motionkit_util_spec.rb
|
191
193
|
- spec/ios/objc_selectors_spec.rb
|
192
194
|
- spec/ios/orientation_helper_specs.rb
|