rm-extensions 0.1.6 → 0.1.7
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/lib/motion/deallocation.rb +56 -0
- data/lib/motion/layout.rb +33 -21
- data/lib/motion/observation.rb +26 -14
- data/lib/motion/util.rb +8 -0
- data/lib/rm-extensions/version.rb +1 -1
- data/lib/rm-extensions.rb +1 -0
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: def362607872dfcd691017faa171e66967d0630c
|
4
|
+
data.tar.gz: bbeb76a150653503536aa8e2cf02565d48d0bca9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3fc8a7624f1ecfe03c8af4bcea0f7c31092c3403091bc99754071efde2d98b2927531c361ca809c817b4a70753357ca0395e9e2c5563c3c8506856e20cda9de6
|
7
|
+
data.tar.gz: 608c671f2a9d9656961005e4e86d2e21a0d14e050dfbea5eb5bc759404ac992bc1d486507936bc149d9a0c4147e0a4937152d3b4ddebe90c027e66dc46c4f852
|
@@ -0,0 +1,56 @@
|
|
1
|
+
module RMExtensions
|
2
|
+
|
3
|
+
module ObjectExtensions
|
4
|
+
|
5
|
+
module Deallocation
|
6
|
+
|
7
|
+
# perform a block before +self+ will dealloc.
|
8
|
+
# the block given should have one argument, the object about to be deallocated.
|
9
|
+
def rmext_on_dealloc(&block)
|
10
|
+
internalObject = ::RMExtensions::OnDeallocInternalObject.create("#{self.class.name}:#{object_id}", self, block)
|
11
|
+
@rmext_on_dealloc_blocks ||= {}
|
12
|
+
@rmext_on_dealloc_blocks[internalObject] = internalObject
|
13
|
+
nil
|
14
|
+
end
|
15
|
+
|
16
|
+
# removes a previously added block from the deallocation callback list
|
17
|
+
def rmext_cancel_on_dealloc(block)
|
18
|
+
@rmext_on_dealloc_blocks ||= {}
|
19
|
+
if internalObject = @rmext_on_dealloc_blocks[block]
|
20
|
+
internalObject.block = nil
|
21
|
+
@rmext_on_dealloc_blocks.delete(block)
|
22
|
+
end
|
23
|
+
nil
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
|
30
|
+
# Used internally by +rmext_on_dealloc+. The idea is this object is added to the
|
31
|
+
# object we want to watch for deallocation. When the object we want to watch
|
32
|
+
# is about to dealloc, this object will dealloc first, so we can execute the block.
|
33
|
+
# the object it follows is kept only as a weak reference to not create
|
34
|
+
# a retain cycle.
|
35
|
+
class OnDeallocInternalObject
|
36
|
+
attr_accessor :description, :block
|
37
|
+
rmext_weak_attr_accessor :obj
|
38
|
+
def self.create(description, obj, block)
|
39
|
+
x = new
|
40
|
+
x.description = description
|
41
|
+
x.obj = obj
|
42
|
+
x.block = block
|
43
|
+
x
|
44
|
+
end
|
45
|
+
def dealloc
|
46
|
+
# p "dealloc OnDeallocInternalObject #{description}"
|
47
|
+
if block
|
48
|
+
block.call(obj)
|
49
|
+
self.block = nil
|
50
|
+
end
|
51
|
+
super
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
56
|
+
Object.send(:include, ::RMExtensions::ObjectExtensions::Deallocation)
|
data/lib/motion/layout.rb
CHANGED
@@ -46,24 +46,27 @@ module RMExtensions
|
|
46
46
|
end
|
47
47
|
end
|
48
48
|
|
49
|
-
def view(view
|
50
|
-
|
51
|
-
@view = view
|
52
|
-
end
|
53
|
-
@view
|
49
|
+
def view(view)
|
50
|
+
@view = view
|
54
51
|
end
|
55
52
|
|
56
|
-
def
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
53
|
+
def view=(v)
|
54
|
+
view(v)
|
55
|
+
end
|
56
|
+
|
57
|
+
def subviews(subviews)
|
58
|
+
@subviews = subviews
|
59
|
+
@subviews.values.each do |subview|
|
60
|
+
subview.translatesAutoresizingMaskIntoConstraints = false
|
61
|
+
@view.addSubview(subview)
|
63
62
|
end
|
64
63
|
@subviews
|
65
64
|
end
|
66
65
|
|
66
|
+
def subviews=(views)
|
67
|
+
subviews(views)
|
68
|
+
end
|
69
|
+
|
67
70
|
def eqs(str)
|
68
71
|
str.split("\n").map(&:strip).select { |x| !x.empty? }.map do |line|
|
69
72
|
eq(line)
|
@@ -143,16 +146,8 @@ module RMExtensions
|
|
143
146
|
|
144
147
|
# normalize
|
145
148
|
|
146
|
-
res_item = item
|
147
|
-
res_item_attribute = ATTRIBUTE_LOOKUP[item_attribute]
|
148
|
-
res_related_by = RELATED_BY_LOOKUP[related_by]
|
149
|
-
res_to_item = if to_item
|
150
|
-
to_item == "view" ? @view : @subviews[to_item]
|
151
|
-
end
|
152
|
-
res_to_item_attribute = ATTRIBUTE_LOOKUP[to_item_attribute]
|
153
|
-
res_multiplier = multiplier ? Float(multiplier) : 1.0
|
149
|
+
res_item = view_for_item(item)
|
154
150
|
res_constant = constant ? Float(PRIORITY_LOOKUP[constant] || constant) : 0.0
|
155
|
-
res_priority = priority ? Integer(PRIORITY_LOOKUP[priority] || priority) : nil
|
156
151
|
|
157
152
|
if res_item
|
158
153
|
case item_attribute
|
@@ -167,6 +162,13 @@ module RMExtensions
|
|
167
162
|
end
|
168
163
|
end
|
169
164
|
|
165
|
+
res_item_attribute = ATTRIBUTE_LOOKUP[item_attribute]
|
166
|
+
res_related_by = RELATED_BY_LOOKUP[related_by]
|
167
|
+
res_to_item = to_item ? view_for_item(to_item) : nil
|
168
|
+
res_to_item_attribute = ATTRIBUTE_LOOKUP[to_item_attribute]
|
169
|
+
res_multiplier = multiplier ? Float(multiplier) : 1.0
|
170
|
+
res_priority = priority ? Integer(PRIORITY_LOOKUP[priority] || priority) : nil
|
171
|
+
|
170
172
|
errors = []
|
171
173
|
errors.push("Invalid view1: #{item}") unless res_item
|
172
174
|
errors.push("Invalid attr1: #{item_attribute}") unless res_item_attribute
|
@@ -226,5 +228,15 @@ module RMExtensions
|
|
226
228
|
"#{item}.#{item_attribute} #{related_by} #{to_item}.#{to_item_attribute} * #{multiplier} + #{constant} @ #{priority}"
|
227
229
|
end
|
228
230
|
|
231
|
+
private
|
232
|
+
|
233
|
+
def view_for_item(item)
|
234
|
+
if item == "view"
|
235
|
+
@view
|
236
|
+
elsif v = (@subviews && @subviews[item])
|
237
|
+
v
|
238
|
+
end
|
239
|
+
end
|
240
|
+
|
229
241
|
end
|
230
242
|
end
|
data/lib/motion/observation.rb
CHANGED
@@ -5,7 +5,7 @@ module RMExtensions
|
|
5
5
|
module Observation
|
6
6
|
|
7
7
|
def rmext_observation_proxy
|
8
|
-
@rmext_observation_proxy ||= ObservationProxy.new(self
|
8
|
+
@rmext_observation_proxy ||= ObservationProxy.new(self)
|
9
9
|
end
|
10
10
|
|
11
11
|
# observe an object.key. takes a block that will be called with the
|
@@ -82,21 +82,30 @@ module RMExtensions
|
|
82
82
|
COLLECTION_OPERATIONS = [ NSKeyValueChangeInsertion, NSKeyValueChangeRemoval, NSKeyValueChangeReplacement ]
|
83
83
|
DEFAULT_OPTIONS = NSKeyValueObservingOptionNew
|
84
84
|
|
85
|
-
def initialize(
|
86
|
-
|
85
|
+
def initialize(obj)
|
86
|
+
obj.rmext_on_dealloc do |x|
|
87
|
+
cleanup
|
88
|
+
end
|
89
|
+
@desc = obj.inspect
|
87
90
|
@events = {}
|
88
91
|
@targets = {}
|
89
|
-
|
92
|
+
if ::RMExtensions.debug?
|
93
|
+
p "created ObservationProxy for #{@desc}"
|
94
|
+
end
|
90
95
|
end
|
91
96
|
|
92
|
-
# clean up on dellocation
|
93
97
|
def dealloc
|
94
|
-
|
95
|
-
|
98
|
+
@did_dealloc = true
|
99
|
+
if ::RMExtensions.debug?
|
100
|
+
p "dealloc ObservationProxy for #{@desc}"
|
101
|
+
end
|
96
102
|
super
|
97
103
|
end
|
98
104
|
|
99
105
|
def cleanup
|
106
|
+
if ::RMExtensions.debug?
|
107
|
+
p "cleanup #{@desc}"
|
108
|
+
end
|
100
109
|
unobserve_all
|
101
110
|
off_all
|
102
111
|
true
|
@@ -150,13 +159,16 @@ module RMExtensions
|
|
150
159
|
# NSKeyValueObserving Protocol
|
151
160
|
|
152
161
|
def observeValueForKeyPath(key_path, ofObject:target, change:change, context:context)
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
162
|
+
rmext_on_main_q do
|
163
|
+
next if @did_dealloc
|
164
|
+
next if target.nil?
|
165
|
+
key_paths = @targets[target] || {}
|
166
|
+
blocks = key_paths[key_path] || []
|
167
|
+
blocks.each do |block|
|
168
|
+
args = [ change[NSKeyValueChangeNewKey] ]
|
169
|
+
args << change[NSKeyValueChangeIndexesKey] if collection?(change)
|
170
|
+
block.call(*args)
|
171
|
+
end
|
160
172
|
end
|
161
173
|
end
|
162
174
|
|
data/lib/motion/util.rb
CHANGED
data/lib/rm-extensions.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rm-extensions
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Joe Noon
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-08-
|
11
|
+
date: 2013-08-22 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: Extensions and helpers for dealing with various areas of rubymotion
|
14
14
|
email:
|
@@ -24,6 +24,7 @@ files:
|
|
24
24
|
- Rakefile
|
25
25
|
- app/app_delegate.rb
|
26
26
|
- lib/motion/accessors.rb
|
27
|
+
- lib/motion/deallocation.rb
|
27
28
|
- lib/motion/layout.rb
|
28
29
|
- lib/motion/observation.rb
|
29
30
|
- lib/motion/queues.rb
|