motion-kit 0.10.9 → 0.10.10
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
+
[![Build Status](https://travis-ci.org/motion-kit/motion-kit.svg?branch=master)](https://travis-ci.org/motion-kit/motion-kit)
|
4
|
+
[![Version](https://badge.fury.io/rb/motion-kit.svg)](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
|