diff --git a/Editor/App_Windows.cpp b/Editor/App_Windows.cpp index 526626e7e..4e079e527 100644 --- a/Editor/App_Windows.cpp +++ b/Editor/App_Windows.cpp @@ -246,7 +246,7 @@ protected: if (args.EventType() == CoreAcceleratorKeyEventType::Character && args.VirtualKey() != VirtualKey::Enter) { - char c = (char)args.VirtualKey(); + wchar_t c = (wchar_t)args.VirtualKey(); if (c == '\b') { diff --git a/Editor/Editor.cpp b/Editor/Editor.cpp index 27f4dc0c1..f5f666f7b 100644 --- a/Editor/Editor.cpp +++ b/Editor/Editor.cpp @@ -582,13 +582,13 @@ void EditorComponent::Update(float dt) } } - bool deleting = wi::input::Press(wi::input::KEYBOARD_BUTTON_DELETE); - translator.interactable = false; + bool deleting = false; // Camera control: if (!wi::backlog::isActive() && !GetGUI().HasFocus()) { + deleting = wi::input::Press(wi::input::KEYBOARD_BUTTON_DELETE); translator.interactable = true; XMFLOAT4 currentMouse = wi::input::GetPointer(); static XMFLOAT4 originalMouse = XMFLOAT4(0, 0, 0, 0); diff --git a/Editor/main_Windows.cpp b/Editor/main_Windows.cpp index c318d98c4..66da1ecaf 100644 --- a/Editor/main_Windows.cpp +++ b/Editor/main_Windows.cpp @@ -229,10 +229,8 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) case VK_RETURN: break; default: - { - const char c = (const char)(TCHAR)wParam; - wi::gui::TextInputField::AddInput(c); - } + const wchar_t c = (const wchar_t)wParam; + wi::gui::TextInputField::AddInput(c); break; } break; diff --git a/Example_ImGui/main_Windows.cpp b/Example_ImGui/main_Windows.cpp index 98ea27095..4ad68a20e 100644 --- a/Example_ImGui/main_Windows.cpp +++ b/Example_ImGui/main_Windows.cpp @@ -175,7 +175,7 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) break; default: { - const char c = (const char)(TCHAR)wParam; + const wchar_t c = (const wchar_t)wParam; wi::gui::TextInputField::AddInput(c); } break; diff --git a/Example_ImGui_Docking/main_Windows.cpp b/Example_ImGui_Docking/main_Windows.cpp index 08b6a6046..3320c11ba 100644 --- a/Example_ImGui_Docking/main_Windows.cpp +++ b/Example_ImGui_Docking/main_Windows.cpp @@ -183,7 +183,7 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) break; default: { - const char c = (const char)(TCHAR)wParam; + const wchar_t c = (const wchar_t)wParam; wi::gui::TextInputField::AddInput(c); } break; diff --git a/Template_UWP/Main.cpp b/Template_UWP/Main.cpp index 3f1be9206..d9db31948 100644 --- a/Template_UWP/Main.cpp +++ b/Template_UWP/Main.cpp @@ -162,7 +162,7 @@ protected: if (args.EventType() == CoreAcceleratorKeyEventType::Character && args.VirtualKey() != VirtualKey::Enter) { - char c = (char)args.VirtualKey(); + wchar_t c = (wchar_t)args.VirtualKey(); if (c == '\b') { diff --git a/Template_Windows/main.cpp b/Template_Windows/main.cpp index c61d640d8..0be0a9000 100644 --- a/Template_Windows/main.cpp +++ b/Template_Windows/main.cpp @@ -175,11 +175,7 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) break; default: { - const char c = (const char)(TCHAR)wParam; - if (wi::backlog::isActive()) - { - wi::backlog::input(c); - } + const wchar_t c = (const wchar_t)wParam; wi::gui::TextInputField::AddInput(c); } break; diff --git a/Tests/main_Windows.cpp b/Tests/main_Windows.cpp index 558295ef2..8f0360d23 100644 --- a/Tests/main_Windows.cpp +++ b/Tests/main_Windows.cpp @@ -168,7 +168,7 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) break; default: { - const char c = (const char)(TCHAR)wParam; + const wchar_t c = (const wchar_t)wParam; wi::gui::TextInputField::AddInput(c); } break; diff --git a/WickedEngine/wiGUI.cpp b/WickedEngine/wiGUI.cpp index e43882702..4cd79e301 100644 --- a/WickedEngine/wiGUI.cpp +++ b/WickedEngine/wiGUI.cpp @@ -1290,12 +1290,15 @@ namespace wi::gui Deactivate(); } - else if ((wi::input::Press(wi::input::MOUSE_BUTTON_LEFT) && !intersectsPointer) || - wi::input::Press(wi::input::KEYBOARD_BUTTON_ESCAPE)) + //else if (wi::input::Press(wi::input::KEYBOARD_BUTTON_BACKSPACE)) + //{ + // // delete input... + // DeleteFromInput(-1); + //} + else if (wi::input::Press(wi::input::KEYBOARD_BUTTON_DELETE)) { - // cancel input - font_input.text.clear(); - Deactivate(); + // delete input... + DeleteFromInput(1); } else if (wi::input::Press(wi::input::KEYBOARD_BUTTON_LEFT) && caret_pos > 0) { @@ -1309,6 +1312,13 @@ namespace wi::gui caret_pos++; caret_timer.record(); } + else if ((wi::input::Press(wi::input::MOUSE_BUTTON_LEFT) && !intersectsPointer) || + wi::input::Press(wi::input::KEYBOARD_BUTTON_ESCAPE)) + { + // cancel input + font_input.text.clear(); + Deactivate(); + } else if (wi::input::Press(wi::input::MOUSE_BUTTON_LEFT) && intersectsPointer) { // caret repositioning by mouse click: @@ -1413,8 +1423,18 @@ namespace wi::gui { onInputAccepted = func; } - void TextInputField::AddInput(const char inputChar) + void TextInputField::AddInput(const wchar_t inputChar) { + switch (inputChar) + { + case '\b': // BACKSPACE + case '\n': // ENTER + case '\r': // ENTER + case 127: // DEL + return; + default: + break; + } std::wstring value_new = font_input.GetText(); if (value_new.size() >= caret_pos) { @@ -1423,15 +1443,30 @@ namespace wi::gui caret_pos = std::min((int)font_input.GetText().size(), caret_pos + 1); } } - void TextInputField::DeleteFromInput() + void TextInputField::AddInput(const char inputChar) + { + AddInput((wchar_t)inputChar); + } + void TextInputField::DeleteFromInput(int direction) { std::wstring value_new = font_input.GetText(); - if (caret_pos > 0 && value_new.size() > caret_pos - 1) + if (direction < 0) { - value_new.erase(value_new.begin() + caret_pos - 1); - font_input.SetText(value_new); - caret_pos = std::max(0, caret_pos - 1); + if (caret_pos > 0 && value_new.size() > caret_pos - 1) + { + value_new.erase(value_new.begin() + caret_pos - 1); + caret_pos = std::max(0, caret_pos - 1); + } } + else + { + if (value_new.size() > caret_pos) + { + value_new.erase(value_new.begin() + caret_pos); + caret_pos = std::min((int)value_new.size(), caret_pos); + } + } + font_input.SetText(value_new); } void TextInputField::SetColor(wi::Color color, int id) { diff --git a/WickedEngine/wiGUI.h b/WickedEngine/wiGUI.h index a67f350c3..acf778675 100644 --- a/WickedEngine/wiGUI.h +++ b/WickedEngine/wiGUI.h @@ -401,8 +401,9 @@ namespace wi::gui const std::string GetDescription() const { return font_description.GetTextA(); } // There can only be ONE active text input field, so these methods modify the active one + static void AddInput(const wchar_t inputChar); static void AddInput(const char inputChar); - static void DeleteFromInput(); + static void DeleteFromInput(int direction = -1); void SetAsActive(); void Update(const wi::Canvas& canvas, float dt) override; diff --git a/WickedEngine/wiVersion.cpp b/WickedEngine/wiVersion.cpp index e46d857a1..4a05ef47a 100644 --- a/WickedEngine/wiVersion.cpp +++ b/WickedEngine/wiVersion.cpp @@ -9,7 +9,7 @@ namespace wi::version // minor features, major updates, breaking compatibility changes const int minor = 70; // minor bug fixes, alterations, refactors, updates - const int revision = 20; + const int revision = 21; const std::string version_string = std::to_string(major) + "." + std::to_string(minor) + "." + std::to_string(revision);