From 508ed0d7d45b00a72cb01f2e17b4126e9472cceb Mon Sep 17 00:00:00 2001 From: Stephen Seo Date: Thu, 30 Jul 2020 20:11:57 +0900 Subject: [PATCH] Impl changing window size --- src/imgui_helper.hpp | 22 ++++++++++- src/state.cpp | 88 ++++++++++++++++++++++++++++++++++++++++---- src/state.hpp | 11 +++++- 3 files changed, 111 insertions(+), 10 deletions(-) diff --git a/src/imgui_helper.hpp b/src/imgui_helper.hpp index bf26dc0..1667f31 100644 --- a/src/imgui_helper.hpp +++ b/src/imgui_helper.hpp @@ -96,13 +96,33 @@ namespace Tri { } else if(ImGui::Button("Cancel")) { state->close_save(); } - auto string_view = state->failed_save_message(); + auto string_view = state->failed_message(); if(!string_view.empty()) { ImGui::TextUnformatted(string_view.data(), string_view.data() + string_view.size()); } ImGui::End(); } } + + inline void draw_change_size(Tri::State *state) { + if(state->get_flags().test(10)) { + ImGui::Begin("ChangeSize"); + ImGui::InputInt2("Width and Height", state->get_input_width_height()); + auto string_view = state->failed_message(); + if(!string_view.empty()) { + ImGui::TextUnformatted(string_view.data(), string_view.data() + string_view.size()); + } + if(ImGui::Button("Cancel")) { + state->close_input_width_height_window(); + } + if(ImGui::Button("Set")) { + if(state->change_width_height()) { + state->close_input_width_height_window(); + } + } + ImGui::End(); + } + } } #endif diff --git a/src/state.cpp b/src/state.cpp index 86d2626..f00edad 100644 --- a/src/state.cpp +++ b/src/state.cpp @@ -25,7 +25,8 @@ currentTri_state(CurrentState::NONE), currentTri_maxState(CurrentState::NONE), colorPickerColor{1.0f, 1.0f, 1.0f, 1.0f}, bgColorPickerColor{0.0f, 0.0f, 0.0f}, -bgColor(sf::Color::Black) +bgColor(sf::Color::Black), +inputWidthHeight{800, 600} { flags.set(1); // is running ImGui::SFML::Init(window); @@ -67,6 +68,7 @@ void Tri::State::handle_events() { flags.reset(1); } else if(event.type == sf::Event::KeyPressed) { if(!flags.test(6)) { + // TODO use a switch statement if(event.key.code == sf::Keyboard::H) { flags.flip(0); } else if(event.key.code == sf::Keyboard::U) { @@ -144,6 +146,12 @@ void Tri::State::handle_events() { } else { notification_alpha = 0.0f; } + } else if(event.key.code == sf::Keyboard::I) { + flags.flip(10); + if(!flags.test(10)) { + inputWidthHeight[0] = width; + inputWidthHeight[1] = height; + } } } } else if(event.type == sf::Event::MouseButtonPressed) { @@ -228,6 +236,7 @@ void Tri::State::update() { Tri::draw_notification(this); Tri::draw_color_picker(this); Tri::draw_bg_color_picker(this); + Tri::draw_change_size(this); Tri::draw_save(this); Tri::draw_help(this); @@ -308,7 +317,7 @@ bool Tri::State::do_save() { #ifndef NDEBUG puts("ERROR: Failed to create texture for saving"); #endif - failedSaveMessage = std::string("Failed to create texture for saving"); + failedMessage = std::string("Failed to create texture for saving"); return false; } @@ -321,19 +330,19 @@ bool Tri::State::do_save() { #ifndef NDEBUG printf("Saved to \"%s\"\n", filename.c_str()); #endif - failedSaveMessage.clear(); + failedMessage.clear(); return true; } else { #ifndef NDEBUG printf("ERROR: Failed to save \"%s\"\n", filename.c_str()); #endif - failedSaveMessage = std::string("Failed to save (does the name end in \".png\"?)"); + failedMessage = std::string("Failed to save (does the name end in \".png\"?)"); return false; } } -std::string_view Tri::State::failed_save_message() const { - return failedSaveMessage; +std::string_view Tri::State::failed_message() const { + return failedMessage; } void Tri::State::close_save() { @@ -345,7 +354,8 @@ bool Tri::State::can_draw() const { && !flags.test(2) && !flags.test(5) && !flags.test(6) - && !flags.test(9); + && !flags.test(9) + && !flags.test(10); } void Tri::State::close_help() { @@ -361,3 +371,67 @@ void Tri::State::close_bg_color_picker() { flags.reset(5); flags.set(7); } + +bool Tri::State::change_width_height() { + std::bitset<2> warnings; + if(inputWidthHeight[0] < 0 || inputWidthHeight[1] < 0) { + failedMessage = "Width or Height cannot be less than 0"; + return false; + } + if(inputWidthHeight[0] < 200) { + inputWidthHeight[0] = 200; + warnings.set(0); + } + if(inputWidthHeight[1] < 150) { + inputWidthHeight[1] = 150; + warnings.set(1); + } + + if(warnings.test(0) && warnings.test(1)) { + notification_alpha = 1.0f; + notification_text.fill(0); + std::strcpy( + notification_text.data(), + "Width set to 200\nHeight set to 150" + ); + } else if(warnings.test(0)) { + notification_alpha = 1.0f; + notification_text.fill(0); + std::strcpy( + notification_text.data(), + "Width set to 200" + ); + } else if(warnings.test(1)) { + notification_alpha = 1.0f; + notification_text.fill(0); + std::strcpy( + notification_text.data(), + "Height set to 150" + ); + } + + this->width = inputWidthHeight[0]; + this->height = inputWidthHeight[1]; + + window.setSize(sf::Vector2u(width, height)); + sf::View newView( + sf::Vector2f(width / 2.0f, height / 2.0f), + sf::Vector2f(width, height)); + window.setView(newView); + + drawCache.create(width, height); + drawCacheSprite.setTexture(drawCache.getTexture(), true); + flags.set(7); + + currentTri_state = CurrentState::NONE; + + return true; +} + +int* Tri::State::get_input_width_height() { + return inputWidthHeight; +} + +void Tri::State::close_input_width_height_window() { + flags.reset(10); +} diff --git a/src/state.hpp b/src/state.hpp index 7213538..ebcad0a 100644 --- a/src/state.hpp +++ b/src/state.hpp @@ -27,6 +27,7 @@ namespace Tri { * 7 - draw cache dirty * 8 - draw cache initialized * 9 - copy color mode + * 10 - display change size */ typedef std::bitset<64> BitsetType; BitsetType flags; @@ -53,11 +54,13 @@ namespace Tri { typedef std::array FilenameBufferType; FilenameBufferType saveFilenameBuffer; - std::string failedSaveMessage; + std::string failedMessage; sf::RenderTexture drawCache; sf::Sprite drawCacheSprite; + int inputWidthHeight[2]; + public: void handle_events(); void update(); @@ -80,7 +83,7 @@ namespace Tri { FilenameBufferType* get_save_filename_buffer(); bool do_save(); - std::string_view failed_save_message() const; + std::string_view failed_message() const; void close_save(); private: @@ -91,6 +94,10 @@ namespace Tri { void close_color_picker(); void close_bg_color_picker(); + bool change_width_height(); + int* get_input_width_height(); + void close_input_width_height_window(); + }; }