From f65f36ffee84e5671b96249426d1e6724e898357 Mon Sep 17 00:00:00 2001 From: myk002 Date: Sat, 16 Jul 2022 22:03:39 -0700 Subject: [PATCH] move the cursor in an EditField on mouse lclick --- library/lua/gui/widgets.lua | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/library/lua/gui/widgets.lua b/library/lua/gui/widgets.lua index d09bdf9cd..2dc197064 100644 --- a/library/lua/gui/widgets.lua +++ b/library/lua/gui/widgets.lua @@ -265,7 +265,7 @@ function EditField:onInput(keys) if self.key and keys.LEAVESCREEN then local old = self.text - self.text = self.saved_text + self:setText(self.saved_text) if self.on_change and old ~= self.saved_text then self.on_change(self.text, old) end @@ -291,26 +291,32 @@ function EditField:onInput(keys) return true end return not not self.key + elseif keys._MOUSE_L then + local mouse_x, mouse_y = self:getMousePos() + if mouse_x then + self:setCursor(mouse_x) + return true + end elseif keys.CURSOR_LEFT then - self.cursor = math.max(1, self.cursor - 1) + self:setCursor(self.cursor - 1) return true elseif keys.A_MOVE_W_DOWN then -- Ctrl-Left (prev word start) local _, prev_word_start = self.text:sub(1, self.cursor-1): find('.*[^%w_%-]+[%w_%-]') - self.cursor = prev_word_start or 1 + self:setCursor(prev_word_start or 1) return true elseif keys.A_CARE_MOVE_W then -- Alt-Left (home) - self.cursor = 1 + self:setCursor(1) return true elseif keys.CURSOR_RIGHT then - self.cursor = math.min(self.cursor + 1, #self.text + 1) + self:setCursor(self.cursor + 1) return true elseif keys.A_MOVE_E_DOWN then -- Ctrl-Right (next word end) local _, next_word_end = self.text:find('[%w_%-]+[^%w_%-]', self.cursor) - self.cursor = next_word_end or #self.text + 1 + self:setCursor(next_word_end) return true elseif keys.A_CARE_MOVE_E then -- Alt-Right (end) - self.cursor = #self.text + 1 + self:setCursor() return true elseif keys._STRING then local old = self.text @@ -318,15 +324,14 @@ function EditField:onInput(keys) -- handle backspace local del_pos = self.cursor - 1 if del_pos > 0 then - self.text = old:sub(1, del_pos-1) .. old:sub(del_pos+1) - self.cursor = del_pos + self:setText(old:sub(1, del_pos-1) .. old:sub(del_pos+1), + del_pos) end else local cv = string.char(keys._STRING) if not self.on_char or self.on_char(cv, old) then - self.text = old:sub(1, self.cursor-1) .. cv .. - old:sub(self.cursor) - self.cursor = self.cursor + 1 + self:setText(old:sub(1,self.cursor-1)..cv..old:sub(self.cursor), + self.cursor + 1) end end if self.on_change and self.text ~= old then