From 49b815a6db0b8b3c070a00993afcf820e3fd2c78 Mon Sep 17 00:00:00 2001 From: trotFunky Date: Tue, 21 May 2019 12:48:08 +0200 Subject: [PATCH 1/4] Correct indent for printing --- snippets/CMakeLists.txt | 1 - xmlParser/Circle.cpp | 7 ++++++- xmlParser/Circle.h | 2 +- xmlParser/DrawingElement.cpp | 9 +++++++-- xmlParser/DrawingElement.h | 3 ++- xmlParser/Group.cpp | 9 +++++++-- xmlParser/Group.h | 2 +- 7 files changed, 24 insertions(+), 9 deletions(-) diff --git a/snippets/CMakeLists.txt b/snippets/CMakeLists.txt index a03ef56..e15085c 100644 --- a/snippets/CMakeLists.txt +++ b/snippets/CMakeLists.txt @@ -40,7 +40,6 @@ endif() add_executable(compte_mots compte_mots.cpp) add_library(polynomial SHARED Polynomial.cpp Polynomial.tpp) -#target_link_libraries(polynomial -static) if(GTest_FOUND) add_executable(polynomialTest gTestPolynomial.cpp) diff --git a/xmlParser/Circle.cpp b/xmlParser/Circle.cpp index d320994..338ed92 100644 --- a/xmlParser/Circle.cpp +++ b/xmlParser/Circle.cpp @@ -42,9 +42,14 @@ namespace xmlParser shape->setPosition(x-r,y-r); } - const std::string Circle::toString() const + const std::string Circle::toString(int indent) const { std::stringstream string; + for(int i = 0;itoString(indent+1) << std::endl; } return(string.str()); } diff --git a/xmlParser/Group.h b/xmlParser/Group.h index 99c7a42..f1c9141 100644 --- a/xmlParser/Group.h +++ b/xmlParser/Group.h @@ -34,7 +34,7 @@ namespace xmlParser void draw(sf::RenderWindow&) override; - const std::string toString() const override; + const std::string toString(int indent) const override; private: std::map drawingElements; }; From 86273890ae5007f6bbb0d027e29908b5b596db28 Mon Sep 17 00:00:00 2001 From: trotFunky Date: Wed, 22 May 2019 18:47:48 +0200 Subject: [PATCH 2/4] Smart pointers to manage DrawingElements --- xmlParser/Group.cpp | 10 +++++----- xmlParser/Group.h | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/xmlParser/Group.cpp b/xmlParser/Group.cpp index 08a2e6d..a9735b6 100644 --- a/xmlParser/Group.cpp +++ b/xmlParser/Group.cpp @@ -6,7 +6,7 @@ namespace xmlParser { - Group::Group(std::string label, float x, float y, const sf::Color& color) : DrawingElement(std::move(label),x,y,color), drawingElements({}) + Group::Group(std::string label, float x, float y, const sf::Color& color) : DrawingElement(std::move(label),x,y,color), drawingElements() {} Group::Group(const pugi::xml_node& node) : DrawingElement(node) @@ -32,7 +32,7 @@ namespace xmlParser !strncmp(childNode.name(),"Group",5) ? dynamic_cast(new Group(childNode)) : nullptr; if(newElement != nullptr) { - drawingElements.insert(std::make_pair(newElement->label,newElement)); + drawingElements.emplace(std::make_pair(newElement->label,std::move(std::unique_ptr(newElement)))); } } } @@ -42,13 +42,13 @@ namespace xmlParser std::transform(elements.begin(),elements.end(),std::inserter(drawingElements,drawingElements.begin()), [](std::pair pair) { - return(pair); + return(std::make_pair(pair.first,std::move(std::unique_ptr(pair.second)))); }); } bool Group::addDrawingElement(DrawingElement* drawingElement) { - return(drawingElements.insert(std::make_pair(drawingElement->label,drawingElement)).second); + return(drawingElements.insert(std::make_pair(drawingElement->label,std::move(std::unique_ptr(drawingElement)))).second); } bool Group::removeDrawingElement(const std::string& label) @@ -58,7 +58,7 @@ namespace xmlParser DrawingElement* Group::getDrawingElement(const std::string& label) { - return(drawingElements.at(label)); + return(drawingElements.at(label).get()); } void Group::draw(sf::RenderWindow& window) diff --git a/xmlParser/Group.h b/xmlParser/Group.h index f1c9141..1d7b2c7 100644 --- a/xmlParser/Group.h +++ b/xmlParser/Group.h @@ -36,7 +36,7 @@ namespace xmlParser const std::string toString(int indent) const override; private: - std::map drawingElements; + std::map> drawingElements; }; } From 52ccc0b426fd8d41c142bc17c77b59548585984a Mon Sep 17 00:00:00 2001 From: trotFunky Date: Wed, 22 May 2019 19:26:15 +0200 Subject: [PATCH 3/4] Smart pointer for sf:Shape and removed useless dynamic_cast (Virtual functions are useful, aren't they ?) --- xmlParser/CMakeLists.txt | 2 ++ xmlParser/Circle.cpp | 11 +++-------- xmlParser/Circle.h | 2 -- xmlParser/DrawingElement.cpp | 28 ++++++++++------------------ xmlParser/DrawingElement.h | 6 +++--- 5 files changed, 18 insertions(+), 31 deletions(-) diff --git a/xmlParser/CMakeLists.txt b/xmlParser/CMakeLists.txt index e1acc4e..c0d5b84 100644 --- a/xmlParser/CMakeLists.txt +++ b/xmlParser/CMakeLists.txt @@ -37,6 +37,8 @@ target_link_libraries(xmlParser sfml-graphics pugixml) +target_compile_options(xmlParser PRIVATE -Wall -Wpedantic -Wextra) + add_executable(gTestXMLParser gTestXMLParser.cpp) target_compile_options(gTestXMLParser PRIVATE -pthread) diff --git a/xmlParser/Circle.cpp b/xmlParser/Circle.cpp index 338ed92..343d535 100644 --- a/xmlParser/Circle.cpp +++ b/xmlParser/Circle.cpp @@ -9,7 +9,7 @@ namespace xmlParser Circle::Circle(std::string label, float x, float y, float r, const sf::Color& color) : DrawingElement(std::move(label),x,y,color), r(2) { - shape = new sf::CircleShape(r); + shape = std::unique_ptr(new sf::CircleShape(r)); shape->setPosition(x-r,y-r); shape->setFillColor(color); } @@ -20,16 +20,11 @@ namespace xmlParser { label = "Test Circle"; } - shape = new sf::CircleShape(r); + shape = std::unique_ptr(new sf::CircleShape(r)); shape->setPosition(x-r,y-r); shape->setFillColor(color); } - void Circle::draw(sf::RenderWindow& window) - { - window.draw(*(dynamic_cast(shape))); - } - float Circle::getR() const { return r; @@ -38,7 +33,7 @@ namespace xmlParser void Circle::setR(float newR) { r = newR; - dynamic_cast(shape)->setRadius(r); + dynamic_cast(shape.get())->setRadius(r); shape->setPosition(x-r,y-r); } diff --git a/xmlParser/Circle.h b/xmlParser/Circle.h index d7fc924..ee945e3 100644 --- a/xmlParser/Circle.h +++ b/xmlParser/Circle.h @@ -22,8 +22,6 @@ namespace xmlParser explicit Circle(const pugi::xml_node&); - void draw(sf::RenderWindow&) override; - void setX(float newX) override; void setY(float newY) override; diff --git a/xmlParser/DrawingElement.cpp b/xmlParser/DrawingElement.cpp index 8c83d87..573b894 100644 --- a/xmlParser/DrawingElement.cpp +++ b/xmlParser/DrawingElement.cpp @@ -9,16 +9,21 @@ namespace xmlParser { - DrawingElement::DrawingElement(std::string label, float x, float y, const sf::Color& color) : x(x), y(-y), label(std::move(label)), + DrawingElement::DrawingElement(std::string label, float x, float y, const sf::Color& color) : label(std::move(label)), x(x), y(-y), color(color), shape(nullptr) {} - DrawingElement::DrawingElement(const pugi::xml_node& node) : x(node.attribute("x").as_int(0)), - y(-node.attribute("y").as_int(1)), label(node.attribute("label").as_string("Test DrawingElement")), shape(nullptr) + DrawingElement::DrawingElement(const pugi::xml_node& node) : label(node.attribute("label").as_string("Test DrawingElement")), + x(node.attribute("x").as_int(0)), y(-node.attribute("y").as_int(1)), shape(nullptr) { setColor(node.attribute("color").as_string("Yellow")); } + void DrawingElement::draw(sf::RenderWindow& window) + { + window.draw(*shape); + } + void DrawingElement::draw(sf::RenderWindow& window, float referenceX, float referenceY) { setX(x+referenceX); @@ -37,7 +42,7 @@ namespace xmlParser { x = newX; - if(shape != nullptr) + if(shape) { shape->setPosition(x,-y); } @@ -52,7 +57,7 @@ namespace xmlParser { y = newY; - if(shape != nullptr) + if(shape) { shape->setPosition(x,-y); } @@ -83,19 +88,6 @@ namespace xmlParser color = strToColor(stringColor); } - const std::string DrawingElement::toString(int indent) const - { - std::stringstream string; - for(int i = 0;i shape; }; } From de4024154c2c971710126ae5725af3f70309cc62 Mon Sep 17 00:00:00 2001 From: trotFunky Date: Thu, 23 May 2019 02:23:49 +0200 Subject: [PATCH 4/4] Added ImGui-SFML --- xmlParser/CMakeLists.txt | 13 +++++- xmlParser/gTestXMLParser.cpp | 80 ++++++++++++++++++++++++++++++++++++ 2 files changed, 91 insertions(+), 2 deletions(-) diff --git a/xmlParser/CMakeLists.txt b/xmlParser/CMakeLists.txt index c0d5b84..d2d788e 100644 --- a/xmlParser/CMakeLists.txt +++ b/xmlParser/CMakeLists.txt @@ -22,6 +22,11 @@ endif() find_path(PugiXML_INCLUDE_DIR pugixml.hpp) +find_package(ImGui-SFML REQUIRED) +if(NOT ImGui-SFML_FOUND) + message(FATAL "ImGui-SFML non trouvé") +endif() + add_library(xmlParser SHARED Circle.cpp Circle.h @@ -35,7 +40,9 @@ add_library(xmlParser SHARED target_link_libraries(xmlParser sfml-window sfml-graphics - pugixml) + sfml-system + pugixml + ImGui-SFML::ImGui-SFML) target_compile_options(xmlParser PRIVATE -Wall -Wpedantic -Wextra) @@ -47,5 +54,7 @@ target_link_libraries(gTestXMLParser gtest sfml-graphics sfml-window - pugixml) + sfml-system + pugixml + ImGui-SFML::ImGui-SFML) target_link_options(gTestXMLParser PRIVATE -pthread) \ No newline at end of file diff --git a/xmlParser/gTestXMLParser.cpp b/xmlParser/gTestXMLParser.cpp index 23534d3..62e4947 100644 --- a/xmlParser/gTestXMLParser.cpp +++ b/xmlParser/gTestXMLParser.cpp @@ -5,12 +5,44 @@ #include #include +#include "imgui.h" +#include "imgui-SFML.h" + #include "Circle.h" #include "xmlParser.h" #include "SFML/Graphics.hpp" #include "Group.h" +class ImGui_F : public ::testing::Test +{ +protected: + + sf::RenderWindow* window; + + sf::Color bgColor; + + sf::Clock deltaClock; + + float color[3] = { 0.f, 0.f, 0.f }; + + // let's use char array as buffer, see next part + // for instructions on using std::string with ImGui + char windowTitle[255]; + + void SetUp() override + { + window = new sf::RenderWindow(sf::VideoMode(640, 480), ""); + window->setVerticalSyncEnabled(true); + ImGui::SFML::Init(*window); + + strcpy(windowTitle,"ImGui + SFML = <3"); + + window->setTitle(windowTitle); + window->resetGLStates(); // call it if you only draw ImGui. Otherwise not needed. + } +}; + TEST(xmlParserInits,initEmptyCircle) { xmlParser::Circle cercle = xmlParser::Circle(); @@ -191,6 +223,54 @@ TEST(drawFace,drawFace) } } +TEST_F(ImGui_F,ImGui_Example) +{ + while (window->isOpen()) { + sf::Event event; + while (window->pollEvent(event)) { + ImGui::SFML::ProcessEvent(event); + + if (event.type == sf::Event::Closed) { + window->close(); + } + } + + ImGui::SFML::Update(*window, deltaClock.restart()); + + ImGui::Begin("Sample window"); // begin window + + // Background color edit + if (ImGui::ColorEdit3("Background color", color)) { + // this code gets called if color value changes, so + // the background color is upgraded automatically! + bgColor.r = static_cast(color[0] * 255.f); + bgColor.g = static_cast(color[1] * 255.f); + bgColor.b = static_cast(color[2] * 255.f); + } + + // Window title text edit + ImGui::InputText("Window title", windowTitle, 255); + + if (ImGui::Button("Update window title")) { + // this code gets if user clicks on the button + // yes, you could have written if(ImGui::InputText(...)) + // but I do this to show how buttons work :) + window->setTitle(windowTitle); + } + ImGui::End(); // end window + + window->clear(bgColor); // fill background with color + ImGui::SFML::Render(*window); + window->display(); + } + + ImGui::SFML::Shutdown(); +} + +TEST_F(ImGui_F,ImGui_Perso) +{ + // TODO : Copy examples to create new shapes 'n stuff +} int main(int argc, char** argv) { ::testing::InitGoogleTest(&argc,argv);