slidefield 0.1 → 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.
- 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: {}
|