1 # Copyright (c) 2009 Paolo Capriotti <p.capriotti@gmail.com>
3 # This program is free software; you can redistribute it and/or modify
4 # it under the terms of the GNU General Public License as published by
5 # the Free Software Foundation; either version 2 of the License, or
6 # (at your option) any later version.
8 require 'board/square_tag.rb'
10 require 'board/point_converter.rb'
12 require 'board/item_bag'
13 require 'board/redrawable'
15 class Board < Qt::GraphicsItemGroup
16 include TaggableSquares
18 include PointConverter
26 attr_reader :scene, :items, :unit, :rect, :theme
27 square_tag :selection, :selection, :z => SELECTION_ZVALUE
28 square_tag :last_move_src, :highlight
29 square_tag :last_move_dst, :highlight
30 square_tag :premove_src, :premove, :z => PREMOVE_ZVALUE
31 square_tag :premove_dst, :premove, :z => PREMOVE_ZVALUE
33 def initialize(scene, theme, game)
36 @scene.add_clickable_element(self)
54 @items.each do |key, item|
59 def reset(board = nil)
62 board.to_enum(:each_square).map do |p|
63 add_piece(p, board[p], :load => false) if board[p]
67 # create background item
69 :reloader => background_reloader,
70 :z => BACKGROUND_ZVALUE
75 def set_geometry(rect)
77 side = [@rect.width / @game.size.x, @rect.height / @game.size.y].min.floor
78 @unit = Qt::Point.new(side, side)
79 self.pos = @rect.top_left.to_f
83 def add_piece(p, piece, opts = {})
84 opts = opts.merge :name => piece,
85 :reloader => piece_reloader(piece)
86 item = add_item(p, opts)
87 item.reload(p) if opts.fetch(:load, true)
91 def create_piece(piece, opts = {})
92 opts = opts.merge :name => piece,
93 :reloader => piece_reloader(piece)
94 item = create_item(opts)
95 item.reload(Qt::PointF.new(0, 0))
108 fire :drag => { :src => p,
114 def on_drop(old_pos, pos, data)
122 fire :drop => data.merge(:src => src, :dst => dst)
128 self.last_move_src = move.src
129 self.last_move_dst = move.dst
131 self.last_move_src = nil
132 self.last_move_dst = nil
136 def premove(src, dst)
137 self.premove_src = src
138 self.premove_dst = dst