]> git.saurik.com Git - wxWidgets.git/blame - samples/forty/forty.cpp
1. PositionToXY() off-by-2 (!) bug corrected
[wxWidgets.git] / samples / forty / forty.cpp
CommitLineData
63cafd27
JS
1/////////////////////////////////////////////////////////////////////////////
2// Name: forty.cpp
3// Purpose: Forty Thieves patience game
4// Author: Chris Breeze
5// Modified by:
6// Created: 21/07/97
7// RCS-ID: $Id$
8// Copyright: (c) 1993-1998 Chris Breeze
9// Licence: wxWindows licence
10//---------------------------------------------------------------------------
11// Last modified: 22nd July 1998 - ported to wxWindows 2.0
12/////////////////////////////////////////////////////////////////////////////
13
14#ifdef __GNUG__
15#pragma implementation
16#pragma interface
17#endif
18
19// For compilers that support precompilation, includes "wx/wx.h".
20#include "wx/wxprec.h"
21
22#ifdef __BORLANDC__
23#pragma hdrstop
24#endif
25
26#ifndef WX_PRECOMP
27#include "wx/wx.h"
28#endif
29
30#include "canvas.h"
31#include "forty.h"
32#include "scoredg.h"
33#ifdef wx_x
34#include "cards.xbm"
35#endif
36
37class FortyFrame: public wxFrame
38{
39public:
40 FortyFrame(wxFrame* frame, char* title, int x, int y, int w, int h);
41 virtual ~FortyFrame();
42
43 bool OnClose();
44
45 // Menu callbacks
46 void NewGame(wxCommandEvent& event);
47 void Exit(wxCommandEvent& event);
48 void About(wxCommandEvent& event);
49 void Undo(wxCommandEvent& event);
50 void Redo(wxCommandEvent& event);
51 void Scores(wxCommandEvent& event);
52 void ToggleRightButtonUndo(wxCommandEvent& event);
53 void ToggleHelpingHand(wxCommandEvent& event);
54
55 DECLARE_EVENT_TABLE()
56
57private:
58 enum MenuCommands { NEW_GAME = 10, SCORES, EXIT,
59 UNDO, REDO,
60 RIGHT_BUTTON_UNDO, HELPING_HAND,
61 ABOUT };
62
63 wxMenuBar* m_menuBar;
64 FortyCanvas* m_canvas;
65};
66
67BEGIN_EVENT_TABLE(FortyFrame, wxFrame)
68 EVT_MENU(NEW_GAME, FortyFrame::NewGame)
69 EVT_MENU(EXIT, FortyFrame::Exit)
70 EVT_MENU(ABOUT, FortyFrame::About)
71 EVT_MENU(UNDO, FortyFrame::Undo)
72 EVT_MENU(REDO, FortyFrame::Redo)
73 EVT_MENU(SCORES, FortyFrame::Scores)
74 EVT_MENU(RIGHT_BUTTON_UNDO, FortyFrame::ToggleRightButtonUndo)
75 EVT_MENU(HELPING_HAND, FortyFrame::ToggleHelpingHand)
76END_EVENT_TABLE()
77
78// Create a new application object
79IMPLEMENT_APP (FortyApp)
80
81wxColour* FortyApp::m_backgroundColour = 0;
82wxColour* FortyApp::m_textColour = 0;
83wxBrush* FortyApp::m_backgroundBrush = 0;
84
85bool FortyApp::OnInit()
86{
87 FortyFrame* frame = new FortyFrame(
88 0,
89 "Forty Thieves",
90 -1, -1, 668, 510
91 );
92
93 // Show the frame
94 frame->Show(TRUE);
95
1e6d9499 96 return TRUE;
63cafd27
JS
97}
98
79490c3d 99const wxColour& FortyApp::BackgroundColour()
63cafd27
JS
100{
101 if (!m_backgroundColour)
102 {
103 m_backgroundColour = new wxColour(0, 128, 0);
104 }
79490c3d
VZ
105
106 return *m_backgroundColour;
63cafd27
JS
107}
108
79490c3d 109const wxBrush& FortyApp::BackgroundBrush()
63cafd27
JS
110{
111 if (!m_backgroundBrush)
112 {
16553659 113 m_backgroundBrush = new wxBrush(BackgroundColour(), wxSOLID);
63cafd27 114 }
79490c3d
VZ
115
116 return *m_backgroundBrush;
63cafd27
JS
117}
118
79490c3d 119const wxColour& FortyApp::TextColour()
63cafd27
JS
120{
121 if (!m_textColour)
122 {
123 m_textColour = new wxColour("BLACK");
124 }
79490c3d
VZ
125
126 return *m_textColour;
63cafd27
JS
127}
128
129// My frame constructor
130FortyFrame::FortyFrame(wxFrame* frame, char* title, int x, int y, int w, int h):
131 wxFrame(frame, -1, title, wxPoint(x, y), wxSize(w, h))
132{
133 // set the icon
134#ifdef __WXMSW__
16553659 135 SetIcon(wxIcon("CardsIcon"));
63cafd27
JS
136#else
137#ifdef GTK_TBD
16553659 138 SetIcon(wxIcon(Cards_bits, Cards_width, Cards_height));
63cafd27
JS
139#endif
140#endif
141
142 // Make a menu bar
143 wxMenu* gameMenu = new wxMenu;
144 gameMenu->Append(NEW_GAME, "&New", "Start a new game");
145 gameMenu->Append(SCORES, "&Scores...", "Displays scores");
146 gameMenu->Append(EXIT, "E&xit", "Exits Forty Thieves");
147
148 wxMenu* editMenu = new wxMenu;
149 editMenu->Append(UNDO, "&Undo", "Undo the last move");
150 editMenu->Append(REDO, "&Redo", "Redo a move that has been undone");
151
152 wxMenu* optionsMenu = new wxMenu;
153 optionsMenu->Append(RIGHT_BUTTON_UNDO,
154 "&Right button undo",
155 "Enables/disables right mouse button undo and redo",
156 TRUE
157 );
158 optionsMenu->Append(HELPING_HAND,
159 "&Helping hand",
160 "Enables/disables hand cursor when a card can be moved",
161 TRUE
162 );
163 optionsMenu->Check(HELPING_HAND, TRUE);
164 optionsMenu->Check(RIGHT_BUTTON_UNDO, TRUE);
165
166 wxMenu* helpMenu = new wxMenu;
167 helpMenu->Append(ABOUT, "&About", "Displays program version information");
168
169 m_menuBar = new wxMenuBar;
170 m_menuBar->Append(gameMenu, "&Game");
171 m_menuBar->Append(editMenu, "&Edit");
172 m_menuBar->Append(optionsMenu, "&Options");
173 m_menuBar->Append(helpMenu, "&Help");
174
175 SetMenuBar(m_menuBar);
176
177 m_canvas = new FortyCanvas(this, 0, 0, 400, 400);
178 wxLayoutConstraints* constr = new wxLayoutConstraints;
179 constr->left.SameAs(this, wxLeft);
180 constr->top.SameAs(this, wxTop);
181 constr->right.SameAs(this, wxRight);
182 constr->height.SameAs(this, wxHeight);
183 m_canvas->SetConstraints(constr);
184
185 CreateStatusBar();
186}
187
188FortyFrame::~FortyFrame()
189{
190}
191
192bool FortyFrame::OnClose()
193{
194 return m_canvas->OnClose();
195}
196
197void
198FortyFrame::NewGame(wxCommandEvent&)
199{
200 m_canvas->NewGame();
201}
202
203void
204FortyFrame::Exit(wxCommandEvent&)
205{
206#ifdef __WXGTK__
207 // wxGTK doesn't call OnClose() so we do it here
208 if (OnClose())
209#endif
210 Close(TRUE);
211}
212
213void
214FortyFrame::About(wxCommandEvent&)
215{
216 wxMessageBox(
217 "Forty Thieves\n\n"
218 "A freeware program using the wxWindows\n"
219 "portable C++ GUI toolkit.\n"
220 "http://web.ukonline.co.uk/julian.smart/wxwin\n"
221 "http://www.freiburg.linux.de/~wxxt\n\n"
222 "Author: Chris Breeze (c) 1992-1998\n"
223 "email: chris.breeze@iname.com",
224 "About Forty Thieves",
225 wxOK, this
226 );
227}
228
229void
230FortyFrame::Undo(wxCommandEvent&)
231{
232 m_canvas->Undo();
233}
234
235void
236FortyFrame::Redo(wxCommandEvent&)
237{
238 m_canvas->Redo();
239}
240
241void
242FortyFrame::Scores(wxCommandEvent&)
243{
244 m_canvas->UpdateScores();
245 ScoreDialog scores(this, m_canvas->GetScoreFile());
246 scores.Display();
247}
248
249void
250FortyFrame::ToggleRightButtonUndo(wxCommandEvent& event)
251{
252 bool checked = m_menuBar->IsChecked(event.GetId());
253 m_canvas->EnableRightButtonUndo(checked);
254}
255
256void
257FortyFrame::ToggleHelpingHand(wxCommandEvent& event)
258{
259 bool checked = m_menuBar->IsChecked(event.GetId());
260 m_canvas->EnableHelpingHand(checked);
261}