]> git.saurik.com Git - wxWidgets.git/commitdiff
Added HTML About box and changed player dialog label
authorJulian Smart <julian@anthemion.co.uk>
Wed, 12 Jun 2002 13:19:08 +0000 (13:19 +0000)
committerJulian Smart <julian@anthemion.co.uk>
Wed, 12 Jun 2002 13:19:08 +0000 (13:19 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@15805 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

demos/forty/about.htm [new file with mode: 0644]
demos/forty/forty.cpp
demos/forty/forty.h
demos/forty/playerdg.cpp

diff --git a/demos/forty/about.htm b/demos/forty/about.htm
new file mode 100644 (file)
index 0000000..e20ab7e
--- /dev/null
@@ -0,0 +1,110 @@
+<html>
+<body bgcolor="#FFFFFF" TEXT="#000000" VLINK="#000000" LINK="#000000" ALINK="#000000">
+
+<font color="#000000">
+
+<center>
+<font size=+1><b>Forty Thieves</b></font> <p>
+
+a game of patience<P>
+
+(c) Chris Breeze, 1998-2002
+
+<p>
+
+</center>
+
+<P>
+
+Forty Thieves is a patience game played with two full packs of
+cards. At the start of the game forty cards are dealt on the
+eight 'bases' along the top of the window. The object of the
+game is to place all the cards onto the eight 'foundations'. The
+foundations are built starting with the ace and adding cards of
+the same suit up to the king. Cards are dealt from the pack and
+placed on the discard pile. Cards may be moved from the discard
+pile or one of the bases to a base or a foundation. Only one
+card can be moved at a time. Cards can only be placed on a base
+if the top card of the base is of the same suit and is one
+higher in pip value or the base is empty e.g. the eight of
+spades can only be placed on top of the nine of spades.<P>
+
+When the mouse cursor is over a card which can be moved it
+changes to the 'hand' cursor. The card can then be moved by
+double clicking the left button.<P>
+
+The mouse cursor also changes to a hand when a card is dragged
+by placing the cursor over the card and holding down the left
+button. This feature can be enabled and disabled by selecting
+the 'Helping hand' option from the Edit menu.<P>
+
+The 'foundations' are the eight piles of cards down the left
+side of the window. When the game starts these piles are empty.
+The object of the game is to place all the cards on the
+foundations. An ace can be placed on any empty foundation. Other
+cards can only be placed on a foundation if the top card is of
+the same suit and is one lower in pip value e.g. the three of
+clubs can be placed on the four of clubs.<P>
+
+The 'bases' are the ten piles of cards along the top of the
+window. At the start of the game four cards are dealt face up on
+each of the bases. A card can be added to a base if the base is
+empty or if the top card is of the same suit and is one higher
+in pip value e.g. the queen of hearts can be placed on the king
+of hearts The top card of a base can be moved onto another base
+or a foundation.<P>
+
+Cards can be only moved one at a time. The top card of the pack
+can be dealt onto discard pile by placing the mouse cursor over
+the pack and pressing the left button. The number of cards
+remaining is displayed to the right of the pack.<P>
+
+Cards can be moved from the discard pile or the bases either by
+'double-clicking' or by dragging. If the left button is
+double-clicked when the mouse cursor is over a card and it can
+move to another pile, it will do so. This is a quick way of
+moving cards when their destination is unambiguous.<P>
+
+A card can be dragged by placing the mouse cursor over the card
+and holding down the left button. The card will follow the mouse
+cursor until the left button is released. If the card is over a
+pile on which it can be placed it will be added to that pile,
+otherwise it will be returned to the pile from which it was
+dragged.<P>
+
+One point is scored for every card that is placed on a
+foundation. Since there are two packs of 52 cards the maximum
+score is 104. A record is kept of the number of games played,
+the number of games won, the current score and the average
+score. This information is displayed at bottom right of the
+window and is stored on disk between games. A game is deemed to
+have started if the cards have been dealt and any card has been
+moved. If the game is abandoned before it is finished (i.e. by
+starting a new game or closing window) it counts as a lost game.
+New players can be added by selecting the 'Player' option from
+the Game menu. A summary of players' scores can be displayed by
+selecting the 'Scores...' option from the Game menu.<P>
+
+All moves are recorded and can be undone. To undo a move select
+the undo menu item from the Edit menu. A quicker way of undoing
+is to press the right mouse button (it doesn't matter where the
+mouse cursor is). Right button undo can be enabled and disabled
+by selecting the 'Right button undo' option from the Edit menu.
+Pressing the right mouse button with the control key pressed
+re-does a previously undone move.<P>
+
+An empty base or two is very useful as it gives the opportunity
+to unscramble other bases. Try not to build onto kings which
+obscure valuable cards as it will be difficult to get to them
+later. The undo facility is very useful for going back and using
+'hindsight'.<P>
+
+Don't be put off if you can't win every game. I reckon winning 1
+in 10 is pretty good (winning 1 in 3 is excellent).
+
+</font>
+
+</body>
+</html>
+
+
index 43865d88400b47a3bd1221386da32405c389f29b..cb37828bef94330c925a72265e1e278b8fc97eaf 100644 (file)
 #include "card.h"
 #include "scoredg.h"
 
+#if wxUSE_HTML
+#include "wx/file.h"
+#include "wx/html/htmlwin.h"
+#endif
+
 BEGIN_EVENT_TABLE(FortyFrame, wxFrame)
        EVT_MENU(NEW_GAME, FortyFrame::NewGame)
        EVT_MENU(EXIT, FortyFrame::Exit)
@@ -169,7 +174,7 @@ FortyFrame::FortyFrame(wxFrame* frame, char* title, int x, int y, int w, int h,b
         optionsMenu->Check(LARGE_CARDS, largecards ? TRUE : FALSE);
 
        wxMenu* helpMenu = new wxMenu;
-       helpMenu->Append(ABOUT, "&About", "Displays program version information");
+       helpMenu->Append(ABOUT, "&About...", "Displays information about the game");
 
        m_menuBar = new wxMenuBar;
        m_menuBar->Append(gameMenu,    "&Game");
@@ -226,17 +231,29 @@ FortyFrame::Exit(wxCommandEvent&)
 void
 FortyFrame::About(wxCommandEvent&)
 {
-       wxMessageBox(
-               "Forty Thieves\n\n"
-               "A freeware program using the wxWindows\n"
-               "portable C++ GUI toolkit.\n"
-               "http://www.wxwindows.org\n"
-               "http://www.freiburg.linux.de/~wxxt\n\n"
-               "Author: Chris Breeze (c) 1992-1998\n"
-               "email: chris.breeze@iname.com",
-               "About Forty Thieves",
-               wxOK, this
-               );
+#if wxUSE_HTML
+    if (wxFileExists(wxT("about.htm")))
+    {
+        FortyAboutDialog dialog(this, -1, wxT("About Forty Thieves"));
+        if (dialog.ShowModal() == wxID_OK)
+        {
+        }
+    }
+    else
+#endif
+    {
+        wxMessageBox(
+            "Forty Thieves\n\n"
+            "A freeware program using the wxWindows\n"
+            "portable C++ GUI toolkit.\n"
+            "http://www.wxwindows.org\n"
+            "http://www.freiburg.linux.de/~wxxt\n\n"
+            "Author: Chris Breeze (c) 1992-1998\n"
+            "email: chris.breeze@iname.com",
+            "About Forty Thieves",
+            wxOK, this
+            );
+    }
 }
 
 void
@@ -282,4 +299,93 @@ FortyFrame::ToggleCardSize(wxCommandEvent& event)
         m_canvas->Refresh();
 }
 
+//----------------------------------------------------------------------------
+// stAboutDialog
+//----------------------------------------------------------------------------
+
+BEGIN_EVENT_TABLE(FortyAboutDialog,wxDialog)
+END_EVENT_TABLE()
+
+FortyAboutDialog::FortyAboutDialog( wxWindow *parent, wxWindowID id, const wxString &title,
+    const wxPoint &position, const wxSize& size, long style ) :
+    wxDialog( parent, id, title, position, size, style )
+{
+    AddControls(this);
+
+    Centre(wxBOTH);
+}
+
+bool FortyAboutDialog::AddControls(wxWindow* parent)
+{
+#if wxUSE_HTML
+    wxString htmlText;
+    wxString htmlFile(wxT("about.htm"));
+
+    //if (!wxGetApp().GetMemoryTextResource(wxT("about.htm"), htmlText))
+    {
+//        wxSetWorkingDirectory(wxGetApp().GetAppDir());
+//        wxString htmlFile(wxGetApp().GetFullAppPath(wxT("about.htm")));
+        
+        if (wxFileExists(htmlFile))
+        {
+            wxFile file;
+            file.Open(htmlFile, wxFile::read);
+            long len = file.Length();
+            char* buf = htmlText.GetWriteBuf(len + 1);
+            file.Read(buf, len);
+            buf[len] = 0;
+            htmlText.UngetWriteBuf();
+        }
+    }
+
+    if (htmlText.IsEmpty())
+    {
+        htmlText.Printf(wxT("<html><head><title>Warning</title></head><body><P>Sorry, could not find resource for About dialog<P></body></html>"));
+    }
+
+    // Customize the HTML
+#if 0
+    wxString verString;
+    verString.Printf("%.2f", stVERSION_NUMBER);
+    htmlText.Replace(wxT("$VERSION$"), verString);
+#endif
+    htmlText.Replace(wxT("$DATE$"), __DATE__);
+
+    wxSize htmlSize(400, 290);
+
+    // Note: in later versions of wxWin this will be fixed so wxRAISED_BORDER
+    // does the right thing. Meanwhile, this is a workaround.
+#ifdef __WXMSW__
+    long borderStyle = wxDOUBLE_BORDER;
+#else
+    long borderStyle = wxRAISED_BORDER;
+#endif
+
+    wxHtmlWindow* html = new wxHtmlWindow(this, ID_ABOUT_HTML_WINDOW, wxDefaultPosition, htmlSize, borderStyle);
+    html -> SetBorders(10);
+    html -> SetPage(htmlText);
+        
+    //// Start of sizer-based control creation
+
+    wxSizer *item0 = new wxBoxSizer( wxVERTICAL );
+
+    wxWindow *item1 = parent->FindWindow( ID_ABOUT_HTML_WINDOW );
+    wxASSERT( item1 );
+    item0->Add( item1, 0, wxALIGN_CENTRE|wxALL, 5 );
+
+    wxButton *item2 = new wxButton( parent, wxID_CANCEL, "&Close", wxDefaultPosition, wxDefaultSize, 0 );
+    item2->SetDefault();
+    item2->SetFocus();
+
+    item0->Add( item2, 0, wxALIGN_RIGHT|wxALL, 5 );
+
+    parent->SetAutoLayout( TRUE );
+    parent->SetSizer( item0 );
+    parent->Layout();
+    item0->Fit( parent );
+    item0->SetSizeHints( parent );
+#endif
+
+    return TRUE;
+}
 
index d6d9e3f752e6ed67e910a3371f6cd5f0eb0e62bf..0ad38bae0acf7dfa16f269299c49a1299ded0b0e 100644 (file)
@@ -64,4 +64,25 @@ private:
        FortyCanvas*    m_canvas;
 };
 
+//----------------------------------------------------------------------------
+// stAboutDialog
+//----------------------------------------------------------------------------
+
+class FortyAboutDialog: public wxDialog
+{
+public:
+    // constructors and destructors
+    FortyAboutDialog( wxWindow *parent, wxWindowID id, const wxString &title,
+        const wxPoint& pos = wxDefaultPosition,
+        const wxSize& size = wxDefaultSize,
+        long style = wxDEFAULT_DIALOG_STYLE );
+    
+    bool AddControls(wxWindow* parent);
+
+private:
+    DECLARE_EVENT_TABLE()
+};
+
+#define ID_ABOUT_HTML_WINDOW    1000
+
 #endif
index 67e11b68eb7d6e2d4d29cdf50b141fd3ac845891..674758143b9697be9130980cca731b6a39502adb 100644 (file)
@@ -52,7 +52,7 @@ PlayerSelectionDialog::PlayerSelectionDialog(
        // enable constraints
        SetAutoLayout (TRUE);
 
-       wxStaticText* msg = new wxStaticText(this, -1, "Please select a name from the list");
+       wxStaticText* msg = new wxStaticText(this, -1, "Please select a name or type a new one:");
 
        wxListBox* list = new wxListBox(
                                                this, ID_LISTBOX,
@@ -122,6 +122,8 @@ PlayerSelectionDialog::PlayerSelectionDialog(
                m_textField->SetValue(prevPlayer);
        }
 
+    m_textField->SetFocus();
+
        Layout();
     
     CentreOnParent();