Introduce the concept of plugin interface.
[kaya.git] / lib / plugins / movelist / simple_movelist.rb
blobb32a95fd7c3925252dc6d99697a4364e1fcdad8d
1 require 'plugins/plugin'
3 class SimpleMoveList < Qt::ListView
4   include Plugin
5   include Observer
6   
7   plugin :name => 'Simple Move List',
8          :interface => :movelist
9          
10   class LinearHistoryModel < Qt::StringListModel
11     include Observer
12     include Observable
13     
14     def initialize(match)
15       super([])
16       @history = match.history
17       @serializer = match.game.serializer.new(:compact)
18       
19       @history.add_observer(self)
20       
21       insert_rows(0, @history.size)
22       (0...@history.size).each do |i|
23         update_row(i)
24       end
25     end
26     
27     def on_new_move
28       if @history.size > rowCount
29         insert_rows(rowCount, @history.size - rowCount)
30       else
31         remove_rows(@history.size, rowCount - @history.size)
32       end
33       update_row(@history.current)
34       on_current_changed
35     end
37     def on_current_changed
38       fire :change_current => index(@history.current, 0)
39     end
40     
41     def move(i)
42       if i == 0
43         'Mainline'
44       else
45         state = @history[i - 1].state
46         move = @history[i].move
47         san = @serializer.serialize(move, state)
48         
49         count = i / 2 + 1
50         dots = if i % 2 == 0
51           '.'
52         else
53           '...'
54         end
55         
56         "#{count}#{dots} #{san}"
57       end
58     end
59     
60     def update_row(i)
61       set_data(index(i, 0), move(i), Qt::DisplayRole)
62     end
63     
64     def flags(index)
65       if index.isValid
66         Qt::ItemIsSelectable | Qt::ItemIsEnabled
67       else
68         Qt::NoItemFlags
69       end
70     end
71   end
72   
73   def initialize(controller, opts = {})
74     super(controller.table)
75     @controller = controller
76     self.font = opts[:font] if opts[:font]
77     
78     @controller.table.add_observer(self)
79   end
80   
81   def on_reset(match)
82     if match.game.respond_to?(:serializer)
83       self.model = LinearHistoryModel.new(match)
84       model.observe(:change_current) do |current|
85         select(current)
86       end
87       sig = 'selectionChanged(QItemSelection, QItemSelection)'
88       selection_model.on(sig) do |selected, deselected|
89         @controller.go_to(selected.indexes.first.row)
90       end
91       # select last item
92       select(model.index(model.row_count - 1, 0))
93     else
94       self.model = nil
95     end
96   end
97   
98   def select(index)
99     selection_model.select(index, 
100       Qt::ItemSelectionModel::ClearAndSelect)
101     scroll_to(index)    
102   end