Sha256: a2144615bf726086780d021f8ddcde387bfd5270b339835fafe5880abe591e7f
Contents?: true
Size: 1.93 KB
Versions: 3
Compression:
Stored size: 1.93 KB
Contents
module DXOpal # A base class for resources acquired through JS Promises. # Provides `<klass>.register` and `<klass>[name]`. # A subclass must impelment `<klass>._load`. # # TODO: better name? (SoundEffect is not actually 'remote') class RemoteResource # List of registered resources (Contains path_or_url) @@resources = Hash.new{|h,k| h[k] = {}} # Contains promises @@promises = Hash.new{|h,k| h[k] = {}} # Contains instances of Image, Sound @@instances = Hash.new{|h,k| h[k] = {}} # Subclasses of RemoteResource @@klasses = {} def self.add_class(subklass) @@klasses[subklass._klass_name] = subklass end # Reserve instance generation def self.register(name, *args, &block) @@resources[_klass_name] ||= {} @@resources[_klass_name][name] = [block, args] end # Return instance of loaded resource (call on subclasses) def self.[](name) if (ret = @@instances[_klass_name][name]) return ret else raise "#{_klass_name} #{name.inspect} is not registered" end end # Called from Window.load_resources def self._load_resources(&block) @@resources.each do |klass_name, items| klass = @@klasses[klass_name] items.each do |name, (block, args)| if !@@promises[klass_name][name] instance, promise = klass._load(*args, &block) @@instances[klass_name][name] = instance @@promises[klass_name][name] = promise end end end promises = @@promises.values.flat_map(&:values) %x{ Promise.all(#{promises}).then(function() { #{block.call} }); } end # Load actual content (defined on subclasses) # Return `[instance, promise]` def self._load(*args) raise "override me" end # Return a string like "Image" or "Sound" def self._klass_name return self.name.split(/::/).last end end end
Version data entries
3 entries across 3 versions & 1 rubygems
Version | Path |
---|---|
dxopal-1.3.0 | opal/dxopal/remote_resource.rb |
dxopal-1.2.0 | opal/dxopal/remote_resource.rb |
dxopal-1.1.0 | opal/dxopal/remote_resource.rb |