renaming and moving samples around
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@5300 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
253
demos/forty/canvas.cpp
Normal file
253
demos/forty/canvas.cpp
Normal file
@@ -0,0 +1,253 @@
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Name: canvas.cpp
|
||||
// Purpose: Forty Thieves patience game
|
||||
// Author: Chris Breeze
|
||||
// Modified by:
|
||||
// Created: 21/07/97
|
||||
// RCS-ID: $Id$
|
||||
// Copyright: (c) 1993-1998 Chris Breeze
|
||||
// Licence: wxWindows licence
|
||||
//---------------------------------------------------------------------------
|
||||
// Last modified: 22nd July 1998 - ported to wxWindows 2.0
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifdef __GNUG__
|
||||
#pragma implementation
|
||||
#pragma interface
|
||||
#endif
|
||||
|
||||
// For compilers that support precompilation, includes "wx/wx.h".
|
||||
#include "wx/wxprec.h"
|
||||
|
||||
#ifdef __BORLANDC__
|
||||
#pragma hdrstop
|
||||
#endif
|
||||
|
||||
#ifndef WX_PRECOMP
|
||||
#include "wx/wx.h"
|
||||
#endif
|
||||
|
||||
#include "forty.h"
|
||||
#include "card.h"
|
||||
#include "game.h"
|
||||
#include "scorefil.h"
|
||||
#include "playerdg.h"
|
||||
#include "canvas.h"
|
||||
|
||||
BEGIN_EVENT_TABLE(FortyCanvas, wxScrolledWindow)
|
||||
EVT_MOUSE_EVENTS(FortyCanvas::OnMouseEvent)
|
||||
END_EVENT_TABLE()
|
||||
|
||||
FortyCanvas::FortyCanvas(wxWindow* parent, int x, int y, int w, int h) :
|
||||
wxScrolledWindow(parent, -1, wxPoint(x, y), wxSize(w, h)),
|
||||
m_helpingHand(TRUE),
|
||||
m_rightBtnUndo(TRUE),
|
||||
m_playerDialog(0),
|
||||
m_leftBtnDown(FALSE)
|
||||
{
|
||||
#ifdef __WXGTK__
|
||||
m_font = wxTheFontList->FindOrCreateFont(12, wxROMAN, wxNORMAL, wxNORMAL);
|
||||
#else
|
||||
m_font = wxTheFontList->FindOrCreateFont(10, wxSWISS, wxNORMAL, wxNORMAL);
|
||||
#endif
|
||||
SetBackgroundColour(FortyApp::BackgroundColour());
|
||||
|
||||
m_handCursor = new wxCursor(wxCURSOR_HAND);
|
||||
m_arrowCursor = new wxCursor(wxCURSOR_ARROW);
|
||||
|
||||
wxString name = wxTheApp->GetAppName();
|
||||
if (name.Length() <= 0) name = "forty";
|
||||
m_scoreFile = new ScoreFile(name);
|
||||
m_game = new Game(0, 0, 0);
|
||||
m_game->Deal();
|
||||
}
|
||||
|
||||
|
||||
FortyCanvas::~FortyCanvas()
|
||||
{
|
||||
UpdateScores();
|
||||
delete m_game;
|
||||
delete m_scoreFile;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Write the current player's score back to the score file
|
||||
*/
|
||||
void FortyCanvas::UpdateScores()
|
||||
{
|
||||
if (m_player.Length() > 0 && m_scoreFile && m_game)
|
||||
{
|
||||
m_scoreFile->WritePlayersScore(
|
||||
m_player,
|
||||
m_game->GetNumWins(),
|
||||
m_game->GetNumGames(),
|
||||
m_game->GetScore()
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void FortyCanvas::OnDraw(wxDC& dc)
|
||||
{
|
||||
dc.SetFont(* m_font);
|
||||
m_game->Redraw(dc);
|
||||
|
||||
// if player name not set (and selection dialog is not displayed)
|
||||
// then ask the player for their name
|
||||
if (m_player.Length() == 0 && !m_playerDialog)
|
||||
{
|
||||
m_playerDialog = new PlayerSelectionDialog(this, m_scoreFile);
|
||||
m_playerDialog->ShowModal();
|
||||
m_player = m_playerDialog->GetPlayersName();
|
||||
if (m_player.Length() > 0)
|
||||
{
|
||||
// user entered a name - lookup their score
|
||||
int wins, games, score;
|
||||
m_scoreFile->ReadPlayersScore(m_player, wins, games, score);
|
||||
m_game->NewPlayer(wins, games, score);
|
||||
m_game->DisplayScore(dc);
|
||||
m_playerDialog->Destroy();
|
||||
m_playerDialog = 0;
|
||||
Refresh();
|
||||
}
|
||||
else
|
||||
{
|
||||
// user cancelled the dialog - exit the app
|
||||
((wxFrame*)GetParent())->Close(TRUE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
Called when the main frame is closed
|
||||
*/
|
||||
bool FortyCanvas::OnCloseCanvas()
|
||||
{
|
||||
if (m_game->InPlay() &&
|
||||
wxMessageBox("Are you sure you want to\nabandon the current game?",
|
||||
"Warning", wxYES_NO | wxICON_QUESTION) == wxNO)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void FortyCanvas::OnMouseEvent(wxMouseEvent& event)
|
||||
{
|
||||
int mouseX = (int)event.GetX();
|
||||
int mouseY = (int)event.GetY();
|
||||
|
||||
wxClientDC dc(this);
|
||||
PrepareDC(dc);
|
||||
dc.SetFont(* m_font);
|
||||
|
||||
if (event.LeftDClick())
|
||||
{
|
||||
if (m_leftBtnDown)
|
||||
{
|
||||
m_leftBtnDown = FALSE;
|
||||
ReleaseMouse();
|
||||
m_game->LButtonUp(dc, mouseX, mouseY);
|
||||
}
|
||||
m_game->LButtonDblClk(dc, mouseX, mouseY);
|
||||
}
|
||||
else if (event.LeftDown())
|
||||
{
|
||||
if (!m_leftBtnDown)
|
||||
{
|
||||
m_leftBtnDown = TRUE;
|
||||
CaptureMouse();
|
||||
m_game->LButtonDown(dc, mouseX, mouseY);
|
||||
}
|
||||
}
|
||||
else if (event.LeftUp())
|
||||
{
|
||||
if (m_leftBtnDown)
|
||||
{
|
||||
m_leftBtnDown = FALSE;
|
||||
ReleaseMouse();
|
||||
m_game->LButtonUp(dc, mouseX, mouseY);
|
||||
}
|
||||
}
|
||||
else if (event.RightDown() && !event.LeftIsDown())
|
||||
{
|
||||
// only allow right button undo if m_rightBtnUndo is TRUE
|
||||
if (m_rightBtnUndo)
|
||||
{
|
||||
if (event.ControlDown() || event.ShiftDown())
|
||||
{
|
||||
m_game->Redo(dc);
|
||||
}
|
||||
else
|
||||
{
|
||||
m_game->Undo(dc);
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (event.Dragging())
|
||||
{
|
||||
m_game->MouseMove(dc, mouseX, mouseY);
|
||||
}
|
||||
|
||||
if (!event.LeftIsDown())
|
||||
{
|
||||
SetCursorStyle(mouseX, mouseY);
|
||||
}
|
||||
}
|
||||
|
||||
void FortyCanvas::SetCursorStyle(int x, int y)
|
||||
{
|
||||
if (m_game->HaveYouWon())
|
||||
{
|
||||
if (wxMessageBox("Do you wish to play again?",
|
||||
"Well Done, You have won!", wxYES_NO | wxICON_QUESTION) == wxYES)
|
||||
{
|
||||
m_game->Deal();
|
||||
|
||||
wxClientDC dc(this);
|
||||
PrepareDC(dc);
|
||||
dc.SetFont(* m_font);
|
||||
m_game->Redraw(dc);
|
||||
}
|
||||
else
|
||||
{
|
||||
// user cancelled the dialog - exit the app
|
||||
((wxFrame*)GetParent())->Close(TRUE);
|
||||
}
|
||||
}
|
||||
|
||||
// Only set cursor to a hand if 'helping hand' is enabled and
|
||||
// the card under the cursor can go somewhere
|
||||
if (m_game->CanYouGo(x, y) && m_helpingHand)
|
||||
{
|
||||
SetCursor(* m_handCursor);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetCursor(* m_arrowCursor);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void FortyCanvas::NewGame()
|
||||
{
|
||||
m_game->Deal();
|
||||
Refresh();
|
||||
}
|
||||
|
||||
void FortyCanvas::Undo()
|
||||
{
|
||||
wxClientDC dc(this);
|
||||
PrepareDC(dc);
|
||||
dc.SetFont(* m_font);
|
||||
m_game->Undo(dc);
|
||||
}
|
||||
|
||||
void FortyCanvas::Redo()
|
||||
{
|
||||
wxClientDC dc(this);
|
||||
PrepareDC(dc);
|
||||
dc.SetFont(* m_font);
|
||||
m_game->Redo(dc);
|
||||
}
|
Reference in New Issue
Block a user