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