motion-prime 0.4.2 → 0.4.3
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 +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
|