diff --git a/gui/color.lua b/gui/color.lua index 3a45ab0..e664cc3 100644 --- a/gui/color.lua +++ b/gui/color.lua @@ -1679,6 +1679,7 @@ color.indexColor("electric_lime","a8ff04") color.indexColor("dust","b2996e") color.indexColor("dark_pastel_green","56ae57") color.indexColor("cloudy_blue","acc2d9") +color.indexColor("highlighter_blue","30C5FF") for i=0,255 do color.indexColor("gray"..i,i,i,i) end diff --git a/gui/init.lua b/gui/init.lua index ae371fd..fd31342 100644 --- a/gui/init.lua +++ b/gui/init.lua @@ -155,6 +155,14 @@ gui.HotKeys.OnRedo = gui:SetHotKey({"lctrl","y"}) -- Utils +function gui:getObjectFocus() + return object_focus +end + +function gui:hasType(t) + return band(object_focus.type, t) == t +end + function gui:move(x,y) self.dualDim.offset.pos.x = self.dualDim.offset.pos.x + x self.dualDim.offset.pos.y = self.dualDim.offset.pos.y + y @@ -355,6 +363,7 @@ function gui:newBase(typ,x, y, w, h, sx, sy, sw, sh) c.OnPressedOuter = multi:newConnection() c.OnReleased = multi:newConnection() c.OnReleasedOuter = multi:newConnection() + c.OnReleasedOther = multi:newConnection() c.OnDragStart = multi:newConnection() c.OnDragging = multi:newConnection() @@ -372,7 +381,7 @@ function gui:newBase(typ,x, y, w, h, sx, sy, sw, sh) gui.Events.OnMouseMoved(function(x, y, dx, dy, istouch) if c:canPress(x,y) then - c.OnMoved:Fire(c,x, y, dx, dy, istouch) + c.OnMoved:Fire(c, x, y, dx, dy, istouch) entered = true c.OnEnter:Fire(c, x, y) if dragging then @@ -387,8 +396,10 @@ function gui:newBase(typ,x, y, w, h, sx, sy, sw, sh) gui.Events.OnMouseReleased(function(x, y, button, istouch, presses) if c:canPress(x, y) then c.OnReleased:Fire(c, x, y, dx, dy, istouch, presses) - else + elseif pressed then c.OnReleasedOuter:Fire(c, x, y, button, istouch, presses) + else + c.OnReleasedOther:Fire(c, x, y, button, istouch, presses) end pressed = false if dragging and button == dragbutton then @@ -636,11 +647,23 @@ end local cur = love.mouse.getCursor() function gui:newTextBox(txt, x, y, w, h, sx, sy, sw, sh) local c = self:newTextBase(box, txt, x, y, w, h, sx, sy, sw, sh) + c.doSelection = false c.OnReturn = multi:newConnection():fastMode() c.cur_pos = 0 c.adjust = 0 + c.selection = {0,0} + + function c:HasSelection() + return c.selection[1] ~= 0 or c.selection[2] ~= 0 + end + + function c:getSelectedText() + local sta, sto = c.selection[1], c.selection[2] + if sta > sto then sta, sto = sto, sta end + return c.text:sub(sta,sto) + end c.OnEnter(function() love.mouse.setCursor(love.mouse.getSystemCursor("ibeam")) @@ -653,6 +676,25 @@ function gui:newTextBox(txt, x, y, w, h, sx, sy, sw, sh) c.OnPressed(function(c, x, y, dx, dy, istouch) object_focus.bar_show = true c.cur_pos = getTextPosition(c.text, c, c:getLocalCords(x, y)) + c.selection[1] = c.cur_pos + c.doSelection = true + end) + + c.OnMoved(function(c, x, y, dx, dy, istouch) + if c.doSelection then + c.selection[2] = getTextPosition(c.text, c, c:getLocalCords(x, y)) + end + end); -- Needed to keep next line from being treated like a function call + + -- Connect to both events + (c.OnReleased + c.OnReleasedOuter)(function(c, x, y, dx, dy, istouch) + c.doSelection = false + end); + + -- ReleasedOther is different than ReleasedOuter (Other/Outer) + (c.OnReleasedOther + c.OnPressedOuter)(function() + c.doSelection = false + c.selection = {0, 0} end) c.OnPressedOuter(function() @@ -665,7 +707,7 @@ end updater:newThread("Textbox Handler", function() while true do -- Do nothing if we aren't dealing with a textbox - thread.hold(function() return band(object_focus.type, box) == box end) + thread.hold(function() return object_focus:hasType(box) end) local ref = object_focus ref.bar_show = true thread.sleep(.5) @@ -686,8 +728,14 @@ gui.Events.OnObjectFocusChanged(function(prev, new) -- end) +gui.HotKeys.OnSelectAll(function() + if object_focus:hasType(box) then + object_focus.selection = {1, #object_focus.text} + end +end) + gui.Events.OnTextInputed(function(text) - if band(object_focus.type, box) == box then + if object_focus:hasType(box) then object_focus.text = insert(object_focus.text, object_focus.cur_pos, text) object_focus.cur_pos = object_focus.cur_pos + 1 end @@ -695,7 +743,7 @@ end) gui.Events.OnKeyPressed(function(key, scancode, isrepeat) -- Don't process if we aren't dealing with a textbox - if band(object_focus.type, box) ~= box then return end + if not object_focus:hasType(box) then return end if key == "left" then object_focus.cur_pos = object_focus.cur_pos - 1 object_focus.bar_show = true @@ -882,6 +930,17 @@ local drawtypes = { local fw = font:getWidth(child.text:sub(1, child.cur_pos)) love.graphics.line(child.textOffsetX + child.adjust + x + fw, y + 4, child.textOffsetX + child.adjust + x + fw, y + fh - 2) end + if child:HasSelection() then + local blue = color.highlighter_blue + local start, stop = child.selection[1], child.selection[2] + if start > stop then + start, stop = stop, start + end + local x1, y1 = child.font:getWidth(child.text:sub(1, start-1)), 0 + local x2, y2 = child.font:getWidth(child.text:sub(1, stop)), h + love.graphics.setColor(blue[1],blue[2],blue[3],.5) + love.graphics.rectangle("fill", x + x1 + child.adjust, y + y1, x2 - x1, y2 - y1) + end end, [8] = function(child, x, y, w, h) if child.video and child.playing then diff --git a/multi b/multi index ec5bf74..5137bb9 160000 --- a/multi +++ b/multi @@ -1 +1 @@ -Subproject commit ec5bf74009f269fc1f9ffaa37a33f00ad5a1b4c3 +Subproject commit 5137bb9483984d5e23eda80ccc8e911e6e48f19f diff --git a/test.lua b/test.lua new file mode 100644 index 0000000..24a4857 --- /dev/null +++ b/test.lua @@ -0,0 +1,12 @@ +local multi, thread = require("multi"):init() +conn1 = multi:newConnection() +conn2 = multi:newConnection(); + +((conn1 * conn2))(function() print("Triggered!") end) + +conn1:Fire() +conn2:Fire() + +-- Looks like this is trigering a response. It shouldn't. We need to account for this +conn1:Fire() +conn1:Fire()