]> git.lizzy.rs Git - dragonfireclient.git/blobdiff - src/gui/guiEditBox.cpp
Fix revoke debug privs not reliably turn off stuff (#11409)
[dragonfireclient.git] / src / gui / guiEditBox.cpp
index cd5a0868da8820e91a112eb68bd6d30949141d35..43afb6e3e46a82f882094872e0fb8ead9160da91 100644 (file)
@@ -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;
                }
@@ -226,10 +232,6 @@ bool GUIEditBox::OnEvent(const SEvent &event)
 
 bool GUIEditBox::processKey(const SEvent &event)
 {
-       if (!m_writable) {
-               return false;
-       }
-
        if (!event.KeyInput.PressedDown)
                return false;
 
@@ -525,6 +527,9 @@ bool GUIEditBox::onKeyControlX(const SEvent &event, s32 &mark_begin, s32 &mark_e
        // First copy to clipboard
        onKeyControlC(event);
 
+       if (!m_writable)
+               return false;
+
        if (m_passwordbox || !m_operator || m_mark_begin == m_mark_end)
                return false;
 
@@ -550,7 +555,7 @@ bool GUIEditBox::onKeyControlX(const SEvent &event, s32 &mark_begin, s32 &mark_e
 
 bool GUIEditBox::onKeyControlV(const SEvent &event, s32 &mark_begin, s32 &mark_end)
 {
-       if (!isEnabled())
+       if (!isEnabled() || !m_writable)
                return false;
 
        // paste from the clipboard
@@ -596,7 +601,7 @@ bool GUIEditBox::onKeyControlV(const SEvent &event, s32 &mark_begin, s32 &mark_e
 
 bool GUIEditBox::onKeyBack(const SEvent &event, s32 &mark_begin, s32 &mark_end)
 {
-       if (!isEnabled() || Text.empty())
+       if (!isEnabled() || Text.empty() || !m_writable)
                return false;
 
        core::stringw s;
@@ -634,7 +639,7 @@ bool GUIEditBox::onKeyBack(const SEvent &event, s32 &mark_begin, s32 &mark_end)
 
 bool GUIEditBox::onKeyDelete(const SEvent &event, s32 &mark_begin, s32 &mark_end)
 {
-       if (!isEnabled() || Text.empty())
+       if (!isEnabled() || Text.empty() || !m_writable)
                return false;
 
        core::stringw s;
@@ -670,39 +675,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();