From 9eb80ffb1986ba5cf652385bba1e2cc189699039 Mon Sep 17 00:00:00 2001 From: akallabeth Date: Fri, 21 Jul 2023 10:49:39 +0200 Subject: [PATCH] [client,sdl] add dialog paste support --- client/SDL/dialogs/sdl_input.cpp | 10 ++++++++++ client/SDL/dialogs/sdl_input.hpp | 1 + client/SDL/dialogs/sdl_input_widgets.cpp | 23 +++++++++++++++++++++++ 3 files changed, 34 insertions(+) diff --git a/client/SDL/dialogs/sdl_input.cpp b/client/SDL/dialogs/sdl_input.cpp index 1b192949d..802a93071 100644 --- a/client/SDL/dialogs/sdl_input.cpp +++ b/client/SDL/dialogs/sdl_input.cpp @@ -110,6 +110,16 @@ bool SdlInputWidget::resize_input(size_t size) return true; } +bool SdlInputWidget::set_str(SDL_Renderer* renderer, const std::string& text) +{ + if (readonly()) + return true; + _text = text; + if (!resize_input(_text.size())) + return false; + return update_input(renderer); +} + bool SdlInputWidget::remove_str(SDL_Renderer* renderer, size_t count) { if (readonly()) diff --git a/client/SDL/dialogs/sdl_input.hpp b/client/SDL/dialogs/sdl_input.hpp index 13f65fe57..ace1e9fe2 100644 --- a/client/SDL/dialogs/sdl_input.hpp +++ b/client/SDL/dialogs/sdl_input.hpp @@ -47,6 +47,7 @@ class SdlInputWidget bool update_input(SDL_Renderer* renderer); bool resize_input(size_t size); + bool set_str(SDL_Renderer* renderer, const std::string& text); bool remove_str(SDL_Renderer* renderer, size_t count); bool append_str(SDL_Renderer* renderer, const std::string& text); diff --git a/client/SDL/dialogs/sdl_input_widgets.cpp b/client/SDL/dialogs/sdl_input_widgets.cpp index b6c763f98..0f1185c35 100644 --- a/client/SDL/dialogs/sdl_input_widgets.cpp +++ b/client/SDL/dialogs/sdl_input_widgets.cpp @@ -1,4 +1,5 @@ #include +#include #include "sdl_input_widgets.hpp" @@ -138,6 +139,7 @@ int SdlInputWidgetList::run(std::vector& result) try { bool running = true; + std::vector pressed; while (running) { if (!clear_window(_renderer)) @@ -153,7 +155,14 @@ int SdlInputWidgetList::run(std::vector& result) SDL_WaitEvent(&event); switch (event.type) { + case SDL_KEYUP: + { + auto it = std::remove(pressed.begin(), pressed.end(), event.key.keysym.sym); + pressed.erase(it, pressed.end()); + } + break; case SDL_KEYDOWN: + pressed.push_back(event.key.keysym.sym); switch (event.key.keysym.sym) { case SDLK_BACKSPACE: @@ -179,6 +188,20 @@ int SdlInputWidgetList::run(std::vector& result) running = false; res = INPUT_BUTTON_CANCEL; break; + case SDLK_v: + if (pressed.size() == 2) + { + if ((pressed[0] == SDLK_LCTRL) || (pressed[0] == SDLK_RCTRL)) + { + auto cur = get(CurrentActiveTextInput); + if (cur) + { + auto text = SDL_GetClipboardText(); + cur->set_str(_renderer, text); + } + } + } + break; default: break; }