forked from xomf/slabOS
		
	Add slabos.lua
This commit is contained in:
		
							parent
							
								
									1ecbaef3bd
								
							
						
					
					
						commit
						9cfb689809
					
				
							
								
								
									
										289
									
								
								slabos.lua
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										289
									
								
								slabos.lua
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,289 @@
 | 
			
		|||
local basalt = require("basalt")
 | 
			
		||||
 | 
			
		||||
local main = basalt.getMainFrame()
 | 
			
		||||
 | 
			
		||||
local FRAME_WIDTH = 26
 | 
			
		||||
local FRAME_HEIGHT = 19
 | 
			
		||||
local CONTROL_BUTTON_Y = 20 
 | 
			
		||||
 | 
			
		||||
local homescreen = main:addFrame()
 | 
			
		||||
    :setPosition(1, 1)
 | 
			
		||||
    :setSize(FRAME_WIDTH, FRAME_HEIGHT)
 | 
			
		||||
    :setBackground(colours.blue)
 | 
			
		||||
    :setVisible(true) 
 | 
			
		||||
 | 
			
		||||
local active_app_frames = {}
 | 
			
		||||
local current_active_frame = homescreen 
 | 
			
		||||
 | 
			
		||||
local app_switcher_frame = main:addFrame()
 | 
			
		||||
    :setPosition(1, 1)
 | 
			
		||||
    :setSize(FRAME_WIDTH, FRAME_HEIGHT)
 | 
			
		||||
    :setBackground(colours.brown)
 | 
			
		||||
    :setVisible(false) 
 | 
			
		||||
 | 
			
		||||
function show_payment_confirmation(amount, purpose, callback)
 | 
			
		||||
 | 
			
		||||
    local payment_confirmation_frame = main:addFrame()
 | 
			
		||||
        :setPosition(1, 1) 
 | 
			
		||||
        :setSize(FRAME_WIDTH, FRAME_HEIGHT / 3) 
 | 
			
		||||
        :setBackground(colours.black) 
 | 
			
		||||
    payment_confirmation_frame.z = 99
 | 
			
		||||
    payment_confirmation_frame.focused = true
 | 
			
		||||
 | 
			
		||||
    payment_confirmation_frame:addLabel()
 | 
			
		||||
        :setText("Confirm Payment") 
 | 
			
		||||
        :setForeground(colours.white) 
 | 
			
		||||
 | 
			
		||||
    payment_confirmation_frame:addLabel()
 | 
			
		||||
        :setPosition(1, 3) 
 | 
			
		||||
        :setText(amount .. "G -> " .. purpose) 
 | 
			
		||||
        :setForeground(colours.white) 
 | 
			
		||||
 | 
			
		||||
    payment_confirmation_frame:addButton()
 | 
			
		||||
        :setText("Confirm") 
 | 
			
		||||
        :setPosition(1, 6) 
 | 
			
		||||
        :setSize(13, 1) 
 | 
			
		||||
        :setBackground(colours.green) 
 | 
			
		||||
 | 
			
		||||
        :onClick(function()
 | 
			
		||||
            if callback then
 | 
			
		||||
                callback(true)
 | 
			
		||||
            end
 | 
			
		||||
            payment_confirmation_frame:destroy()
 | 
			
		||||
        end)
 | 
			
		||||
 | 
			
		||||
    payment_confirmation_frame:addButton()
 | 
			
		||||
        :setText("Deny") 
 | 
			
		||||
        :setPosition(14, 6) 
 | 
			
		||||
        :setSize(13, 1) 
 | 
			
		||||
        :setBackground(colours.red) 
 | 
			
		||||
 | 
			
		||||
        :onClick(function()
 | 
			
		||||
 | 
			
		||||
            if callback then
 | 
			
		||||
                callback(false)
 | 
			
		||||
            end
 | 
			
		||||
 | 
			
		||||
            payment_confirmation_frame:destroy()
 | 
			
		||||
        end)
 | 
			
		||||
        sleep(0.01)
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
local function payment_listener()
 | 
			
		||||
    local modem = peripheral.find("modem")
 | 
			
		||||
    local lchannel = tonumber(os.getComputerID() .. 43)
 | 
			
		||||
    modem.open(lchannel)
 | 
			
		||||
    while true do
 | 
			
		||||
 | 
			
		||||
        local event, side, channel, replyChannel, message, distance
 | 
			
		||||
        repeat
 | 
			
		||||
        event, side, channel, replyChannel, message, distance = os.pullEvent("modem_message")
 | 
			
		||||
        until channel == lchannel
 | 
			
		||||
 | 
			
		||||
        local payload = textutils.unserialiseJSON(message)
 | 
			
		||||
        if payload.type == "confirmTransaction" then
 | 
			
		||||
            show_payment_confirmation(payload.amount, payload.vendor,function(bruh)
 | 
			
		||||
                if bruh then
 | 
			
		||||
 | 
			
		||||
                    local confirmation_payload = {
 | 
			
		||||
                        type = "transactionConfirmation",
 | 
			
		||||
                        transaction_id = payload.transaction_id,
 | 
			
		||||
                        confirmed = true
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    modem.transmit(replyChannel,channel,textutils.serialiseJSON(confirmation_payload))
 | 
			
		||||
 | 
			
		||||
                else
 | 
			
		||||
 | 
			
		||||
                    local confirmation_payload = {
 | 
			
		||||
                        type = "transactionConfirmation",
 | 
			
		||||
                        transaction_id = payload.transaction_id,
 | 
			
		||||
                        confirmed = false
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    modem.transmit(replyChannel,channel,textutils.serialiseJSON(confirmation_payload))
 | 
			
		||||
 | 
			
		||||
                end
 | 
			
		||||
            end)
 | 
			
		||||
 | 
			
		||||
        end
 | 
			
		||||
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
local function populate_homescreen_buttons()
 | 
			
		||||
 | 
			
		||||
    homescreen:clear()
 | 
			
		||||
 | 
			
		||||
    local button_width = 8
 | 
			
		||||
    local button_height = 3
 | 
			
		||||
    local button_spacing_x = 3
 | 
			
		||||
    local button_spacing_y = 2
 | 
			
		||||
    local current_x = button_spacing_x
 | 
			
		||||
    local current_y = button_spacing_y
 | 
			
		||||
 | 
			
		||||
    local app_files = fs.list("/apps/")
 | 
			
		||||
 | 
			
		||||
    for i = 1, #app_files do
 | 
			
		||||
        local filename = app_files[i]
 | 
			
		||||
 | 
			
		||||
        local display_name = filename:gsub(".lua$", "")
 | 
			
		||||
 | 
			
		||||
        if current_x + button_width > homescreen:getWidth() then
 | 
			
		||||
            current_x = button_spacing_x 
 | 
			
		||||
            current_y = current_y + button_height + button_spacing_y 
 | 
			
		||||
        end
 | 
			
		||||
 | 
			
		||||
        if current_y + button_height > homescreen:getHeight() then
 | 
			
		||||
            break
 | 
			
		||||
        end
 | 
			
		||||
        
 | 
			
		||||
        local app_button = homescreen:addButton()
 | 
			
		||||
            :setText(display_name) 
 | 
			
		||||
            :setPosition(current_x, current_y)
 | 
			
		||||
            :setSize(button_width, button_height)
 | 
			
		||||
            :setBackground(colours.grey)
 | 
			
		||||
            :setForeground(colours.white)
 | 
			
		||||
            :onClick(function()
 | 
			
		||||
 | 
			
		||||
                if current_active_frame then
 | 
			
		||||
                    current_active_frame:setVisible(false)
 | 
			
		||||
                end
 | 
			
		||||
 | 
			
		||||
                local app_frame = active_app_frames[filename]
 | 
			
		||||
                if not app_frame then
 | 
			
		||||
 | 
			
		||||
                    app_frame = main:addFrame()
 | 
			
		||||
                        :setPosition(1, 1) 
 | 
			
		||||
                        :setSize(FRAME_WIDTH, FRAME_HEIGHT)
 | 
			
		||||
                        :setBackground(colours.green) 
 | 
			
		||||
                        :setVisible(false) 
 | 
			
		||||
 | 
			
		||||
                    app_frame:addProgram()
 | 
			
		||||
                        :setSize(FRAME_WIDTH, FRAME_HEIGHT)
 | 
			
		||||
                        :execute("/apps/" .. filename)
 | 
			
		||||
 | 
			
		||||
                    active_app_frames[filename] = app_frame
 | 
			
		||||
                end
 | 
			
		||||
 | 
			
		||||
                app_frame:setVisible(true)
 | 
			
		||||
                current_active_frame = app_frame
 | 
			
		||||
            end)
 | 
			
		||||
 | 
			
		||||
        current_x = current_x + button_width + button_spacing_x
 | 
			
		||||
    end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
local function switch_to_frame(target_frame, frame_name)
 | 
			
		||||
    if current_active_frame then
 | 
			
		||||
        current_active_frame:setVisible(false)
 | 
			
		||||
    end
 | 
			
		||||
    target_frame:setVisible(true)
 | 
			
		||||
    current_active_frame = target_frame
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
local function populate_app_switcher_ui()
 | 
			
		||||
    app_switcher_frame:clear() 
 | 
			
		||||
 | 
			
		||||
    app_switcher_frame:addLabel()
 | 
			
		||||
        :setText("Active Applications")
 | 
			
		||||
        :setPosition(5, 1)
 | 
			
		||||
        :setSize(FRAME_WIDTH - 2, 1)
 | 
			
		||||
        :setForeground(colours.white)
 | 
			
		||||
        :setBackground(colours.blue)
 | 
			
		||||
 | 
			
		||||
    local current_y = 3 
 | 
			
		||||
 | 
			
		||||
    app_switcher_frame:addButton()
 | 
			
		||||
        :setText("Home Screen")
 | 
			
		||||
        :setPosition(2, current_y)
 | 
			
		||||
        :setSize(FRAME_WIDTH - 3, 1)
 | 
			
		||||
        :setBackground(homescreen == current_active_frame and colours.lightGrey or colours.grey) 
 | 
			
		||||
        :setForeground(colours.white)
 | 
			
		||||
        :onClick(function()
 | 
			
		||||
            switch_to_frame(homescreen, "Home Screen")
 | 
			
		||||
            app_switcher_frame:setVisible(false) 
 | 
			
		||||
        end)
 | 
			
		||||
    current_y = current_y + 2
 | 
			
		||||
 | 
			
		||||
    for filename, app_frame in pairs(active_app_frames) do
 | 
			
		||||
 | 
			
		||||
        local display_name = filename:gsub(".lua$", "")
 | 
			
		||||
 | 
			
		||||
        if current_y + 1 > app_switcher_frame:getHeight() - 2 then 
 | 
			
		||||
            app_switcher_frame:addLabel()
 | 
			
		||||
                :setText("...more apps below...")
 | 
			
		||||
                :setPosition(1, current_y)
 | 
			
		||||
                :setSize(FRAME_WIDTH - 2, 1)
 | 
			
		||||
                :setForeground(colours.orange)
 | 
			
		||||
                :setBackground(colours.black)
 | 
			
		||||
            break
 | 
			
		||||
        end
 | 
			
		||||
 | 
			
		||||
        app_switcher_frame:addButton()
 | 
			
		||||
            :setText(display_name) 
 | 
			
		||||
            :setPosition(2, current_y)
 | 
			
		||||
            :setSize(FRAME_WIDTH - 8, 1) 
 | 
			
		||||
            :setBackground(app_frame == current_active_frame and colours.lightGrey or colours.grey) 
 | 
			
		||||
            :setForeground(colours.white)
 | 
			
		||||
            :onClick(function()
 | 
			
		||||
                switch_to_frame(app_frame, filename)
 | 
			
		||||
                app_switcher_frame:setVisible(false) 
 | 
			
		||||
            end)
 | 
			
		||||
 | 
			
		||||
        app_switcher_frame:addButton()
 | 
			
		||||
            :setText("X")
 | 
			
		||||
            :setPosition(FRAME_WIDTH - 6, current_y)
 | 
			
		||||
            :setSize(5, 1)
 | 
			
		||||
            :setBackground(colours.red)
 | 
			
		||||
            :setForeground(colours.white)
 | 
			
		||||
            :onClick(function()
 | 
			
		||||
 | 
			
		||||
                if app_frame then
 | 
			
		||||
                    app_frame:destroy()
 | 
			
		||||
                end
 | 
			
		||||
                active_app_frames[filename] = nil 
 | 
			
		||||
 | 
			
		||||
                if current_active_frame == app_frame then
 | 
			
		||||
                    switch_to_frame(homescreen, "Home Screen (after close)")
 | 
			
		||||
                end
 | 
			
		||||
 | 
			
		||||
                populate_app_switcher_ui()
 | 
			
		||||
            end)
 | 
			
		||||
        current_y = current_y + 2
 | 
			
		||||
    end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
populate_homescreen_buttons()
 | 
			
		||||
 | 
			
		||||
main:addButton()
 | 
			
		||||
    :setText("Home")
 | 
			
		||||
    :setPosition(0, CONTROL_BUTTON_Y)
 | 
			
		||||
    :setSize(14, 1)
 | 
			
		||||
    :setBackground(colours.black)
 | 
			
		||||
    :setForeground(colours.white)
 | 
			
		||||
    :onClick(function()
 | 
			
		||||
 | 
			
		||||
        if current_active_frame ~= homescreen or app_switcher_frame.visible == true then
 | 
			
		||||
            app_switcher_frame:setVisible(false) 
 | 
			
		||||
            switch_to_frame(homescreen, "Home Screen")
 | 
			
		||||
        end
 | 
			
		||||
    end)
 | 
			
		||||
 | 
			
		||||
main:addButton()
 | 
			
		||||
    :setText("Switch")
 | 
			
		||||
    :setPosition(14, CONTROL_BUTTON_Y)
 | 
			
		||||
    :setSize(13, 1)
 | 
			
		||||
    :setBackground(colours.red)
 | 
			
		||||
    :setForeground(colours.white)
 | 
			
		||||
    :onClick(function()
 | 
			
		||||
 | 
			
		||||
        if current_active_frame then
 | 
			
		||||
            current_active_frame:setVisible(false)
 | 
			
		||||
        end
 | 
			
		||||
        populate_app_switcher_ui() 
 | 
			
		||||
        app_switcher_frame:setVisible(true)
 | 
			
		||||
    end)
 | 
			
		||||
 | 
			
		||||
parallel.waitForAny(basalt.run,payment_listener)
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user