diff --git a/src/imgui_helper.hpp b/src/imgui_helper.hpp index 13400ac..bf26dc0 100644 --- a/src/imgui_helper.hpp +++ b/src/imgui_helper.hpp @@ -30,6 +30,7 @@ namespace Tri { ImGui::Text("Press \"R\" to redo."); ImGui::Text("Press \"C\" to change colors"); ImGui::Text("Press \"B\" to change background color"); + ImGui::Text("Press \"P\" to set current color to a color on screen"); ImGui::Text("Press \"S\" to save what was drawn as a png image"); if(ImGui::Button("Close")) { state->close_help(); @@ -38,8 +39,8 @@ namespace Tri { } } - inline void draw_show_help(Tri::State *state) { - float alpha = state->get_starting_help_alpha(); + inline void draw_notification(Tri::State *state) { + float alpha = state->get_notification_alpha(); if(alpha > 0.0f) { ImGui::PushStyleVar(ImGuiStyleVar_Alpha, alpha); @@ -49,9 +50,12 @@ namespace Tri { ImGui::SetNextWindowSize(sf::Vector2f( SHOW_HELP_WIDTH, SHOW_HELP_HEIGHT)); - ImGui::Begin("Use Help Window", nullptr, ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_NoSavedSettings); + ImGui::Begin( + "Notification Window", + nullptr, + ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_NoSavedSettings); ImGui::SetWindowFontScale(3.0f); - ImGui::Text("Press \"H\" for help"); + ImGui::Text("%s", state->get_notification_text()); ImGui::End(); ImGui::PopStyleVar(); diff --git a/src/state.cpp b/src/state.cpp index 0dad229..86d2626 100644 --- a/src/state.cpp +++ b/src/state.cpp @@ -18,7 +18,7 @@ Tri::State::State(int argc, char **argv) : width(800), height(600), dt(sf::microseconds(16666)), -starting_help_alpha(1.0f), +notification_alpha(1.0f), window(sf::VideoMode(800, 600), "Triangles", sf::Style::Titlebar | sf::Style::Close), trisIndex(0), currentTri_state(CurrentState::NONE), @@ -31,6 +31,9 @@ bgColor(sf::Color::Black) ImGui::SFML::Init(window); window.setFramerateLimit(60); + notification_text.fill(0); + std::strcpy(notification_text.data(), "Press \"H\" for help"); + pointCircle.setRadius(7.0f); pointCircle.setOrigin(7.0f, 7.0f); pointCircle.setFillColor(sf::Color::White); @@ -127,10 +130,24 @@ void Tri::State::handle_events() { } } else if(event.key.code == sf::Keyboard::S) { flags.flip(6); + } else if(event.key.code == sf::Keyboard::P) { + flags.flip(9); + if(flags.test(9)) { + notification_text.fill(0); + std::strcpy(notification_text.data(), + "Copy color mode\n" + "Click to change\n" + "current draw color\n" + "to what was\n" + "clicked on"); + notification_alpha = 1.0f; + } else { + notification_alpha = 0.0f; + } } } } else if(event.type == sf::Event::MouseButtonPressed) { - if(!is_in_clickable_menu()) { + if(can_draw()) { switch(currentTri_state) { case CurrentState::NONE: currentTri[0] = sf::Vector2f(event.mouseButton.x, event.mouseButton.y); @@ -164,6 +181,18 @@ void Tri::State::handle_events() { flags.set(7); break; } + } else if(flags.test(9)) { + auto color = drawCache.getTexture().copyToImage().getPixel(event.mouseButton.x, event.mouseButton.y); + colorPickerColor[0] = color.r / 255.0f; + colorPickerColor[1] = color.g / 255.0f; + colorPickerColor[2] = color.b / 255.0f; + colorPickerColor[3] = 1.0f; + pointCircle.setFillColor(color); + flags.reset(9); + notification_text.fill(0); + std::strcpy(notification_text.data(), + "Color set"); + notification_alpha = 1.0f; } } } @@ -172,10 +201,10 @@ void Tri::State::handle_events() { void Tri::State::update() { ImGui::SFML::Update(window, dt); - if(starting_help_alpha > 0.0f) { - starting_help_alpha -= dt.asSeconds() * STARTING_HELP_FADE_RATE; - if(starting_help_alpha < 0.0f) { - starting_help_alpha = 0.0f; + if(notification_alpha > 0.0f) { + notification_alpha -= dt.asSeconds() * STARTING_HELP_FADE_RATE; + if(notification_alpha < 0.0f) { + notification_alpha = 0.0f; } } @@ -196,7 +225,7 @@ void Tri::State::update() { } // Seems misleading, but imgui handles setting up the window during update - Tri::draw_show_help(this); + Tri::draw_notification(this); Tri::draw_color_picker(this); Tri::draw_bg_color_picker(this); Tri::draw_save(this); @@ -251,8 +280,12 @@ const Tri::State::BitsetType Tri::State::get_flags() const { return flags; } -float Tri::State::get_starting_help_alpha() const { - return starting_help_alpha; +float Tri::State::get_notification_alpha() const { + return notification_alpha; +} + +const char* Tri::State::get_notification_text() const { + return notification_text.data(); } float* Tri::State::get_color() { @@ -307,8 +340,12 @@ void Tri::State::close_save() { flags.reset(6); } -bool Tri::State::is_in_clickable_menu() const { - return flags.test(0) || flags.test(2) || flags.test(5) || flags.test(6); +bool Tri::State::can_draw() const { + return !flags.test(0) + && !flags.test(2) + && !flags.test(5) + && !flags.test(6) + && !flags.test(9); } void Tri::State::close_help() { diff --git a/src/state.hpp b/src/state.hpp index 7ae25bb..7213538 100644 --- a/src/state.hpp +++ b/src/state.hpp @@ -26,13 +26,16 @@ namespace Tri { * 6 - draw save * 7 - draw cache dirty * 8 - draw cache initialized + * 9 - copy color mode */ typedef std::bitset<64> BitsetType; BitsetType flags; unsigned int width; unsigned int height; const sf::Time dt; - float starting_help_alpha; + float notification_alpha; + typedef std::array NotificationBufferType; + NotificationBufferType notification_text; sf::RenderWindow window; std::vector tris; @@ -69,7 +72,8 @@ namespace Tri { const BitsetType get_flags() const; - float get_starting_help_alpha() const; + float get_notification_alpha() const; + const char* get_notification_text() const; float* get_color(); float* get_bg_color(); @@ -80,7 +84,7 @@ namespace Tri { void close_save(); private: - bool is_in_clickable_menu() const; + bool can_draw() const; public: void close_help();