Skip to content

Commit

Permalink
Continuation of "semi support for touchscreens + clickRegion" (#10)
Browse files Browse the repository at this point in the history
* Create clickRegion.lua

button without stuff being rendered on screen uwu owo
(also got monitor support lol)

* Added touch support for monitors to buttons

yes.

* Update clickRegion.lua

idk something didn't work
don't sue me

* fix cosmetic problems with button.lua and clickRegion.lua

---------

Co-authored-by: tizu69 <60812901+tizu69@users.noreply.github.com>
  • Loading branch information
Hellscaped and tizu69 authored Jun 21, 2024
1 parent 315e8d6 commit 3199af8
Show file tree
Hide file tree
Showing 2 changed files with 56 additions and 7 deletions.
21 changes: 14 additions & 7 deletions button.lua
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,9 @@ local expect = require "cc.expect".expect -- DO NOT COPY THIS LINE
---@param fgColor color|nil The color of the button text (defaults to white)
---@param bgColor color|nil The color of the button (defaults to light gray)
---@param clickedColor color|nil The color of the button when clicked (defaults to gray)
function PrimeUI.button(win, x, y, text, action, fgColor, bgColor, clickedColor)
---@param periphName string|nil The name of the monitor peripheral, or nil (set if you're using a monitor - events will be filtered to that monitor)
function PrimeUI.button(win, x, y, text, action, fgColor, bgColor, clickedColor, periphName)
expect(1, win, "table")
expect(1, win, "table")
expect(2, x, "number")
expect(3, y, "number")
Expand All @@ -20,31 +22,36 @@ function PrimeUI.button(win, x, y, text, action, fgColor, bgColor, clickedColor)
fgColor = expect(6, fgColor, "number", "nil") or colors.white
bgColor = expect(7, bgColor, "number", "nil") or colors.gray
clickedColor = expect(8, clickedColor, "number", "nil") or colors.lightGray
periphName = expect(9, periphName, "string", "nil")
-- Draw the initial button.
win.setCursorPos(x, y)
win.setBackgroundColor(bgColor)
win.setTextColor(fgColor)
win.write(" " .. text .. " ")
-- Get the screen position and add a click handler.
PrimeUI.addTask(function()
local screenX, screenY = PrimeUI.getWindowPos(win, x, y)
local buttonDown = false
while true do
local event, button, clickX, clickY = os.pullEvent()
local screenX, screenY = PrimeUI.getWindowPos(win, x, y)
if event == "mouse_click" and button == 1 and clickX >= screenX and clickX < screenX + #text + 2 and clickY == screenY then
if event == "mouse_click" and periphName == nil and button == 1 and clickX >= screenX and clickX < screenX + #text + 2 and clickY == screenY then
-- Initiate a click action (but don't trigger until mouse up).
buttonDown = true
-- Redraw the button with the clicked background color.
win.setCursorPos(x, y)
win.setBackgroundColor(clickedColor)
win.setTextColor(fgColor)
win.write(" " .. text .. " ")
elseif event == "mouse_up" and button == 1 and buttonDown then
elseif (event == "monitor_touch" and periphName == button and clickX >= screenX and clickX < screenX + #text + 2 and clickY == screenY)
or (event == "mouse_up" and button == 1 and buttonDown) then
-- Finish a click event.
if clickX >= screenX and clickX < screenX + #text + 2 and clickY == screenY then
-- Trigger the action.
if type(action) == "string" then PrimeUI.resolve("button", action)
else action() end
if type(action) == "string" then
PrimeUI.resolve("button", action)
else
action()
end
end
-- Redraw the original button state.
win.setCursorPos(x, y)
Expand All @@ -54,4 +61,4 @@ function PrimeUI.button(win, x, y, text, action, fgColor, bgColor, clickedColor)
end
end
end)
end
end
42 changes: 42 additions & 0 deletions clickRegion.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
local PrimeUI = require "util" -- DO NOT COPY THIS LINE
local expect = require "cc.expect".expect -- DO NOT COPY THIS LINE
-- Start copying below this line. --

--- Creates a clickable region on screen without any content.
---@param win window The window to draw on
---@param x number The X position of the button
---@param y number The Y position of the button
---@param width number The width of the inner box
---@param height number The height of the inner box
---@param action function|string A function to call when clicked, or a string to send with a `run` event
---@param periphName string|nil The name of the monitor peripheral, or nil (set if you're using a monitor - events will be filtered to that monitor)
function PrimeUI.clickRegion(win, x, y, width, height, action, periphName)
expect(1, win, "table")
expect(2, x, "number")
expect(3, y, "number")
expect(4, width, "number")
expect(5, height, "number")
expect(6, action, "function", "string")
expect(7, periphName, "string", "nil")
PrimeUI.addTask(function()
-- Get the screen position and add a click handler.
local screenX, screenY = PrimeUI.getWindowPos(win, x, y)
local buttonDown = false
while true do
local event, button, clickX, clickY = os.pullEvent()
if (event == "monitor_touch" and periphName == button)
or (event == "mouse_down" and button == 1 and periphName == nil) then
-- Finish a click event.
if clickX >= screenX and clickX < screenX + width
and clickY >= screenY and clickY < screenY + height then
-- Trigger the action.
if type(action) == "string" then
PrimeUI.resolve("clickRegion", action)
else
action()
end
end
end
end
end)
end

0 comments on commit 3199af8

Please sign in to comment.