2022-02-23 18:11:55 +01:00
|
|
|
#include "MainWindow.hpp"
|
|
|
|
#include "ChessArbiter.hpp"
|
2022-02-26 19:21:52 +01:00
|
|
|
#include "UCI.hpp"
|
2022-02-26 17:05:47 +01:00
|
|
|
#include "engine_tab/EngineTab.hpp"
|
2022-02-23 18:11:55 +01:00
|
|
|
#include "pgnp.hpp"
|
|
|
|
#include "preferences/preferences.hpp"
|
|
|
|
|
|
|
|
wxDEFINE_EVENT(REFRESH_TAB_TITLE, wxCommandEvent);
|
2022-02-24 16:45:28 +01:00
|
|
|
wxDEFINE_EVENT(NEW_GAME_EVENT, wxCommandEvent);
|
2022-02-26 20:34:42 +01:00
|
|
|
wxDEFINE_EVENT(CLOSE_TAB_EVENT, wxCommandEvent);
|
2022-02-26 21:43:09 +01:00
|
|
|
wxDEFINE_EVENT(REFRESH_ENGINE_LIST, wxCommandEvent);
|
2022-02-23 18:11:55 +01:00
|
|
|
|
|
|
|
/// ---------- MainWindow ----------
|
|
|
|
|
|
|
|
MainWindow::MainWindow()
|
|
|
|
: wxFrame(NULL, wxID_ANY, "OChess: The Open Chess software",
|
2022-02-23 19:41:50 +01:00
|
|
|
wxDefaultPosition, wxSize(1500, 1000)),
|
|
|
|
prefsEditor(NULL) {
|
2022-02-23 18:11:55 +01:00
|
|
|
CreateStatusBar();
|
|
|
|
SetStatusText("OChess");
|
|
|
|
|
|
|
|
/// File menu
|
|
|
|
wxMenu *menuFile = new wxMenu;
|
|
|
|
menuFile->Append(1, "Open", "Open file");
|
2022-02-25 08:49:57 +01:00
|
|
|
menuFile->AppendSeparator();
|
|
|
|
menuFile->Append(10, "Save", "Save current game");
|
|
|
|
menuFile->Append(11, "Save As", "Save current game as");
|
|
|
|
menuFile->AppendSeparator();
|
2022-02-23 18:11:55 +01:00
|
|
|
menuFile->Append(4, "Settings", "Configure OChess");
|
|
|
|
menuFile->AppendSeparator();
|
|
|
|
menuFile->Append(wxID_EXIT);
|
|
|
|
|
2022-02-25 08:49:57 +01:00
|
|
|
// Game menu
|
2022-02-23 18:11:55 +01:00
|
|
|
menuGame = new wxMenu;
|
|
|
|
menuGame->Append(2, "New", "Create new game");
|
|
|
|
menuGame->Append(3, "New from FEN", "Create new game using FEN");
|
2022-02-25 08:49:57 +01:00
|
|
|
|
|
|
|
// Game base menu
|
|
|
|
wxMenu *menuBase = new wxMenu;
|
|
|
|
menuBase->Append(5, "New", "Create new database");
|
2022-02-23 18:11:55 +01:00
|
|
|
|
2022-02-26 17:05:47 +01:00
|
|
|
// Engine menu
|
|
|
|
wxMenu *engineMenu = new wxMenu;
|
|
|
|
engineMenu->Append(6, "New", "Create a new engine configuration");
|
2022-02-26 21:43:09 +01:00
|
|
|
manageMenu = new wxMenu;
|
|
|
|
engineMenu->AppendSubMenu(manageMenu, "Manage");
|
|
|
|
wxCommandEvent dummy(REFRESH_ENGINE_LIST, GetId());
|
|
|
|
OnRefreshEngineList(dummy);
|
2022-02-26 17:05:47 +01:00
|
|
|
|
2022-02-23 18:11:55 +01:00
|
|
|
/// Menu bar
|
|
|
|
menuBar = new wxMenuBar;
|
|
|
|
menuBar->Append(menuFile, "&File");
|
|
|
|
menuBar->Append(menuGame, "&Game");
|
2022-02-25 08:49:57 +01:00
|
|
|
menuBar->Append(menuBase, "&Database");
|
2022-02-26 17:05:47 +01:00
|
|
|
menuBar->Append(engineMenu, "&Engines");
|
2022-02-23 18:11:55 +01:00
|
|
|
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);
|
2022-02-24 21:10:29 +01:00
|
|
|
Bind(NEW_GAME_EVENT, &MainWindow::OnNewGame, this, wxID_ANY);
|
2022-02-23 19:41:50 +01:00
|
|
|
Bind(wxEVT_CLOSE_WINDOW, &MainWindow::OnClose, this);
|
2022-02-26 20:34:42 +01:00
|
|
|
Bind(CLOSE_TAB_EVENT, &MainWindow::OnCloseTabEvent, this, wxID_ANY);
|
2022-02-26 21:43:09 +01:00
|
|
|
Bind(wxEVT_MENU, &MainWindow::OnMenuItemClick, this, wxID_ANY);
|
|
|
|
Bind(REFRESH_ENGINE_LIST, &MainWindow::OnRefreshEngineList, this, wxID_ANY);
|
2022-02-26 12:30:07 +01:00
|
|
|
|
2022-02-26 17:05:47 +01:00
|
|
|
/*BaseTab *bt = new BaseTab((wxFrame *)notebook,
|
|
|
|
"/home/loic/hartwig_tests.pgn"); notebook->AddPage(bt, bt->GetLabel());
|
|
|
|
notebook->SetSelection(notebook->GetPageIndex(bt));*/
|
2022-02-26 21:43:09 +01:00
|
|
|
/*
|
|
|
|
EngineTab *bt =
|
|
|
|
new EngineTab((wxWindow *)notebook,
|
|
|
|
new uciadapter::UCI("/home/loic/.local/bin/stockfish"),
|
|
|
|
"/home/loic/.local/bin/stockfish");
|
|
|
|
notebook->AddPage(bt, bt->GetLabel());
|
|
|
|
notebook->SetSelection(notebook->GetPageIndex(bt));*/
|
2022-02-23 18:11:55 +01:00
|
|
|
}
|
|
|
|
|
2022-02-26 20:34:42 +01:00
|
|
|
void MainWindow::OnCloseTabEvent(wxCommandEvent &event) {
|
|
|
|
notebook->DeletePage(notebook->GetSelection());
|
|
|
|
}
|
|
|
|
|
2022-02-26 21:43:09 +01:00
|
|
|
void MainWindow::OnMenuItemClick(wxCommandEvent &event) {
|
|
|
|
std::uint32_t id = event.GetId();
|
|
|
|
if (id == wxID_EXIT) {
|
|
|
|
Close(true);
|
|
|
|
} else if (id >= 100) {
|
|
|
|
wxLogDebug("Engine selected!");
|
|
|
|
wxMenuItemList items = manageMenu->GetMenuItems();
|
|
|
|
for (wxMenuItem *item : items) {
|
|
|
|
if (item->GetId() == id) {
|
|
|
|
wxLogDebug("Selected %s", item->GetItemLabel());
|
|
|
|
EngineTab *bt = new EngineTab((wxWindow *)notebook,
|
|
|
|
item->GetItemLabel().ToStdString());
|
|
|
|
notebook->AddPage(bt, bt->GetLabel());
|
|
|
|
notebook->SetSelection(notebook->GetPageIndex(bt));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else if (id == 1) {
|
|
|
|
OpenFile();
|
|
|
|
} else if (id == 2) {
|
|
|
|
NewGame(false);
|
|
|
|
} else if (id == 3) {
|
|
|
|
NewGame(true);
|
|
|
|
} else if (id == 4) {
|
|
|
|
OpenSettings();
|
|
|
|
} else if (id == 6) {
|
|
|
|
NewEngine();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void MainWindow::OnRefreshEngineList(wxCommandEvent &event) {
|
|
|
|
// Delete all items
|
|
|
|
wxMenuItemList items = manageMenu->GetMenuItems();
|
|
|
|
for (wxMenuItem *item : items) {
|
|
|
|
manageMenu->Delete(item->GetId());
|
|
|
|
}
|
|
|
|
// Refresh items
|
|
|
|
CONFIG_OPEN(conf);
|
|
|
|
conf->SetPath("engines/");
|
|
|
|
wxString engine_name;
|
|
|
|
long index;
|
|
|
|
if (conf->GetFirstGroup(engine_name, index)) {
|
|
|
|
std::uint32_t id = 0;
|
|
|
|
do {
|
|
|
|
manageMenu->Append(100 + id, engine_name, "Configure " + engine_name);
|
|
|
|
id++;
|
|
|
|
} while (conf->GetNextGroup(engine_name, index));
|
|
|
|
}
|
|
|
|
|
|
|
|
CONFIG_CLOSE(conf);
|
|
|
|
}
|
|
|
|
|
|
|
|
void MainWindow::NewEngine() {
|
2022-02-26 19:21:52 +01:00
|
|
|
wxFileDialog openFileDialog(this, _("Use engine"), "", "", "Executable|*",
|
|
|
|
wxFD_OPEN | wxFD_FILE_MUST_EXIST);
|
|
|
|
if (openFileDialog.ShowModal() != wxID_CANCEL) {
|
|
|
|
std::string path = openFileDialog.GetPath().ToStdString();
|
|
|
|
uciadapter::UCI *engine;
|
|
|
|
try {
|
|
|
|
engine = new uciadapter::UCI(path);
|
|
|
|
EngineTab *bt = new EngineTab((wxWindow *)notebook, engine, path);
|
|
|
|
notebook->AddPage(bt, bt->GetLabel());
|
|
|
|
notebook->SetSelection(notebook->GetPageIndex(bt));
|
|
|
|
} catch (...) {
|
|
|
|
SHOW_DIALOG_ERROR("Could not communicate with the engine");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-02-26 21:43:09 +01:00
|
|
|
void MainWindow::OpenSettings() {
|
2022-02-23 19:41:50 +01:00
|
|
|
if (prefsEditor != NULL) {
|
|
|
|
delete prefsEditor;
|
|
|
|
}
|
|
|
|
prefsEditor = new wxPreferencesEditor("Preferences");
|
|
|
|
prefsEditor->AddPage(new BoardPrefs());
|
|
|
|
prefsEditor->AddPage(new EditorPrefs());
|
|
|
|
prefsEditor->Show(this);
|
2022-02-23 18:11:55 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
void MainWindow::ApplyPreferences() {
|
|
|
|
for (int i = 0; i < notebook->GetPageCount(); i++) {
|
|
|
|
TabInfos *infos = dynamic_cast<TabInfos *>(notebook->GetPage(i));
|
|
|
|
infos->ApplyPreferences();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-02-26 12:30:07 +01:00
|
|
|
std::vector<TabInfos *> MainWindow::ListTabInfos() {
|
|
|
|
std::vector<TabInfos *> tinfos;
|
|
|
|
for (int i = 0; i < notebook->GetPageCount(); i++) {
|
|
|
|
tinfos.push_back(dynamic_cast<TabInfos *>(notebook->GetPage(i)));
|
|
|
|
}
|
|
|
|
return (tinfos);
|
|
|
|
}
|
|
|
|
|
2022-02-23 19:41:50 +01:00
|
|
|
void MainWindow::OnClose(wxCloseEvent &e) {
|
|
|
|
if (prefsEditor != NULL) {
|
|
|
|
prefsEditor->Dismiss();
|
|
|
|
}
|
|
|
|
e.Skip();
|
|
|
|
}
|
|
|
|
|
2022-02-26 21:43:09 +01:00
|
|
|
void MainWindow::OpenFile() {
|
2022-02-23 18:11:55 +01:00
|
|
|
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();
|
2022-02-25 09:21:26 +01:00
|
|
|
// Test base tab
|
|
|
|
BaseTab *bt = new BaseTab((wxFrame *)notebook, path);
|
|
|
|
notebook->AddPage(bt, bt->GetLabel());
|
|
|
|
notebook->SetSelection(notebook->GetPageIndex(bt));
|
2022-02-23 18:11:55 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-02-26 21:43:09 +01:00
|
|
|
void MainWindow::NewGame(bool useFen) {
|
|
|
|
if (useFen) {
|
2022-02-23 18:11:55 +01:00
|
|
|
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());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-02-24 21:10:29 +01:00
|
|
|
void MainWindow::OnNewGame(wxCommandEvent &event) {
|
2022-02-25 08:49:57 +01:00
|
|
|
Game *g = (Game *)event.GetClientData();
|
2022-02-24 16:45:28 +01:00
|
|
|
NewGame(g);
|
|
|
|
}
|
|
|
|
|
2022-02-23 18:11:55 +01:00
|
|
|
void MainWindow::OnPageChange(wxAuiNotebookEvent &event) {
|
|
|
|
TabInfos *infos = dynamic_cast<TabInfos *>(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<GameTab *>(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));
|
|
|
|
}
|