2021-05-07 06:19:01 +00:00
-- Change these lines to change the GUI colors.
2021-05-06 14:22:19 +00:00
accentColor = colors.gray
buttonColor = colors.lightGray
2021-05-07 04:52:48 +00:00
textColor = colors.lightGray
altTextColor = colors.gray
2021-05-06 14:22:19 +00:00
backgroundColor = colors.black
2021-05-07 07:38:46 +00:00
-- Code starts from here
2021-05-07 06:19:01 +00:00
function round ( n ) -- We need a function to round the center of the terminal
2021-05-06 17:46:25 +00:00
return n % 1 >= 0.5 and math.ceil ( n ) or math.floor ( n )
end
2021-05-07 06:19:01 +00:00
width , height = term.getSize ( ) -- Gets the terminal size to determine the center
centerWidth = round ( width / 2 ) -- Defines the horizontal center
centerHeight = round ( height / 2 ) -- Defines the vertical center
2021-05-07 07:38:46 +00:00
if arg [ 1 ] == nil then
2021-05-07 07:36:40 +00:00
peripherals = peripheral.getNames ( ) -- Gets peripherals to check if any disk drives are avavailable
if # peripherals < 0 then
print " No drive "
return true -- Exits if there's no disk drive
else
driveCount = 0
for n = 1 , # peripherals do
local driveCheck = peripherals [ n ]
if peripheral.getType ( driveCheck ) == " drive " then
drive = driveCheck
driveCount = driveCount + 1
end
end
if driveCount > 1 then
2021-05-07 07:43:01 +00:00
print ( " Too many disk drives. Specify where the desired disk drive is by running 'rhythmbox [drive position]' " ) -- For safety reasons
2021-05-07 07:38:46 +00:00
return false
2021-05-06 14:22:19 +00:00
end
end
2021-05-07 07:36:40 +00:00
else
drive = arg [ 1 ]
2021-05-06 14:22:19 +00:00
end
2021-05-07 06:19:01 +00:00
--[[ Instead of calling every status by string, we call the variables storing the strings. This may ease translation if we plan to do it in the future.
] ]
2021-05-07 06:56:46 +00:00
defaultStatus = " Rhythmblock 1.0 "
2021-05-06 17:34:43 +00:00
invalidFormatStatus = " Not a music disc "
noDiscStatus = " No disc "
2021-05-07 07:06:51 +00:00
noAudioStatus = " No audio is playing "
2021-05-07 06:19:01 +00:00
ejectText = " Eject "
2021-05-06 14:22:19 +00:00
function playDisc ( )
2021-05-07 07:06:51 +00:00
term.clear ( )
2021-05-07 06:19:01 +00:00
if disk.isPresent ( drive ) and disk.hasAudio ( drive ) then -- Determines if there's a disc or not and if it's a music disc
2021-05-06 14:22:19 +00:00
disk.playAudio ( drive )
2021-05-07 06:19:01 +00:00
renderStopButton ( )
2021-05-07 07:06:51 +00:00
renderEjectButton ( )
2021-05-07 07:29:39 +00:00
renderCloseButton ( )
2021-05-06 14:22:19 +00:00
playing = true
2021-05-07 06:19:01 +00:00
status = disk.getAudioTitle ( drive )
elseif disk.isPresent ( drive ) then -- If there's a floppy disk for example, Rhythmbox won't play it.
status = invalidFormatStatus
2021-05-07 07:06:51 +00:00
renderPlayButton ( )
renderEjectButton ( )
2021-05-07 07:29:39 +00:00
renderCloseButton ( )
2021-05-07 06:19:01 +00:00
else -- If none of these checks are passed then it just means there's no disc in the drive.
status = noDiscStatus
2021-05-07 07:06:51 +00:00
renderPlayButton ( )
renderEjectButton ( )
2021-05-07 07:29:39 +00:00
renderCloseButton ( )
2021-05-06 14:22:19 +00:00
end
end
2021-05-07 06:19:01 +00:00
function ejectDisc ( ) -- Ejects the disc! How cool is that?
2021-05-07 07:29:39 +00:00
term.clear ( )
2021-05-07 07:06:51 +00:00
renderPlayButton ( )
renderEjectButton ( )
2021-05-07 07:29:39 +00:00
renderCloseButton ( )
2021-05-07 06:19:01 +00:00
if playing == true then
stopDisc ( )
disk.eject ( )
elseif disk.isPresent ( drive ) then -- If there's a disc, it'll be ejected.
2021-05-07 06:52:13 +00:00
disk.eject ( drive )
2021-05-07 06:19:01 +00:00
else -- If not it'll report there's no disc.
status = noDiscStatus
end
2021-05-06 14:22:19 +00:00
end
2021-05-07 06:19:01 +00:00
function stopDisc ( ) -- Stops the music
playing = false
status = defaultStatus
2021-05-07 07:09:10 +00:00
disk.stopAudio ( drive )
2021-05-07 07:06:51 +00:00
term.clear ( )
renderPlayButton ( )
renderEjectButton ( )
2021-05-07 07:29:39 +00:00
renderCloseButton ( )
2021-05-06 14:22:19 +00:00
end
2021-05-07 06:19:01 +00:00
function renderPlayButton ( ) -- Renders the Play button
2021-05-07 04:52:48 +00:00
paintutils.drawFilledBox ( centerWidth - 4 , centerHeight - 4 , centerWidth + 4 , centerHeight + 2 , accentColor )
2021-05-07 04:48:14 +00:00
paintutils.drawFilledBox ( centerWidth - 2 , centerHeight - 3 , centerWidth - 1 , centerHeight + 1 , buttonColor )
2021-05-07 04:52:48 +00:00
paintutils.drawFilledBox ( centerWidth , centerHeight - 2 , centerWidth + 1 , centerHeight , buttonColor )
paintutils.drawPixel ( centerWidth + 2 , centerHeight - 1 , buttonColor )
2021-05-06 17:34:43 +00:00
end
2021-05-07 06:19:01 +00:00
function renderStopButton ( ) -- Renders the Stop button
paintutils.drawFilledBox ( centerWidth - 4 , centerHeight - 4 , centerWidth + 4 , centerHeight + 2 , accentColor )
2021-05-07 06:32:24 +00:00
paintutils.drawFilledBox ( centerWidth - 2 , centerHeight - 3 , centerWidth + 2 , centerHeight + 1 , buttonColor )
2021-05-07 06:19:01 +00:00
end
function renderEjectButton ( ) -- Renders the Eject button
2021-05-07 06:44:08 +00:00
paintutils.drawLine ( centerWidth - 2 , centerHeight + 4 , centerWidth + 2 , centerHeight + 4 , accentColor )
2021-05-07 06:19:01 +00:00
term.setTextColor ( buttonColor )
term.setCursorPos ( centerWidth - 2 , centerHeight + 4 )
term.write ( ejectText )
end
2021-05-07 07:29:39 +00:00
function statusRender ( s ) -- Renders the status bar
2021-05-07 06:56:46 +00:00
term.setCursorPos ( 1 , 1 )
term.setTextColor ( textColor )
term.setBackgroundColor ( backgroundColor )
term.write ( s )
2021-05-07 06:19:01 +00:00
end
2021-05-07 07:29:39 +00:00
function renderCloseButton ( ) -- Renders the X button
2021-05-07 07:30:26 +00:00
term.setCursorPos ( width , 1 )
2021-05-07 07:29:39 +00:00
term.setTextColor ( textColor )
term.setBackgroundColor ( backgroundColor )
term.write ( " x " )
end
2021-05-07 06:36:21 +00:00
term.clear ( )
2021-05-07 06:32:24 +00:00
term.setBackgroundColor ( backgroundColor ) -- Setting the background color
renderPlayButton ( ) -- Rendering the play button
renderEjectButton ( ) -- Rendering the eject button
2021-05-07 07:29:39 +00:00
renderCloseButton ( ) -- Rendering the close button
2021-05-07 06:44:08 +00:00
status = defaultStatus -- Setting the value to the default
2021-05-07 06:19:01 +00:00
2021-05-07 06:32:24 +00:00
while true do
2021-05-07 06:52:13 +00:00
statusRender ( status )
2021-05-07 06:32:24 +00:00
local eventData = { os.pullEvent ( ) }
local event = eventData [ 1 ]
2021-05-07 06:44:08 +00:00
2021-05-07 06:32:24 +00:00
if event == " mouse_up " then
2021-05-07 06:33:30 +00:00
if eventData [ 2 ] == 1 and eventData [ 3 ] >= centerWidth - 4 and eventData [ 4 ] >= centerHeight - 4 and eventData [ 3 ] <= centerWidth + 4 and eventData [ 4 ] <= centerHeight + 2 then
2021-05-07 06:19:01 +00:00
if playing == true then
stopDisc ( )
else
playDisc ( )
end
2021-05-07 06:32:24 +00:00
elseif eventData [ 2 ] == 1 and eventData [ 3 ] >= centerWidth - 2 and eventData [ 4 ] >= centerHeight + 4 and eventData [ 3 ] <= centerWidth + 2 and eventData [ 4 ] <= centerHeight + 4 then
2021-05-07 06:19:01 +00:00
ejectDisc ( )
2021-05-07 07:29:39 +00:00
elseif eventData [ 2 ] == 1 and eventData [ 3 ] == width and eventData [ 4 ] == 1 then
term.clear ( )
term.setCursorPos ( 1 , 1 )
return true
end
2021-05-07 06:32:24 +00:00
elseif event == " key_up " then
local name = keys.getName ( eventData [ 2 ] ) or " unknown key "
if name == " space " then
if playing == true then
stopDisc ( )
else
playDisc ( )
end
2021-05-07 07:07:51 +00:00
elseif name == " e " then
2021-05-07 07:06:51 +00:00
ejectDisc ( )
2021-05-07 06:32:24 +00:00
elseif name == " q " then
2021-05-07 06:56:46 +00:00
term.clear ( )
term.setCursorPos ( 1 , 1 )
2021-05-07 06:40:18 +00:00
return true
2021-05-07 06:32:24 +00:00
end
end
2021-05-07 06:19:01 +00:00
end