motion-prime 0.1.0 → 0.1.1
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.
- data/.gitignore +2 -1
- data/.travis.yml +6 -0
- data/Gemfile +5 -10
- data/Gemfile.lock +10 -7
- data/README.md +15 -7
- data/Rakefile +3 -2
- data/files/Gemfile +8 -1
- data/files/Rakefile +2 -0
- data/files/app/app_delegate.rb +10 -0
- data/files/app/config/base.rb +6 -0
- data/files/app/models/.gitkeep +0 -0
- data/files/app/screens/application_screen.rb +4 -0
- data/files/app/screens/help_screen.rb +5 -0
- data/files/app/screens/home_screen.rb +5 -0
- data/files/app/screens/sidebar_screen.rb +14 -0
- data/files/app/sections/sidebar/action.rb +5 -0
- data/files/app/sections/sidebar/table.rb +20 -0
- data/files/app/styles/sidebar.rb +38 -0
- data/files/resources/images/navigation/bg.png +0 -0
- data/files/resources/images/navigation/bg@2x.png +0 -0
- data/files/resources/images/navigation/button.png +0 -0
- data/files/resources/images/navigation/button@2x.png +0 -0
- data/lib/motion-prime.rb +1 -1
- data/motion-prime.gemspec +3 -0
- data/motion-prime/config/base.rb +8 -0
- data/motion-prime/config/config.rb +49 -0
- data/motion-prime/elements/draw/label.rb +1 -1
- data/motion-prime/models/association.rb +115 -0
- data/motion-prime/models/bag.rb +129 -0
- data/motion-prime/models/base.rb +15 -65
- data/motion-prime/models/errors.rb +3 -0
- data/motion-prime/models/finder.rb +189 -0
- data/motion-prime/models/json.rb +45 -0
- data/motion-prime/models/model.rb +118 -0
- data/motion-prime/models/store.rb +53 -0
- data/motion-prime/models/store_extension.rb +159 -0
- data/motion-prime/styles/{forms.rb → base.rb} +4 -0
- data/motion-prime/support/dm_view_controller.rb +1 -1
- data/motion-prime/version.rb +1 -1
- data/spec/config/store_spec.rb +73 -0
- data/spec/delegate/base_delegate_spec.rb +12 -0
- data/spec/helpers/base_delegate.rb +5 -0
- data/spec/helpers/base_screen.rb +9 -0
- data/spec/helpers/models.rb +53 -0
- data/spec/models/association_spec.rb +49 -0
- data/spec/models/bag_spec.rb +92 -0
- data/spec/models/base_model_spec.rb +158 -0
- data/spec/models/finder_spec.rb +183 -0
- data/spec/models/store_extension_spec.rb +120 -0
- data/spec/models/store_spec.rb +51 -0
- data/spec/screens/base_screen_spec.rb +77 -0
- metadata +84 -8
- data/lib/view_styler.rb +0 -141
- data/spec/main_spec.rb +0 -9
data/.gitignore
CHANGED
data/.travis.yml
ADDED
data/Gemfile
CHANGED
@@ -1,13 +1,8 @@
|
|
1
1
|
source 'http://rubygems.org'
|
2
2
|
|
3
|
-
gem 'cocoapods', '0.19.1'
|
4
|
-
gem 'motion-cocoapods', '1.3.2'
|
5
|
-
|
6
|
-
|
7
|
-
gem '
|
8
|
-
gem 'motion-support', '0.2.4'
|
9
|
-
gem 'bubble-wrap', '1.3.0'
|
10
|
-
|
11
|
-
# modelds
|
12
|
-
gem 'nano-store', '0.6.3'
|
3
|
+
gem 'cocoapods', '~> 0.19.1'
|
4
|
+
gem 'motion-cocoapods', '~> 1.3.2'
|
5
|
+
gem 'motion-support', '~> 0.2.4'
|
6
|
+
gem 'sugarcube', '~> 0.20.23'
|
7
|
+
gem 'bubble-wrap', '~> 1.3.0'
|
13
8
|
gemspec
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
motion-prime (0.1.
|
4
|
+
motion-prime (0.1.1)
|
5
5
|
bubble-wrap
|
6
6
|
cocoapods
|
7
7
|
motion-cocoapods
|
@@ -47,7 +47,9 @@ GEM
|
|
47
47
|
json (1.7.7)
|
48
48
|
motion-cocoapods (1.3.2)
|
49
49
|
cocoapods (>= 0.17.0)
|
50
|
+
motion-redgreen (0.1.0)
|
50
51
|
motion-require (0.0.7)
|
52
|
+
motion-stump (0.3.0)
|
51
53
|
motion-support (0.2.4)
|
52
54
|
motion-require (>= 0.0.6)
|
53
55
|
multi_json (1.7.7)
|
@@ -73,11 +75,12 @@ PLATFORMS
|
|
73
75
|
ruby
|
74
76
|
|
75
77
|
DEPENDENCIES
|
76
|
-
bubble-wrap (
|
77
|
-
cocoapods (
|
78
|
-
motion-cocoapods (
|
78
|
+
bubble-wrap (~> 1.3.0)
|
79
|
+
cocoapods (~> 0.19.1)
|
80
|
+
motion-cocoapods (~> 1.3.2)
|
79
81
|
motion-prime!
|
80
|
-
motion-
|
81
|
-
|
82
|
+
motion-redgreen
|
83
|
+
motion-stump
|
84
|
+
motion-support (~> 0.2.4)
|
82
85
|
rake
|
83
|
-
sugarcube (
|
86
|
+
sugarcube (~> 0.20.23)
|
data/README.md
CHANGED
@@ -1,21 +1,29 @@
|
|
1
|
-
# MotionPrime
|
1
|
+
# MotionPrime [](https://travis-ci.org/clearsightstudio/ProMotion)
|
2
2
|
|
3
3
|

|
4
4
|
|
5
5
|
MotionPrime is yet another framework written on RubyMotion.
|
6
6
|
|
7
|
-
The main feature of MotionPrime is one more
|
7
|
+
The main feature of MotionPrime is one more layer on UI elements: Section.
|
8
8
|
"Section" is something like "Partial" in Ruby On Rails, but it's smarter and will help you build application UI.
|
9
9
|
|
10
10
|
## Getting Started
|
11
11
|
|
12
|
-
|
12
|
+
### 1. Create MotionPrime project:
|
13
13
|
|
14
|
-
|
14
|
+
$ motion create --template=git@github.com:droidlabs/motion-prime.git myapp
|
15
15
|
|
16
|
-
|
16
|
+
### 2. Install gems
|
17
17
|
|
18
|
-
$
|
18
|
+
$ bundle
|
19
|
+
|
20
|
+
### 3. Setup application
|
21
|
+
|
22
|
+
# edit Rakefile
|
23
|
+
|
24
|
+
### $. Run application
|
25
|
+
|
26
|
+
$ rake
|
19
27
|
|
20
28
|
## Hello World (Sample)
|
21
29
|
|
@@ -38,7 +46,7 @@ Or create MotionPrime project:
|
|
38
46
|
|
39
47
|
# app/sections/my_profile.rb
|
40
48
|
class MyProfileSection < MotionPrime::BaseSection
|
41
|
-
element :title, text:
|
49
|
+
element :title, text: "Hello World"
|
42
50
|
element :avatar, image: "images/avatar.png", type: :image
|
43
51
|
end
|
44
52
|
|
data/Rakefile
CHANGED
@@ -8,14 +8,15 @@ require 'motion-cocoapods'
|
|
8
8
|
Bundler.setup
|
9
9
|
Bundler.require
|
10
10
|
require 'motion-support'
|
11
|
-
require 'nano-store'
|
12
11
|
require 'motion-prime'
|
12
|
+
require 'motion-stump'
|
13
|
+
require 'motion-redgreen'
|
13
14
|
|
14
15
|
Motion::Project::App.setup do |app|
|
15
16
|
app.name = 'MotionPrime'
|
16
17
|
app.pods do
|
17
18
|
pod 'PKRevealController'
|
18
|
-
pod 'NanoStore', '~> 2.
|
19
|
+
pod 'NanoStore', '~> 2.7.7'
|
19
20
|
pod 'SDWebImage'
|
20
21
|
pod 'SVPullToRefresh'
|
21
22
|
pod 'MBAlertView'
|
data/files/Gemfile
CHANGED
@@ -1,3 +1,10 @@
|
|
1
1
|
source 'http://rubygems.org'
|
2
2
|
|
3
|
-
gem '
|
3
|
+
gem 'cocoapods', '~> 0.19.1'
|
4
|
+
gem 'motion-cocoapods', '~> 1.3.2'
|
5
|
+
gem 'motion-support', '~> 0.2.4'
|
6
|
+
gem 'sugarcube', '~> 0.20.23'
|
7
|
+
gem 'bubble-wrap', '~> 1.3.0'
|
8
|
+
gem 'nano-store', '~> 0.6.3'
|
9
|
+
|
10
|
+
gem 'motion-prime', :path => '../motion-prime'
|
data/files/Rakefile
CHANGED
data/files/app/app_delegate.rb
CHANGED
@@ -1,4 +1,14 @@
|
|
1
1
|
class AppDelegate < MotionPrime::BaseAppDelegate
|
2
2
|
def on_load(app, options)
|
3
|
+
setup_navigation_styles
|
4
|
+
open_with_sidebar HomeScreen.new(navigation: true), SidebarScreen.new
|
5
|
+
end
|
6
|
+
|
7
|
+
def setup_navigation_styles
|
8
|
+
# set navigation bar and button backgrounds
|
9
|
+
UINavigationBar.appearance.setBackgroundImage "images/navigation/bg.png".uiimage,
|
10
|
+
forBarMetrics: UIBarMetricsDefault
|
11
|
+
UIBarButtonItem.appearance.setBackgroundImage "images/navigation/button.png".uiimage,
|
12
|
+
forState: UIControlStateNormal, barMetrics:UIBarMetricsDefault
|
3
13
|
end
|
4
14
|
end
|
File without changes
|
@@ -0,0 +1,14 @@
|
|
1
|
+
class SidebarScreen < MotionPrime::BaseScreen
|
2
|
+
def render
|
3
|
+
@main_section = SidebarTableSection.new()
|
4
|
+
@main_section.render(to: self)
|
5
|
+
end
|
6
|
+
|
7
|
+
def open_home
|
8
|
+
open_screen HomeScreen.new(navigation: true)
|
9
|
+
end
|
10
|
+
|
11
|
+
def open_help
|
12
|
+
open_screen HelpScreen.new(navigation: true)
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
class SidebarTableSection < MotionPrime::TableSection
|
2
|
+
def sidebar_items
|
3
|
+
[
|
4
|
+
{title: 'Home Screen', action: :open_home},
|
5
|
+
{title: 'Help Screen', action: :open_help}
|
6
|
+
]
|
7
|
+
end
|
8
|
+
|
9
|
+
def table_data
|
10
|
+
sidebar_items.map do |model|
|
11
|
+
SidebarActionSection.new(model: model)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def on_click(table, index)
|
16
|
+
section = data[index.row]
|
17
|
+
return false if !section || !section.model[:action]
|
18
|
+
screen.send section.model[:action].to_sym
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
MotionPrime::Styles.define :sidebar do
|
2
|
+
# navigation layout
|
3
|
+
# ----------
|
4
|
+
style :screen,
|
5
|
+
background_color: APP_CONFIG[:css_color_base],
|
6
|
+
opaque: true
|
7
|
+
|
8
|
+
style :table,
|
9
|
+
top: 0,
|
10
|
+
left: 0,
|
11
|
+
width: 320,
|
12
|
+
bottom: 0,
|
13
|
+
background_color: APP_CONFIG[:css_color_base],
|
14
|
+
separator_color: APP_CONFIG[:css_color_dark],
|
15
|
+
opaque: true
|
16
|
+
|
17
|
+
style :table_cell,
|
18
|
+
selection_style: UITableViewCellSelectionStyleNone,
|
19
|
+
opaque: true
|
20
|
+
|
21
|
+
style :action_title,
|
22
|
+
background_color: APP_CONFIG[:css_color_base],
|
23
|
+
text_color: :white,
|
24
|
+
top: 10,
|
25
|
+
width: 320,
|
26
|
+
opaque: true,
|
27
|
+
font: proc { :system.uifont(20) },
|
28
|
+
size_to_fit: true,
|
29
|
+
left: 20,
|
30
|
+
text_color: :white
|
31
|
+
|
32
|
+
style :action_arrow,
|
33
|
+
width: 9,
|
34
|
+
height: 14,
|
35
|
+
right: 50,
|
36
|
+
top: 14,
|
37
|
+
image: "images/sidebar/icons/arrow.png"
|
38
|
+
end
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
data/lib/motion-prime.rb
CHANGED
@@ -5,7 +5,7 @@ Motion::Require.all(Dir.glob(File.expand_path('../../motion-prime/**/*.rb', __FI
|
|
5
5
|
Motion::Project::App.setup do |app|
|
6
6
|
app.pods do
|
7
7
|
pod 'PKRevealController'
|
8
|
-
pod 'NanoStore', '~> 2.
|
8
|
+
pod 'NanoStore', '~> 2.7.7'
|
9
9
|
pod 'SDWebImage'
|
10
10
|
pod 'SVPullToRefresh'
|
11
11
|
pod 'MBAlertView'
|
data/motion-prime.gemspec
CHANGED
@@ -17,6 +17,9 @@ Gem::Specification.new do |spec|
|
|
17
17
|
spec.require_paths = ["lib"]
|
18
18
|
|
19
19
|
spec.add_development_dependency "rake"
|
20
|
+
spec.add_development_dependency("motion-stump")
|
21
|
+
spec.add_development_dependency("motion-redgreen")
|
22
|
+
|
20
23
|
spec.add_dependency "cocoapods"
|
21
24
|
spec.add_dependency "motion-cocoapods"
|
22
25
|
spec.add_dependency "motion-require"
|
@@ -0,0 +1,49 @@
|
|
1
|
+
module MotionPrime
|
2
|
+
class Config
|
3
|
+
def initialize(attributes = {})
|
4
|
+
@attributes = attributes || {}
|
5
|
+
end
|
6
|
+
|
7
|
+
def [](key)
|
8
|
+
fetch(key.to_sym) || store(key, self.class.new)
|
9
|
+
end
|
10
|
+
|
11
|
+
def store(key, value)
|
12
|
+
@attributes[key.to_sym] = value
|
13
|
+
end
|
14
|
+
alias :[]= :store
|
15
|
+
|
16
|
+
def fetch(key)
|
17
|
+
@attributes[key.to_sym]
|
18
|
+
end
|
19
|
+
|
20
|
+
def nil?
|
21
|
+
@attributes.empty?
|
22
|
+
end
|
23
|
+
alias :blank? :nil?
|
24
|
+
|
25
|
+
def has_key?(key)
|
26
|
+
!self[key].is_a?(self.class)
|
27
|
+
end
|
28
|
+
|
29
|
+
class << self
|
30
|
+
def method_missing(name, *args, &block)
|
31
|
+
@base_config ||= self.new()
|
32
|
+
@base_config.send(name.to_sym, *args, &block)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def method_missing(name, *args, &block)
|
37
|
+
if block_given?
|
38
|
+
yield self[name]
|
39
|
+
else
|
40
|
+
name = name.to_s
|
41
|
+
if /(.+)=$/.match(name)
|
42
|
+
return store($1, args[0])
|
43
|
+
else
|
44
|
+
return self[name]
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -2,7 +2,7 @@ motion_require '../draw.rb'
|
|
2
2
|
module MotionPrime
|
3
3
|
class LabelDrawElement < DrawElement
|
4
4
|
def draw_in(rect)
|
5
|
-
color = computed_options[:
|
5
|
+
color = computed_options[:text_color]
|
6
6
|
color.uicolor.set if color
|
7
7
|
computed_options[:text].to_s.drawAtPoint(
|
8
8
|
CGPointMake(computed_left, computed_top),
|
@@ -0,0 +1,115 @@
|
|
1
|
+
module MotionPrime
|
2
|
+
module ModelAssociationMethods
|
3
|
+
def _bags
|
4
|
+
@_bags ||= {}
|
5
|
+
end
|
6
|
+
|
7
|
+
def save
|
8
|
+
_bags.values.each do |bag|
|
9
|
+
bag.store = self.store
|
10
|
+
bag.save
|
11
|
+
end
|
12
|
+
super
|
13
|
+
end
|
14
|
+
end
|
15
|
+
module ModelAssociationClassMethods
|
16
|
+
|
17
|
+
# Defines bag associated with model, creates accessor for bag
|
18
|
+
#
|
19
|
+
# @param [String] name - the name of bag
|
20
|
+
# @return [Nil]
|
21
|
+
def bag(name)
|
22
|
+
define_method(name) do |*args, &block|
|
23
|
+
return _bags[name] if _bags[name]
|
24
|
+
|
25
|
+
bag_key = self.info[name]
|
26
|
+
if bag_key.nil?
|
27
|
+
bag = Bag.bag
|
28
|
+
self.info[name] = bag.key
|
29
|
+
else
|
30
|
+
bag = self.class.store.bagsWithKeysInArray([bag_key]).first
|
31
|
+
end
|
32
|
+
|
33
|
+
_bags[name] = bag
|
34
|
+
end
|
35
|
+
|
36
|
+
define_method((name + "=").to_sym) do |*args, &block|
|
37
|
+
bag = self.send(name)
|
38
|
+
case args[0]
|
39
|
+
when Bag
|
40
|
+
bag.clear
|
41
|
+
bag += args[0].saved.values
|
42
|
+
when Array
|
43
|
+
bag.clear
|
44
|
+
bag += args[0]
|
45
|
+
else
|
46
|
+
raise StoreError, "Unexpected type assigned to bags, must be an Array or MotionPrime::Bag, now: #{args[0].class}"
|
47
|
+
end
|
48
|
+
bag
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
# Defines has one association for model, creates accessor for association
|
53
|
+
#
|
54
|
+
# @param [String] name - the name of association
|
55
|
+
# @return [Nil]
|
56
|
+
def has_one(association_name, options = {})
|
57
|
+
bag_name = "#{association_name.pluralize}_bag"
|
58
|
+
self.bag bag_name.to_sym
|
59
|
+
|
60
|
+
self._associations ||= {}
|
61
|
+
self._associations[association_name] = options.merge(type: :one)
|
62
|
+
|
63
|
+
define_method("#{association_name}=") do |value|
|
64
|
+
self.send(bag_name).clear
|
65
|
+
|
66
|
+
self.send(:"#{bag_name}") << value
|
67
|
+
value
|
68
|
+
end
|
69
|
+
define_method("#{association_name}_attributes=") do |value|
|
70
|
+
self.send(bag_name).clear
|
71
|
+
|
72
|
+
association = association_name.classify.constantize.new
|
73
|
+
association.sync_with_attributes(value)
|
74
|
+
association.save
|
75
|
+
self.send(:"#{bag_name}") << association
|
76
|
+
association
|
77
|
+
end
|
78
|
+
define_method("#{association_name}") do
|
79
|
+
self.send(:"#{bag_name}").to_a.first
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
# Defines has many association for model, creates accessor for association
|
84
|
+
#
|
85
|
+
# @param [String] name - the name of association
|
86
|
+
# @return [Nil]
|
87
|
+
def has_many(association_name, options = {})
|
88
|
+
bag_name = "#{association_name}_bag"
|
89
|
+
self.bag bag_name.to_sym
|
90
|
+
|
91
|
+
self._associations ||= {}
|
92
|
+
self._associations[association_name] = options.merge(type: :many)
|
93
|
+
|
94
|
+
define_method("#{association_name}_attributes=") do |value|
|
95
|
+
self.send(bag_name).clear
|
96
|
+
|
97
|
+
association = []
|
98
|
+
value.each do |attrs|
|
99
|
+
model = association_name.classify.constantize.new
|
100
|
+
model.sync_with_attributes(attrs)
|
101
|
+
association << model
|
102
|
+
end
|
103
|
+
self.send(:"#{bag_name}=", association)
|
104
|
+
association
|
105
|
+
end
|
106
|
+
define_method("#{association_name}=") do |value|
|
107
|
+
self.send(bag_name).clear
|
108
|
+
self.send(:"#{bag_name}=", value)
|
109
|
+
end
|
110
|
+
define_method("#{association_name}") do
|
111
|
+
self.send(:"#{bag_name}").to_a
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|