1998-07-24 15:43:32 -04:00
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
// Name: canvas.cpp
|
|
|
|
// Purpose: Forty Thieves patience game
|
|
|
|
// Author: Chris Breeze
|
|
|
|
// Modified by:
|
|
|
|
// Created: 21/07/97
|
|
|
|
// Copyright: (c) 1993-1998 Chris Breeze
|
2004-06-02 05:14:59 -04:00
|
|
|
// Licence: wxWindows licence
|
1998-07-24 15:43:32 -04:00
|
|
|
//---------------------------------------------------------------------------
|
2004-05-25 07:20:37 -04:00
|
|
|
// Last modified: 22nd July 1998 - ported to wxWidgets 2.0
|
1998-07-24 15:43:32 -04:00
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
// For compilers that support precompilation, includes "wx/wx.h".
|
|
|
|
#include "wx/wxprec.h"
|
|
|
|
|
|
|
|
#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"
|
|
|
|
|
2015-04-23 07:49:01 -04:00
|
|
|
wxBEGIN_EVENT_TABLE(FortyCanvas, wxScrolledWindow)
|
1998-07-24 15:43:32 -04:00
|
|
|
EVT_MOUSE_EVENTS(FortyCanvas::OnMouseEvent)
|
2015-04-23 07:49:01 -04:00
|
|
|
wxEND_EVENT_TABLE()
|
1998-07-24 15:43:32 -04:00
|
|
|
|
2004-03-23 16:23:17 -05:00
|
|
|
FortyCanvas::FortyCanvas(wxWindow* parent, const wxPoint& pos, const wxSize& size) :
|
2008-03-12 09:36:28 -04:00
|
|
|
wxScrolledWindow(parent, wxID_ANY, pos, size, 0),
|
2004-06-02 05:14:59 -04:00
|
|
|
m_helpingHand(true),
|
|
|
|
m_rightBtnUndo(true),
|
|
|
|
m_playerDialog(0),
|
|
|
|
m_leftBtnDown(false)
|
1998-07-24 15:43:32 -04:00
|
|
|
{
|
2008-03-12 09:36:28 -04:00
|
|
|
SetScrollbars(0, 0, 0, 0);
|
|
|
|
|
1998-07-24 15:43:32 -04:00
|
|
|
#ifdef __WXGTK__
|
2017-11-25 11:39:44 -05:00
|
|
|
m_font = wxTheFontList->FindOrCreateFont(wxFontInfo(12).Family(wxFONTFAMILY_ROMAN));
|
1998-07-24 15:43:32 -04:00
|
|
|
#else
|
2017-11-25 11:39:44 -05:00
|
|
|
m_font = wxTheFontList->FindOrCreateFont(wxFontInfo(10).Family(wxFONTFAMILY_SWISS));
|
1998-07-24 15:43:32 -04:00
|
|
|
#endif
|
2004-06-02 05:14:59 -04:00
|
|
|
SetBackgroundColour(FortyApp::BackgroundColour());
|
1998-07-24 15:43:32 -04:00
|
|
|
|
2004-06-02 05:14:59 -04:00
|
|
|
m_handCursor = new wxCursor(wxCURSOR_HAND);
|
|
|
|
m_arrowCursor = new wxCursor(wxCURSOR_ARROW);
|
1998-07-24 15:43:32 -04:00
|
|
|
|
2004-06-02 05:14:59 -04:00
|
|
|
wxString name = wxTheApp->GetAppName();
|
2011-01-22 09:38:36 -05:00
|
|
|
if ( name.empty() ) name = wxT("forty");
|
2004-06-02 05:14:59 -04:00
|
|
|
m_scoreFile = new ScoreFile(name);
|
|
|
|
m_game = new Game(0, 0, 0);
|
|
|
|
m_game->Deal();
|
1998-07-24 15:43:32 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
FortyCanvas::~FortyCanvas()
|
|
|
|
{
|
2004-06-02 05:14:59 -04:00
|
|
|
UpdateScores();
|
|
|
|
delete m_game;
|
|
|
|
delete m_scoreFile;
|
2002-04-07 17:12:45 -04:00
|
|
|
delete m_handCursor;
|
|
|
|
delete m_arrowCursor;
|
1998-07-24 15:43:32 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
Write the current player's score back to the score file
|
|
|
|
*/
|
|
|
|
void FortyCanvas::UpdateScores()
|
|
|
|
{
|
2011-01-22 09:38:36 -05:00
|
|
|
if (!m_player.empty() && m_scoreFile && m_game)
|
2004-06-02 05:14:59 -04:00
|
|
|
{
|
|
|
|
m_scoreFile->WritePlayersScore(
|
|
|
|
m_player,
|
|
|
|
m_game->GetNumWins(),
|
|
|
|
m_game->GetNumGames(),
|
|
|
|
m_game->GetScore()
|
|
|
|
);
|
|
|
|
}
|
1998-07-24 15:43:32 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void FortyCanvas::OnDraw(wxDC& dc)
|
|
|
|
{
|
2004-06-02 05:14:59 -04:00
|
|
|
dc.SetFont(* m_font);
|
|
|
|
m_game->Redraw(dc);
|
2002-03-21 08:10:17 -05:00
|
|
|
#if 0
|
2004-06-02 05:14:59 -04:00
|
|
|
// if player name not set (and selection dialog is not displayed)
|
|
|
|
// then ask the player for their name
|
2011-01-22 09:38:36 -05:00
|
|
|
if (m_player.empty() && !m_playerDialog)
|
2004-06-02 05:14:59 -04:00
|
|
|
{
|
|
|
|
m_playerDialog = new PlayerSelectionDialog(this, m_scoreFile);
|
|
|
|
m_playerDialog->ShowModal();
|
|
|
|
m_player = m_playerDialog->GetPlayersName();
|
2011-01-22 09:38:36 -05:00
|
|
|
if ( !m_player.empty() )
|
2004-06-02 05:14:59 -04:00
|
|
|
{
|
|
|
|
// 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(false);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
// user cancelled the dialog - exit the app
|
|
|
|
((wxFrame*)GetParent())->Close(true);
|
|
|
|
}
|
|
|
|
}
|
2002-03-21 08:10:17 -05:00
|
|
|
#endif
|
1998-07-24 15:43:32 -04:00
|
|
|
}
|
|
|
|
|
2002-03-21 08:10:17 -05:00
|
|
|
void FortyCanvas::ShowPlayerDialog()
|
|
|
|
{
|
2004-06-02 05:14:59 -04:00
|
|
|
// if player name not set (and selection dialog is not displayed)
|
|
|
|
// then ask the player for their name
|
2011-01-22 09:38:36 -05:00
|
|
|
if (m_player.empty() && !m_playerDialog)
|
2004-06-02 05:14:59 -04:00
|
|
|
{
|
|
|
|
m_playerDialog = new PlayerSelectionDialog(this, m_scoreFile);
|
|
|
|
m_playerDialog->ShowModal();
|
|
|
|
m_player = m_playerDialog->GetPlayersName();
|
2011-01-22 09:38:36 -05:00
|
|
|
if ( !m_player.empty() )
|
2004-06-02 05:14:59 -04:00
|
|
|
{
|
|
|
|
// 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);
|
2005-01-31 13:18:18 -05:00
|
|
|
|
2004-06-02 05:14:59 -04:00
|
|
|
wxClientDC dc(this);
|
|
|
|
dc.SetFont(* m_font);
|
|
|
|
m_game->DisplayScore(dc);
|
|
|
|
m_playerDialog->Destroy();
|
|
|
|
m_playerDialog = 0;
|
|
|
|
Refresh(false);
|
2002-03-21 08:10:17 -05:00
|
|
|
}
|
2004-06-02 05:14:59 -04:00
|
|
|
else
|
|
|
|
{
|
|
|
|
// user cancelled the dialog - exit the app
|
|
|
|
((wxFrame*)GetParent())->Close(true);
|
|
|
|
}
|
|
|
|
}
|
2002-03-21 08:10:17 -05:00
|
|
|
}
|
2005-01-31 13:18:18 -05:00
|
|
|
|
1998-07-24 15:43:32 -04:00
|
|
|
/*
|
|
|
|
Called when the main frame is closed
|
|
|
|
*/
|
1999-02-05 18:55:04 -05:00
|
|
|
bool FortyCanvas::OnCloseCanvas()
|
1998-07-24 15:43:32 -04:00
|
|
|
{
|
2004-06-02 05:14:59 -04:00
|
|
|
if (m_game->InPlay() &&
|
|
|
|
wxMessageBox(wxT("Are you sure you want to\nabandon the current game?"),
|
|
|
|
wxT("Warning"), wxYES_NO | wxICON_QUESTION) == wxNO)
|
|
|
|
{
|
2004-03-23 16:23:17 -05:00
|
|
|
return false;
|
2004-06-02 05:14:59 -04:00
|
|
|
}
|
|
|
|
return true;
|
1998-07-24 15:43:32 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
void FortyCanvas::OnMouseEvent(wxMouseEvent& event)
|
|
|
|
{
|
2004-06-02 05:14:59 -04:00
|
|
|
int mouseX = (int)event.GetX();
|
|
|
|
int mouseY = (int)event.GetY();
|
1998-07-24 15:43:32 -04:00
|
|
|
|
2005-01-31 13:18:18 -05:00
|
|
|
wxClientDC dc(this);
|
2004-06-02 05:14:59 -04:00
|
|
|
PrepareDC(dc);
|
|
|
|
dc.SetFont(* m_font);
|
1998-07-24 15:43:32 -04:00
|
|
|
|
2004-06-02 05:14:59 -04:00
|
|
|
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);
|
|
|
|
}
|
1998-07-24 15:43:32 -04:00
|
|
|
|
2004-06-02 05:14:59 -04:00
|
|
|
if (!event.LeftIsDown())
|
|
|
|
{
|
|
|
|
SetCursorStyle(mouseX, mouseY);
|
|
|
|
}
|
1998-07-24 15:43:32 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
void FortyCanvas::SetCursorStyle(int x, int y)
|
|
|
|
{
|
2004-06-02 05:14:59 -04:00
|
|
|
// Only set cursor to a hand if 'helping hand' is enabled and
|
2005-01-31 13:18:18 -05:00
|
|
|
// the card under the cursor can go somewhere
|
2004-06-02 05:14:59 -04:00
|
|
|
if (m_game->CanYouGo(x, y) && m_helpingHand)
|
|
|
|
{
|
|
|
|
SetCursor(* m_handCursor);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
SetCursor(* m_arrowCursor);
|
|
|
|
}
|
1998-07-24 15:43:32 -04:00
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
void FortyCanvas::NewGame()
|
|
|
|
{
|
2004-06-02 05:14:59 -04:00
|
|
|
m_game->Deal();
|
|
|
|
Refresh();
|
1998-07-24 15:43:32 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
void FortyCanvas::Undo()
|
|
|
|
{
|
2005-01-31 13:18:18 -05:00
|
|
|
wxClientDC dc(this);
|
2004-06-02 05:14:59 -04:00
|
|
|
PrepareDC(dc);
|
|
|
|
dc.SetFont(* m_font);
|
|
|
|
m_game->Undo(dc);
|
1998-07-24 15:43:32 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
void FortyCanvas::Redo()
|
|
|
|
{
|
2005-01-31 13:18:18 -05:00
|
|
|
wxClientDC dc(this);
|
2004-06-02 05:14:59 -04:00
|
|
|
PrepareDC(dc);
|
|
|
|
dc.SetFont(* m_font);
|
|
|
|
m_game->Redo(dc);
|
1998-07-24 15:43:32 -04:00
|
|
|
}
|
2002-03-06 12:50:52 -05:00
|
|
|
|
|
|
|
void FortyCanvas::LayoutGame()
|
|
|
|
{
|
|
|
|
m_game->Layout();
|
|
|
|
}
|