#include "MainWindow.hpp" #include "ChessArbiter.hpp" #include "pgnp.hpp" #include "preferences/preferences.hpp" #include wxDEFINE_EVENT(REFRESH_TAB_TITLE, wxCommandEvent); /// ---------- MainWindow ---------- MainWindow::MainWindow() : wxFrame(NULL, wxID_ANY, "OChess: The Open Chess software", wxDefaultPosition, wxSize(1500, 1000)) { CreateStatusBar(); SetStatusText("OChess"); /// File menu wxMenu *menuFile = new wxMenu; menuFile->Append(1, "Open", "Open file"); Bind(wxEVT_MENU, &MainWindow::OnOpen, this, 1); menuFile->Append(4, "Settings", "Configure OChess"); Bind(wxEVT_MENU, &MainWindow::OnSettings, this, 4); menuFile->AppendSeparator(); menuFile->Append(wxID_EXIT); Bind(wxEVT_MENU, &MainWindow::OnExit, this, wxID_EXIT); menuGame = new wxMenu; menuGame->Append(2, "New", "Create new game"); Bind(wxEVT_MENU, &MainWindow::OnNewGame, this, 2); menuGame->Append(3, "New from FEN", "Create new game using FEN"); Bind(wxEVT_MENU, &MainWindow::OnNewGame, this, 3); menuGame->AppendSeparator(); menuGame->Append(10, "Save", "Save current game"); menuGame->Append(11, "Save As", "Save current game as"); /// Menu bar menuBar = new wxMenuBar; menuBar->Append(menuFile, "&File"); menuBar->Append(menuGame, "&Game"); SetMenuBar(menuBar); // Create the wxNotebook widget notebook = new wxAuiNotebook(this, wxID_ANY); NewGame(new Game()); Bind(wxEVT_AUINOTEBOOK_PAGE_CHANGED, &MainWindow::OnPageChange, this, wxID_ANY); Bind(REFRESH_TAB_TITLE, &MainWindow::OnRefreshTabTitle, this, wxID_ANY); } class AdvancePage : public wxPreferencesPage { public: virtual wxString GetName() const { return "Topics"; } virtual wxBitmap GetLargeIcon() { return wxArtProvider::GetBitmap(wxART_HELP, wxART_TOOLBAR); } virtual wxWindow *CreateWindow(wxWindow *parent) { wxPanel *p = new wxPanel(parent, wxID_ANY, wxDefaultPosition, wxSize(800, 800)); wxBoxSizer *s = new wxBoxSizer(wxVERTICAL); s->Add(new wxButton(p, COPY_FEN_BTN, L"Copy FEN"), 1, wxEXPAND); p->SetSizer(s); return p; } }; void MainWindow::OnSettings(wxCommandEvent &event) { wxPreferencesEditor *edt = new wxPreferencesEditor("Preferences"); edt->AddPage(new BoardPrefs()); edt->Show(this); } void MainWindow::ApplyPreferences() { for (int i = 0; i < notebook->GetPageCount(); i++) { TabInfos *infos = dynamic_cast(notebook->GetPage(i)); infos->ApplyPreferences(); } } void MainWindow::OnExit(wxCommandEvent &event) { Close(true); } void MainWindow::OnOpen(wxCommandEvent &event) { wxFileDialog openFileDialog(this, _("Open file"), "", "", "PGN files (*.pgn)|*.pgn", wxFD_OPEN | wxFD_FILE_MUST_EXIST); if (openFileDialog.ShowModal() != wxID_CANCEL) { std::string path = openFileDialog.GetPath().ToStdString(); pgnp::PGN pgn; try { pgn.FromFile(path); pgn.ParseNextGame(); pgnp::HalfMove *pgnp_moves = new pgnp::HalfMove(); pgn.GetMoves(pgnp_moves); std::string fen = "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1"; if (pgn.HasTag("FEN")) { fen = pgn.GetTagValue("FEN"); } HalfMove *m = new HalfMove(pgnp_moves, fen); NewGame(new Game(m)); } catch (...) { SHOW_DIALOG_ERROR("Invalid PGN file"); } } } void MainWindow::OnNewGame(wxCommandEvent &event) { if (event.GetId() == 3) { wxTextEntryDialog *dial = new wxTextEntryDialog(NULL, wxT("Enter FEN:"), wxT("Error")); if (dial->ShowModal() == wxID_OK) { try { NewGame(new Game(dial->GetValue().ToStdString())); } catch (...) { SHOW_DIALOG_ERROR("Invalid FEN"); } } } else { NewGame(new Game()); } } void MainWindow::OnPageChange(wxAuiNotebookEvent &event) { TabInfos *infos = dynamic_cast(notebook->GetCurrentPage()); if (infos->type != TabInfos::GAME) { for (short i = 10; i < 20; i++) { if (menuGame->FindChildItem(i) != NULL) { menuGame->Enable(i, false); } } } } void MainWindow::OnRefreshTabTitle(wxCommandEvent &event) { GameTab *win = dynamic_cast(event.GetEventObject()); int page = notebook->GetPageIndex(win); if (page != wxNOT_FOUND) { notebook->SetPageText(page, win->GetLabel()); } } void MainWindow::NewGame(Game *game) { GameTab *gt = new GameTab((wxFrame *)notebook, game); notebook->AddPage(gt, gt->GetLabel()); notebook->SetSelection(notebook->GetPageIndex(gt)); }