Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- local UDim2 = require("UDim2")
- local Enum = require("Enum")
- local InputService = require("InputService")
- local Signal = require("Signal")
- local focusedTextbox = nil
- local UI = {}
- UI.__index = UI
- UI.Windows = {}
- UI.Focused = Signal.new()
- UI.FocusLost = Signal.new()
- function UI.new()
- local self = {
- Size = UDim2.fromOffset(0, 0),
- Position = UDim2.fromOffset(0, 0),
- AnchorPoint = {X = .5, Y = .5},
- TextXAlign = Enum.TextXAlign.Center,
- TextYAlign = Enum.TextYAlign.Center,
- Text = "",
- BackgroundColor = colors.white,
- TextColor = colors.black,
- TextEditable = false,
- MultiLine = false,
- Focused = Signal.new(),
- FocusLost = Signal.new(),
- Clicked = Signal.new()
- }
- return setmetatable(self, UI)
- end
- function UI:Init(optionalParent)
- if (self.Window) then
- printError("UI already initialized")
- return
- end
- local terminalSizeX, terminalSizeY = term.getSize()
- local sizeX = self.Size.X.Offset + terminalSizeX * self.Size.X.Scale
- local sizeY = self.Size.Y.Offset + terminalSizeY * self.Size.Y.Scale
- local positionX = (self.Position.X.Offset + terminalSizeX * self.Position.X.Scale) - sizeX * self.AnchorPoint.X
- local positionY = (self.Position.Y.Offset + terminalSizeY * self.Position.Y.Scale) - sizeY * self.AnchorPoint.Y
- local newUI = window.create(optionalParent or term.current(), positionX, positionY, sizeX, sizeY)
- UI.Windows[newUI] = self
- self.Window = newUI
- self:Update()
- end
- function UI:Update()
- if (not self) then
- return printError("Self not assigned")
- end
- if (not self.Window) then
- return printError("Missing Window")
- end
- local terminalSizeX, terminalSizeY = term.getSize()
- local sizeX = self.Size.X.Offset + (terminalSizeX + 1) * self.Size.X.Scale
- local sizeY = self.Size.Y.Offset + (terminalSizeY + 1) * self.Size.Y.Scale
- local positionX = (self.Position.X.Offset + terminalSizeX * self.Position.X.Scale) - sizeX * self.AnchorPoint.X
- local positionY = (self.Position.Y.Offset + terminalSizeY * self.Position.Y.Scale) - sizeY * self.AnchorPoint.Y
- self.Window.reposition(positionX, positionY, sizeX, sizeY)
- local cursorX = 0 do
- if (self.TextXAlign == Enum.TextXAlign.Center) then
- cursorX = (sizeX / 2) - (#self.Text / 2) + 1
- elseif (self.TextXAlign == Enum.TextXAlign.Right) then
- cursorX = sizeX - #self.Text
- end
- end
- local cursorY = 0 do
- if (self.TextYAlign == Enum.TextYAlign.Center) then
- cursorY = (sizeY / 2) + 1
- elseif (self.TextYAlign == Enum.TextYAlign.Botom) then
- cursorY = sizeY
- end
- end
- self.Window.setBackgroundColor(self.BackgroundColor)
- self.Window.setTextColor(self.TextColor)
- self.Window.clear()
- self.Window.setCursorPos(cursorX, cursorY)
- self.Window.write(self.Text)
- end
- function UI:CleanUp()
- self.Window.setVisible(false)
- self.Window.clear()
- UI.Windows[self.Window] = nil
- for _, signal in next, {UI.FocusLost, UI.Focused, UI.Clicked} do
- for _, c in next, signal.__Connections do
- c:Disconnect()
- end
- end
- for k in next, self do
- self[k] = nil
- end
- end
- function UI.UpdateAll()
- term.clear()
- for _, ui in next, UI.Windows do
- UI.Update(ui)
- end
- end
- local function appendCharacter(char)
- if (not focusedTextbox) then
- return
- end
- focusedTextbox.Text = focusedTextbox.Text .. char
- UI.Update(focusedTextbox)
- end
- InputService.MouseDown:Connect(function (mouseKey, X, Y)
- if (focusedTextbox) then
- UI.FocusLost:Fire(false)
- focusedTextbox = nil
- return
- end
- for uiWindow, ui in next, UI.Windows do
- local sizeX, sizeY = uiWindow.getSize()
- local positionX, positionY = uiWindow.getPosition()
- if (mouseKey == Enum.MouseButton.Left and X > positionX and X < positionX + sizeX and Y > positionY and Y < positionY + sizeY) then
- if (ui.TextEditable) then
- focusedTextbox = ui
- UI.Focused:Fire(ui)
- ui.Focused:Fire()
- uiWindow.setCursorBlink(true)
- else
- ui.Clicked:Fire(X, Y)
- end
- return
- end
- end
- end)
- InputService.Writing:Connect(appendCharacter)
- InputService.Paste:Connect(appendCharacter)
- InputService.KeyDown:Connect(function (keyCode)
- if (not focusedTextbox) then
- return
- end
- local key = keys.getName(keyCode)
- if (key == "enter") then
- if (focusedTextbox.MultiLine) then
- appendCharacter("\n")
- else
- UI.FocusLost:Fire(true)
- focusedTextbox = nil
- return
- end
- elseif (key == "backspace") then
- focusedTextbox.Text = string.sub(focusedTextbox.Text, 1, -2)
- end
- UI.Update(focusedTextbox)
- end)
- UI.FocusLost:Connect(function (enterPressed)
- if (not focusedTextbox or not focusedTextbox.Window) then
- return
- end
- focusedTextbox.Window.setCursorBlink(false)
- focusedTextbox.FocusLost:Fire(enterPressed)
- end)
- return UI
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement