protected override bool UpdateRecordingStatus(IProgram program)
        {
            IProgramRecordingStatus recordingStatus = program as IProgramRecordingStatus;

            if (recordingStatus == null)
            {
                return(false);
            }

            ChannelProgramListItem programChannel = _channelList.OfType <ChannelProgramListItem>().FirstOrDefault(c => c.Channel.ChannelId == program.ChannelId);

            if (programChannel == null)
            {
                return(false);
            }

            ProgramListItem listProgram;

            lock (programChannel.Programs.SyncRoot)
            {
                listProgram = programChannel.Programs.OfType <ProgramListItem>().FirstOrDefault(p => p.Program.ProgramId == program.ProgramId);
                if (listProgram == null)
                {
                    return(false);
                }
            }
            listProgram.Program.UpdateState(recordingStatus.RecordingStatus);
            return(true);
        }
Ejemplo n.º 2
0
        protected override void UpdateChannels()
        {
            base.UpdateChannels();
            if (_webChannelGroupIndex < _channelGroups.Count)
            {
                IChannelGroup currentGroup = _channelGroups[_webChannelGroupIndex];
                CurrentGroupName = currentGroup.Name;
            }
            _channelList.Clear();
            if (_channels == null)
            {
                return;
            }

            foreach (IChannel channel in _channels)
            {
                // Use local variable, otherwise delegate argument is not fixed
                IChannel currentChannel = channel;

                ChannelProgramListItem item = new ChannelProgramListItem(currentChannel, GetNowAndNextProgramsList(currentChannel))
                {
                    Command = new MethodDelegateCommand(() => Tune(currentChannel))
                };
                item.AdditionalProperties["CHANNEL"] = channel;
                _channelList.Add(item);
            }
            CurrentGroupChannels.FireChange();
        }
Ejemplo n.º 3
0
        /// <summary>
        /// Presents a dialog with recording options for the currently selected program/channel.
        /// </summary>
        public async void RecordMenu()
        {
            if (SlimTvExtScheduleModel.CurrentItem == null)
            {
                return;
            }
            ChannelProgramListItem item = SlimTvExtScheduleModel.CurrentItem as ChannelProgramListItem;

            if (item == null || item.Programs == null)
            {
                return;
            }
            IProgram program = null;
            IChannel channel = null;

            lock (item.Programs.SyncRoot)
                if (item.Programs.Count == 2)
                {
                    program = item.Programs[0].AdditionalProperties["PROGRAM"] as IProgram;
                    channel = item.AdditionalProperties["CHANNEL"] as IChannel;
                }
            if (program != null && channel != null && await InitActionsList(program, channel))
            {
                IScreenManager screenManager = ServiceRegistration.Get <IScreenManager>();
                screenManager.ShowDialog("DialogClientModel");
            }
        }
Ejemplo n.º 4
0
 /// <summary>
 /// Sets the "IsRunning" state of all programs.
 /// </summary>
 /// <param name="channel"></param>
 private static void UpdateChannelProgramsState(ChannelProgramListItem channel)
 {
     foreach (ProgramListItem program in channel.Programs)
     {
         program.Update();
     }
 }
Ejemplo n.º 5
0
        protected override void UpdateChannels()
        {
            base.UpdateChannels();
            if (_webChannelGroupIndex < _channelGroups.Count)
            {
                IChannelGroup currentGroup = _channelGroups[_webChannelGroupIndex];
                CurrentGroupName = currentGroup.Name;
            }
            _channelList.Clear();
            if (_channels == null)
            {
                return;
            }

            foreach (IChannel channel in _channels)
            {
                // Use local variable, otherwise delegate argument is not fixed
                IChannel currentChannel = channel;

                ChannelProgramListItem item = new ChannelProgramListItem(currentChannel, null)
                {
                    Programs = new ItemsList {
                        GetNoProgramPlaceholder(), GetNoProgramPlaceholder()
                    },
                    Command = new MethodDelegateCommand(() => Tune(currentChannel))
                };
                item.AdditionalProperties["CHANNEL"] = channel;
                // Load programs asynchronously, this increases performance of list building
                GetNowAndNextProgramsList(item, currentChannel);
                _channelList.Add(item);
            }
            CurrentGroupChannels.FireChange();
        }
 /// <summary>
 /// Sets the "IsRunning" state of all programs.
 /// </summary>
 /// <param name="channel"></param>
 private static void UpdateChannelProgramsState(ChannelProgramListItem channel)
 {
     lock (channel.Programs.SyncRoot)
         foreach (ProgramListItem program in channel.Programs)
         {
             program.Update();
         }
 }
Ejemplo n.º 7
0
        private void ReloadEnd(ChannelProgramListItem channel, DateTime lastEndTime)
        {
            ItemsList newItems = GetProgramsList(channel.Channel, lastEndTime.AddSeconds(1), GuideEndTime);

            foreach (ListItem listItem in newItems)
            {
                channel.Programs.Add(listItem);
            }
        }
Ejemplo n.º 8
0
        private void ReloadStart(ChannelProgramListItem channel, DateTime firstFromTime)
        {
            ItemsList newItems = GetProgramsList(channel.Channel, GuideStartTime, firstFromTime.AddSeconds(-1));
            int       idx      = 0;

            foreach (ListItem listItem in newItems)
            {
                channel.Programs.Insert(idx++, listItem);
            }
        }
 private void UpdateChannelPrograms(ChannelProgramListItem channel)
 {
     channel.Programs.Clear();
     if (_groupPrograms != null)
     {
         _groupPrograms.Where(p => p.ChannelId == channel.Channel.ChannelId).ToList().ForEach(p => channel.Programs.Add(BuildProgramListItem(p)));
     }
     FillNoPrograms(channel, GuideStartTime, GuideEndTime);
     channel.Programs.FireChange();
 }
        protected ListItem CreateChannelItem(IChannel channel)
        {
            ChannelProgramListItem item = new ChannelProgramListItem(channel, null)
            {
                Command = new AsyncMethodDelegateCommand(() => SlimTvModelBase.TuneChannel(channel)),
            };

            item.AdditionalProperties["CHANNEL"] = channel;
            return(item);
        }
 private void UpdateChannelPrograms(ChannelProgramListItem channel)
 {
     lock (channel.Programs.SyncRoot)
     {
         channel.Programs.Clear();
         if (_groupPrograms != null)
         {
             _groupPrograms.Where(p => p.ChannelId == channel.Channel.ChannelId && p.StartTime < GuideEndTime).ToList().ForEach(p => channel.Programs.Add(BuildProgramListItem(p)));
         }
         FillNoPrograms(channel, GuideStartTime, GuideEndTime);
     }
     // Don't notify about every channel programs list changes, only for channel list
     // channel.Programs.FireChange();
 }
 private void BackgroundUpdateChannels(object threadArgument)
 {
     base.UpdateChannels();
     _channelList.Clear();
     if (_channels != null)
     {
         foreach (IChannel channel in _channels)
         {
             var channelProgramsItem = new ChannelProgramListItem(channel, new ItemsList());
             UpdateChannelPrograms(channelProgramsItem);
             _channelList.Add(channelProgramsItem);
         }
     }
     _channelList.FireChange();
 }
 private void BackgroundUpdateChannels()
 {
     //base.UpdateChannels();
     _channelList.Clear();
     foreach (IChannel channel in ChannelContext.Instance.Channels)
     {
         IChannel localChannel        = channel;
         var      channelProgramsItem = new ChannelProgramListItem(channel, new ItemsList())
         {
             Command = new MethodDelegateCommand(() => ShowSingleChannelGuide(localChannel))
         };
         UpdateChannelPrograms(channelProgramsItem);
         _channelList.Add(channelProgramsItem);
     }
     _channelList.FireChange();
 }
Ejemplo n.º 14
0
        protected override void UpdateChannels()
        {
            base.UpdateChannels();
            if (CurrentChannelGroup != null)
            {
                CurrentGroupName = CurrentChannelGroup.Name;
            }
            _channelList.Clear();

            bool isOneSelected = false;

            foreach (IChannel channel in ChannelContext.Channels)
            {
                // Use local variable, otherwise delegate argument is not fixed
                IChannel currentChannel = channel;

                bool isCurrentSelected = IsSameChannel(currentChannel, _lastTunedChannel);
                isOneSelected |= isCurrentSelected;
                ChannelProgramListItem item = new ChannelProgramListItem(currentChannel, null)
                {
                    Programs = new ItemsList {
                        GetNoProgramPlaceholder(), GetNoProgramPlaceholder()
                    },
                    Command  = new MethodDelegateCommand(() => Tune(currentChannel)),
                    Selected = isCurrentSelected
                };
                item.AdditionalProperties["CHANNEL"] = channel;
                _channelList.Add(item);
            }
            // Adjust channel list position
            ChannelContext.Channels.MoveTo(c => IsSameChannel(c, _lastTunedChannel));

            // If the current watched channel is not part of the channel group, set the "selected" property to first list item to make sure focus will be set to the list view
            if (!isOneSelected && _channelList.Count > 0)
            {
                _channelList.First().Selected = true;
            }

            // Load programs asynchronously, this increases performance of list building
            GetNowAndNextProgramsList_Async();
            CurrentGroupChannels.FireChange();
        }
Ejemplo n.º 15
0
        protected void GetNowAndNextProgramsList(ChannelProgramListItem channelItem, IChannel channel)
        {
            IThreadPool threadPool = ServiceRegistration.Get <IThreadPool>();

            threadPool.Add(() =>
            {
                IProgram currentProgram;
                IProgram nextProgram;
                // We do not check return code here. Results for currentProgram or nextProgram can be null, this is ok here, as Program will be filled with placeholder.
                if (_tvHandler.ProgramInfo == null)
                {
                    return;
                }
                _tvHandler.ProgramInfo.GetNowNextProgram(channel, out currentProgram, out nextProgram);
                CreateProgramListItem(currentProgram, channelItem.Programs[0]);
                CreateProgramListItem(nextProgram, channelItem.Programs[1], currentProgram);
            },
                           QueuePriority.Low
                           );
        }
Ejemplo n.º 16
0
        protected override bool UpdateRecordingStatus(IProgram program, RecordingStatus newStatus)
        {
            bool changed = base.UpdateRecordingStatus(program, newStatus);

            if (changed)
            {
                ChannelProgramListItem programChannel = _channelList.OfType <ChannelProgramListItem>().FirstOrDefault(c => c.Channel.ChannelId == program.ChannelId);
                if (programChannel == null)
                {
                    return(false);
                }

                ProgramListItem listProgram = programChannel.Programs.OfType <ProgramListItem>().FirstOrDefault(p => p.Program.ProgramId == program.ProgramId);
                if (listProgram == null)
                {
                    return(false);
                }
                listProgram.Program.IsScheduled = newStatus != RecordingStatus.None;
            }
            return(changed);
        }
        private void FillNoPrograms(ChannelProgramListItem channel, DateTime viewPortStart, DateTime viewPortEnd)
        {
            var programs = channel.Programs;

            if (programs.Count == 0)
            {
                programs.Add(NoProgramPlaceholder(channel.Channel, null, null));
                return;
            }
            ProgramListItem firstItem = programs.Cast <ProgramListItem>().First();
            ProgramListItem lastItem  = programs.Cast <ProgramListItem>().Last();

            if (firstItem.Program.StartTime > viewPortStart)
            {
                programs.Insert(0, NoProgramPlaceholder(channel.Channel, null, firstItem.Program.StartTime));
            }

            if (lastItem.Program.EndTime < viewPortEnd)
            {
                programs.Add(NoProgramPlaceholder(channel.Channel, lastItem.Program.EndTime, null));
            }
        }
Ejemplo n.º 18
0
        private void UpdateChannelPrograms(ChannelProgramListItem channel)
        {
            int programCount = channel.Programs.Count;

            if (programCount > 0)
            {
                ProgramListItem firstItem = (ProgramListItem)channel.Programs[0];
                ProgramListItem lastItem  = (ProgramListItem)channel.Programs[programCount - 1];
                DateTime        timeFrom  = firstItem.Program.StartTime;
                DateTime        timeTo    = lastItem.Program.EndTime;
                if (timeFrom > GuideStartTime)
                {
                    ReloadStart(channel, timeFrom);
                }
                else
                {
                    TrimStart(channel.Programs);
                }

                if (timeTo < GuideEndTime)
                {
                    ReloadEnd(channel, timeTo);
                }
                else
                {
                    TrimEnd(channel.Programs);
                }

                foreach (ProgramListItem program in channel.Programs)
                {
                    program.Program.UpdateDuration(GuideStartTime, GuideEndTime);
                }

                RemoveZeroDurations(channel.Programs);
            }
            channel.Programs.FireChange();
        }
Ejemplo n.º 19
0
        private bool CreateOrUpdateRow(bool updateOnly, ref int channelIndex, int rowIndex)
        {
            if (channelIndex >= ChannelsPrograms.Count)
            {
                return(false);
            }
            ChannelProgramListItem channel = ChannelsPrograms[channelIndex] as ChannelProgramListItem;

            if (channel == null)
            {
                return(false);
            }

            // Default: take viewport from model
            var model = SlimTvMultiChannelGuideModel;

            if (model == null)
            {
                return(false);
            }
            DateTime viewportStart = model.GuideStartTime;
            DateTime viewportEnd   = model.GuideEndTime;

            int colIndex = GroupButtonEnabled ? 1 : 0;

            if (!updateOnly)
            {
                Control btnHeader = CreateControl(channel);
                SetGrid(btnHeader, colIndex, rowIndex, 1);

                // Deep copy the styles to each program button.
                btnHeader.Template = MpfCopyManager.DeepCopyCutLVPs(HeaderTemplate);
                Children.Add(btnHeader);
            }

            int      colSpan       = 0;
            DateTime?lastStartTime = null;
            DateTime?lastEndTime   = viewportStart;

#if DEBUG_LAYOUT
            // Debug layouting:
            if (rowIndex == 0)
            {
                ServiceRegistration.Get <ILogger>().Debug("EPG: Viewport: {0}-{1} PerCell: {2} min", viewportStart.ToShortTimeString(), viewportEnd.ToShortTimeString(), _perCellTime);
            }
#endif
            if (updateOnly)
            {
                // Remove all programs outside of viewport.
                DateTime start      = viewportStart;
                DateTime end        = viewportEnd;
                var      removeList = GetRowItems(rowIndex).Where(el =>
                {
                    ProgramListItem p = (ProgramListItem)el.Context;
                    return(p.Program.EndTime <= start || p.Program.StartTime >= end || channel.Channel.ChannelId != ((IProgram)p.AdditionalProperties["PROGRAM"]).ChannelId ||
                           p is PlaceholderListItem);
                }).ToList();
                removeList.ForEach(Children.Remove);
            }

            colIndex++; // After header (and optional GroupButton)
            int programIndex = 0;
            while (programIndex < channel.Programs.Count && colIndex <= _numberOfColumns)
            {
                ProgramListItem program = channel.Programs[programIndex] as ProgramListItem;
                if (program == null || program.Program.StartTime > viewportEnd)
                {
                    break;
                }

                // Ignore programs outside viewport and programs that start at same time (duplicates)
                if (program.Program.EndTime <= viewportStart || (lastStartTime.HasValue && lastStartTime.Value == program.Program.StartTime))
                {
                    programIndex++;
                    continue;
                }

                lastStartTime = program.Program.StartTime;

                CalculateProgamPosition(program, viewportStart, viewportEnd, ref colIndex, ref colSpan, ref lastEndTime);

                Control btnEpg = GetOrCreateControl(program, rowIndex);
                SetGrid(btnEpg, colIndex, rowIndex, colSpan);
                programIndex++;
                colIndex += colSpan; // Skip spanned columns.
            }
            channelIndex++;
            return(true);
        }