motion-prime 0.1.0

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.
Files changed (65) hide show
  1. data/.gitignore +17 -0
  2. data/Gemfile +13 -0
  3. data/Gemfile.lock +83 -0
  4. data/README.md +67 -0
  5. data/Rakefile +23 -0
  6. data/app/app_delegate.rb +5 -0
  7. data/doc/SECTION.md +7 -0
  8. data/doc/STYLE.md +39 -0
  9. data/files/Gemfile +3 -0
  10. data/files/Rakefile +16 -0
  11. data/files/app/app_delegate.rb +4 -0
  12. data/files/app/screens/application_screen.rb +3 -0
  13. data/lib/motion-prime.rb +14 -0
  14. data/lib/view_styler.rb +141 -0
  15. data/motion-prime.gemspec +27 -0
  16. data/motion-prime/app_delegate.rb +56 -0
  17. data/motion-prime/elements/base.rb +94 -0
  18. data/motion-prime/elements/button.rb +7 -0
  19. data/motion-prime/elements/draw.rb +56 -0
  20. data/motion-prime/elements/draw/image.rb +43 -0
  21. data/motion-prime/elements/draw/label.rb +13 -0
  22. data/motion-prime/elements/image.rb +14 -0
  23. data/motion-prime/elements/label.rb +20 -0
  24. data/motion-prime/elements/text_field.rb +7 -0
  25. data/motion-prime/elements/text_view.rb +7 -0
  26. data/motion-prime/helpers/has_authorization.rb +10 -0
  27. data/motion-prime/helpers/has_search_bar.rb +25 -0
  28. data/motion-prime/models/base.rb +220 -0
  29. data/motion-prime/screens/_aliases_mixin.rb +32 -0
  30. data/motion-prime/screens/_base_mixin.rb +119 -0
  31. data/motion-prime/screens/_navigation_bar_mixin.rb +57 -0
  32. data/motion-prime/screens/_navigation_mixin.rb +118 -0
  33. data/motion-prime/screens/_orientations_mixin.rb +39 -0
  34. data/motion-prime/screens/base_screen.rb +22 -0
  35. data/motion-prime/screens/sidebar_container_screen.rb +58 -0
  36. data/motion-prime/sections/base.rb +101 -0
  37. data/motion-prime/sections/draw.rb +62 -0
  38. data/motion-prime/sections/form.rb +103 -0
  39. data/motion-prime/sections/form/base_field_section.rb +26 -0
  40. data/motion-prime/sections/form/password_field_section.rb +33 -0
  41. data/motion-prime/sections/form/select_field_section.rb +40 -0
  42. data/motion-prime/sections/form/string_field_section.rb +32 -0
  43. data/motion-prime/sections/form/submit_field_section.rb +20 -0
  44. data/motion-prime/sections/form/text_field_section.rb +33 -0
  45. data/motion-prime/sections/table.rb +97 -0
  46. data/motion-prime/sections/table/refresh_mixin.rb +13 -0
  47. data/motion-prime/styles/forms.rb +93 -0
  48. data/motion-prime/support/_key_value_store.rb +10 -0
  49. data/motion-prime/support/dm_button.rb +22 -0
  50. data/motion-prime/support/dm_cell_with_section.rb +12 -0
  51. data/motion-prime/support/dm_text_field.rb +30 -0
  52. data/motion-prime/support/dm_text_view.rb +93 -0
  53. data/motion-prime/support/dm_view_controller.rb +50 -0
  54. data/motion-prime/support/dm_view_with_section.rb +11 -0
  55. data/motion-prime/support/navigation_controller.rb +4 -0
  56. data/motion-prime/support/ui_search_bar_custom.rb +10 -0
  57. data/motion-prime/support/ui_view.rb +59 -0
  58. data/motion-prime/version.rb +3 -0
  59. data/motion-prime/views/layout.rb +45 -0
  60. data/motion-prime/views/styles.rb +44 -0
  61. data/motion-prime/views/view_builder.rb +80 -0
  62. data/motion-prime/views/view_styler.rb +141 -0
  63. data/resources/Default-568h@2x.png +0 -0
  64. data/spec/main_spec.rb +9 -0
  65. metadata +245 -0
@@ -0,0 +1,4 @@
1
+ module MotionPrime
2
+ class NavigationController < UINavigationController
3
+ end
4
+ end
@@ -0,0 +1,10 @@
1
+ # Search bar with background and no padding
2
+ class UISearchBarCustom < UISearchBar
3
+ def layoutSubviews
4
+ super
5
+ text_field = subviews.detect do |view|
6
+ view.is_a?(UISearchBarTextField)
7
+ end
8
+ text_field.frame = CGRectMake(0, 0, 320, 44)
9
+ end
10
+ end
@@ -0,0 +1,59 @@
1
+ class UIView
2
+ attr_accessor :name
3
+
4
+ def find name
5
+ subviews.each do |subview|
6
+ return subview if subview.name == name
7
+ end
8
+ nil
9
+ end
10
+ alias_method :subview, :find
11
+
12
+ def sibling name
13
+ if superview
14
+ superview.find name
15
+ else
16
+ nil
17
+ end
18
+ end
19
+
20
+ def closest name
21
+ view = sibling name
22
+ if view.nil? && superview
23
+ view = superview.closest name
24
+ end
25
+ view
26
+ end
27
+
28
+ def left
29
+ self.frame.origin.x
30
+ end
31
+
32
+ def setLeft value
33
+ self.frame = [[value, self.frame.origin.y], [self.frame.size.width, self.frame.size.height]]
34
+ end
35
+
36
+ def top
37
+ self.frame.origin.y
38
+ end
39
+
40
+ def setTop value
41
+ self.frame = [[self.frame.origin.x, value], [self.frame.size.width, self.frame.size.height]]
42
+ end
43
+
44
+ def width
45
+ self.frame.size.width
46
+ end
47
+
48
+ def setWidth value
49
+ self.frame = [[self.frame.origin.x, self.frame.origin.y], [value, self.frame.size.height]]
50
+ end
51
+
52
+ def height
53
+ self.frame.size.height
54
+ end
55
+
56
+ def setHeight value
57
+ self.frame = [[self.frame.origin.x, self.frame.origin.y], [self.frame.size.width, value]]
58
+ end
59
+ end
@@ -0,0 +1,3 @@
1
+ module MotionPrime
2
+ VERSION = "0.1.0"
3
+ end
@@ -0,0 +1,45 @@
1
+ # TODO: make it part of Sections
2
+ module MotionPrime
3
+ module Layout
4
+ def setup(view, options = {}, &block)
5
+ ViewStyler.new(view, options.delete(:bounds), options).apply
6
+ view_stack.push(view)
7
+ block.call(view) if block_given?
8
+ view_stack.pop
9
+ end
10
+
11
+ def add_view(klass, options = {}, &block)
12
+ bounds = view_stack.empty? ? CGRectZero : view_stack.last.bounds
13
+ builder = ViewBuilder.new(klass, options)
14
+ options = builder.options.merge(calculate_frame: true, bounds: bounds)
15
+ view = builder.view
16
+ view_stack.last.addSubview(view) unless view_stack.empty?
17
+
18
+ setup(view, options, &block)
19
+
20
+ view
21
+ end
22
+
23
+ def view_stack
24
+ @view_stack ||= []
25
+ end
26
+
27
+ def self.included base
28
+ base.class_eval do
29
+ [::UIActionSheet, ::UIActivityIndicatorView, ::UIButton, ::UIDatePicker, ::UIImageView, ::UILabel,
30
+ ::UIPageControl, ::UIPickerView, ::UIProgressView, ::UIScrollView, ::UISearchBar, ::UISegmentedControl,
31
+ ::UISlider, ::UIStepper, ::UISwitch, ::UITabBar, ::UITableView, ::UITableViewCell, ::UITextField, ::UITextView,
32
+ ::UIToolbar, ::UIWebView].each do |klass|
33
+
34
+ shorthand = "#{klass}"[2..-1].underscore.to_sym
35
+
36
+ define_method(shorthand) do |options, &block|
37
+ element = MotionPrime::BaseElement.factory(shorthand, options)
38
+ element.render(to: self, &block)
39
+ element
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,44 @@
1
+ module MotionPrime
2
+ class Styles
3
+ @@repo = {}
4
+
5
+ def initialize(namespace = nil)
6
+ @namespace = namespace
7
+ end
8
+
9
+ def style(name, options = {})
10
+ name = "#{@namespace}_#{name}".to_sym if @namespace
11
+ @@repo[name] ||= {}
12
+ if parent = options.delete(:parent)
13
+ parent ="#{@namespace}_#{parent}".to_sym if @namespace
14
+ @@repo[name].deep_merge! self.class.for(parent)
15
+ end
16
+ @@repo[name].deep_merge! options
17
+ end
18
+
19
+ class << self
20
+ def define(namespace = nil, &block)
21
+ self.new(namespace).instance_eval(&block)
22
+ end
23
+
24
+ def for(style_names)
25
+ style_options = {}
26
+ Array.wrap(style_names).each do |name|
27
+ style_options.deep_merge!(@@repo[name] || {})
28
+ end
29
+ style_options
30
+ end
31
+
32
+ def extend_and_normalize_options(options = {})
33
+ style_options = self.for(options.delete(:styles))
34
+ normalize_options(style_options.merge(options))
35
+ end
36
+
37
+ def normalize_options(options)
38
+ options.each do |key, option|
39
+ options[key] = option.is_a?(Proc) && key != :block ? instance_eval(&option) : option
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,80 @@
1
+ module MotionPrime
2
+ class ViewBuilder
3
+ attr_reader :view, :options
4
+
5
+ def initialize(klass, options = {})
6
+ @options = Styles.extend_and_normalize_options(options)
7
+ @view = view_for_class(klass, klass, @options)
8
+ end
9
+
10
+ def view_for_class(klass, root_klass, options = {})
11
+ if VIEWS_MAP.key?(klass)
12
+ VIEWS_MAP[klass].call root_klass, options
13
+ else
14
+ view_for_class klass.superclass, root_klass, options
15
+ end
16
+ end
17
+
18
+ VIEWS_MAP = {
19
+ UIView => Proc.new {|klass, options| klass.alloc.initWithFrame CGRectZero },
20
+ UIControl => Proc.new {|klass, options| klass.alloc.init },
21
+ UIActionSheet => Proc.new {|klass, options|
22
+ title = options.delete(:title) || ''
23
+ delegate = options.delete(:delegate)
24
+ cancel_button_title = options.delete(:cancel_button_title)
25
+ destructive_button_title = options.delete(:destructive_button_title)
26
+ other_button_titles = options.delete(:other_button_titles)
27
+
28
+ klass.alloc.initWithTitle title,
29
+ delegate: delegate,
30
+ cancelButtonTitle: cancel_button_title,
31
+ destructiveButtonTitle: destructive_button_title,
32
+ otherButtonTitles: other_button_titles, nil
33
+ },
34
+ UIActivityIndicatorView => Proc.new{|klass, options|
35
+ style = options.delete(:style) || :large.uiactivityindicatorstyle
36
+ klass.alloc.initWithActivityIndicatorStyle style
37
+ },
38
+ UIButton => Proc.new{|klass, options|
39
+ is_custom_button = options[:background_image] || options[:title_color]
40
+ default_button_type = is_custom_button ? :custom : :rounded
41
+ button_type = (options.delete(:button_type) || default_button_type).uibuttontype
42
+ klass.buttonWithType button_type
43
+ },
44
+ UIImageView => Proc.new{|klass, options|
45
+ image = options.delete(:image)
46
+ highlighted_image = options.delete(:highlighted_image)
47
+
48
+ if !image.nil? && !highlighted_image.nil?
49
+ klass.alloc.initWithImage image.uiimage, highlightedImage: highlighted_image.uiimage
50
+ elsif !image.nil?
51
+ klass.alloc.initWithImage image.uiimage
52
+ else
53
+ klass.alloc.initWithFrame CGRectZero
54
+ end
55
+ },
56
+ UIProgressView => Proc.new{|klass, options|
57
+ style = options.delete(:style) || UIProgressViewStyleDefault
58
+ klass.alloc.initWithProgressViewStyle style
59
+ },
60
+ UISegmentedControl => Proc.new{|klass, options|
61
+ items = options.delete(:items) || []
62
+ klass.alloc.initWithItems items
63
+ },
64
+ UITableView => Proc.new{|klass, options|
65
+ style = options.delete(:style) || UITableViewStylePlain
66
+ klass.alloc.initWithFrame CGRectZero, style: style
67
+ },
68
+ UITableViewCell => Proc.new{|klass, options|
69
+ style = options.delete(:style) || UITableViewCellStyleDefault
70
+ klass.alloc.initWithStyle style, reuseIdentifier: options.delete(:reuse_identifier)
71
+ },
72
+ UISearchBar => Proc.new{|klass, options|
73
+ klass = options[:search_field_background_image] ? UISearchBarCustom : UISearchBar
74
+ search_bar = klass.alloc.init
75
+ search_bar.autoresizingMask = UIViewAutoresizingFlexibleWidth
76
+ search_bar
77
+ }
78
+ }
79
+ end
80
+ end
@@ -0,0 +1,141 @@
1
+ module MotionPrime
2
+ class ViewStyler
3
+ attr_reader :view, :options
4
+
5
+ def initialize(view, bounds = CGRectZero, options = {})
6
+ @options = Styles.extend_and_normalize_options options
7
+ @view = view
8
+ calculate_frame_for(bounds) if @options.delete(:calculate_frame)
9
+ end
10
+
11
+ def apply
12
+ convert_primitives_to_objects(options)
13
+ setValuesForKeysWithDictionary(options)
14
+ end
15
+
16
+ def convert_primitives_to_objects(options)
17
+ options.each do |k,v|
18
+ options[k] = STRUCTS_MAP[v.class].call(v) if STRUCTS_MAP.has_key?(v.class)
19
+ end
20
+ end
21
+
22
+ def calculate_frame_for(bounds)
23
+ width = options.delete(:width)
24
+ height = options.delete(:height)
25
+ top = options.delete(:top)
26
+ right = options.delete(:right)
27
+ bottom = options.delete(:bottom)
28
+ left = options.delete(:left)
29
+
30
+ if width.nil? && height.nil? && right.nil? && bottom.nil?
31
+ options[:frame] = CGRectZero
32
+ else
33
+ frame = CGRectZero
34
+ max_width = bounds.size.width
35
+ max_height = bounds.size.height
36
+ width = 0.0 if width.nil?
37
+ height = 0.0 if height.nil?
38
+
39
+ # calculate left and right if width is relative, e.g 0.7
40
+ if width > 0 && width <= 1
41
+ if right.nil?
42
+ left ||= 0
43
+ right = max_width - max_width * width
44
+ else
45
+ left = max_width - max_width * width
46
+ end
47
+ end
48
+
49
+ # calculate top and bottom if height is relative, e.g 0.7
50
+ if height > 0 && height <= 1
51
+ if bottom.nil?
52
+ top ||= 0
53
+ bottom = max_height - max_height * height
54
+ else
55
+ top = max_height - max_height * height
56
+ end
57
+ end
58
+
59
+ mask = UIViewAutoresizingNone
60
+ mask |= UIViewAutoresizingFlexibleTopMargin if top.nil?
61
+ mask |= UIViewAutoresizingFlexibleLeftMargin if left.nil?
62
+ mask |= UIViewAutoresizingFlexibleBottomMargin if bottom.nil?
63
+ mask |= UIViewAutoresizingFlexibleRightMargin if right.nil?
64
+ mask |= UIViewAutoresizingFlexibleWidth if !left.nil? && !right.nil?
65
+ mask |= UIViewAutoresizingFlexibleHeight if !top.nil? && !bottom.nil?
66
+
67
+ if !left.nil? && !right.nil?
68
+ frame.origin.x = left
69
+ frame.size.width = max_width - left - right
70
+ elsif !right.nil?
71
+ frame.origin.x = max_width - width - right
72
+ frame.size.width = width
73
+ elsif !left.nil?
74
+ frame.origin.x = left
75
+ frame.size.width = width
76
+ else
77
+ frame.origin.x = max_width / 2 - width / 2
78
+ frame.size.width = width
79
+ end
80
+
81
+ if !top.nil? && !bottom.nil?
82
+ frame.origin.y = top
83
+ frame.size.height = max_height - top - bottom
84
+ elsif !bottom.nil?
85
+ frame.origin.y = max_height - height - bottom
86
+ frame.size.height = height
87
+ elsif !top.nil?
88
+ frame.origin.y = top
89
+ frame.size.height = height
90
+ else
91
+ frame.origin.y = max_height / 2 - height / 2
92
+ frame.size.height = height
93
+ end
94
+
95
+ options[:frame] = frame
96
+ options[:autoresizingMask] = mask
97
+ end
98
+ end
99
+
100
+ def setValue(value, forUndefinedKey: key)
101
+ return if value.nil?
102
+ # ignore options
103
+ return if key == 'size_to_fit' && view.is_a?(UILabel)
104
+ return if (key == 'url' || key == 'default') && view.is_a?(UIImageView)
105
+
106
+ # apply options
107
+ if key.end_with?('title_color')
108
+ view.setTitleColor value.uicolor, forState: UIControlStateNormal
109
+ elsif key.end_with?('title_shadow_color')
110
+ view.setTitleShadowColor value.uicolor, forState: UIControlStateNormal
111
+ elsif key.end_with?('color')
112
+ color = value.uicolor
113
+ color = color.cgcolor if view.is_a?(CALayer)
114
+ view.send :"#{key.camelize(:lower)}=", color
115
+ elsif key.end_with?('background_image')
116
+ if view.is_a?(UIButton)
117
+ view.setBackgroundImage value.uiimage, forState: UIControlStateNormal
118
+ elsif view.is_a?(UISearchBar) && key == 'search_field_background_image'
119
+ view.setSearchFieldBackgroundImage value.uiimage, forState: UIControlStateNormal
120
+ else
121
+ view.setBackgroundColor value.uiimage.uicolor
122
+ end
123
+ elsif key.end_with?('image')
124
+ view.setValue value.uiimage, forKey: key.camelize
125
+ elsif value.is_a?(Hash)
126
+ self.class.new(view.send(key.camelize(:lower).to_sym), nil, value).apply
127
+ else
128
+ view.setValue value, forKey: key.camelize(:lower)
129
+ end
130
+ end
131
+
132
+ STRUCTS_MAP = {
133
+ CGAffineTransform => Proc.new {|v| NSValue.valueWithCGAffineTransform(v) },
134
+ CGPoint => Proc.new {|v| NSValue.valueWithCGPoint(v) },
135
+ CGRect => Proc.new {|v| NSValue.valueWithCGRect(v) },
136
+ CGSize => Proc.new {|v| NSValue.valueWithCGSize(v) },
137
+ UIEdgeInsets => Proc.new {|v| NSValue.valueWithUIEdgeInsets(v) },
138
+ UIOffset => Proc.new {|v| NSValue.valueWithUIOffset(v) }
139
+ }
140
+ end
141
+ end
Binary file
data/spec/main_spec.rb ADDED
@@ -0,0 +1,9 @@
1
+ describe "Application 'motion-prime'" do
2
+ before do
3
+ @app = UIApplication.sharedApplication
4
+ end
5
+
6
+ it "has one window" do
7
+ @app.windows.size.should == 1
8
+ end
9
+ end
metadata ADDED
@@ -0,0 +1,245 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: motion-prime
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Iskander Haziev
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-07-18 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rake
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: cocoapods
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: motion-cocoapods
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :runtime
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: motion-require
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ type: :runtime
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ - !ruby/object:Gem::Dependency
79
+ name: motion-support
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ! '>='
84
+ - !ruby/object:Gem::Version
85
+ version: '0'
86
+ type: :runtime
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ! '>='
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
94
+ - !ruby/object:Gem::Dependency
95
+ name: bubble-wrap
96
+ requirement: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ! '>='
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
102
+ type: :runtime
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ - !ruby/object:Gem::Dependency
111
+ name: sugarcube
112
+ requirement: !ruby/object:Gem::Requirement
113
+ none: false
114
+ requirements:
115
+ - - ! '>='
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ none: false
122
+ requirements:
123
+ - - ! '>='
124
+ - !ruby/object:Gem::Version
125
+ version: '0'
126
+ - !ruby/object:Gem::Dependency
127
+ name: nano-store
128
+ requirement: !ruby/object:Gem::Requirement
129
+ none: false
130
+ requirements:
131
+ - - ! '>='
132
+ - !ruby/object:Gem::Version
133
+ version: '0'
134
+ type: :runtime
135
+ prerelease: false
136
+ version_requirements: !ruby/object:Gem::Requirement
137
+ none: false
138
+ requirements:
139
+ - - ! '>='
140
+ - !ruby/object:Gem::Version
141
+ version: '0'
142
+ description: RubyMotion apps development framework
143
+ email:
144
+ - gvalmon@gmail.com
145
+ executables: []
146
+ extensions: []
147
+ extra_rdoc_files: []
148
+ files:
149
+ - .gitignore
150
+ - Gemfile
151
+ - Gemfile.lock
152
+ - README.md
153
+ - Rakefile
154
+ - app/app_delegate.rb
155
+ - doc/SECTION.md
156
+ - doc/STYLE.md
157
+ - files/Gemfile
158
+ - files/Rakefile
159
+ - files/app/app_delegate.rb
160
+ - files/app/screens/application_screen.rb
161
+ - lib/motion-prime.rb
162
+ - lib/view_styler.rb
163
+ - motion-prime.gemspec
164
+ - motion-prime/app_delegate.rb
165
+ - motion-prime/elements/base.rb
166
+ - motion-prime/elements/button.rb
167
+ - motion-prime/elements/draw.rb
168
+ - motion-prime/elements/draw/image.rb
169
+ - motion-prime/elements/draw/label.rb
170
+ - motion-prime/elements/image.rb
171
+ - motion-prime/elements/label.rb
172
+ - motion-prime/elements/text_field.rb
173
+ - motion-prime/elements/text_view.rb
174
+ - motion-prime/helpers/has_authorization.rb
175
+ - motion-prime/helpers/has_search_bar.rb
176
+ - motion-prime/models/base.rb
177
+ - motion-prime/screens/_aliases_mixin.rb
178
+ - motion-prime/screens/_base_mixin.rb
179
+ - motion-prime/screens/_navigation_bar_mixin.rb
180
+ - motion-prime/screens/_navigation_mixin.rb
181
+ - motion-prime/screens/_orientations_mixin.rb
182
+ - motion-prime/screens/base_screen.rb
183
+ - motion-prime/screens/sidebar_container_screen.rb
184
+ - motion-prime/sections/base.rb
185
+ - motion-prime/sections/draw.rb
186
+ - motion-prime/sections/form.rb
187
+ - motion-prime/sections/form/base_field_section.rb
188
+ - motion-prime/sections/form/password_field_section.rb
189
+ - motion-prime/sections/form/select_field_section.rb
190
+ - motion-prime/sections/form/string_field_section.rb
191
+ - motion-prime/sections/form/submit_field_section.rb
192
+ - motion-prime/sections/form/text_field_section.rb
193
+ - motion-prime/sections/table.rb
194
+ - motion-prime/sections/table/refresh_mixin.rb
195
+ - motion-prime/styles/forms.rb
196
+ - motion-prime/support/_key_value_store.rb
197
+ - motion-prime/support/dm_button.rb
198
+ - motion-prime/support/dm_cell_with_section.rb
199
+ - motion-prime/support/dm_text_field.rb
200
+ - motion-prime/support/dm_text_view.rb
201
+ - motion-prime/support/dm_view_controller.rb
202
+ - motion-prime/support/dm_view_with_section.rb
203
+ - motion-prime/support/navigation_controller.rb
204
+ - motion-prime/support/ui_search_bar_custom.rb
205
+ - motion-prime/support/ui_view.rb
206
+ - motion-prime/version.rb
207
+ - motion-prime/views/layout.rb
208
+ - motion-prime/views/styles.rb
209
+ - motion-prime/views/view_builder.rb
210
+ - motion-prime/views/view_styler.rb
211
+ - resources/Default-568h@2x.png
212
+ - spec/main_spec.rb
213
+ homepage: ''
214
+ licenses:
215
+ - ''
216
+ post_install_message:
217
+ rdoc_options: []
218
+ require_paths:
219
+ - lib
220
+ required_ruby_version: !ruby/object:Gem::Requirement
221
+ none: false
222
+ requirements:
223
+ - - ! '>='
224
+ - !ruby/object:Gem::Version
225
+ version: '0'
226
+ segments:
227
+ - 0
228
+ hash: 2230486183734213704
229
+ required_rubygems_version: !ruby/object:Gem::Requirement
230
+ none: false
231
+ requirements:
232
+ - - ! '>='
233
+ - !ruby/object:Gem::Version
234
+ version: '0'
235
+ segments:
236
+ - 0
237
+ hash: 2230486183734213704
238
+ requirements: []
239
+ rubyforge_project:
240
+ rubygems_version: 1.8.25
241
+ signing_key:
242
+ specification_version: 3
243
+ summary: RubyMotion apps development framework
244
+ test_files:
245
+ - spec/main_spec.rb