[client,sdl] add dialog paste support

This commit is contained in:
akallabeth
2023-07-21 10:49:39 +02:00
committed by akallabeth
parent 6be08815e5
commit 9eb80ffb19
3 changed files with 34 additions and 0 deletions

View File

@@ -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())

View File

@@ -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);

View File

@@ -1,4 +1,5 @@
#include <assert.h>
#include <algorithm>
#include "sdl_input_widgets.hpp"
@@ -138,6 +139,7 @@ int SdlInputWidgetList::run(std::vector<std::string>& result)
try
{
bool running = true;
std::vector<SDL_Keycode> pressed;
while (running)
{
if (!clear_window(_renderer))
@@ -153,7 +155,14 @@ int SdlInputWidgetList::run(std::vector<std::string>& 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<std::string>& 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;
}