2021-11-21 17:09:19 +00:00
--[[
Rhythmblock - a graphical music player for CC : Tweaked
( c ) 2021 mint < they @ mint.lgbt >
This program is free software : you can redistribute it and / or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation , either version 3 of the License , or
( at your option ) any later version .
This program is distributed in the hope that it will be useful ,
but WITHOUT ANY WARRANTY ; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
GNU General Public License for more details .
You should have received a copy of the GNU General Public License
along with this program . If not , see < https : // www.gnu . org / licenses /> .
--]]
2021-11-21 17:06:15 +00:00
2021-05-07 06:19:01 +00:00
-- Change these lines to change the GUI colors.
2021-05-07 18:56:15 +00:00
accentColor = colors.gray
buttonColor = colors.lightGray
textColor = colors.lightGray
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 18:56:15 +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-11-21 16:58:36 +00:00
peripherals = peripheral.getNames ( ) -- Gets peripherals to check if any disk drives are available
2021-05-07 07:45:42 +00:00
if # peripherals == 0 then
2021-05-07 07:51:40 +00:00
term.setTextColor ( colors.red )
2021-05-07 20:02:14 +00:00
print ( " No drive " )
2021-05-07 07:45:42 +00:00
return false -- Exits if there's no disk drive
2021-05-07 07:36:40 +00:00
else
driveCount = 0
for n = 1 , # peripherals do
local driveCheck = peripherals [ n ]
if peripheral.getType ( driveCheck ) == " drive " then
2021-05-07 18:56:15 +00:00
drive = driveCheck
driveCount = driveCount + 1
2021-05-07 07:36:40 +00:00
end
end
if driveCount > 1 then
2021-05-07 07:51:40 +00:00
term.setTextColor ( colors.red )
2021-11-21 16:58:36 +00:00
print ( " Too many disk drives. Specify where the desired disk drive is located by running 'rhythmblock [drive position]' " ) -- For safety reasons
2021-05-07 07:38:46 +00:00
return false
2021-05-07 07:47:27 +00:00
elseif driveCount == 0 then
2021-05-07 07:51:40 +00:00
term.setTextColor ( colors.red )
2021-05-07 20:02:14 +00:00
print ( " No drive " )
2021-05-07 07:47:27 +00:00
return false -- Exits if there's no disk drive
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-11-21 16:58:36 +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 so in the future.
2021-05-07 06:19:01 +00:00
] ]
2021-05-07 18:56:15 +00:00
defaultStatus = " Rhythmblock "
invalidFormatStatus = " Not a music disc "
noDiscStatus = " No disc "
noAudioStatus = " No audio is playing "
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 08:01:47 +00:00
buttonRender ( true )
2021-05-07 18:56:15 +00:00
playing = true
status = disk.getAudioTitle ( drive )
2021-05-07 08:01:47 +00:00
buttonRender ( true )
2021-05-07 08:05:41 +00:00
elseif disk.isPresent ( drive ) then
2021-05-07 18:56:15 +00:00
status = invalidFormatStatus
2021-05-07 08:01:47 +00:00
buttonRender ( false )
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.
2021-05-07 18:56:15 +00:00
status = noDiscStatus
2021-05-07 08:01:47 +00:00
buttonRender ( false )
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 08:01:47 +00:00
buttonRender ( false )
2021-05-07 18:57:13 +00:00
if playing then
2021-05-07 06:19:01 +00:00
stopDisc ( )
2021-05-07 19:05:13 +00:00
disk.eject ( drive )
2021-05-07 06:19:01 +00:00
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.
2021-05-07 18:56:15 +00:00
status = noDiscStatus
2021-05-07 06:19:01 +00:00
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
2021-05-07 18:56:15 +00:00
status = defaultStatus
2021-05-07 07:09:10 +00:00
disk.stopAudio ( drive )
2021-05-07 07:06:51 +00:00
term.clear ( )
2021-05-07 08:01:47 +00:00
buttonRender ( false )
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 20:02:14 +00:00
paintutils.drawLine ( centerWidth - 3 , centerHeight + 4 , centerWidth + 3 , 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 08:01:47 +00:00
function renderCloseButton ( ) -- Renders the Close button
2021-05-07 19:12:22 +00:00
term.setCursorPos ( width - 1 , 1 )
2021-05-07 08:01:47 +00:00
term.setTextColor ( textColor )
term.setBackgroundColor ( backgroundColor )
2021-05-07 19:12:22 +00:00
term.write ( " x " )
2021-05-07 08:01:47 +00:00
end
function buttonRender ( play ) -- Render some buttons depending if the computer is advanced or not
2021-05-07 18:57:13 +00:00
if play then
2021-05-07 08:01:47 +00:00
renderStopButton ( )
else
renderPlayButton ( )
end
if term.isColour ( ) then
renderEjectButton ( )
renderCloseButton ( )
end
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 06:36:21 +00:00
term.clear ( )
2021-05-07 06:32:24 +00:00
term.setBackgroundColor ( backgroundColor ) -- Setting the background color
2021-05-07 08:03:42 +00:00
buttonRender ( false )
2021-05-07 18:56:15 +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 08:27:15 +00:00
statusRender ( status ) -- Renders the status
2021-11-21 16:58:36 +00:00
if term.isColour ( ) then -- Renders the close button (if the song title is too long, the close button kind of disappears)
2021-05-07 19:12:22 +00:00
renderCloseButton ( )
end
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 08:27:15 +00:00
if event == " mouse_up " then -- If the event triggered is the mouse clicking it'll do what's next
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 -- If the user clicks on the play/stop button it'll begin playing the disc
2021-05-07 18:57:13 +00:00
if playing then
2021-05-07 06:19:01 +00:00
stopDisc ( )
else
playDisc ( )
end
2021-05-07 08:27:15 +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 -- If the user clicks on the eject button it'll eject the disc
2021-05-07 06:19:01 +00:00
ejectDisc ( )
2021-05-07 08:27:15 +00:00
elseif eventData [ 2 ] == 1 and eventData [ 3 ] == width and eventData [ 4 ] == 1 then -- If the user presses the X it'll quit
2021-05-07 19:08:15 +00:00
stopDisc ( )
2021-05-07 07:29:39 +00:00
term.clear ( )
term.setCursorPos ( 1 , 1 )
return true
end
2021-05-07 08:27:15 +00:00
elseif event == " key_up " then -- Same order but now with keys
2021-05-07 06:32:24 +00:00
local name = keys.getName ( eventData [ 2 ] ) or " unknown key "
if name == " space " then
2021-05-07 18:57:13 +00:00
if playing then
2021-05-07 06:32:24 +00:00
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 19:08:15 +00:00
stopDisc ( )
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