Integrate CMI

This commit is contained in:
Loic Guegan 2023-01-19 13:06:36 +01:00
parent 5e18d43a6b
commit a84b210ca3
15 changed files with 194 additions and 286 deletions

View file

@ -4,3 +4,5 @@ find_package(wxWidgets COMPONENTS core base REQUIRED)
include(${wxWidgets_USE_FILE})
add_executable(wxwidgets_example main.cpp MyHalfMove.cpp)
target_link_libraries(wxwidgets_example cgeditor ${wxWidgets_LIBRARIES})
target_link_libraries(wxwidgets_example ChessMoveInterface)

View file

@ -1,114 +1,6 @@
#include "MyHalfMove.hpp"
MyHalfMove::MyHalfMove(std::string move) { this->move = move; }
MyHalfMove::~MyHalfMove() {}
void MyHalfMove::AddVariation(MyHalfMove *m) {
m->IsBlack = this->IsBlack;
m->Number = this->Number;
MyHalfMove::variations.push_back(m);
cgeditor::CGEHalfMove::variations.push_back(m);
m->SetParent(this);
}
void MyHalfMove::SetMainline(MyHalfMove *m) {
if (!this->IsBlack) {
m->IsBlack = true;
m->Number = this->Number;
} else {
m->IsBlack = false;
m->Number = this->Number + 1;
}
MyHalfMove::mainline = m;
cgeditor::CGEHalfMove::MainLine = m;
if (m != NULL) {
m->SetParent(this);
}
}
void MyHalfMove::SetParent(MyHalfMove *m) {
MyHalfMove::parent = m;
CGEHalfMove::Parent = m;
}
void MyHalfMove::RemoveChild(MyHalfMove *m) {
std::uint32_t i = 0;
bool found = false;
for (i; i < MyHalfMove::variations.size(); i++) {
if (MyHalfMove::variations[i] == m) {
found = true;
break;
}
}
if (found) {
MyHalfMove::variations.erase(MyHalfMove::variations.begin() + i);
}
if (MyHalfMove::MainLine == m) {
MyHalfMove::MainLine = NULL;
}
cgeditor::CGEHalfMove::RemoveChild((CGEHalfMove *)m);
}
MyHalfMove *MyHalfMove::GetParent() { return (parent); }
MyHalfMove *MyHalfMove::GetRoot() {
MyHalfMove *m = this;
MyHalfMove *p = MyHalfMove::parent;
while (p != NULL) {
if (p->mainline != m) {
return (m);
}
m = p;
p = m->MyHalfMove::parent;
}
return (m);
}
void MyHalfMove::SetAsMainline() {
MyHalfMove *root = GetRoot();
MyHalfMove *lastRoot;
do {
lastRoot = root;
root->MyHalfMove::Promote();
root = GetRoot();
} while (root != lastRoot);
// std::cout << IsVariation() << std::endl << std::flush;
}
void MyHalfMove::Promote() {
if (MyHalfMove::parent != NULL) {
MyHalfMove *p = MyHalfMove::parent;
if (p->MyHalfMove::mainline != this) {
if (MyHalfMove::parent->MyHalfMove::parent != NULL) {
MyHalfMove *pp = MyHalfMove::parent->MyHalfMove::parent;
if (pp->MyHalfMove::mainline == p) {
pp->MyHalfMove::SetMainline(this);
} else {
pp->AddVariation(this);
pp->MyHalfMove::RemoveChild(p);
}
}
if (p->MyHalfMove::mainline == this) {
p->MyHalfMove::SetMainline(NULL);
} else {
p->MyHalfMove::RemoveChild(this);
}
this->AddVariation(p);
}
}
}
bool MyHalfMove::IsVariation() {
MyHalfMove *m = this;
MyHalfMove *p = MyHalfMove::parent;
while (p != NULL) {
if (p->mainline != m) {
return (true);
}
m = p;
p = m->MyHalfMove::parent;
}
return (false);
}
MyHalfMove::MyHalfMove(std::string move){SetSAN(move); }
MyHalfMove *BuildExampleGame() {
MyHalfMove *m = new MyHalfMove("e4");
@ -128,7 +20,7 @@ MyHalfMove *BuildExampleGame() {
m2 = new MyHalfMove("Bc4");
m->SetMainline(m2);
m->comment="Italian Opening";
m->SetComment("Italian Opening");
m = m2;
m2 = new MyHalfMove("Bc5");
@ -136,7 +28,7 @@ MyHalfMove *BuildExampleGame() {
m = m2;
m2 = new MyHalfMove("c3");
m2->comment="Giuoco Pianissimo";
m2->SetComment("Giuoco Pianissimo");
m->SetMainline(m2);
m = m2;
@ -158,7 +50,7 @@ MyHalfMove *BuildExampleGame() {
{
MyHalfMove *var = new MyHalfMove("Re1");
var->comment="Also possible";
var->SetComment("Also possible");
m->AddVariation(var);
MyHalfMove *var2 = new MyHalfMove("a6");
@ -185,8 +77,8 @@ MyHalfMove *BuildExampleGame() {
m2 = new MyHalfMove("a6");
m->SetMainline(m2);
m->comment="Test for a very long comment, to see how line breaks are handle by the framework.";
m->comment+="Test for a very long comment, to see how line breaks are handle by the framework.";
m->SetComment("Test for a very long comment, to see how line breaks are handle by the framework.");
m->SetComment(m->GetComment()+"Test for a very long comment, to see how line breaks are handle by the framework.");
m = m2;
m2 = new MyHalfMove("Bb3");
@ -198,7 +90,7 @@ MyHalfMove *BuildExampleGame() {
m = m2;
m2 = new MyHalfMove("Re1");
m2->nag="!!";
m2->SetNAG(3);
m->SetMainline(m2);
m = m2;

View file

@ -1,5 +1,6 @@
#pragma once
#include "CGEditor.hpp"
#include <vector>
/**
* @brief Create your custom half move class
@ -8,32 +9,10 @@
* an overview of how to keep your move sync with the one of CGEditor
*
*/
class MyHalfMove : public cgeditor::CGEHalfMove {
MyHalfMove *parent = NULL;
MyHalfMove *mainline = NULL;
std::vector<MyHalfMove *> variations;
class MyHalfMove : public CMI::HalfMove {
public:
MyHalfMove(std::string move);
~MyHalfMove();
/// @brief Add variation to current move
void AddVariation(MyHalfMove *m);
/// @brief Remove the specified child from mainline and/or variations
void RemoveChild(MyHalfMove *m);
/// @brief Set value of the mailine
void SetMainline(MyHalfMove *m);
/// @brief Set this move as mainline
void SetAsMainline();
/// @brief Promote the current move and submove
void Promote();
/// @brief Check if current half move is within a variation
bool IsVariation();
/// @brief Get the root of a variation
MyHalfMove* GetRoot();
/// @brief Get parent of the current move
MyHalfMove* GetParent();
/// @brief Set parent of the current move
void SetParent(MyHalfMove *m);
};
/// @brief Build the example game to use in the editor

View file

@ -38,7 +38,7 @@ private:
CGEditor::status.CanvasWidth = sz.GetWidth();
CGEditor::status.CanvasHeight = sz.GetHeight();
CGEditor::status.UseMoveIcons =
true; // Piece image should be drawn before the move ?
false; // Piece image should be drawn before the move ?
const wxPoint pt = wxGetMousePosition();
CGEditor::status.MouseX = pt.x - this->GetScreenPosition().x;
@ -90,7 +90,7 @@ private:
e.y + (e.height - sz.GetHeight()) / 2));
}
/**
/**
* @brief CGEditor is going to call this method with the elements to draw on
* the canvas
*
@ -161,22 +161,27 @@ private:
str = "Comment Selected";
else if (e.type == cgeditor::Event::Type::Promote) {
str = "Promote";
static_cast<MyHalfMove *>(e.move)->MyHalfMove::Promote();
e.move->Promote();
SyncCache();
} else if (e.type == cgeditor::Event::Type::Delete) {
str = "Delete";
if (e.move->Parent != NULL) {
static_cast<MyHalfMove *>(e.move)->GetParent()->MyHalfMove::RemoveChild(
(MyHalfMove *)e.move);
if (e.move->GetParent() != nullptr) {
static_cast<MyHalfMove *>((e.move)->GetParent())->RemoveChild(static_cast<MyHalfMove *>(e.move));
delete static_cast<MyHalfMove *>(e.move);
SyncCache(); // Do not forget to sync the cache
} else {
CGEditor::status.Moves = NULL;
CGEditor::status.Moves = nullptr;
}
} else if (e.type == cgeditor::Event::Type::SetAsMainline) {
str = "Set as main line";
static_cast<MyHalfMove *>(e.move)->MyHalfMove::SetAsMainline();
e.move->SetAsMainline();
SyncCache();
} else if (e.type == cgeditor::Event::Type::Goto) {
str = "Goto move";
}
std::cout << "Event received: " << str << std::endl << std::flush;
wxLogDebug("Event received: %s", str);
if(CGEditor::status.Moves != nullptr && !CGEditor::status.Moves->IsConsistent())
wxLogError("ERROR!! The tree of moves is not consistent anymore! Something wrong happends");
}
// wxWidgets specific