From a0f6fd68a56068a20e7186e2dd2d7daccfbce4aa Mon Sep 17 00:00:00 2001 From: Pavel Perminov Date: Wed, 26 Sep 2012 19:02:53 +0000 Subject: Chess4Net_MI 2010.0 release (106 rev. truncated adjusted copy) git-svn-id: http://svn.miranda-ng.org/main/trunk@1666 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- plugins/Chess4Net/PromotionUnit.pas | 159 ++++++++++++++++++++++++++++++++++++ 1 file changed, 159 insertions(+) create mode 100644 plugins/Chess4Net/PromotionUnit.pas (limited to 'plugins/Chess4Net/PromotionUnit.pas') diff --git a/plugins/Chess4Net/PromotionUnit.pas b/plugins/Chess4Net/PromotionUnit.pas new file mode 100644 index 0000000000..91abacbad7 --- /dev/null +++ b/plugins/Chess4Net/PromotionUnit.pas @@ -0,0 +1,159 @@ +unit PromotionUnit; + +interface + +uses + Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, + Dialogs, ExtCtrls, + // Chess4net + ChessRulesEngine, ChessBoardHeaderUnit, BitmapResUnit; + +type + TPromotionForm = class(TForm) + PromFigImage: TImage; + procedure FormShow(Sender: TObject); + procedure PromFigImageMouseUp(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); + procedure FormKeyPress(Sender: TObject; var Key: Char); + private + m_iSquareSize: integer; + m_BitmapRes: TBitmapRes; + m_bmFigure: array[TFigure] of TBitmap; + m_fig_color: TFigureColor; + m_fig: TFigureName; + procedure FLoadFigures; + public + function ShowPromotion(color: TFigureColor): TFigureName; + constructor Create(AOwner: TComponent; BitmapRes: TBitmapRes); reintroduce; + destructor Destroy; override; + end; + +implementation + +{$R *.dfm} + +const + INDENT_SIZE = 2; + +//////////////////////////////////////////////////////////////////////////////// +// TPromotionForm + +procedure TPromotionForm.FormShow(Sender: TObject); +var + k: byte; +begin + if (m_iSquareSize <> m_BitmapRes.SquareSize) then + FLoadFigures; + + // Установить окно в пределах курсора + Left := Mouse.CursorPos.X - m_iSquareSize div 2; + Top := Mouse.CursorPos.Y - m_iSquareSize div 2; + if (Left + Width > Screen.Width) then + Left := Screen.Width - Width; + + with PromFigImage.Canvas do + begin + Brush.Color:= Color; + FillRect(Rect(0,0, Width, PromFigImage.Height)); + + Brush.Color:= clWhite; + for k := 0 to 3 do + FillRect(Rect((m_iSquareSize + INDENT_SIZE) * k, 0, + (m_iSquareSize + INDENT_SIZE) * k + m_iSquareSize - 1, m_iSquareSize - 1)); + + case m_fig_color of + fcWhite: + begin + Draw(0, 0, m_bmFigure[WQ]); + Draw(m_iSquareSize + 2, 0, m_bmFigure[WR]); + Draw(2 * (m_iSquareSize + INDENT_SIZE), 0, m_bmFigure[WB]); + Draw(3 * (m_iSquareSize + INDENT_SIZE), 0, m_bmFigure[WN]); + end; + fcBlack: + begin + Draw(0, 0, m_bmFigure[BQ]); + Draw(m_iSquareSize + INDENT_SIZE, 0, m_bmFigure[BR]); + Draw(2 * (m_iSquareSize + INDENT_SIZE), 0, m_bmFigure[BB]); + Draw(3 * (m_iSquareSize + INDENT_SIZE), 0, m_bmFigure[BN]); + end; + end; + end; +end; + + +function TPromotionForm.ShowPromotion(color: TFigureColor): TFigureName; +begin + m_fig_color := color; + ShowModal; + Result := m_fig; +end; + + +procedure TPromotionForm.PromFigImageMouseUp(Sender: TObject; + Button: TMouseButton; Shift: TShiftState; X, Y: Integer); +begin + case X div (m_BitmapRes.SquareSize + 1) of + 1: m_fig:= R; + 2: m_fig:= B; + 3: m_fig:= N; + else + m_fig:= Q; + end; + Close; +end; + +procedure TPromotionForm.FormKeyPress(Sender: TObject; var Key: Char); +begin + Key:= UpCase(Key); + case Key of + 'Q', '1', ' ', #13: + m_fig:= Q; + 'R', '2': + m_fig:= R; + 'B', '3': + m_fig:= B; + 'N', '4': + m_fig:= N; + else + exit; + end; + Close; +end; + + +constructor TPromotionForm.Create(AOwner: TComponent; BitmapRes: TBitmapRes); +begin + self.FormStyle := (AOwner as TForm).FormStyle; + inherited Create(AOwner); + m_BitmapRes := BitmapRes; + FLoadFigures; +end; + + +destructor TPromotionForm.Destroy; +var + fig: TFigure; +begin + for fig := Low(m_bmFigure) to High(m_bmFigure) do + m_bmFigure[fig].Free; + inherited; +end; + + +procedure TPromotionForm.FLoadFigures; +var + fig: TFigure; +begin + for fig := Low(m_bmFigure) to High(m_bmFigure) do + begin + FreeAndNil(m_bmFigure[fig]); + m_BitmapRes.CreateFigureBitmap(fig, m_bmFigure[fig]); + end; + m_iSquareSize := m_BitmapRes.SquareSize; + + // Adjust size of the form + PromFigImage.Width := 4 * m_iSquareSize + 3 * INDENT_SIZE; + PromFigImage.Height := m_iSquareSize; +end; + +end. -- cgit v1.2.3