added paste to text fields

This commit is contained in:
Zwelf 2017-06-19 12:28:50 +02:00
parent 501cbea8c1
commit 1020896fac
2 changed files with 43 additions and 9 deletions

View file

@ -37,7 +37,7 @@ void CLineInput::Set(const char *pString)
} }
} }
bool CLineInput::CtrlStop(char c) bool CLineInput::MoveWordStop(char c)
{ {
// jump to spaces and special ASCII characters // jump to spaces and special ASCII characters
return ((32 <= c && c <= 47) || // !"#$%&'()*+,-./ return ((32 <= c && c <= 47) || // !"#$%&'()*+,-./
@ -55,7 +55,8 @@ bool CLineInput::Manipulate(IInput::CEvent Event, char *pStr, int StrMaxSize, in
if(CursorPos > Len) if(CursorPos > Len)
CursorPos = Len; CursorPos = Len;
if(Event.m_Flags&IInput::FLAG_TEXT) if(Event.m_Flags&IInput::FLAG_TEXT &&
!(KEY_LCTRL <= Event.m_Key && Event.m_Key <= KEY_RGUI))
{ {
// gather string stats // gather string stats
int CharCount = 0; int CharCount = 0;
@ -89,13 +90,13 @@ bool CLineInput::Manipulate(IInput::CEvent Event, char *pStr, int StrMaxSize, in
if(Event.m_Flags&IInput::FLAG_PRESS) if(Event.m_Flags&IInput::FLAG_PRESS)
{ {
int Key = Event.m_Key; int Key = Event.m_Key;
bool Ctrl = false; bool MoveWord = false;
#ifdef CONF_PLATFORM_MACOSX #ifdef CONF_PLATFORM_MACOSX
if(pInput && (pInput->KeyIsPressed(KEY_LALT) || pInput->KeyIsPressed(KEY_RALT))) if(pInput && (pInput->KeyIsPressed(KEY_LALT) || pInput->KeyIsPressed(KEY_RALT)))
#else #else
if(pInput && (pInput->KeyIsPressed(KEY_LCTRL) || pInput->KeyIsPressed(KEY_RCTRL))) if(pInput && (pInput->KeyIsPressed(KEY_LCTRL) || pInput->KeyIsPressed(KEY_RCTRL)))
#endif #endif
Ctrl = true; MoveWord = true;
if(Key == KEY_BACKSPACE && CursorPos > 0) if(Key == KEY_BACKSPACE && CursorPos > 0)
{ {
int NewCursorPos = CursorPos; int NewCursorPos = CursorPos;
@ -103,7 +104,7 @@ bool CLineInput::Manipulate(IInput::CEvent Event, char *pStr, int StrMaxSize, in
{ {
NewCursorPos = str_utf8_rewind(pStr, NewCursorPos); NewCursorPos = str_utf8_rewind(pStr, NewCursorPos);
NumChars -= 1; NumChars -= 1;
} while(Ctrl && NewCursorPos > 0 && !CtrlStop(pStr[NewCursorPos - 1])); } while(MoveWord && NewCursorPos > 0 && !MoveWordStop(pStr[NewCursorPos - 1]));
int CharSize = CursorPos-NewCursorPos; int CharSize = CursorPos-NewCursorPos;
mem_move(pStr+NewCursorPos, pStr+CursorPos, Len - NewCursorPos - CharSize + 1); // +1 == null term mem_move(pStr+NewCursorPos, pStr+CursorPos, Len - NewCursorPos - CharSize + 1); // +1 == null term
CursorPos = NewCursorPos; CursorPos = NewCursorPos;
@ -117,7 +118,7 @@ bool CLineInput::Manipulate(IInput::CEvent Event, char *pStr, int StrMaxSize, in
{ {
EndCursorPos = str_utf8_forward(pStr, EndCursorPos); EndCursorPos = str_utf8_forward(pStr, EndCursorPos);
NumChars -= 1; NumChars -= 1;
} while(Ctrl && EndCursorPos < Len && !CtrlStop(pStr[EndCursorPos - 1])); } while(MoveWord && EndCursorPos < Len && !MoveWordStop(pStr[EndCursorPos - 1]));
int CharSize = EndCursorPos - CursorPos; int CharSize = EndCursorPos - CursorPos;
mem_move(pStr + CursorPos, pStr + CursorPos + CharSize, Len - CursorPos - CharSize + 1); // +1 == null term mem_move(pStr + CursorPos, pStr + CursorPos + CharSize, Len - CursorPos - CharSize + 1); // +1 == null term
Len -= CharSize; Len -= CharSize;
@ -128,19 +129,52 @@ bool CLineInput::Manipulate(IInput::CEvent Event, char *pStr, int StrMaxSize, in
do do
{ {
CursorPos = str_utf8_rewind(pStr, CursorPos); CursorPos = str_utf8_rewind(pStr, CursorPos);
} while(Ctrl && CursorPos > 0 && !CtrlStop(pStr[CursorPos - 1])); } while(MoveWord && CursorPos > 0 && !MoveWordStop(pStr[CursorPos - 1]));
} }
else if(Key == KEY_RIGHT && CursorPos < Len) else if(Key == KEY_RIGHT && CursorPos < Len)
{ {
do do
{ {
CursorPos = str_utf8_forward(pStr, CursorPos); CursorPos = str_utf8_forward(pStr, CursorPos);
} while(Ctrl && CursorPos < Len && !CtrlStop(pStr[CursorPos - 1])); } while(MoveWord && CursorPos < Len && !MoveWordStop(pStr[CursorPos - 1]));
} }
else if(Key == KEY_HOME) else if(Key == KEY_HOME)
CursorPos = 0; CursorPos = 0;
else if(Key == KEY_END) else if(Key == KEY_END)
CursorPos = Len; CursorPos = Len;
else if((pInput->KeyIsPressed(KEY_LCTRL) || pInput->KeyIsPressed(KEY_RCTRL)) && Key == KEY_V)
{
// paste clipboard to cursor
const char *pClipboardText = pInput->GetClipboardText();
// gather string stats
int CharCount = 0;
int CharSize = 0;
while(pClipboardText[CharSize])
{
int NewCharSize = str_utf8_forward(pClipboardText, CharSize);
if(NewCharSize != CharSize)
{
++CharCount;
CharSize = NewCharSize;
}
}
// add new string
if(CharCount)
{
if(Len+CharSize < StrMaxSize && CursorPos+CharSize < StrMaxSize && NumChars+CharCount < StrMaxChars)
{
mem_move(pStr + CursorPos + CharSize, pStr + CursorPos, Len-CursorPos+1); // +1 == null term
for(int i = 0; i < CharSize; i++)
pStr[CursorPos+i] = pClipboardText[i];
CursorPos += CharSize;
Len += CharSize;
NumChars += CharCount;
Changes = true;
}
}
}
} }
*pNumCharsPtr = NumChars; *pNumCharsPtr = NumChars;

View file

@ -19,7 +19,7 @@ class CLineInput
int m_NumChars; int m_NumChars;
IInput *m_pInput; IInput *m_pInput;
public: public:
static bool CtrlStop(char c); static bool MoveWordStop(char c);
static bool Manipulate(IInput::CEvent e, char *pStr, int StrMaxSize, int StrMaxChars, int *pStrLenPtr, int *pCursorPosPtr, int *pNumCharsPtr, IInput *pInput); static bool Manipulate(IInput::CEvent e, char *pStr, int StrMaxSize, int StrMaxChars, int *pStrLenPtr, int *pCursorPosPtr, int *pNumCharsPtr, IInput *pInput);
class CCallback class CCallback