Added queue locking.

This commit is contained in:
samuelmaddock 2015-11-07 19:18:53 -05:00
parent e591a77cfe
commit 189825135a
13 changed files with 118 additions and 3 deletions

View File

@ -186,3 +186,14 @@ function MediaPlayer.RequestShuffle( mp )
net.SendToServer()
end
function MediaPlayer.RequestLock( mp )
local mpId = GetMediaPlayerId( mp )
if not mpId then return end
net.Start( "MEDIAPLAYER.RequestLock" )
net.WriteString( mpId )
net.SendToServer()
end

View File

@ -50,6 +50,9 @@ local function OnMediaUpdate( len )
local queueShuffle = net.ReadBool()
mp:SetQueueShuffle( queueShuffle )
local queueLocked = net.ReadBool()
mp:SetQueueLocked( queueLocked )
-- Read extended update information
mp:NetReadUpdate()

View File

@ -240,6 +240,10 @@ function MEDIAPLAYER:CanPlayerRequestMedia( ply, media )
return false, msg
end
if self:GetQueueLocked() and not self:IsPlayerPrivileged(ply) then
return false, "The requested media couldn't be added as the queue is locked."
end
return true
end
@ -502,6 +506,22 @@ function MEDIAPLAYER:RequestShuffle( ply )
end
function MEDIAPLAYER:RequestLock( ply )
if not ( IsValid(ply) and self:HasListener(ply) ) then
return
end
if not self:IsPlayerPrivileged(ply) then
self:NotifyPlayer(ply, "You don't have permission to do that.")
return
end
self:SetQueueLocked( not self:GetQueueLocked() )
self:BroadcastUpdate()
end
--[[---------------------------------------------------------
Media Player Updates
@ -531,9 +551,13 @@ function MEDIAPLAYER:BroadcastUpdate( ply )
net.WriteString( self.Name ) -- media player type
net.WriteEntity( self:GetOwner() )
self.net.WritePlayerState( self:GetPlayerState() )
net.WriteBool( self:GetQueueRepeat() )
net.WriteBool( self:GetQueueShuffle() )
net.WriteBool( self:GetQueueLocked() )
self:NetWriteUpdate( pl ) -- mp type-specific info
net.WriteUInt( #self._Queue, self:GetQueueLimit(true) )
for _, media in ipairs(self._Queue) do
self.net.WriteMedia(media)

View File

@ -7,7 +7,8 @@ function MEDIAPLAYER:GetSnapshot()
currentTime = media and media:CurrentTime(),
queue = queue,
queueRepeat = self:GetQueueRepeat(),
queueShuffle = self:GetQueueShuffle()
queueShuffle = self:GetQueueShuffle(),
queueLocked = self:GetQueueLocked()
}
end
@ -16,6 +17,7 @@ function MEDIAPLAYER:RestoreSnapshot( snapshot )
self:SetQueueRepeat( snapshot.queueRepeat )
self:SetQueueShuffle( snapshot.queueShuffle )
self:SetQueueLocked( snapshot.queueLocked )
if snapshot.media then
-- restore currently playing media from where it left off

View File

@ -315,6 +315,14 @@ function MEDIAPLAYER:SetQueueShuffle( shouldShuffle )
end
end
function MEDIAPLAYER:GetQueueLocked()
return self._QueueLocked
end
function MEDIAPLAYER:SetQueueLocked( locked )
self._QueueLocked = locked
end
---
-- Called when the queue is updated; emits a change event.
--

View File

@ -7,6 +7,7 @@ util.AddNetworkString( "MEDIAPLAYER.RequestSeek" )
util.AddNetworkString( "MEDIAPLAYER.RequestRemove" )
util.AddNetworkString( "MEDIAPLAYER.RequestRepeat" )
util.AddNetworkString( "MEDIAPLAYER.RequestShuffle" )
util.AddNetworkString( "MEDIAPLAYER.RequestLock" )
local REQUEST_DELAY = 0.2
@ -148,3 +149,13 @@ net.Receive( "MEDIAPLAYER.RequestShuffle", RequestWrapper(function(mp, ply)
mp:RequestShuffle( ply )
end) )
net.Receive( "MEDIAPLAYER.RequestLock", RequestWrapper(function(mp, ply)
if MediaPlayer.DEBUG then
print("MEDIAPLAYER.RequestLock:", mp:GetId(), ply)
end
mp:RequestLock( ply )
end) )

View File

@ -18,6 +18,7 @@ MP.EVENTS.UI = {
REMOVE_MEDIA = "mp.events.ui.removeMedia",
SKIP_MEDIA = "mp.events.ui.skipMedia",
VOTE_MEDIA = "mp.events.ui.voteMedia",
TOGGLE_LOCK = "mp.events.ui.toggleLock",
TOGGLE_PAUSE = "mp.events.ui.togglePause",
TOGGLE_REPEAT = "mp.events.ui.toggleRepeat",
TOGGLE_SHUFFLE = "mp.events.ui.toggleShuffle",

View File

@ -36,6 +36,8 @@ spritesheet.Register {
mpIcon( "mp-repeat", 4, 2, 18, 18 ),
mpIcon( "mp-shuffle", 0, 3, 16, 16 ),
mpIcon( "mp-replay", 1, 3, 13, 16 ),
mpIcon( "mp-lock", 2, 3, 12, 16 ),
mpIcon( "mp-lock-open", 3, 3, 12, 16 ),
mpIcon( "mp-play", 3, 4, 19, 25 ),
mpIcon( "mp-pause", 4, 4, 22, 24 ),

View File

@ -75,8 +75,13 @@ derma.DefineControl( "MP.QueueHeader", "", QUEUE_HEADER, "Panel" )
local ADD_VIDEO_BTN = {}
ADD_VIDEO_BTN.Color = Color( 232, 78, 64 )
ADD_VIDEO_BTN.HoverColor = Color( 252, 98, 84 )
local AddEnabledColor = Color( 232, 78, 64 )
local AddEnabledHoverColor = Color( 252, 98, 84 )
local AddDisabledColor = Color( 140, 140, 140 )
ADD_VIDEO_BTN.Color = AddEnabledColor
ADD_VIDEO_BTN.HoverColor = AddEnabledHoverColor
function ADD_VIDEO_BTN:Init()
@ -94,6 +99,17 @@ function ADD_VIDEO_BTN:Init()
end
function ADD_VIDEO_BTN:SetLocked( locked )
if locked and not hook.Run( MP.EVENTS.UI.PRIVILEGED_PLAYER ) then
self:SetDisabled( true )
self.Color = AddDisabledColor
self.HoverColor = AddDisabledColor
self:SetIcon( "mp-lock" )
end
end
function ADD_VIDEO_BTN:Paint( w, h )
local col

View File

@ -106,6 +106,10 @@ function SidebarPresenter:SetupEvents()
MediaPlayer.Skip( mp )
end )
self:RegisterHook( MP.EVENTS.UI.TOGGLE_LOCK, function()
MediaPlayer.RequestLock( mp )
end )
self:RegisterHook( MP.EVENTS.UI.TOGGLE_PAUSE, function()
MediaPlayer.Pause( mp )
end )

View File

@ -179,6 +179,8 @@ function CURRENTLY_PLAYING_TAB:OnMediaPlayerChanged( mp )
self:SetMediaPlayerId( mp:GetId() )
self.QueuePanel.Header.AddVidBtn:SetLocked( mp:GetQueueLocked() )
if not self.MediaChangedHandle then
-- set current media
self.PlaybackPanel:OnMediaChanged( mp:GetMedia() )

View File

@ -28,6 +28,8 @@ function PANEL:Init()
self:AddButton( self.RepeatBtn )
self.ShuffleBtn = vgui.Create( "MP.ShuffleButton" )
self:AddButton( self.ShuffleBtn )
self.LockBtn = vgui.Create( "MP.LockButton" )
self:AddButton( self.LockBtn )
end
self:OnVolumeChanged( MediaPlayer.Volume() )
@ -54,6 +56,7 @@ function PANEL:OnMediaPlayerChanged( mp )
if hook.Run( MP.EVENTS.UI.PRIVILEGED_PLAYER ) then
self.RepeatBtn:SetEnabled( mp:GetQueueRepeat() )
self.ShuffleBtn:SetEnabled( mp:GetQueueShuffle() )
self.LockBtn:SetEnabled( mp:GetQueueLocked() )
end
end
@ -213,3 +216,31 @@ function SHUFFLE_BTN:DoClick()
end
derma.DefineControl( "MP.ShuffleButton", "", SHUFFLE_BTN, "MP.SidebarToggleButton" )
local LOCK_BTN = {}
function LOCK_BTN:Init()
self.BaseClass.Init( self )
self:SetIcon( "mp-lock-open" )
self:SetTooltip( "Toggle Queue Lock" )
end
function LOCK_BTN:DoClick()
self.BaseClass.DoClick( self )
hook.Run( MP.EVENTS.UI.TOGGLE_LOCK )
self:UpdateIcon()
end
function LOCK_BTN:SetEnabled( bEnabled )
self.BaseClass.SetEnabled( self, bEnabled )
self:UpdateIcon()
end
function LOCK_BTN:UpdateIcon()
local icon = self:GetEnabled() and "mp-lock" or "mp-lock-open"
self:SetIcon( icon )
end
derma.DefineControl( "MP.LockButton", "", LOCK_BTN, "MP.SidebarToggleButton" )

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 22 KiB