New game dialog allows selecting engines.
[kaya.git] / lib / plugins / engines / loader.rb
blob176acfcaeb1fc5ba717e2f2357fa4f6e26060330
1 require 'factory'
3 class EngineLoader
4   include Plugin
5   
6   class Entry < Factory
7     attr_reader :name
8     attr_reader :game
9   
10     def initialize(name, game, &blk)
11       super(&blk)
12       @name = name
13       @game = game
14     end
15     
16     def self.load(loader, name, group)
17       game = Game.get(group.read_entry('game').to_sym)
18       path = group.read_entry('path')
19       protocol = group.read_entry('protocol')
20       workdir = group.read_entry('workdir')
21       
22       engine_plugin = loader.get_all_matching(:engine).find do |e|
23         e.data(:protocol) == protocol
24       end
25       
26       new(name, game) do |color, match|
27         engine_plugin.new(path, name, color, match)
28       end
29     end
30   end
31   
32   plugin :name => 'Default Engine Loader',
33          :interface => :engine_loader
34          
35   def initialize(loader)
36     @loader = loader
37     reload
38   end
40   def reload
41     @entries = { }
42     config = KDE::Global.config.group("Engines")
43     engine_groups = config.group_list
44     engine_groups.each do |engine_group|
45       entry = Entry.load(@loader, engine_group, config.group(engine_group))
46       @entries[entry.name] = entry
47     end
48   end
49   
50   def [](name)
51     @entries[name]
52   end
53   
54   def find_by_game(game)
55     @entries.select do |name, e|
56       e.game == game
57     end
58   end
59 end