slidefield 0.1 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +19 -5
- data/bin/slidefield +13 -12
- data/lib/slidefield.rb +10 -0
- data/lib/slidefield/animator.rb +9 -4
- data/lib/slidefield/interpreter.rb +16 -17
- data/lib/slidefield/object_manager.rb +13 -6
- data/lib/slidefield/objects/animation.rb +2 -0
- data/lib/slidefield/objects/image.rb +6 -2
- data/lib/slidefield/objects/rect.rb +2 -2
- data/lib/slidefield/objects/slide.rb +11 -5
- data/lib/slidefield/objects/song.rb +8 -3
- data/lib/slidefield/objects/text.rb +6 -2
- data/lib/slidefield/version.rb +1 -1
- data/lib/slidefield/viewer.rb +45 -8
- data/slidefield.gemspec +1 -1
- data/test/test_animator.rb +38 -4
- data/test/test_interpreter.rb +56 -9
- data/test/test_object_manager.rb +14 -2
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c3bc77b80a6d3d653b3be6506daa06a6d4ecf1d8
|
4
|
+
data.tar.gz: 1be3a9e2f0b2d0eaf81b7e3e8dd27003c3847605
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 159f8368156d312baaf045ee4414c33999f40ac9fad8eff0e0a3a2b24acc9d36f2570f84783e82887a246f80be3be3aa22bd7566d379e0b56778a06b807b706d
|
7
|
+
data.tar.gz: 4ba661ac98cc08dc6d49da1895b1697c77b792303318b54d650d77b1a4ec8c7ee1aa3f77521295abf6da3667c3ca4557745d164b51a3cce39b4852709eaf8eaf
|
data/README.md
CHANGED
@@ -9,7 +9,6 @@ Requirements: ruby, sdl, sdl_ttf, freeimage
|
|
9
9
|
|
10
10
|
$ gem install slidefield
|
11
11
|
|
12
|
-
|
13
12
|
## Usage
|
14
13
|
|
15
14
|
$ slidefield [options] [file ...]
|
@@ -37,7 +36,7 @@ The type of the variable cannot be changed after the variable creation.
|
|
37
36
|
|
38
37
|
Integers:
|
39
38
|
|
40
|
-
variable
|
39
|
+
variable = 42
|
41
40
|
variable += 2 % add
|
42
41
|
variable -= 10 % subtract
|
43
42
|
variable *= 6 % multiply
|
@@ -46,7 +45,7 @@ Integers:
|
|
46
45
|
|
47
46
|
Character strings:
|
48
47
|
|
49
|
-
variable
|
48
|
+
variable = "hello"
|
50
49
|
variable += " world!\n" % append
|
51
50
|
variable -= "!" % remove the bang
|
52
51
|
variable *= "3" % multiply by 3
|
@@ -54,7 +53,7 @@ Character strings:
|
|
54
53
|
|
55
54
|
Size or point coordinates:
|
56
55
|
|
57
|
-
variable
|
56
|
+
variable = 2x4
|
58
57
|
variable += 100x80 % add
|
59
58
|
variable -= 10x0 % subtract
|
60
59
|
variable *= 3x4 % multiply
|
@@ -63,7 +62,7 @@ Size or point coordinates:
|
|
63
62
|
|
64
63
|
Colors (red, blue, green & alpha in hexadecimal notation):
|
65
64
|
|
66
|
-
variable
|
65
|
+
variable = #C0FF33FF
|
67
66
|
variable += #03003300 % add
|
68
67
|
variable -= #0C240055 % subtract
|
69
68
|
% variable is #B7DB66AA
|
@@ -133,6 +132,8 @@ compatible with the value's type.
|
|
133
132
|
name = "zoom"
|
134
133
|
%}
|
135
134
|
duration = 400 % in ms (optional)
|
135
|
+
enter = :true % optional
|
136
|
+
leave = :true % optional
|
136
137
|
}
|
137
138
|
*Note: The animation is applied only to nested objects.*
|
138
139
|
|
@@ -244,6 +245,19 @@ Equivalent of the above example without using templates:
|
|
244
245
|
\text title { height = 72; }
|
245
246
|
}
|
246
247
|
|
248
|
+
## Changelog
|
249
|
+
|
250
|
+
#### 0.1.1
|
251
|
+
|
252
|
+
- (un)load subsequent slides in background
|
253
|
+
- greatly reduced memory usage and startup time
|
254
|
+
- new 'enter' and 'leave' properties for `\animation`
|
255
|
+
- support template inheritance
|
256
|
+
|
257
|
+
### 0.1
|
258
|
+
|
259
|
+
- First public release
|
260
|
+
|
247
261
|
## Contributing
|
248
262
|
|
249
263
|
1. [Fork it](https://bitbucket.org/cfi30/slidefield/fork)
|
data/bin/slidefield
CHANGED
@@ -1,16 +1,4 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
-
# This program is free software: you can redistribute it and/or modify
|
3
|
-
# it under the terms of the GNU General Public License as published by
|
4
|
-
# the Free Software Foundation, either version 3 of the License, or
|
5
|
-
# (at your option) any later version.
|
6
|
-
#
|
7
|
-
# This program is distributed in the hope that it will be useful,
|
8
|
-
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
9
|
-
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
10
|
-
# GNU General Public License for more details.
|
11
|
-
#
|
12
|
-
# You should have received a copy of the GNU General Public License
|
13
|
-
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
14
2
|
|
15
3
|
require 'slidefield'
|
16
4
|
require 'optparse'
|
@@ -27,6 +15,10 @@ def parse_opts
|
|
27
15
|
options << :check
|
28
16
|
end
|
29
17
|
|
18
|
+
opts.on '-d', '--debug', "Enable debug messages" do
|
19
|
+
options << :debug
|
20
|
+
end
|
21
|
+
|
30
22
|
opts.on_tail '-v', '--version', "Show version number and copyright" do
|
31
23
|
puts opts.ver
|
32
24
|
puts <<GPL
|
@@ -61,11 +53,20 @@ begin
|
|
61
53
|
raise SlideField::Error, e
|
62
54
|
end
|
63
55
|
|
56
|
+
if options.include? :debug
|
57
|
+
SlideField.ondebug do |message|
|
58
|
+
puts message
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
64
62
|
files = ARGV
|
65
63
|
|
66
64
|
# read from standard input by default
|
67
65
|
files << '-' if files.empty?
|
68
66
|
|
67
|
+
SlideField.debug "Options: #{options}"
|
68
|
+
SlideField.debug "File List: #{files}"
|
69
|
+
|
69
70
|
files.each {|file|
|
70
71
|
interpreter = SlideField::Interpreter.new
|
71
72
|
if '-' == file
|
data/lib/slidefield.rb
CHANGED
@@ -25,3 +25,13 @@ require 'slidefield/objects/rect.rb'
|
|
25
25
|
require 'slidefield/objects/slide.rb'
|
26
26
|
require 'slidefield/objects/song.rb'
|
27
27
|
require 'slidefield/objects/text.rb'
|
28
|
+
|
29
|
+
module SlideField
|
30
|
+
def self.ondebug(&block)
|
31
|
+
@ondebug = block
|
32
|
+
end
|
33
|
+
|
34
|
+
def self.debug(message)
|
35
|
+
@ondebug[message] if @ondebug
|
36
|
+
end
|
37
|
+
end
|
data/lib/slidefield/animator.rb
CHANGED
@@ -1,6 +1,4 @@
|
|
1
1
|
class SlideField::Animator
|
2
|
-
attr_accessor :current, :forward
|
3
|
-
|
4
2
|
def initialize(layout_size)
|
5
3
|
@layout_size = layout_size
|
6
4
|
reset
|
@@ -33,6 +31,11 @@ class SlideField::Animator
|
|
33
31
|
# no animation
|
34
32
|
return tr if anim.nil?
|
35
33
|
|
34
|
+
# direction disabled
|
35
|
+
cur_direction = @frame.forward? ? @frame.current? : !@frame.current?
|
36
|
+
dir_enabled = cur_direction ? anim.enter : anim.leave
|
37
|
+
anim.enabled = false unless dir_enabled
|
38
|
+
|
36
39
|
elapsed = @frame.time - anim.start_time
|
37
40
|
position = elapsed / anim.duration
|
38
41
|
anim.enabled = false if position > 1.0
|
@@ -80,14 +83,16 @@ class SlideField::Animator
|
|
80
83
|
def animation_for(data)
|
81
84
|
return @animations[data] if @animations.has_key? data
|
82
85
|
|
83
|
-
anim_struct = Struct.new :enabled, :start_time, :name, :duration
|
84
|
-
anim = anim_struct.new false, 0.0, '', 0
|
86
|
+
anim_struct = Struct.new :enabled, :start_time, :name, :duration, :enter, :leave
|
87
|
+
anim = anim_struct.new false, 0.0, '', 0, true, true
|
85
88
|
|
86
89
|
if data
|
87
90
|
anim.enabled = true
|
88
91
|
anim.start_time = @frame.time.to_f
|
89
92
|
anim.name = data.get :name
|
90
93
|
anim.duration = data.get :duration
|
94
|
+
anim.enter = data.get :enter
|
95
|
+
anim.leave = data.get :leave
|
91
96
|
end
|
92
97
|
|
93
98
|
@animations[data] = anim
|
@@ -2,8 +2,8 @@ class SlideField::Interpreter
|
|
2
2
|
attr_accessor :root
|
3
3
|
|
4
4
|
def initialize
|
5
|
-
@parser = SlideField::Parser.new
|
6
5
|
@files = []
|
6
|
+
@parser = SlideField::Parser.new
|
7
7
|
@root = SlideField::ObjectData.new(:ROOT, 'line 0 char 0')
|
8
8
|
end
|
9
9
|
|
@@ -31,6 +31,7 @@ class SlideField::Interpreter
|
|
31
31
|
end
|
32
32
|
|
33
33
|
def run_string(input, include_path = '.', context = 'input', parent_obj = nil)
|
34
|
+
SlideField.debug "Parsing #{context}..."
|
34
35
|
include_path = File.absolute_path(include_path) + File::SEPARATOR
|
35
36
|
|
36
37
|
object = parent_obj || @root
|
@@ -192,7 +193,7 @@ class SlideField::Interpreter
|
|
192
193
|
value = copy
|
193
194
|
when '*='
|
194
195
|
multiplier = var_value.to_i
|
195
|
-
|
196
|
+
unless multiplier > 0
|
196
197
|
raise SlideField::InterpreterError,
|
197
198
|
"Invalid string multiplier '#{var_value}', integer > 0 required at #{get_loc var_value_t}"
|
198
199
|
end
|
@@ -218,11 +219,15 @@ class SlideField::Interpreter
|
|
218
219
|
def interpret_object(stmt_data, object, include_path, context)
|
219
220
|
type_t = stmt_data[:type]
|
220
221
|
type = type_t.to_sym
|
221
|
-
value_data = stmt_data[:value]
|
222
|
-
tpl_value_data = nil
|
223
222
|
body = stmt_data[:body] || []
|
224
223
|
|
225
|
-
|
224
|
+
anon_values = []
|
225
|
+
anon_values << stmt_data[:value] if stmt_data[:value]
|
226
|
+
|
227
|
+
template_t = stmt_data[:template]
|
228
|
+
template = stmt_data
|
229
|
+
|
230
|
+
while template[:template]
|
226
231
|
template = object.get type
|
227
232
|
unless template
|
228
233
|
raise SlideField::InterpreterError,
|
@@ -237,11 +242,12 @@ class SlideField::Interpreter
|
|
237
242
|
type = template[:type].to_sym
|
238
243
|
|
239
244
|
if template[:value]
|
240
|
-
|
245
|
+
tpl_value = rebind_tokens template[:value], template_t
|
246
|
+
anon_values << tpl_value
|
241
247
|
end
|
242
248
|
|
243
249
|
if template[:body]
|
244
|
-
tpl_body = rebind_tokens template[:body],
|
250
|
+
tpl_body = rebind_tokens template[:body], template_t
|
245
251
|
body += tpl_body
|
246
252
|
end
|
247
253
|
end
|
@@ -261,8 +267,9 @@ class SlideField::Interpreter
|
|
261
267
|
raise "Unsupported object '#{child.type}'"
|
262
268
|
end
|
263
269
|
|
264
|
-
|
265
|
-
|
270
|
+
anon_values.each {|value_data|
|
271
|
+
interpret_anon_value value_data, child
|
272
|
+
}
|
266
273
|
interpret_tree body, child || [], include_path, context
|
267
274
|
|
268
275
|
# process special objects
|
@@ -323,14 +330,6 @@ class SlideField::Interpreter
|
|
323
330
|
end
|
324
331
|
elsif type == :object
|
325
332
|
token = token[:type]
|
326
|
-
|
327
|
-
if value[:template]
|
328
|
-
# we got something like `alias = \&template`
|
329
|
-
# a template must be copied using the standard syntax `alias = template`
|
330
|
-
# otherwise the reference would not be resolved
|
331
|
-
raise SlideField::InterpreterError,
|
332
|
-
"Unexpected template reference at #{get_loc token}"
|
333
|
-
end
|
334
333
|
end
|
335
334
|
|
336
335
|
filters.reverse_each {|filter_token|
|
@@ -13,17 +13,24 @@ module SlideField::ObjectManager
|
|
13
13
|
end
|
14
14
|
|
15
15
|
def execute(event, *args)
|
16
|
-
|
16
|
+
SlideField.debug "Event: #{event} (#{@obj.type} in #{@obj.context} at #{@obj.loc})"
|
17
|
+
send "on_#{event}", *args
|
17
18
|
rescue => e
|
19
|
+
SlideField.debug "Backtrace: #{e.backtrace.join "\n"}"
|
18
20
|
raise SlideField::RuntimeError,
|
19
21
|
"#{@obj.context_string} An error occured while executing the '#{event}' event on the object '#{@obj.type}' at #{@obj.loc}:\n" +
|
20
22
|
"\t(#{e.class}) #{e.message}"
|
21
23
|
end
|
22
24
|
|
23
|
-
def
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
25
|
+
def method_missing(method, *args)
|
26
|
+
raise NameError, "No such event" if method.to_s.start_with? 'on_'
|
27
|
+
execute method, *args
|
28
|
+
end
|
29
|
+
|
30
|
+
def on_load; end
|
31
|
+
def on_activate; end
|
32
|
+
def on_draw(animator); end
|
33
|
+
def on_deactivate; end
|
34
|
+
def on_unload; end
|
28
35
|
end
|
29
36
|
end
|
@@ -12,7 +12,7 @@ end
|
|
12
12
|
|
13
13
|
module SlideField::ObjectManager
|
14
14
|
class Image < Base
|
15
|
-
def
|
15
|
+
def on_load
|
16
16
|
@x, @y = @obj.get :position
|
17
17
|
@z = @obj.get :z_order
|
18
18
|
@color = Gosu::Color.rgba *@obj.get(:color)
|
@@ -28,7 +28,7 @@ module SlideField::ObjectManager
|
|
28
28
|
@y_scale = height / @image.height.to_f
|
29
29
|
end
|
30
30
|
|
31
|
-
def
|
31
|
+
def on_draw(animator)
|
32
32
|
tr = animator.transform @obj
|
33
33
|
return if tr.skip_draw?
|
34
34
|
|
@@ -43,5 +43,9 @@ module SlideField::ObjectManager
|
|
43
43
|
|
44
44
|
@image.draw x, y, @z, x_scale, y_scale, color
|
45
45
|
end
|
46
|
+
|
47
|
+
def on_unload
|
48
|
+
@image = nil
|
49
|
+
end
|
46
50
|
end
|
47
51
|
end
|
@@ -11,7 +11,7 @@ end
|
|
11
11
|
|
12
12
|
module SlideField::ObjectManager
|
13
13
|
class Rect < Base
|
14
|
-
def
|
14
|
+
def on_load
|
15
15
|
@x, @y = @obj.get :position
|
16
16
|
@z = @obj.get :z_order
|
17
17
|
|
@@ -19,7 +19,7 @@ module SlideField::ObjectManager
|
|
19
19
|
@fill = Gosu::Color.rgba *@obj.get(:fill)
|
20
20
|
end
|
21
21
|
|
22
|
-
def
|
22
|
+
def on_draw(animator)
|
23
23
|
tr = animator.transform @obj
|
24
24
|
return if tr.skip_draw?
|
25
25
|
|
@@ -4,26 +4,32 @@ end
|
|
4
4
|
|
5
5
|
module SlideField::ObjectManager
|
6
6
|
class Slide < Base
|
7
|
-
def
|
7
|
+
def loaded?
|
8
|
+
@is_loaded
|
9
|
+
end
|
10
|
+
|
11
|
+
def on_load
|
12
|
+
@is_loaded = true
|
8
13
|
@children = []
|
9
14
|
add_children_of @obj
|
10
15
|
|
11
16
|
forward :load
|
12
17
|
end
|
13
18
|
|
14
|
-
def
|
19
|
+
def on_activate
|
15
20
|
forward :activate
|
16
21
|
end
|
17
22
|
|
18
|
-
def
|
23
|
+
def on_draw(animator)
|
19
24
|
forward :draw, animator
|
20
25
|
end
|
21
26
|
|
22
|
-
def
|
27
|
+
def on_deactivate
|
23
28
|
forward :deactivate
|
24
29
|
end
|
25
30
|
|
26
|
-
def
|
31
|
+
def on_unload
|
32
|
+
@is_loaded = false
|
27
33
|
forward :unload
|
28
34
|
end
|
29
35
|
|
@@ -12,7 +12,7 @@ end
|
|
12
12
|
|
13
13
|
module SlideField::ObjectManager
|
14
14
|
class Song < Base
|
15
|
-
def
|
15
|
+
def on_load
|
16
16
|
source = File.expand_path @obj.get(:source), @obj.include_path
|
17
17
|
@loop = @obj.get(:loop)
|
18
18
|
@volume = @obj.get(:volume) / 100.0
|
@@ -20,12 +20,17 @@ module SlideField::ObjectManager
|
|
20
20
|
@song = Gosu::Sample.new @window, source
|
21
21
|
end
|
22
22
|
|
23
|
-
def
|
23
|
+
def on_activate
|
24
24
|
@instance = @song.play @volume, 1, @loop
|
25
25
|
end
|
26
26
|
|
27
|
-
def
|
27
|
+
def on_deactivate
|
28
28
|
@instance.stop
|
29
|
+
@instance = nil
|
30
|
+
end
|
31
|
+
|
32
|
+
def on_unload
|
33
|
+
@song = nil
|
29
34
|
end
|
30
35
|
end
|
31
36
|
end
|
@@ -16,7 +16,7 @@ end
|
|
16
16
|
|
17
17
|
module SlideField::ObjectManager
|
18
18
|
class Text < Base
|
19
|
-
def
|
19
|
+
def on_load
|
20
20
|
@x, @y = @obj.get :position
|
21
21
|
@z = @obj.get :z_order
|
22
22
|
@color = Gosu::Color.rgba *@obj.get(:color)
|
@@ -41,7 +41,7 @@ module SlideField::ObjectManager
|
|
41
41
|
@image = Gosu::Image.from_text @window, content, font, height, spacing, width, align
|
42
42
|
end
|
43
43
|
|
44
|
-
def
|
44
|
+
def on_draw(animator)
|
45
45
|
tr = animator.transform @obj
|
46
46
|
return if tr.skip_draw?
|
47
47
|
|
@@ -53,5 +53,9 @@ module SlideField::ObjectManager
|
|
53
53
|
|
54
54
|
@image.draw x, y, @z, tr.scale, tr.scale, color
|
55
55
|
end
|
56
|
+
|
57
|
+
def on_unload
|
58
|
+
@image = nil
|
59
|
+
end
|
56
60
|
end
|
57
61
|
end
|
data/lib/slidefield/version.rb
CHANGED
data/lib/slidefield/viewer.rb
CHANGED
@@ -1,4 +1,8 @@
|
|
1
1
|
class SlideField::Viewer < Gosu::Window
|
2
|
+
# preloader settings
|
3
|
+
LOAD_AROUND = 4
|
4
|
+
LOAD_DELAY = 1000
|
5
|
+
|
2
6
|
def initialize(project)
|
3
7
|
layout = project[:layout].first
|
4
8
|
layout_size = layout.get :size
|
@@ -6,12 +10,12 @@ class SlideField::Viewer < Gosu::Window
|
|
6
10
|
|
7
11
|
super *layout_size, fullscreen
|
8
12
|
|
13
|
+
@time = 0
|
9
14
|
@animator = SlideField::Animator.new layout_size
|
10
15
|
|
11
16
|
@slides = []
|
12
17
|
project[:slide].each {|slide_data|
|
13
18
|
manager = SlideField::ObjectManager.new slide_data, self
|
14
|
-
manager.load
|
15
19
|
@slides << manager
|
16
20
|
}
|
17
21
|
|
@@ -19,20 +23,32 @@ class SlideField::Viewer < Gosu::Window
|
|
19
23
|
end
|
20
24
|
|
21
25
|
def update
|
22
|
-
|
23
|
-
end
|
26
|
+
now = Gosu::milliseconds
|
24
27
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
+
unless needs_redraw?
|
29
|
+
if now - @time > LOAD_DELAY && @can_preload
|
30
|
+
smart_loader
|
31
|
+
@can_preload = false
|
32
|
+
end
|
33
|
+
|
34
|
+
return
|
28
35
|
end
|
29
36
|
|
37
|
+
@time = now
|
38
|
+
@can_preload = true
|
39
|
+
end
|
40
|
+
|
41
|
+
def draw
|
30
42
|
# animate the previous slide
|
31
43
|
if @previous && @animator.need_redraw?
|
32
44
|
@animator.frame @time, false, @forward do
|
33
45
|
@slides[@previous].draw @animator
|
34
46
|
end
|
35
47
|
end
|
48
|
+
|
49
|
+
@animator.frame @time, true, @forward do
|
50
|
+
@slides[@current].draw @animator
|
51
|
+
end
|
36
52
|
end
|
37
53
|
|
38
54
|
def needs_redraw?
|
@@ -68,7 +84,6 @@ class SlideField::Viewer < Gosu::Window
|
|
68
84
|
end
|
69
85
|
end
|
70
86
|
|
71
|
-
private
|
72
87
|
def change_slide(index)
|
73
88
|
return if @current == index || index < 0 || index > @slides.length-1
|
74
89
|
|
@@ -82,8 +97,30 @@ class SlideField::Viewer < Gosu::Window
|
|
82
97
|
@forward = true
|
83
98
|
end
|
84
99
|
|
100
|
+
@slides[@current].load unless @slides[@current].loaded?
|
85
101
|
@slides[@current].activate
|
86
|
-
|
87
102
|
@animator.reset
|
88
103
|
end
|
104
|
+
|
105
|
+
private
|
106
|
+
def smart_loader
|
107
|
+
SlideField.debug "(Un)loading resources..."
|
108
|
+
|
109
|
+
ahead = LOAD_AROUND / 2
|
110
|
+
behind = -ahead
|
111
|
+
|
112
|
+
@slides.each_with_index {|manager, index|
|
113
|
+
rel_index = index - @current
|
114
|
+
keep = rel_index >= behind && rel_index <= ahead
|
115
|
+
|
116
|
+
if keep && !manager.loaded?
|
117
|
+
manager.load
|
118
|
+
elsif !keep && manager.loaded?
|
119
|
+
manager.unload
|
120
|
+
end
|
121
|
+
}
|
122
|
+
|
123
|
+
# really unload resources
|
124
|
+
GC.start
|
125
|
+
end
|
89
126
|
end
|
data/slidefield.gemspec
CHANGED
@@ -9,7 +9,7 @@ Gem::Specification.new do |spec|
|
|
9
9
|
spec.authors = ["cfi30"]
|
10
10
|
spec.email = ["slidefield@cfillion.tk"]
|
11
11
|
spec.summary = %q{A presentation software that reads plain text files written in its own interpreted language.}
|
12
|
-
spec.homepage = ""
|
12
|
+
spec.homepage = "https://bitbucket.org/cfi30/slidefield"
|
13
13
|
spec.license = "GPL"
|
14
14
|
|
15
15
|
spec.files = `git ls-files -z`.split "\x0"
|
data/test/test_animator.rb
CHANGED
@@ -6,19 +6,21 @@ class TestAnimator < MiniTest::Test
|
|
6
6
|
@assert_number = 0
|
7
7
|
end
|
8
8
|
|
9
|
-
def get_object(anim_name, duration)
|
9
|
+
def get_object(anim_name, duration, enter = true, leave = true)
|
10
10
|
|
11
11
|
a = SlideField::ObjectData.new :animation, 'animation loc'
|
12
12
|
a.set :name, anim_name, 'name loc', :string
|
13
13
|
a.set :duration, duration, 'duration loc', :integer
|
14
|
+
a.set :enter, enter, 'enter loc', :boolean
|
15
|
+
a.set :leave, leave, 'leave loc', :boolean
|
14
16
|
|
15
17
|
obj = SlideField::ObjectData.new :object, 'object loc'
|
16
18
|
a << obj
|
17
19
|
obj
|
18
20
|
end
|
19
21
|
|
20
|
-
def assert_animation(anim_name, duration, tests)
|
21
|
-
obj = get_object anim_name, duration
|
22
|
+
def assert_animation(anim_name, duration, tests, enter = true, leave = true, need_redraw = true)
|
23
|
+
obj = get_object anim_name, duration, enter, leave
|
22
24
|
tests.each_with_index {|test, index|
|
23
25
|
time, current, forward, assertions = test
|
24
26
|
|
@@ -30,7 +32,7 @@ class TestAnimator < MiniTest::Test
|
|
30
32
|
}
|
31
33
|
end
|
32
34
|
|
33
|
-
|
35
|
+
assert_equal need_redraw, @animator.need_redraw?,
|
34
36
|
"animator.need_redraw? in test #{index + 1}"
|
35
37
|
}
|
36
38
|
end
|
@@ -241,4 +243,36 @@ class TestAnimator < MiniTest::Test
|
|
241
243
|
[100, false, nil, {:scale=>0.0}],
|
242
244
|
]
|
243
245
|
end
|
246
|
+
|
247
|
+
def test_enter_disabled_forward
|
248
|
+
assert_animation 'fade', 100, [
|
249
|
+
[0, true, true, {:opacity=>1.0}],
|
250
|
+
[50, true, true, {:opacity=>1.0}],
|
251
|
+
[100, true, true, {:opacity=>1.0}],
|
252
|
+
], false, true, false
|
253
|
+
end
|
254
|
+
|
255
|
+
def test_enter_disabled_backward
|
256
|
+
assert_animation 'fade', 100, [
|
257
|
+
[0, false, false, {:opacity=>1.0}],
|
258
|
+
[50, false, false, {:opacity=>1.0}],
|
259
|
+
[100, false, false, {:opacity=>1.0}],
|
260
|
+
], false, true, false
|
261
|
+
end
|
262
|
+
|
263
|
+
def test_leave_disabled_forward
|
264
|
+
assert_animation 'fade', 100, [
|
265
|
+
[0, false, true, {:opacity=>1.0}],
|
266
|
+
[50, false, true, {:opacity=>1.0}],
|
267
|
+
[100, false, true, {:opacity=>1.0}],
|
268
|
+
], true, false, false
|
269
|
+
end
|
270
|
+
|
271
|
+
def test_leave_disabled_backward
|
272
|
+
assert_animation 'fade', 100, [
|
273
|
+
[0, true, false, {:opacity=>1.0}],
|
274
|
+
[50, true, false, {:opacity=>1.0}],
|
275
|
+
[100, true, false, {:opacity=>1.0}],
|
276
|
+
], true, false, false
|
277
|
+
end
|
244
278
|
end
|
data/test/test_interpreter.rb
CHANGED
@@ -22,6 +22,7 @@ module SlideField::ObjectRules
|
|
22
22
|
def rules
|
23
23
|
property :num, :integer, 0
|
24
24
|
property :num2, :integer, 0
|
25
|
+
property :bool, :boolean, false
|
25
26
|
property :str, :string, ""
|
26
27
|
end
|
27
28
|
end
|
@@ -47,8 +48,10 @@ class TestInterpreter < MiniTest::Test
|
|
47
48
|
@col_cache[line] = 0 unless @col_cache[line]
|
48
49
|
col = @col_cache[line] += 1
|
49
50
|
|
50
|
-
line_cache =
|
51
|
-
line_cache.
|
51
|
+
line_cache = Class.new
|
52
|
+
line_cache.define_singleton_method :line_and_column do |pos|
|
53
|
+
[line, col]
|
54
|
+
end
|
52
55
|
|
53
56
|
pos = Parslet::Position.new val, 0
|
54
57
|
Parslet::Slice.new pos, val, line_cache
|
@@ -1087,7 +1090,7 @@ class TestInterpreter < MiniTest::Test
|
|
1087
1090
|
@interpreter.interpret_tree tokens, o
|
1088
1091
|
end
|
1089
1092
|
|
1090
|
-
assert_equal "Unexpected 'point', expecting one of [:integer, :string] at line 1 char 2", error.message
|
1093
|
+
assert_equal "Unexpected 'point', expecting one of [:integer, :boolean, :string] at line 1 char 2", error.message
|
1091
1094
|
end
|
1092
1095
|
|
1093
1096
|
def test_unknown_object
|
@@ -1396,7 +1399,7 @@ class TestInterpreter < MiniTest::Test
|
|
1396
1399
|
@interpreter.interpret_tree tokens, o
|
1397
1400
|
end
|
1398
1401
|
|
1399
|
-
assert_equal "Variable 'num' is already defined at line 2 char
|
1402
|
+
assert_equal "Variable 'num' is already defined at line 2 char 1", error.message
|
1400
1403
|
end
|
1401
1404
|
|
1402
1405
|
def test_template_of_template
|
@@ -1413,13 +1416,57 @@ class TestInterpreter < MiniTest::Test
|
|
1413
1416
|
]
|
1414
1417
|
|
1415
1418
|
o = SlideField::ObjectData.new :parent, 'loc'
|
1416
|
-
o.set :template, {:type=>slice('child',
|
1419
|
+
o.set :template, {:type=>slice('child', 3)}, 'loc', :object
|
1417
1420
|
|
1418
|
-
|
1419
|
-
|
1420
|
-
|
1421
|
+
@interpreter.interpret_tree tokens, o
|
1422
|
+
|
1423
|
+
assert_equal 1, o[:child].count
|
1424
|
+
assert_equal 'line 2 char 2', o[:child].first.loc
|
1425
|
+
end
|
1426
|
+
|
1427
|
+
def test_template_triple_value
|
1428
|
+
template = {
|
1429
|
+
:type=>slice('value', 1),
|
1430
|
+
:value=>{:filters=>[], :integer=>slice('42', 1)}
|
1431
|
+
}
|
1432
|
+
|
1433
|
+
tokens = [
|
1434
|
+
{:assignment=>{
|
1435
|
+
:variable=>slice('alias', 2),
|
1436
|
+
:operator=>slice('=', 2),
|
1437
|
+
:value=>{
|
1438
|
+
:filters=>[],
|
1439
|
+
:object=>{
|
1440
|
+
:template=>slice('&', 2),
|
1441
|
+
:value=>{:filters=>[], :string=>slice('"test"', 2)},
|
1442
|
+
:type=>slice('template', 2)
|
1443
|
+
}
|
1444
|
+
}
|
1445
|
+
}},
|
1446
|
+
{:object=>{
|
1447
|
+
:template=>slice('&', 3),
|
1448
|
+
:value=>{:filters=>[], :boolean=>slice(':true', 3)},
|
1449
|
+
:type=>slice('alias', 3)}
|
1450
|
+
}
|
1451
|
+
]
|
1452
|
+
|
1453
|
+
o = SlideField::ObjectData.new :parent, 'loc'
|
1454
|
+
o.set :template, template, 'loc', :object
|
1455
|
+
|
1456
|
+
@interpreter.interpret_tree tokens, o
|
1457
|
+
copy = o[:value].first
|
1458
|
+
|
1459
|
+
assert_equal 42, copy.get(:num)
|
1460
|
+
assert_equal :integer, copy.var_type(:num)
|
1461
|
+
assert_equal 'line 3 char 1', copy.var_loc(:num)
|
1462
|
+
|
1463
|
+
assert_equal 'test', copy.get(:str)
|
1464
|
+
assert_equal :string, copy.var_type(:str)
|
1465
|
+
assert_equal 'line 3 char 1', copy.var_loc(:str)
|
1421
1466
|
|
1422
|
-
assert_equal
|
1467
|
+
assert_equal true, copy.get(:bool)
|
1468
|
+
assert_equal :boolean, copy.var_type(:bool)
|
1469
|
+
assert_equal 'line 3 char 2', copy.var_loc(:bool)
|
1423
1470
|
end
|
1424
1471
|
|
1425
1472
|
def test_undefined_template
|
data/test/test_object_manager.rb
CHANGED
@@ -2,7 +2,7 @@ require File.expand_path '../helper', __FILE__
|
|
2
2
|
|
3
3
|
module SlideField::ObjectManager
|
4
4
|
class CatchTest < Base
|
5
|
-
def
|
5
|
+
def on_load(what)
|
6
6
|
raise what
|
7
7
|
end
|
8
8
|
end
|
@@ -40,9 +40,21 @@ class TestObjectManager < MiniTest::Test
|
|
40
40
|
|
41
41
|
manager = SlideField::ObjectManager.new obj, nil
|
42
42
|
error = assert_raises SlideField::RuntimeError do
|
43
|
-
manager.
|
43
|
+
manager.load 'error message'
|
44
44
|
end
|
45
45
|
|
46
46
|
assert_equal "[context] An error occured while executing the 'load' event on the object 'catchTest' at loc:\n\t(RuntimeError) error message", error.message
|
47
47
|
end
|
48
|
+
|
49
|
+
def test_unknown_event
|
50
|
+
obj = SlideField::ObjectData.new :catchTest, 'loc'
|
51
|
+
obj.context = 'context'
|
52
|
+
|
53
|
+
manager = SlideField::ObjectManager.new obj, nil
|
54
|
+
error = assert_raises NameError do
|
55
|
+
manager.on_jump
|
56
|
+
end
|
57
|
+
|
58
|
+
assert_equal "No such event", error.message
|
59
|
+
end
|
48
60
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: slidefield
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- cfi30
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-06
|
11
|
+
date: 2014-07-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -156,7 +156,7 @@ files:
|
|
156
156
|
- test/test_object_manager.rb
|
157
157
|
- test/test_object_rules.rb
|
158
158
|
- test/test_parser.rb
|
159
|
-
homepage:
|
159
|
+
homepage: https://bitbucket.org/cfi30/slidefield
|
160
160
|
licenses:
|
161
161
|
- GPL
|
162
162
|
metadata: {}
|