|
@@ -19,6 +19,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
|
|
|
|
|
#include "guiEditBox.h"
|
|
|
|
|
|
+#include "IrrCompileConfig.h"
|
|
|
#include "IGUISkin.h"
|
|
|
#include "IGUIEnvironment.h"
|
|
|
#include "IGUIFont.h"
|
|
@@ -216,6 +217,11 @@ bool GUIEditBox::OnEvent(const SEvent &event)
|
|
|
if (processMouse(event))
|
|
|
return true;
|
|
|
break;
|
|
|
+#if (IRRLICHT_VERSION_MT_REVISION >= 2)
|
|
|
+ case EET_STRING_INPUT_EVENT:
|
|
|
+ inputString(*event.StringInput.Str);
|
|
|
+ return true;
|
|
|
+#endif
|
|
|
default:
|
|
|
break;
|
|
|
}
|
|
@@ -670,39 +676,44 @@ bool GUIEditBox::onKeyDelete(const SEvent &event, s32 &mark_begin, s32 &mark_end
|
|
|
|
|
|
void GUIEditBox::inputChar(wchar_t c)
|
|
|
{
|
|
|
- if (!isEnabled() || !m_writable)
|
|
|
+ if (c == 0)
|
|
|
return;
|
|
|
+ core::stringw s(&c, 1);
|
|
|
+ inputString(s);
|
|
|
+}
|
|
|
|
|
|
- if (c != 0) {
|
|
|
- if (Text.size() < m_max || m_max == 0) {
|
|
|
- core::stringw s;
|
|
|
-
|
|
|
- if (m_mark_begin != m_mark_end) {
|
|
|
- // clang-format off
|
|
|
- // replace marked text
|
|
|
- s32 real_begin = m_mark_begin < m_mark_end ? m_mark_begin : m_mark_end;
|
|
|
- s32 real_end = m_mark_begin < m_mark_end ? m_mark_end : m_mark_begin;
|
|
|
-
|
|
|
- s = Text.subString(0, real_begin);
|
|
|
- s.append(c);
|
|
|
- s.append(Text.subString(real_end, Text.size() - real_end));
|
|
|
- Text = s;
|
|
|
- m_cursor_pos = real_begin + 1;
|
|
|
- // clang-format on
|
|
|
- } else {
|
|
|
- // add new character
|
|
|
- s = Text.subString(0, m_cursor_pos);
|
|
|
- s.append(c);
|
|
|
- s.append(Text.subString(m_cursor_pos,
|
|
|
- Text.size() - m_cursor_pos));
|
|
|
- Text = s;
|
|
|
- ++m_cursor_pos;
|
|
|
- }
|
|
|
+void GUIEditBox::inputString(const core::stringw &str)
|
|
|
+{
|
|
|
+ if (!isEnabled() || !m_writable)
|
|
|
+ return;
|
|
|
|
|
|
- m_blink_start_time = porting::getTimeMs();
|
|
|
- setTextMarkers(0, 0);
|
|
|
+ u32 len = str.size();
|
|
|
+ if (Text.size()+len <= m_max || m_max == 0) {
|
|
|
+ core::stringw s;
|
|
|
+ if (m_mark_begin != m_mark_end) {
|
|
|
+ // replace marked text
|
|
|
+ s32 real_begin = m_mark_begin < m_mark_end ? m_mark_begin : m_mark_end;
|
|
|
+ s32 real_end = m_mark_begin < m_mark_end ? m_mark_end : m_mark_begin;
|
|
|
+
|
|
|
+ s = Text.subString(0, real_begin);
|
|
|
+ s.append(str);
|
|
|
+ s.append(Text.subString(real_end, Text.size() - real_end));
|
|
|
+ Text = s;
|
|
|
+ m_cursor_pos = real_begin + len;
|
|
|
+ } else {
|
|
|
+ // append string
|
|
|
+ s = Text.subString(0, m_cursor_pos);
|
|
|
+ s.append(str);
|
|
|
+ s.append(Text.subString(m_cursor_pos,
|
|
|
+ Text.size() - m_cursor_pos));
|
|
|
+ Text = s;
|
|
|
+ m_cursor_pos += len;
|
|
|
}
|
|
|
+
|
|
|
+ m_blink_start_time = porting::getTimeMs();
|
|
|
+ setTextMarkers(0, 0);
|
|
|
}
|
|
|
+
|
|
|
breakText();
|
|
|
sendGuiEvent(EGET_EDITBOX_CHANGED);
|
|
|
calculateScrollPos();
|