From 06ef26a1e90d9f7c0ad122d0aa0f6fc449933b9f Mon Sep 17 00:00:00 2001 From: Yousef Khadadeh Date: Mon, 6 Oct 2025 09:07:11 +0300 Subject: [PATCH] Pressing enter on textbox creates a new grid/bookmark --- src/GUIStuff/Elements/TextBox.hpp | 4 ++-- src/GUIStuff/GUIManager.cpp | 12 ++++++------ src/GUIStuff/GUIManager.hpp | 24 ++++++++++++------------ src/Toolbar.cpp | 14 ++++++++++---- 4 files changed, 30 insertions(+), 24 deletions(-) diff --git a/src/GUIStuff/Elements/TextBox.hpp b/src/GUIStuff/Elements/TextBox.hpp index ad49c4f..94526dd 100644 --- a/src/GUIStuff/Elements/TextBox.hpp +++ b/src/GUIStuff/Elements/TextBox.hpp @@ -6,7 +6,7 @@ namespace GUIStuff { template class TextBox : public Element { public: - void update(UpdateInputData& io, T* newData, const std::function(const std::string&)>& newFromStr, const std::function newToStr, bool newSingleLine, bool updateEveryEdit, const std::function& elemUpdate) { + void update(UpdateInputData& io, T* newData, const std::function(const std::string&)>& newFromStr, const std::function newToStr, bool newSingleLine, bool updateEveryEdit, const std::function& elemUpdate) { data = newData; fromStr = newFromStr; toStr = newToStr; @@ -129,7 +129,7 @@ template class TextBox : public Element { force_update_textbox(true); } if(elemUpdate) - elemUpdate(); + elemUpdate(selection); } } diff --git a/src/GUIStuff/GUIManager.cpp b/src/GUIStuff/GUIManager.cpp index 15e7a0a..a1a9126 100644 --- a/src/GUIStuff/GUIManager.cpp +++ b/src/GUIStuff/GUIManager.cpp @@ -273,14 +273,14 @@ void GUIManager::checkbox(const std::string& id, bool* val, const std::function< pop_id(); } -void GUIManager::input_text_field(const std::string& id, const std::string& name, std::string* val, const std::function& elemUpdate) { +void GUIManager::input_text_field(const std::string& id, const std::string& name, std::string* val, const std::function& elemUpdate) { left_to_right_line_layout([&]() { text_label(name); input_text(id, val, elemUpdate); }); } -void GUIManager::input_path_field(const std::string& id, const std::string& name, std::filesystem::path* val, std::filesystem::file_type fileTypeRestriction, const std::function& elemUpdate) { +void GUIManager::input_path_field(const std::string& id, const std::string& name, std::filesystem::path* val, std::filesystem::file_type fileTypeRestriction, const std::function& elemUpdate) { left_to_right_line_layout([&]() { text_label(name); input_path(id, val, fileTypeRestriction, elemUpdate); @@ -303,7 +303,7 @@ bool GUIManager::radio_button_field(const std::string& id, const std::string& na return toRet; } -void GUIManager::input_color_component_255(const std::string& id, float* val, const std::function& elemUpdate) { +void GUIManager::input_color_component_255(const std::string& id, float* val, const std::function& elemUpdate) { push_id(id); insert_element>()->update(*io, val, [&](const std::string& str) { @@ -322,7 +322,7 @@ void GUIManager::input_color_component_255(const std::string& id, float* val, co pop_id(); } -void GUIManager::input_text(const std::string& id, std::string* val, const std::function& elemUpdate) { +void GUIManager::input_text(const std::string& id, std::string* val, const std::function& elemUpdate) { push_id(id); insert_element>()->update(*io, val, [&](const std::string& str) { @@ -399,7 +399,7 @@ bool GUIManager::text_button_wide(const std::string& id, const std::string& text return toRet; } -void GUIManager::input_scalar(const std::string& id, uint8_t* val, uint8_t min, uint8_t max, int decimalPrecision, const std::function& elemUpdate) { +void GUIManager::input_scalar(const std::string& id, uint8_t* val, uint8_t min, uint8_t max, int decimalPrecision, const std::function& elemUpdate) { push_id(id); insert_element>()->update(*io, val, [&](const std::string& a) { @@ -419,7 +419,7 @@ void GUIManager::input_scalar(const std::string& id, uint8_t* val, uint8_t min, pop_id(); } -void GUIManager::input_path(const std::string& id, std::filesystem::path* val, std::filesystem::file_type fileTypeRestriction, const std::function& elemUpdate) { +void GUIManager::input_path(const std::string& id, std::filesystem::path* val, std::filesystem::file_type fileTypeRestriction, const std::function& elemUpdate) { push_id(id); insert_element>()->update(*io, val, [&](const std::string& a) { diff --git a/src/GUIStuff/GUIManager.hpp b/src/GUIStuff/GUIManager.hpp index 8e03ca4..e33ba26 100644 --- a/src/GUIStuff/GUIManager.hpp +++ b/src/GUIStuff/GUIManager.hpp @@ -40,7 +40,7 @@ class GUIManager { Vector2f screen_pos_to_window_pos(const Vector2f& screenPos); Vector2f get_mouse_pos(); - void input_text_field(const std::string& id, const std::string& name, std::string* val, const std::function& elemUpdate = nullptr); + void input_text_field(const std::string& id, const std::string& name, std::string* val, const std::function& elemUpdate = nullptr); void text_label_color(const std::string& val, const SkColor4f& color); void text_label_size(const std::string& val, float modifier); @@ -68,8 +68,8 @@ class GUIManager { void scroll_bar_area(const std::string& uniqueId, const std::function& elemUpdate); void scroll_bar_many_entries_area(const std::string& uniqueId, float entryHeight, size_t entryCount, const std::function& entryUpdate, const std::function& elemUpdate = nullptr); - void input_color_component_255(const std::string& id, float* val, const std::function& elemUpdate = nullptr); - void input_text(const std::string& id, std::string* val, const std::function& elemUpdate = nullptr); + void input_color_component_255(const std::string& id, float* val, const std::function& elemUpdate = nullptr); + void input_text(const std::string& id, std::string* val, const std::function& elemUpdate = nullptr); bool radio_button(const std::string& id, bool val, const std::function& elemUpdate = nullptr); bool radio_button_field(const std::string& id, const std::string& name, bool val, const std::function& elemUpdate = nullptr); @@ -79,8 +79,8 @@ class GUIManager { void tab_list(const std::string& id, const std::vector>& tabNames, size_t& selectedTab, std::optional& closedTab, const std::function& elemUpdate = nullptr); - void input_path(const std::string& id, std::filesystem::path* val, std::filesystem::file_type fileTypeRestriction, const std::function& elemUpdate = nullptr); - void input_path_field(const std::string& id, const std::string& name, std::filesystem::path* val, std::filesystem::file_type fileTypeRestriction, const std::function& elemUpdate = nullptr); + void input_path(const std::string& id, std::filesystem::path* val, std::filesystem::file_type fileTypeRestriction, const std::function& elemUpdate = nullptr); + void input_path_field(const std::string& id, const std::string& name, std::filesystem::path* val, std::filesystem::file_type fileTypeRestriction, const std::function& elemUpdate = nullptr); void dropdown_select(const std::string& id, size_t* val, const std::vector& selections, float width = 200.0f, const std::function& hoverboxElemUpdate = nullptr); @@ -109,13 +109,13 @@ class GUIManager { return toRet; } - template void input_generic(const std::string& id, T* val, const std::function(const std::string&)>& fromStr, const std::function& toStr, bool singleLine, bool updateEveryEdit, const std::function& elemUpdate = nullptr) { + template void input_generic(const std::string& id, T* val, const std::function(const std::string&)>& fromStr, const std::function& toStr, bool singleLine, bool updateEveryEdit, const std::function& elemUpdate = nullptr) { push_id(id); insert_element>()->update(*io, val, fromStr, toStr, singleLine, updateEveryEdit, elemUpdate); pop_id(); } - template void input_scalar(const std::string& id, T* val, T min, T max, int decimalPrecision = 0, const std::function& elemUpdate = nullptr) { + template void input_scalar(const std::string& id, T* val, T min, T max, int decimalPrecision = 0, const std::function& elemUpdate = nullptr) { input_generic(id, val, [&](const std::string& a) { if(a.empty()) @@ -140,9 +140,9 @@ class GUIManager { }, true, false, elemUpdate); } - void input_scalar(const std::string& id, uint8_t* val, uint8_t min, uint8_t max, int decimalPrecision, const std::function& elemUpdate); + void input_scalar(const std::string& id, uint8_t* val, uint8_t min, uint8_t max, int decimalPrecision, const std::function& elemUpdate); - template void input_scalar_fields(const std::string& id, const std::string& name, TContainer* val, size_t elemCount, T min, T max, int decimalPrecision = 0, const std::function& elemUpdate = nullptr) { + template void input_scalar_fields(const std::string& id, const std::string& name, TContainer* val, size_t elemCount, T min, T max, int decimalPrecision = 0, const std::function& elemUpdate = nullptr) { push_id(id); left_to_right_line_layout([&]() { text_label(name); @@ -152,7 +152,7 @@ class GUIManager { pop_id(); } - template void input_color_hex(const std::string& id, T* val, bool selectAlpha, const std::function& elemUpdate = nullptr) { + template void input_color_hex(const std::string& id, T* val, bool selectAlpha, const std::function& elemUpdate = nullptr) { input_generic(id, val, [&](const std::string& str) { T def = {0.0f, 0.0f, 0.0f, 1.0f}; @@ -201,7 +201,7 @@ class GUIManager { pop_id(); } - template void input_scalar_field(const std::string& id, const std::string& name, T* val, T min, T max, int decimalPrecision = 0, const std::function& elemUpdate = nullptr) { + template void input_scalar_field(const std::string& id, const std::string& name, T* val, T min, T max, int decimalPrecision = 0, const std::function& elemUpdate = nullptr) { left_to_right_line_layout([&]() { text_label(name); input_scalar(id, val, min, max, decimalPrecision, elemUpdate); @@ -212,7 +212,7 @@ class GUIManager { push_id(id); left_to_right_line_layout([&]() { text_label(name); - input_scalar("0", val, min, max, decimalPrecision, elemUpdate); + input_scalar("0", val, min, max, decimalPrecision, nullptr); }); slider_scalar("1", val, min, max, elemUpdate); pop_id(); diff --git a/src/Toolbar.cpp b/src/Toolbar.cpp index 7617c5e..9a3cfb3 100644 --- a/src/Toolbar.cpp +++ b/src/Toolbar.cpp @@ -715,8 +715,11 @@ void Toolbar::grid_menu(bool justOpened) { if(toDelete != ServerClientID{0, 0}) main.world->gridMan.remove_grid(toDelete); gui.left_to_right_line_layout([&]() { - gui.input_text("grid text input", &gridMenu.newName); - if(gui.svg_icon_button("grid add button", "data/icons/plus.svg", false, 25.0f)) { + bool addByEnter = false; + gui.input_text("grid text input", &gridMenu.newName, [&](GUIStuff::SelectionHelper& s) { + addByEnter = s.selected && io->key.enter; + }); + if(gui.svg_icon_button("grid add button", "data/icons/plus.svg", false, 25.0f) || (addByEnter && !gridMenu.newName.empty())) { main.world->drawProg.modify_grid(main.world->gridMan.add_default_grid(gridMenu.newName)); stop_displaying_grid_menu(); } @@ -797,9 +800,12 @@ void Toolbar::bookmark_menu(bool justOpened) { main.world->bMan.remove_bookmark(toDelete); bool bookmarkExists = std::find(main.world->bMan.sorted_names().begin(), main.world->bMan.sorted_names().end(), bookMenu.newName) != main.world->bMan.sorted_names().end(); gui.left_to_right_line_layout([&]() { - gui.input_text("bookmark text input", &bookMenu.newName); + bool addByEnter = false; + gui.input_text("bookmark text input", &bookMenu.newName, [&](GUIStuff::SelectionHelper& s) { + addByEnter = s.selected && io->key.enter; + }); if(!bookmarkExists) { - if(gui.svg_icon_button("bookmark add button", "data/icons/plus.svg", false, 25.0f) && !bookMenu.newName.empty()) + if((gui.svg_icon_button("bookmark add button", "data/icons/plus.svg", false, 25.0f) || addByEnter) && !bookMenu.newName.empty()) main.world->bMan.add_bookmark(bookMenu.newName); } });