motion-prime 0.4.2 → 0.4.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +8 -8
- data/CHANGELOG.md +6 -0
- data/Gemfile +1 -1
- data/Gemfile.lock +6 -9
- data/files/Gemfile +2 -2
- data/files/Rakefile +1 -1
- data/motion-prime.gemspec +0 -1
- data/motion-prime/elements/_content_padding_mixin.rb +1 -1
- data/motion-prime/elements/_content_text_mixin.rb +1 -1
- data/motion-prime/elements/base_element.rb +19 -16
- data/motion-prime/elements/button.rb +1 -1
- data/motion-prime/elements/draw.rb +12 -3
- data/motion-prime/elements/draw/_draw_background_mixin.rb +2 -4
- data/motion-prime/elements/draw/image.rb +5 -12
- data/motion-prime/elements/draw/label.rb +1 -1
- data/motion-prime/elements/table_view_cell.rb +1 -1
- data/motion-prime/elements/text_field.rb +1 -1
- data/motion-prime/elements/text_view.rb +1 -1
- data/motion-prime/helpers/has_class_factory.rb +33 -0
- data/motion-prime/helpers/has_style_chain_builder.rb +10 -1
- data/motion-prime/models/sync.rb +2 -2
- data/motion-prime/mp.rb +11 -0
- data/motion-prime/screens/_base_mixin.rb +1 -3
- data/motion-prime/screens/_navigation_mixin.rb +1 -1
- data/motion-prime/screens/base_screen.rb +8 -5
- data/motion-prime/screens/sidebar_container_screen.rb +2 -1
- data/motion-prime/sections/_cell_section_mixin.rb +11 -0
- data/motion-prime/sections/base_section.rb +3 -1
- data/motion-prime/sections/form.rb +2 -10
- data/motion-prime/sections/tabbed.rb +2 -2
- data/motion-prime/sections/table.rb +35 -22
- data/motion-prime/styles/_mixins.rb +6 -1
- data/motion-prime/styles/form.rb +1 -1
- data/motion-prime/support/{dm_button.rb → mp_button.rb} +1 -1
- data/motion-prime/support/{dm_cell_with_section.rb → mp_cell_with_section.rb} +1 -1
- data/motion-prime/support/{ui_search_bar_custom.rb → mp_search_bar_custom.rb} +1 -1
- data/motion-prime/support/{dm_text_field.rb → mp_text_field.rb} +2 -2
- data/motion-prime/support/{dm_text_view.rb → mp_text_view.rb} +1 -1
- data/motion-prime/support/{dm_view_controller.rb → mp_view_controller.rb} +1 -1
- data/motion-prime/support/{dm_view_with_section.rb → mp_view_with_section.rb} +1 -1
- data/motion-prime/support/tab_bar_controller.rb +0 -1
- data/motion-prime/version.rb +1 -1
- data/motion-prime/views/layout.rb +2 -2
- data/motion-prime/views/view_builder.rb +2 -1
- data/motion-prime/views/view_styler.rb +12 -9
- data/spec/screens/base_screen_spec.rb +2 -1
- metadata +10 -24
- data/motion-prime/support/navigation_controller.rb +0 -4
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
ZWVmZmZjNDVhMTMxZGE4ZjMzMWQyMzM0OWU4NDMzZGUzMjdmZTNjMQ==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
ZDBkMTNhODQzYjQyZGMwOTI1ZTEwYWM2NzUyNTFjZDJhYTBiODUyZg==
|
7
7
|
!binary "U0hBNTEy":
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
NDJkY2JmMzAzMWFmY2QyODM0Yzg1ODllMjRmNDY2MWIzMTk5MDRlMDI5NWQ1
|
10
|
+
NTIwZmJmYWE5Y2U2NzZjNWM3NGUwMTVkNDM0YzAyYzNiZjNlMDVkYmUwZGEw
|
11
|
+
NTkxNWJlY2U5ODM4NTIyNWNhN2I2M2UzZTRiYmYyMDllYWM0NDc=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
NTU5YzUwZmUwYWVhYWNiYzc0YWIzOGU4NzMxMDE4NGJkMjUyN2QxZjBkMGY3
|
14
|
+
ZWJjMmMwN2E4YmZkMGM0YWZkZWI0NTBlYzIzYmEyM2NmNjVmNTJiNWUyZjZh
|
15
|
+
M2Y0Yjk2MjYzNGI1NDkwZjU0NjNlYTMyNzUyMjY1YzQ4OTZkOTc=
|
data/CHANGELOG.md
CHANGED
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,20 +1,19 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
motion-prime (0.4.
|
4
|
+
motion-prime (0.4.3)
|
5
5
|
bubble-wrap
|
6
6
|
cocoapods
|
7
7
|
methadone
|
8
8
|
motion-cocoapods
|
9
9
|
motion-require
|
10
10
|
motion-support
|
11
|
-
nano-store
|
12
11
|
sugarcube
|
13
12
|
|
14
13
|
GEM
|
15
14
|
remote: http://rubygems.org/
|
16
15
|
specs:
|
17
|
-
activesupport (3.2.
|
16
|
+
activesupport (3.2.16)
|
18
17
|
i18n (~> 0.6, >= 0.6.4)
|
19
18
|
multi_json (~> 1.0)
|
20
19
|
bubble-wrap (1.3.0)
|
@@ -38,7 +37,7 @@ GEM
|
|
38
37
|
colored (1.2)
|
39
38
|
escape (0.0.4)
|
40
39
|
fuzzy_match (2.0.4)
|
41
|
-
i18n (0.6.
|
40
|
+
i18n (0.6.9)
|
42
41
|
json (1.8.1)
|
43
42
|
json_pure (1.8.1)
|
44
43
|
methadone (1.3.1)
|
@@ -51,12 +50,10 @@ GEM
|
|
51
50
|
motion-support (0.2.5)
|
52
51
|
motion-require (>= 0.0.6)
|
53
52
|
multi_json (1.8.2)
|
54
|
-
|
55
|
-
motion-cocoapods (>= 1.2.1)
|
56
|
-
nap (0.5.1)
|
53
|
+
nap (0.6.0)
|
57
54
|
open4 (1.3.0)
|
58
55
|
rake (10.1.0)
|
59
|
-
sugarcube (
|
56
|
+
sugarcube (1.3.7)
|
60
57
|
xcodeproj (0.14.1)
|
61
58
|
activesupport (~> 3.0)
|
62
59
|
colored (~> 1.2)
|
@@ -73,4 +70,4 @@ DEPENDENCIES
|
|
73
70
|
motion-stump
|
74
71
|
motion-support (~> 0.2.4)
|
75
72
|
rake
|
76
|
-
sugarcube (~>
|
73
|
+
sugarcube (~> 1.3.7)
|
data/files/Gemfile
CHANGED
@@ -2,7 +2,7 @@ source 'http://rubygems.org'
|
|
2
2
|
|
3
3
|
gem 'motion-cocoapods', '~> 1.4.0'
|
4
4
|
gem 'motion-support', '~> 0.2.4'
|
5
|
-
gem 'sugarcube', '~>
|
5
|
+
gem 'sugarcube', '~> 1.3.7', require: 'sugarcube-classic'
|
6
6
|
gem 'bubble-wrap', '~> 1.3.0'
|
7
7
|
|
8
|
-
gem 'motion-prime', '~> 0.
|
8
|
+
gem 'motion-prime', '~> 0.4.2'
|
data/files/Rakefile
CHANGED
data/motion-prime.gemspec
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
motion_require '../helpers/has_normalizer'
|
2
2
|
motion_require '../helpers/has_style_chain_builder'
|
3
|
+
motion_require '../helpers/has_class_factory'
|
3
4
|
module MotionPrime
|
4
5
|
class BaseElement
|
5
6
|
# MotionPrime::BaseElement is container for UIView class elements with options.
|
@@ -8,6 +9,8 @@ module MotionPrime
|
|
8
9
|
include ::MotionSupport::Callbacks
|
9
10
|
include HasNormalizer
|
10
11
|
include HasStyleChainBuilder
|
12
|
+
include HasClassFactory
|
13
|
+
extend HasClassFactory
|
11
14
|
|
12
15
|
attr_accessor :options, :section, :name,
|
13
16
|
:view_class, :view, :view_name, :styles, :screen
|
@@ -20,7 +23,7 @@ module MotionPrime
|
|
20
23
|
@section = options[:section]
|
21
24
|
@name = options[:name]
|
22
25
|
@block = options[:block]
|
23
|
-
@view_class = options[:view_class] ||
|
26
|
+
@view_class = options[:view_class] || 'UIView'
|
24
27
|
@view_name = self.class_name_without_kvo.demodulize.underscore.gsub(/(_draw)?_element/, '')
|
25
28
|
end
|
26
29
|
|
@@ -31,7 +34,7 @@ module MotionPrime
|
|
31
34
|
end
|
32
35
|
|
33
36
|
def render!(&block)
|
34
|
-
screen.add_view view_class
|
37
|
+
screen.add_view class_factory(view_class), computed_options do |view|
|
35
38
|
@view = view
|
36
39
|
block.try(:call, view, self)
|
37
40
|
end
|
@@ -97,14 +100,16 @@ module MotionPrime
|
|
97
100
|
# following example in Prime::TableSection#cell_styles
|
98
101
|
# form element/cell: <base|user>_form_field, <base|user>_form_string_field, user_form_field_email
|
99
102
|
# table element/cell: <base|categories>_table_cell, categories_table_title
|
100
|
-
|
101
|
-
|
103
|
+
if section.section_styles
|
104
|
+
section.section_styles.each { |type, values| base_styles[type] += values }
|
105
|
+
end
|
106
|
+
if %w[base table_view_cell].exclude?(@view_name)
|
102
107
|
# form element: _input
|
103
108
|
# table element: _image
|
104
109
|
suffixes[:common] << @view_name.to_sym
|
105
110
|
suffixes[:common] << :"#{@view_name}_with_errors" if has_errors
|
106
111
|
end
|
107
|
-
if name && name.to_s != @view_name
|
112
|
+
if name && name.to_s != @view_name
|
108
113
|
# form element: _input
|
109
114
|
# table element: _icon
|
110
115
|
suffixes[:specific] << name.to_sym
|
@@ -118,7 +123,7 @@ module MotionPrime
|
|
118
123
|
build_styles_chain(base_styles[:common], suffixes[:common])
|
119
124
|
elsif suffixes[:specific].any?
|
120
125
|
build_styles_chain(base_styles[:common], suffixes[:specific])
|
121
|
-
elsif @view_name
|
126
|
+
elsif @view_name == 'table_view_cell'
|
122
127
|
base_styles[:common]
|
123
128
|
end
|
124
129
|
@styles += Array.wrap(common_styles)
|
@@ -129,7 +134,7 @@ module MotionPrime
|
|
129
134
|
# table element: categories_table_cell_image, categories_table_title_image
|
130
135
|
specific_base_common_suffix_styles = if suffixes[:common].any?
|
131
136
|
build_styles_chain(base_styles[:specific], suffixes[:common])
|
132
|
-
elsif suffixes[:specific].empty? && @view_name
|
137
|
+
elsif suffixes[:specific].empty? && @view_name == 'table_view_cell'
|
133
138
|
base_styles[:specific]
|
134
139
|
end
|
135
140
|
@styles += Array.wrap(specific_base_common_suffix_styles)
|
@@ -144,20 +149,18 @@ module MotionPrime
|
|
144
149
|
# custom style (from options or block options), using for TableViews as well
|
145
150
|
custom_styles = style_sources.map do |source|
|
146
151
|
normalize_object(source.delete(:styles), section)
|
147
|
-
end.
|
152
|
+
end.flatten
|
148
153
|
@styles += custom_styles
|
149
|
-
#
|
154
|
+
#puts @view_class.to_s + @styles.inspect, ''
|
150
155
|
end
|
151
156
|
|
152
157
|
class << self
|
153
158
|
def factory(type, options = {})
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
self.new(options)
|
160
|
-
end
|
159
|
+
element_class = class_factory("#{type}_element", true) || self
|
160
|
+
view_class_name = camelize_factory("ui_#{type}")
|
161
|
+
|
162
|
+
options.merge!(view_class: view_class_name)
|
163
|
+
element_class.new(options)
|
161
164
|
end
|
162
165
|
def before_render(method_name)
|
163
166
|
set_callback :render, :before, method_name
|
@@ -51,6 +51,16 @@ module MotionPrime
|
|
51
51
|
section.bind_gesture_on_container_for(self, action, receiver)
|
52
52
|
end
|
53
53
|
|
54
|
+
def hide
|
55
|
+
computed_options[:hidden] = true
|
56
|
+
view.setNeedsDisplay
|
57
|
+
end
|
58
|
+
|
59
|
+
def show
|
60
|
+
computed_options[:hidden] = false
|
61
|
+
view.setNeedsDisplay
|
62
|
+
end
|
63
|
+
|
54
64
|
private
|
55
65
|
def reset_computed_values
|
56
66
|
@computed_frame = nil
|
@@ -58,9 +68,8 @@ module MotionPrime
|
|
58
68
|
|
59
69
|
class << self
|
60
70
|
def factory(type, options = {})
|
61
|
-
return unless %w[
|
62
|
-
|
63
|
-
"MotionPrime::#{class_name}".constantize.new(options)
|
71
|
+
return unless %w[view label image].include?(type.to_s.downcase)
|
72
|
+
class_factory("#{type}_draw_element", true).new(options)
|
64
73
|
end
|
65
74
|
end
|
66
75
|
end
|
@@ -1,16 +1,14 @@
|
|
1
1
|
module MotionPrime
|
2
2
|
module DrawBackgroundMixin
|
3
3
|
def draw_background_in(draw_rect, options)
|
4
|
-
|
5
4
|
bg_color = options[:background_color]
|
6
5
|
border_radius = options[:layer].try(:[], :corner_radius)
|
7
6
|
border_width = options[:layer].try(:[], :border_width).to_f
|
8
7
|
border_color = options[:layer].try(:[], :border_color) || bg_color || :black
|
9
8
|
|
10
|
-
|
11
|
-
inset = border_width > 0 ? (border_width - 1 )*0.5 : 0
|
12
|
-
rect = CGRectInset(draw_rect, -inset, -inset)
|
13
9
|
if bg_color || border_width > 0
|
10
|
+
inset = border_width > 0 ? (border_width - 1 )*0.5 : 0
|
11
|
+
rect = CGRectInset(draw_rect, -inset, -inset)
|
14
12
|
if border_radius
|
15
13
|
bezierPath = UIBezierPath.bezierPathWithRoundedRect rect, cornerRadius: border_radius
|
16
14
|
if border_width > 0
|
@@ -52,26 +52,19 @@ module MotionPrime
|
|
52
52
|
end
|
53
53
|
|
54
54
|
def draw_with_layer(image, rect)
|
55
|
+
layer = CALayer.layer
|
56
|
+
layer.contents = image.CGImage
|
57
|
+
layer.frame = rect
|
58
|
+
layer.bounds = rect
|
55
59
|
if computed_options[:layer]
|
56
|
-
layer = CALayer.layer
|
57
|
-
layer.frame = CGRectMake(0, 0, image.size.width, image.size.height)
|
58
|
-
layer.contents = image.CGImage
|
59
|
-
|
60
60
|
layer.masksToBounds = computed_options[:layer][:masks_to_bounds] || computed_options[:clips_to_bounds]
|
61
61
|
if radius = computed_options[:layer][:corner_radius]
|
62
62
|
k = image.size.width / rect.size.width
|
63
63
|
radius = radius * k
|
64
64
|
layer.cornerRadius = radius
|
65
65
|
end
|
66
|
-
|
67
|
-
UIGraphicsBeginImageContext(image.size)
|
68
|
-
layer.renderInContext(UIGraphicsGetCurrentContext())
|
69
|
-
image = UIGraphicsGetImageFromCurrentImageContext()
|
70
|
-
UIGraphicsEndImageContext()
|
71
|
-
image.drawInRect(rect)
|
72
|
-
else
|
73
|
-
image.drawInRect(rect)
|
74
66
|
end
|
67
|
+
view.layer.addSublayer layer
|
75
68
|
end
|
76
69
|
end
|
77
70
|
end
|
@@ -23,7 +23,7 @@ module MotionPrime
|
|
23
23
|
color = (options[:text_color] || :black).uicolor
|
24
24
|
font = (options[:font] || :system).uifont
|
25
25
|
alignment = (options.has_key?(:text_alignment) ? options[:text_alignment] : :left).uitextalignment
|
26
|
-
line_break_mode = (options.has_key?(:line_break_mode) ? options[:line_break_mode] : :
|
26
|
+
line_break_mode = (options.has_key?(:line_break_mode) ? options[:line_break_mode] : :tail_truncation).uilinebreakmode
|
27
27
|
label_text = options[:text].to_s.gsub(/^[\n\r]+/, '')
|
28
28
|
|
29
29
|
top_left_corner = CGPointMake(computed_inner_left, computed_inner_top)
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# These things required because camelize/constantize/classify methods are very slow
|
2
|
+
module MotionPrime
|
3
|
+
module HasClassFactory
|
4
|
+
def class_factory(name, is_mp_class = false)
|
5
|
+
if is_mp_class
|
6
|
+
value = Prime.class_factory_cache["motion_prime/#{name}"]
|
7
|
+
return value if value
|
8
|
+
class_name = camelize_factory(name)
|
9
|
+
|
10
|
+
return nil unless MotionPrime.const_defined?(class_name)
|
11
|
+
class_name = "MotionPrime::#{class_name}"
|
12
|
+
name = "motion_prime/#{name}"
|
13
|
+
else
|
14
|
+
value = Prime.class_factory_cache[name]
|
15
|
+
return value if value
|
16
|
+
class_name = camelize_factory(name)
|
17
|
+
end
|
18
|
+
Prime.class_factory_cache[name] = class_name.constantize
|
19
|
+
end
|
20
|
+
|
21
|
+
def camelize_factory(name)
|
22
|
+
value = Prime.camelize_factory_cache[name]
|
23
|
+
return value if value
|
24
|
+
Prime.camelize_factory_cache[name] = name.camelize
|
25
|
+
end
|
26
|
+
|
27
|
+
def low_camelize_factory(name)
|
28
|
+
value = Prime.low_camelize_factory_cache[name]
|
29
|
+
return value if value
|
30
|
+
Prime.low_camelize_factory_cache[name] = name.camelize(:lower)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -1,7 +1,16 @@
|
|
1
1
|
module MotionPrime
|
2
2
|
module HasStyleChainBuilder
|
3
3
|
def build_styles_chain(base_styles, suffixes)
|
4
|
-
|
4
|
+
styles = []
|
5
|
+
[*base_styles].each do |base_style|
|
6
|
+
[*suffixes].each do |suffix|
|
7
|
+
components = []
|
8
|
+
components << base_style.to_s if base_style.present?
|
9
|
+
components << suffix.to_s if suffix.present?
|
10
|
+
styles << components.join('_').to_sym if components.present?
|
11
|
+
end
|
12
|
+
end
|
13
|
+
styles
|
5
14
|
end
|
6
15
|
end
|
7
16
|
end
|
data/motion-prime/models/sync.rb
CHANGED
@@ -161,7 +161,7 @@ module MotionPrime
|
|
161
161
|
data.each do |attributes|
|
162
162
|
model = old_collection.detect{ |model| model.id == attributes[:id]}
|
163
163
|
unless model
|
164
|
-
model = key.
|
164
|
+
model = key.classify.constantize.new
|
165
165
|
self.send(:"#{key}_bag") << model
|
166
166
|
end
|
167
167
|
model.fetch_with_attributes(attributes)
|
@@ -191,7 +191,7 @@ module MotionPrime
|
|
191
191
|
if data.present?
|
192
192
|
model = self.send(key)
|
193
193
|
unless model
|
194
|
-
model = key.
|
194
|
+
model = key.classify.constantize.new
|
195
195
|
self.send(:"#{key}_bag") << model
|
196
196
|
end
|
197
197
|
model.fetch_with_attributes(data)
|
data/motion-prime/mp.rb
CHANGED
@@ -1,4 +1,15 @@
|
|
1
1
|
module MotionPrime
|
2
|
+
def self.class_factory_cache
|
3
|
+
@class_factory_cache ||= {}
|
4
|
+
end
|
5
|
+
|
6
|
+
def self.camelize_factory_cache
|
7
|
+
@camelize_factory_cache ||= {}
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.low_camelize_factory_cache
|
11
|
+
@camelize_factory_cache ||= {}
|
12
|
+
end
|
2
13
|
end
|
3
14
|
::MP = MotionPrime unless defined?(::MP)
|
4
15
|
::Prime = MotionPrime unless defined?(::Prime)
|
@@ -35,7 +35,7 @@ module MotionPrime
|
|
35
35
|
end
|
36
36
|
end
|
37
37
|
|
38
|
-
# Setup the screen, will be called when you run
|
38
|
+
# Setup the screen, will be called when you run MPViewController.new
|
39
39
|
# @param options [hash] Options passed to setup
|
40
40
|
# @return [MotionPrime::BaseScreen] Ready to use screen
|
41
41
|
def on_create(options = {})
|
@@ -48,8 +48,6 @@ module MotionPrime
|
|
48
48
|
options.each do |k, v|
|
49
49
|
self.send("#{k}=", v) if self.respond_to?("#{k}=")
|
50
50
|
end
|
51
|
-
|
52
|
-
self.on_init if respond_to?(:on_init)
|
53
51
|
self
|
54
52
|
end
|
55
53
|
|
@@ -107,7 +107,7 @@ module MotionPrime
|
|
107
107
|
end
|
108
108
|
|
109
109
|
def wrap_in_navigation!
|
110
|
-
self.navigation_controller =
|
110
|
+
self.navigation_controller = UINavigationController.alloc.initWithRootViewController(self)
|
111
111
|
end
|
112
112
|
end
|
113
113
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
motion_require '../support/
|
1
|
+
motion_require '../support/mp_view_controller.rb'
|
2
2
|
motion_require '../views/layout.rb'
|
3
3
|
motion_require '../screens/_base_mixin.rb'
|
4
4
|
motion_require './extensions/_indicators_mixin'
|
@@ -6,7 +6,7 @@ motion_require './extensions/_navigation_bar_mixin'
|
|
6
6
|
motion_require '../helpers/has_authorization'
|
7
7
|
motion_require '../helpers/has_search_bar'
|
8
8
|
module MotionPrime
|
9
|
-
class BaseScreen <
|
9
|
+
class BaseScreen < MPViewController
|
10
10
|
include Layout
|
11
11
|
include ScreenBaseMixin
|
12
12
|
|
@@ -25,10 +25,13 @@ module MotionPrime
|
|
25
25
|
[:base_screen, self.class_name_without_kvo.underscore.to_sym]
|
26
26
|
end
|
27
27
|
|
28
|
-
def
|
29
|
-
|
30
|
-
|
28
|
+
def will_appear
|
29
|
+
unless @on_appear_happened
|
30
|
+
setup view, styles: default_styles do
|
31
|
+
render
|
32
|
+
end
|
31
33
|
end
|
34
|
+
@on_appear_happened = true
|
32
35
|
end
|
33
36
|
end
|
34
37
|
end
|
@@ -5,6 +5,7 @@ module MotionPrime
|
|
5
5
|
def self.new(menu, content, options={})
|
6
6
|
screen = self.alloc.initWithContentViewController(nil, menuViewController: nil)
|
7
7
|
screen.backgroundImage = MotionPrime::Config.sidebar.background_image
|
8
|
+
screen.parallaxEnabled = false
|
8
9
|
|
9
10
|
full_width = UIScreen.mainScreen.bounds.size.width
|
10
11
|
|
@@ -58,7 +59,7 @@ module MotionPrime
|
|
58
59
|
private
|
59
60
|
|
60
61
|
def should_reinit_content?(new_controller)
|
61
|
-
content_controller.nil? ||
|
62
|
+
content_controller.nil? ||
|
62
63
|
content_controller.is_a?(TabBarController) ||
|
63
64
|
new_controller.is_a?(TabBarController)
|
64
65
|
end
|
@@ -23,5 +23,16 @@ module MotionPrime
|
|
23
23
|
name.gsub("#{table_name}_", '')
|
24
24
|
end
|
25
25
|
end
|
26
|
+
|
27
|
+
def load_container_element(options = {})
|
28
|
+
@container_element ||= begin
|
29
|
+
options.merge!({
|
30
|
+
screen: screen,
|
31
|
+
section: self,
|
32
|
+
has_drawn_content: true
|
33
|
+
})
|
34
|
+
MotionPrime::BaseElement.factory(:table_view_cell, options)
|
35
|
+
end
|
36
|
+
end
|
26
37
|
end
|
27
38
|
end
|
@@ -17,6 +17,7 @@ module MotionPrime
|
|
17
17
|
include ::MotionSupport::Callbacks
|
18
18
|
include HasAuthorization
|
19
19
|
include HasNormalizer
|
20
|
+
include HasClassFactory
|
20
21
|
include DrawMixin
|
21
22
|
|
22
23
|
attr_accessor :screen, :model, :name, :options, :elements, :section_styles
|
@@ -88,6 +89,7 @@ module MotionPrime
|
|
88
89
|
|
89
90
|
def load_elements
|
90
91
|
self.elements.values.each do |element|
|
92
|
+
element.size_to_fit_if_needed if element.is_a?(LabelDrawElement)
|
91
93
|
element.computed_options if element.respond_to?(:computed_options)
|
92
94
|
end
|
93
95
|
end
|
@@ -198,7 +200,7 @@ module MotionPrime
|
|
198
200
|
views = Array.wrap(keyboard_close_bindings_options[:views])
|
199
201
|
|
200
202
|
elements.each { |el| views << el.view if %w[text_field text_view].include?(el.view_name) && el.view }
|
201
|
-
|
203
|
+
views.compact.each(&:resignFirstResponder)
|
202
204
|
end
|
203
205
|
|
204
206
|
protected
|
@@ -54,14 +54,6 @@ module MotionPrime
|
|
54
54
|
self.table_element = screen.table_view(options)
|
55
55
|
end
|
56
56
|
|
57
|
-
def render_cell(index, table)
|
58
|
-
field = rows_for_section(index.section)[index.row]
|
59
|
-
screen.table_view_cell section: field, reuse_identifier: cell_name(table, index), parent_view: table_view do |container_view, container_element|
|
60
|
-
field.container_element = container_element
|
61
|
-
field.render
|
62
|
-
end
|
63
|
-
end
|
64
|
-
|
65
57
|
def reload_cell(section)
|
66
58
|
field = section.name.to_sym
|
67
59
|
index = field_indexes[field].split('_').map(&:to_i)
|
@@ -218,8 +210,8 @@ module MotionPrime
|
|
218
210
|
end
|
219
211
|
|
220
212
|
def load_field(field)
|
221
|
-
|
222
|
-
|
213
|
+
field_class = class_factory("#{field[:type]}_field_section", true)
|
214
|
+
field_class.new(field.merge(screen: screen, table: self))
|
223
215
|
end
|
224
216
|
|
225
217
|
def render_field?(name, options)
|
@@ -103,8 +103,8 @@ module MotionPrime
|
|
103
103
|
self.tab_pages = []
|
104
104
|
index = 0
|
105
105
|
tab_options.each do |key, options|
|
106
|
-
|
107
|
-
page =
|
106
|
+
page_class = class_factory("/#{options[:page_section]}_section")
|
107
|
+
page = page_class.new(screen: screen, model: model)
|
108
108
|
page.render
|
109
109
|
page.hide if index != tab_default
|
110
110
|
self.tab_pages << page
|
@@ -117,13 +117,18 @@ module MotionPrime
|
|
117
117
|
end
|
118
118
|
|
119
119
|
def render_cell(index, table)
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
item.container_element = container_element
|
125
|
-
item.render
|
120
|
+
section = rows_for_section(index.section)[index.row]
|
121
|
+
cell_element = container_element_for(index)
|
122
|
+
cell_view = cell_element.render do
|
123
|
+
section.render
|
126
124
|
end
|
125
|
+
|
126
|
+
@rendered_cells[index.section][index.row] = cell_view
|
127
|
+
on_row_render(cell_view, index)
|
128
|
+
|
129
|
+
preload_sections_for(index)
|
130
|
+
|
131
|
+
cell_view
|
127
132
|
end
|
128
133
|
|
129
134
|
def on_row_render(cell, index); end
|
@@ -148,12 +153,7 @@ module MotionPrime
|
|
148
153
|
@rendered_cells ||= []
|
149
154
|
@rendered_cells[index.section] ||= []
|
150
155
|
|
151
|
-
cell = cached_cell(index, table) || render_cell(index, table)
|
152
|
-
@rendered_cells[index.section][index.row] = cell
|
153
|
-
on_row_render(cell, index)
|
154
|
-
|
155
|
-
preload_sections_for(index)
|
156
|
-
end
|
156
|
+
cell = cached_cell(index, table) || render_cell(index, table)
|
157
157
|
|
158
158
|
# run table view is appeared callback if needed
|
159
159
|
if !@did_appear && index.row == rows_for_section(index.section).size - 1
|
@@ -203,6 +203,16 @@ module MotionPrime
|
|
203
203
|
def on_async_data_loaded; end
|
204
204
|
def on_async_data_preloaded(loaded_index); end
|
205
205
|
|
206
|
+
def cell_name(table, index)
|
207
|
+
record = row_by_index(index)
|
208
|
+
if record && record.model &&
|
209
|
+
record.model.respond_to?(:id) && record.model.id.present?
|
210
|
+
"cell_#{record.model.id}_#{data_stamp_for("#{index.section}_#{index.row}")}"
|
211
|
+
else
|
212
|
+
"cell_#{index.section}_#{index.row}_#{data_stamp_for("#{index.section}_#{index.row}")}"
|
213
|
+
end
|
214
|
+
end
|
215
|
+
|
206
216
|
private
|
207
217
|
def set_table_data
|
208
218
|
cells = async_data? ? load_sections_async : table_data
|
@@ -225,16 +235,6 @@ module MotionPrime
|
|
225
235
|
end
|
226
236
|
end
|
227
237
|
|
228
|
-
def cell_name(table, index)
|
229
|
-
record = row_by_index(index)
|
230
|
-
if record && record.model &&
|
231
|
-
record.model.respond_to?(:id) && record.model.id.present?
|
232
|
-
"cell_#{record.model.id}_#{data_stamp_for("#{index.section}_#{index.row}")}"
|
233
|
-
else
|
234
|
-
"cell_#{index.section}_#{index.row}_#{data_stamp_for("#{index.section}_#{index.row}")}"
|
235
|
-
end
|
236
|
-
end
|
237
|
-
|
238
238
|
def cached_cell(index, table = nil)
|
239
239
|
table ||= self.table_view
|
240
240
|
table.dequeueReusableCellWithIdentifier(cell_name(table, index))
|
@@ -252,6 +252,19 @@ module MotionPrime
|
|
252
252
|
cell = rows_for_section(index.section)[index.row]
|
253
253
|
return unless cell.load_section # return if already loaded
|
254
254
|
cell.load_elements
|
255
|
+
if async_data?
|
256
|
+
container_element = container_element_for(index)
|
257
|
+
container_element.computed_options # compute options
|
258
|
+
end
|
259
|
+
end
|
260
|
+
|
261
|
+
def container_element_for(index)
|
262
|
+
cell = rows_for_section(index.section)[index.row]
|
263
|
+
options = {
|
264
|
+
reuse_identifier: cell_name(table_view, index),
|
265
|
+
parent_view: table_view
|
266
|
+
}
|
267
|
+
cell.load_container_element(options)
|
255
268
|
end
|
256
269
|
|
257
270
|
def data_stamp_for(id)
|
@@ -1,8 +1,13 @@
|
|
1
1
|
motion_require '../views/styles.rb'
|
2
2
|
MotionPrime::Styles.define :_mixin do
|
3
|
+
style :label_reset,
|
4
|
+
top: nil, left: nil, height: nil, right: nil, bottom: nil, top: nil,
|
5
|
+
padding: nil, padding_top: nil, padding_left: nil, padding_right: nil, padding_bottom: nil,
|
6
|
+
size_to_fit: false
|
7
|
+
|
3
8
|
style :multiline,
|
4
9
|
size_to_fit: true,
|
5
10
|
number_of_lines: 0,
|
6
|
-
line_break_mode: :
|
11
|
+
line_break_mode: :word_wrap,
|
7
12
|
line_spacing: 2
|
8
13
|
end
|
data/motion-prime/styles/form.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# This class have some modifications for UITextField:
|
2
2
|
# * support padding, padding_left, padding_right options
|
3
3
|
# * support placeholder_color, placeholder_font options
|
4
|
-
class
|
4
|
+
class MPTextField < UITextField
|
5
5
|
include MotionPrime::SupportKeyValueStore
|
6
6
|
include MotionPrime::SupportPaddingAttribute
|
7
7
|
attr_accessor :placeholderColor, :placeholderFont, :readonly, :placeholderAlignment
|
@@ -30,7 +30,7 @@ class DMTextField < UITextField
|
|
30
30
|
color.setFill
|
31
31
|
font = self.placeholderFont || self.font || :system.uifont(16)
|
32
32
|
|
33
|
-
truncation = :
|
33
|
+
truncation = :tail_truncation.uilinebreakmode
|
34
34
|
alignment = (placeholderAlignment || :left)
|
35
35
|
alignment = alignment.uitextalignment if alignment.is_a?(Symbol)
|
36
36
|
self.placeholder.drawInRect(rect, withFont: font, lineBreakMode: truncation, alignment: alignment)
|
@@ -1,7 +1,7 @@
|
|
1
1
|
# This class have some modifications for UITextView:
|
2
2
|
# * support padding, padding_left, padding_right options
|
3
3
|
# * support placeholder, placeholder_color, placeholder_font options
|
4
|
-
class
|
4
|
+
class MPTextView < UITextView
|
5
5
|
include MotionPrime::SupportKeyValueStore
|
6
6
|
include MotionPrime::SupportPaddingAttribute
|
7
7
|
attr_accessor :placeholderColor, :placeholderFont, :placeholder
|
data/motion-prime/version.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
# TODO: make it part of Sections
|
2
|
-
motion_require '../support/
|
2
|
+
motion_require '../support/mp_cell_with_section'
|
3
3
|
module MotionPrime
|
4
4
|
module Layout
|
5
5
|
def add_view(klass, options = {}, &block)
|
@@ -39,7 +39,7 @@ module MotionPrime
|
|
39
39
|
[::UIActionSheet, ::UIActivityIndicatorView, ::UIButton, ::UIDatePicker, ::UIImageView, ::UILabel,
|
40
40
|
::UIPageControl, ::UIPickerView, ::UIProgressView, ::UIScrollView, ::UISearchBar, ::UISegmentedControl,
|
41
41
|
::UISlider, ::UIStepper, ::UISwitch, ::UITabBar, ::UITableView, ::UITableViewCell, ::UITextField, ::UITextView,
|
42
|
-
::UIToolbar, ::UIWebView, ::UINavigationBar, ::
|
42
|
+
::UIToolbar, ::UIWebView, ::UINavigationBar, ::MPCellWithSection, ::MBProgressHUD].each do |klass|
|
43
43
|
|
44
44
|
shorthand = "#{klass}"[2..-1].underscore.to_sym
|
45
45
|
|
@@ -107,10 +107,11 @@ module MotionPrime
|
|
107
107
|
options[:background_color] = :clear
|
108
108
|
options.delete(:gradient)
|
109
109
|
end
|
110
|
+
|
110
111
|
klass.alloc.initWithStyle style, reuseIdentifier: options.delete(:reuse_identifier)
|
111
112
|
},
|
112
113
|
'UISearchBar' => Proc.new{|klass, options|
|
113
|
-
klass = options[:search_field_background_image] ?
|
114
|
+
klass = options[:search_field_background_image] ? MPSearchBarCustom : UISearchBar
|
114
115
|
search_bar = klass.alloc.init
|
115
116
|
search_bar.autoresizingMask = UIViewAutoresizingFlexibleWidth
|
116
117
|
search_bar
|
@@ -2,6 +2,7 @@ module MotionPrime
|
|
2
2
|
class ViewStyler
|
3
3
|
include FrameCalculatorMixin
|
4
4
|
include HasStyles
|
5
|
+
include HasClassFactory
|
5
6
|
|
6
7
|
attr_reader :view, :options
|
7
8
|
|
@@ -13,7 +14,9 @@ module MotionPrime
|
|
13
14
|
|
14
15
|
def apply
|
15
16
|
converted_options = convert_primitives_to_objects(options)
|
16
|
-
|
17
|
+
converted_options.each do |key, value|
|
18
|
+
set_option(key.to_s, value)
|
19
|
+
end
|
17
20
|
end
|
18
21
|
|
19
22
|
def convert_primitives_to_objects(options)
|
@@ -39,7 +42,7 @@ module MotionPrime
|
|
39
42
|
end
|
40
43
|
end
|
41
44
|
|
42
|
-
def
|
45
|
+
def set_option(key, value)
|
43
46
|
# return if value.nil?
|
44
47
|
# ignore options
|
45
48
|
return if key == 'section' && !view.respond_to?(:section=)
|
@@ -56,15 +59,15 @@ module MotionPrime
|
|
56
59
|
if key.end_with?('title_color')
|
57
60
|
view.setTitleColor value.uicolor, forState: UIControlStateNormal
|
58
61
|
elsif key.end_with?('alignment') && value.is_a?(Symbol)
|
59
|
-
view.setValue value.uitextalignment, forKey: key
|
62
|
+
view.setValue value.uitextalignment, forKey: camelize_factory(key)
|
60
63
|
elsif key.end_with?('line_break_mode') && value.is_a?(Symbol)
|
61
|
-
view.setValue value.uilinebreakmode, forKey: key
|
64
|
+
view.setValue value.uilinebreakmode, forKey: camelize_factory(key)
|
62
65
|
elsif key.end_with?('title_shadow_color')
|
63
66
|
view.setTitleShadowColor value.uicolor, forState: UIControlStateNormal
|
64
67
|
elsif key.end_with?('color')
|
65
68
|
color = value.try(:uicolor)
|
66
69
|
color = color.cgcolor if view.is_a?(CALayer)
|
67
|
-
view.send :"#{key
|
70
|
+
view.send :"#{low_camelize_factory(key)}=", color
|
68
71
|
elsif key.end_with?('background_image')
|
69
72
|
if view.is_a?(UIButton)
|
70
73
|
view.setBackgroundImage value.uiimage, forState: UIControlStateNormal
|
@@ -79,10 +82,10 @@ module MotionPrime
|
|
79
82
|
bg_view.backgroundColor = value[:color].uicolor
|
80
83
|
view.backgroundView = bg_view
|
81
84
|
else
|
82
|
-
view.setValue value, forKey: key
|
85
|
+
view.setValue value, forKey: low_camelize_factory(key)
|
83
86
|
end
|
84
87
|
elsif key.end_with?('image')
|
85
|
-
view.setValue value.uiimage, forKey: key
|
88
|
+
view.setValue value.uiimage, forKey: camelize_factory(key)
|
86
89
|
elsif key.end_with?('_content_inset')
|
87
90
|
current_inset = view.contentInset
|
88
91
|
current_inset.send("#{key.partition('_').first}=", value)
|
@@ -144,9 +147,9 @@ module MotionPrime
|
|
144
147
|
view.separatorInset = UIEdgeInsetsMake(0, value.first, 0, value.last)
|
145
148
|
end
|
146
149
|
elsif value.is_a?(Hash)
|
147
|
-
self.class.new(view.send(key
|
150
|
+
self.class.new(view.send(low_camelize_factory(key).to_sym), nil, value.merge(parent_frame: options[:frame] || options[:parent_frame])).apply
|
148
151
|
else
|
149
|
-
view.setValue value, forKey: key
|
152
|
+
view.setValue value, forKey: low_camelize_factory(key)
|
150
153
|
end
|
151
154
|
end
|
152
155
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: motion-prime
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Iskander Haziev
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-12-
|
11
|
+
date: 2013-12-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -136,20 +136,6 @@ dependencies:
|
|
136
136
|
- - ! '>='
|
137
137
|
- !ruby/object:Gem::Version
|
138
138
|
version: '0'
|
139
|
-
- !ruby/object:Gem::Dependency
|
140
|
-
name: nano-store
|
141
|
-
requirement: !ruby/object:Gem::Requirement
|
142
|
-
requirements:
|
143
|
-
- - ! '>='
|
144
|
-
- !ruby/object:Gem::Version
|
145
|
-
version: '0'
|
146
|
-
type: :runtime
|
147
|
-
prerelease: false
|
148
|
-
version_requirements: !ruby/object:Gem::Requirement
|
149
|
-
requirements:
|
150
|
-
- - ! '>='
|
151
|
-
- !ruby/object:Gem::Version
|
152
|
-
version: '0'
|
153
139
|
- !ruby/object:Gem::Dependency
|
154
140
|
name: methadone
|
155
141
|
requirement: !ruby/object:Gem::Requirement
|
@@ -242,6 +228,7 @@ files:
|
|
242
228
|
- motion-prime/elements/text_field.rb
|
243
229
|
- motion-prime/elements/text_view.rb
|
244
230
|
- motion-prime/helpers/has_authorization.rb
|
231
|
+
- motion-prime/helpers/has_class_factory.rb
|
245
232
|
- motion-prime/helpers/has_normalizer.rb
|
246
233
|
- motion-prime/helpers/has_search_bar.rb
|
247
234
|
- motion-prime/helpers/has_style_chain_builder.rb
|
@@ -289,16 +276,15 @@ files:
|
|
289
276
|
- motion-prime/styles/form.rb
|
290
277
|
- motion-prime/support/_key_value_store.rb
|
291
278
|
- motion-prime/support/_padding_attribute.rb
|
292
|
-
- motion-prime/support/
|
293
|
-
- motion-prime/support/
|
294
|
-
- motion-prime/support/dm_text_field.rb
|
295
|
-
- motion-prime/support/dm_text_view.rb
|
296
|
-
- motion-prime/support/dm_view_controller.rb
|
297
|
-
- motion-prime/support/dm_view_with_section.rb
|
279
|
+
- motion-prime/support/mp_button.rb
|
280
|
+
- motion-prime/support/mp_cell_with_section.rb
|
298
281
|
- motion-prime/support/mp_label.rb
|
299
|
-
- motion-prime/support/
|
282
|
+
- motion-prime/support/mp_search_bar_custom.rb
|
283
|
+
- motion-prime/support/mp_text_field.rb
|
284
|
+
- motion-prime/support/mp_text_view.rb
|
285
|
+
- motion-prime/support/mp_view_controller.rb
|
286
|
+
- motion-prime/support/mp_view_with_section.rb
|
300
287
|
- motion-prime/support/tab_bar_controller.rb
|
301
|
-
- motion-prime/support/ui_search_bar_custom.rb
|
302
288
|
- motion-prime/support/ui_view.rb
|
303
289
|
- motion-prime/version.rb
|
304
290
|
- motion-prime/views/_frame_calculator_mixin.rb
|