Ejemplo n.º 1
0
        private VideoPanelItem findAVideoPanel(SplitScreenNode node)
        {
            VideoPanelItem panel = null;

            if (_garbageItems.Count > 0)
            {
                panel = _garbageItems[_garbageItems.Count - 1];
                _garbageItems.RemoveAt(_garbageItems.Count - 1);
                Console.WriteLine("GetPanel from Garbage!");
            }
            else
            {
                panel = new VideoPanelItem(ViewModel.CanItemClose);
            }

            panel.ViewModel.CanClose = ViewModel.CanItemClose;
            if (!string.IsNullOrWhiteSpace(node.VideoId))
            {
                panel.PlayVideo(node.VideoId);
            }
            //绑定属性
            panel.SetBinding(Grid.RowProperty, CreateBinding(node, BindingMode.TwoWay, nameof(node.Row)));
            panel.SetBinding(Grid.ColumnProperty, CreateBinding(node, BindingMode.TwoWay, nameof(node.Column)));
            panel.SetBinding(Grid.RowSpanProperty, CreateBinding(node, BindingMode.TwoWay, nameof(node.RowSpan)));
            panel.SetBinding(Grid.ColumnSpanProperty, CreateBinding(node, BindingMode.TwoWay, nameof(node.ColumnSpan)));
            panel.ViewModel.SplitScreenNode = node;
            SetDragDropParam(panel);
            //监听鼠标点击事件,以隐藏VideoControl的控制面板。
            panel.PreviewMouseDown += Panel_PreviewMouseDown;
            return(panel);
        }
Ejemplo n.º 2
0
 private void updateOpacity(VideoPanelItem vpi, double opacity)
 {
     if (vpi?.ViewModel?.ControlViewModel != null)
     {
         vpi.ViewModel.ControlViewModel.Opacity = opacity;
     }
 }
Ejemplo n.º 3
0
        private void BindElementProp(VideoPanelItem vpi)
        {
            //按钮绑定。
            MultiBinding multi = new MultiBinding();

            multi.Mode      = BindingMode.OneWay;
            multi.Converter = new MultiConverter();
            multi.Bindings.Add(CreateBinding(vpi, BindingMode.OneWay, "DataContext.ControlViewModel.IsVisible"));
            multi.Bindings.Add(CreateBinding(vpi, BindingMode.OneWay, "DataContext.ControlViewModel.IsFullScreen"));
            btnToNormal.SetBinding(VisibilityProperty, multi);

            Binding binding = CreateBinding(vpi, BindingMode.TwoWay, "DataContext.ControlViewModel.IsFullScreen");

            btnToNormal.SetBinding(ToggleButton.IsCheckedProperty, binding);

            IValueConverter converter = new InnerBoolToVisibility();

            //全屏窗绑定
            binding                    = CreateBinding(vpi, BindingMode.OneWay, "DataContext.ControlViewModel.IsFullScreen");
            binding.Converter          = converter;
            binding.ConverterParameter = "AND";
            gridFull.SetBinding(VisibilityProperty, binding);
            //弹出窗绑定
            binding                    = CreateBinding(vpi, BindingMode.OneWay, "DataContext.ControlViewModel.IsFullScreen");
            binding.Converter          = converter;
            binding.ConverterParameter = "XOR";
            canvasPopup.SetBinding(VisibilityProperty, binding);
            //源父窗体绑定
            _parent.SetBinding(VisibilityProperty, binding);
        }
Ejemplo n.º 4
0
        private bool TryCalcToSize(VideoPanelItem vpi, ref Size toSize)
        {
            if (vpi.ActualWidth == 0 || vpi.ActualHeight == 0)
            {
                return(false);
            }
            double toWidth  = Math.Min(AppConstants.VideoControlMinWidth, this.ActualWidth);
            double toHeight = Math.Min(AppConstants.VideoControlMinHeight, this.ActualHeight);
            double ratioW   = toWidth / vpi.ActualWidth;
            double ratioH   = toHeight / vpi.ActualHeight;
            double ratio    = Math.Max(ratioW, ratioH);

            if (ratio <= 1)
            {
                return(false);
            }
            toWidth  = vpi.ActualWidth * ratio;
            toHeight = vpi.ActualHeight * ratio;
            if (toWidth > this.ActualWidth - AppConstants.VideoControlMargin * 2)
            {
                toWidth = this.ActualWidth - AppConstants.VideoControlMargin * 2;
            }
            if (toHeight > this.ActualHeight - AppConstants.VideoControlMargin * 2)
            {
                toHeight = this.ActualHeight - AppConstants.VideoControlMargin * 2;
            }
            toSize = new Size(toWidth, toHeight);
            return(true);
        }
Ejemplo n.º 5
0
        public void Dragging(DragInfo info)
        {
            VideoPanelItem vpi = info.Source as VideoPanelItem;

            if (info.Effects == DragDropEffects.None)
            {
                if (!IsCursorInWindow(info) && vpi.ViewModel != null && vpi.ViewModel.IsInEditStatus)
                {
                    Mouse.SetCursor(Cursors.Hand);
                    info.Handled = true;
                }
            }
            else
            {
                Mouse.SetCursor(Cursors.SizeAll);
                info.Handled = true;
            }

            if (vpi != null)
            {
                if (info.Effects.HasFlag(DragDropEffects.Copy))
                {
                    updateOpacity(vpi, 1);
                }
                else
                {
                    updateOpacity(vpi, 0);
                }
            }
        }
Ejemplo n.º 6
0
        private int _delayTime = 300; //延时时间。

        public void DragOver(DropInfo info)
        {
            _mouseOn = true;
            if (info.KeyStates.HasFlag(DragDropKeyStates.ControlKey))
            {
                info.Effects = DragDropEffects.Copy;
            }
            else
            {
                info.Effects = DragDropEffects.Move;
            }
            if (!_accepted)
            {
                VideoPanelItem vpi    = info.Target as VideoPanelItem;
                VideoPanelItem srcVpi = info.Source as VideoPanelItem;

                //延时拖动接收。
                if (Environment.TickCount - _startTick < _delayTime)
                {
                    return;
                }

                string videoId = info.Data as string;
                if (videoId == null && info.DataType.ToUpper().EndsWith(".STRING"))
                {
                    videoId = info.GetDataFromJson <string>();
                }
                if (videoId == null)
                {
                    info.Effects = DragDropEffects.None;
                    return;
                }
                if (vpi != null && videoId != null && !vpi.Equals(srcVpi))
                {
                    _videoMode  = vpi.ViewModel.ControlViewModel;
                    DropAdorner = CreateAdorner(vpi);
                    DropAdorner.VisualCover.Visibility = Visibility.Hidden;
                    //
                    Point  toPnt  = new Point(0, 0);
                    double scaleX = 1;
                    double scaleY = 1;
                    if (srcVpi != null && IsBrothers(srcVpi, vpi))
                    {
                        //隐藏源的视频。
                        if (vpi.VideoControl != null && vpi.ViewModel.ControlViewModel.IsVisible)
                        {
                            _videoMode.Opacity = 0;
                            DropAdorner.VisualCover.Visibility = Visibility.Visible;
                            toPnt  = vpi.PointFromScreen(srcVpi.PointToScreen(new Point(0, 0)));
                            scaleX = srcVpi.ActualWidth / vpi.ActualWidth;
                            scaleY = srcVpi.ActualHeight / vpi.ActualHeight;
                        }
                    }
                    //启动动画。
                    Storyboard sb = CreateStoryboard(toPnt, scaleX, scaleY, 1);
                    sb.Begin(DropAdorner, true);
                    _accepted = true;
                }
            }
        }
Ejemplo n.º 7
0
 public void StopAll()
 {
     for (int i = 0; i < gridMain.Children.Count; i++)
     {
         VideoPanelItem item = gridMain.Children[i] as VideoPanelItem;
         item?.PlayVideo(null);
     }
 }
Ejemplo n.º 8
0
 private void setPanelEditStatus(bool editting)
 {
     for (int i = 0; i < gridMain.Children.Count; i++)
     {
         VideoPanelItem item = gridMain.Children[i] as VideoPanelItem;
         item.ViewModel.IsInEditStatus = editting;
     }
 }
Ejemplo n.º 9
0
 private void RemoveVideoFromInitParent(VideoPanelItem vpi)
 {
     _parent    = vpi.Parent as Panel;
     _lastIndex = _parent.Children.IndexOf(vpi);
     _parent.Children.Remove(vpi);
     _vpi = vpi;
     _vpi.SetValue(DragDropTool.AllowDragProperty, false);
     _parent.Visibility = Visibility.Collapsed;
 }
Ejemplo n.º 10
0
 public void ClearVideoPanel()
 {
     if (_vpi != null)
     {
         UnbindElementProp();
         AddVideoToInitParent();
         _vpi = null;
         HideCurrent();
     }
 }
Ejemplo n.º 11
0
        public void UpdateSelectedVideos()
        {
            List <string> videoIds = ViewModel?.SplitScreenData?.Nodes?.Where(e => !string.IsNullOrWhiteSpace(e.VideoId)).Select(v => v.VideoId).ToList();

            for (int i = 0; i < gridMain.Children.Count; i++)
            {
                VideoPanelItem item = gridMain.Children[i] as VideoPanelItem;
                item.ViewModel.UpdateDisplayVideos(videoIds);
            }
        }
Ejemplo n.º 12
0
        private void SearchPanel_Visible(object sender, RoutedEventArgs e)
        {
            VideoPanelItem vpi = e.Source as VideoPanelItem;

            if (vpi != null)
            {
                if (vpi.ViewModel.SearchedResultModel.IsVisible)
                {
                    topCover.InsertVideoPanel(vpi, false);
                }
            }
        }
Ejemplo n.º 13
0
        public void InsertVideoPanel(VideoPanelItem vpi, bool isFullScreen)
        {
            bool inserted = isFullScreen ? InsertFullScreen(vpi) : InsertPopup(vpi);

            if (inserted)
            {
                _onScaling = false;
                DisplayCurrent();
                _isInitFullScreen = isFullScreen;
                BindElementProp(vpi);
            }
        }
Ejemplo n.º 14
0
        private void VideoControl_FullScreen(object sender, RoutedEventArgs e)
        {
            VideoPanelItem vpi = e.Source as VideoPanelItem;

            if (vpi != null)
            {
                VideoControl vc = e.OriginalSource as VideoControl;
                if (vc.ViewModel.IsFullScreen)
                {
                    topCover.InsertVideoPanel(vpi, true);
                }
            }
        }
Ejemplo n.º 15
0
        public void DragStart(DragInfo info)
        {
            VideoPanelItem vpi = info.Source as VideoPanelItem;

            if (vpi.VideoControl != null)
            {
                Binding binding = new Binding();
                binding.Mode   = BindingMode.OneWay;
                binding.Source = vpi.VideoControl.videoDisp;
                vpi.SetBinding(DragDropVisual.VisualProperty, binding);
                _topWin = FindTopWindow(vpi);
                updateOpacity(vpi, 0);
            }
        }
Ejemplo n.º 16
0
        private async Task <VideoPanelItem[]> CreateVideoPanels(SplitScreenInfo data)
        {
            DateTime timeStart = DateTime.Now;

            VideoPanelItem[] vpis = new VideoPanelItem[data.Nodes.Length];
            for (int i = 0; i < data.Nodes.Length; i++)
            {
                var            node  = data.Nodes[i];
                VideoPanelItem panel = findAVideoPanel(node);
                vpis[i] = panel;
                await Task.Delay(10);
            }
            Console.WriteLine("Load Count:{0} UsedTime:{1}", gridMain.Children.Count, DateTime.Now - timeStart);
            return(vpis);
        }
Ejemplo n.º 17
0
        private void VideoControl_PanelVisible(object sender, RoutedEventArgs e)
        {
            VideoPanelItem vpi = e.Source as VideoPanelItem;

            if (vpi != null)
            {
                VideoControl vc = e.OriginalSource as VideoControl;
                if (vc.ViewModel.IsControlPanelVisible && !vc.ViewModel.IsFullScreen)
                {
                    topCover.InsertVideoPanel(vpi, false);
                }
                //else if (string.IsNullOrWhiteSpace(vc.ViewModel.VideoId) && !vc.ViewModel.IsFullScreen)
                //    topCover.ClearVideoPanel();
            }
        }
Ejemplo n.º 18
0
        VideoPanelItem getFirstBlankItem()
        {
            List <ItemSequence> list = new List <ItemSequence>();

            for (int i = 0; i < gridMain.Children.Count; i++)
            {
                VideoPanelItem item  = gridMain.Children[i] as VideoPanelItem;
                int            split = ViewModel.SplitScreenData.Split;
                if (item != null && !item.IsPlaying)
                {
                    int row = (int)item.GetValue(Grid.RowProperty);
                    int col = (int)item.GetValue(Grid.ColumnProperty);
                    list.Add(new ItemSequence(item, row * split + col));
                }
            }
            list = list.OrderBy(e => e.SerialNumber).ToList();
            return(list.FirstOrDefault()?.PanelItem);
        }
Ejemplo n.º 19
0
        public void Drop(DropInfo info)
        {
            _mouseOn  = false;
            _accepted = false;
            ResetAdorner();
            if (_videoMode != null)
            {
                _videoMode.Opacity = 1;
                _videoMode         = null;
            }
            string videoId = info.Data as string;

            if (videoId == null)
            {
                videoId = info.GetDataFromJson <string>();
            }
            if (videoId != null)
            {
                VideoPanelItem vpi = info.Target as VideoPanelItem;
                if (vpi != null)
                {
                    VideoPanelItem srcVpi = info.Source as VideoPanelItem;
                    if (srcVpi != null && !srcVpi.Equals(vpi) &&
                        !info.KeyStates.HasFlag(DragDropKeyStates.ControlKey))
                    {
                        //没有交换则直接设置ID。
                        if (!Exchange(srcVpi, vpi))
                        {
                            vpi.PlayVideo(videoId);
                            info.Effects = DragDropEffects.Copy;
                        }
                        else
                        {
                            info.Effects = DragDropEffects.Move;
                        }
                    }
                    else
                    {
                        vpi.PlayVideo(videoId);
                        info.Effects = DragDropEffects.Move;
                    }
                }
            }
        }
Ejemplo n.º 20
0
 private bool ShowVideoWin(DragInfo info, VideoPanelItem vpi)
 {
     if (_topWin != null)
     {
         string        videoID = (string)info.Data;
         PopupWinModel model   = new PopupWinModel(videoID);
         PopupWin      popup   = new PopupWin();
         popup.IsTopmost   = true;
         popup.DataContext = model;
         Point startPos = info.GetPosition(vpi);
         startPos = vpi.PointToScreen(startPos);
         startPos = new Point(startPos.X - vpi.ActualWidth / 2, startPos.Y - vpi.ActualHeight / 2);
         if (startPos.X < 0)
         {
             startPos.X = 0;
         }
         if (startPos.Y < 0)
         {
             startPos.Y = 0;
         }
         popup.Left = startPos.X;
         popup.Top  = startPos.Y;
         if (vpi.ActualWidth < AppConstants.VideoControlMinWidth)
         {
             popup.Width = AppConstants.VideoControlMinWidth;
             if (vpi.ActualHeight == 0)
             {
                 popup.Height = AppConstants.VideoControlMinWidth * 0.75;
             }
             else
             {
                 popup.Height = vpi.ActualHeight * (AppConstants.VideoControlMinWidth / vpi.ActualWidth);
             }
         }
         else
         {
             popup.Width  = vpi.ActualWidth;
             popup.Height = vpi.ActualHeight;
         }
         popup.Show();
         return(true);
     }
     return(false);
 }
Ejemplo n.º 21
0
        //设置视频窗口的可拖拽属性。
        private void SetDragDropParam(VideoPanelItem vpi)
        {
            vpi.SetValue(DragDropTool.AllowDropProperty, true);
            vpi.SetValue(DragDropTool.DropHandlerProperty, new VideoPanelDropHandler());
            vpi.SetValue(DragDropTool.DragHandlerProperty, new VideoPanelDragHandler());
            //允许拖动
            Binding binding = CreateBinding(vpi.DataContext, BindingMode.OneWay, "ControlViewModel.IsVisible");

            vpi.SetBinding(DragDropTool.AllowDragProperty, binding);

            //设置拖动数据
            binding = CreateBinding(vpi.DataContext, BindingMode.OneWay, "ControlViewModel.VideoId");
            vpi.SetBinding(DragDropData.DataProperty, binding);

            //设置可视化
            vpi.SetValue(DragDropVisual.ShadowVisibleProperty, true);
            vpi.SetValue(DragDropVisual.ShadowColorProperty, Color.FromRgb(0, 255, 0));
            vpi.SetValue(DragDropVisual.BorderThicknessProperty, new Thickness(2));
        }
Ejemplo n.º 22
0
        private void Panel_PreviewMouseDown(object sender, MouseButtonEventArgs e)
        {
            if (ViewModel.OnSwitching && !ViewModel.SwitchPaused)
            {
                ViewModel.SwitchPaused = true;
                e.Handled = true;
                return;
            }
            VideoPanelItem item = sender as VideoPanelItem;

            foreach (VideoPanelItem vpi in gridMain.Children)
            {
                if (!item.Equals(vpi))
                {
                    vpi.ViewModel.ControlViewModel.IsControlPanelVisible = false;
                    vpi.ViewModel.SearchedResultModel.IsVisible          = false;
                    vpi.ViewModel.PlusSignModel.IsVisible = true;
                }
            }
        }
Ejemplo n.º 23
0
        public void DragEnd(DragInfo info)
        {
            VideoPanelItem vpi = info.Source as VideoPanelItem;

            if (info.Effects == DragDropEffects.None)
            {
                //当鼠标移出窗体且没有接收源时,打开一个新视频窗口,同时关闭源视频。
                if (!IsCursorInWindow(info) && vpi.ViewModel != null && vpi.ViewModel.IsInEditStatus)
                {
                    if (ShowVideoWin(info, vpi))
                    {
                        if (vpi.ViewModel != null && vpi.ViewModel.ControlViewModel != null)
                        {
                            vpi.ViewModel.ControlViewModel.VideoId = null;
                        }
                    }
                }
            }
            _topWin = null;
            updateOpacity(vpi, 1);
        }
Ejemplo n.º 24
0
        private bool InsertPopup(VideoPanelItem vpi)
        {
            Size toSize = default(Size);

            if (!TryCalcToSize(vpi, ref toSize))
            {
                return(false);
            }

            Point fromPos = vpi.TranslatePoint(new Point(), this);
            Point toPos   = CalcToLocation(toSize);

            RemoveVideoFromInitParent(vpi);
            RecordVideoPreLocation(vpi, fromPos);
            gridMain.Children.Add(vpi);
            //动画
            Storyboard sb = CreateStoryboard(vpi.ActualWidth, toSize.Width, vpi.ActualHeight, toSize.Height, fromPos, toPos);

            sb.Begin(gridMain);

            return(true);
        }
Ejemplo n.º 25
0
        VideoPanelDropAdorner CreateAdorner(VideoPanelItem vpi)
        {
            VideoPanelDropAdorner adorner = new VideoPanelDropAdorner(vpi, vpi.VideoControl?.videoDisp);

            return(adorner);
        }
Ejemplo n.º 26
0
 private void RecordVideoPreLocation(VideoPanelItem vpi, Point fromPos)
 {
     //记录初始值。
     _initSize = new Size(vpi.ActualWidth, vpi.ActualHeight);
     _initPos  = fromPos;
 }
Ejemplo n.º 27
0
 private bool InsertFullScreen(VideoPanelItem vpi)
 {
     RemoveVideoFromInitParent(vpi);
     gridFull.Children.Add(vpi);
     return(true);
 }
Ejemplo n.º 28
0
 public ItemSequence(VideoPanelItem item, int number)
 {
     PanelItem    = item;
     SerialNumber = number;
 }
Ejemplo n.º 29
0
 private void destoryVideoPanel(VideoPanelItem vpi)
 {
     vpi.PreviewMouseDown         -= Panel_PreviewMouseDown;
     vpi.ViewModel.SplitScreenNode = null;
     vpi.PlayVideo(null);
 }