WJC
2020-03-23 bba578c2f0acf2eca747edcb69426771e0cadd32
ZigbeeApp/Shared/Phone/Device/CommonForm/SceneCategoryView.cs
@@ -6,8 +6,10 @@
namespace Shared.Phone.Device.CommonForm
{
    public class SceneCategoryView : FrameLayout
    public class SceneCategoryView : RowLayout
    {
        #region ■ 变量声明___________________________
        /// <summary>
        /// scene
        /// </summary>
@@ -15,174 +17,121 @@
        /// <summary>
        /// room
        /// </summary>
        public Shared.Common.Room room;
        private Common.Room room;
        /// <summary>
        /// delayTimeBtn
        /// 延时时间
        /// </summary>
        private Button delayTimeBtn;
        private NormalViewControl btnDelayTime;
        /// <summary>
        /// delayImgBtn
        /// 延时图标
        /// </summary>
        private Button delayImgBtn;
        private IconViewControl btnDelayIcon;
        /// <summary>
        /// sceneImg
        /// 场景图片控件
        /// </summary>
        private ImageView sceneImg;
        private ScenePictrueControl sceneContr = null;
        /// <summary>
        /// 是否已经完成控件初始化结束
        /// </summary>
        private bool isInitControlFinish = false;
        #endregion
        #region ■ 初始化_____________________________
        /// <summary>
        /// SceneCategoryView
        /// </summary>
        /// <param name="x"></param>
        /// <param name="y"></param>
        public SceneCategoryView(int x, int y)
        public SceneCategoryView()
        {
            X = Application.GetRealWidth(x);
            Y = Application.GetRealHeight(y);
            Width = Application.GetRealWidth(1080);
            Height = Application.GetRealHeight(397 + 46);
            BackgroundColor = ZigbeeColor.Current.GXCGrayBackgroundColor;
            this.Width = Application.GetRealWidth(1080);
            this.Height = Application.GetRealHeight(397 + 46);
            this.BackgroundColor = ZigbeeColor.Current.GXCGrayBackgroundColor;
            this.IsUseSameSubViewWidth = false;
        }
        /// <summary>
        /// init
        /// 初始化
        /// </summary>
        public void Init(SceneUI sceneUI,Common.Room curRoom)
        /// <param name="i_scene"></param>
        public void InitControl(SceneUI i_scene, Common.Room i_room)
        {
            this.scene = sceneUI;
            this.room = curRoom;
            this.RemoveAll();
            InitFrame();
        }
            this.LineColor = UserCenterColor.Current.Transparent;
        /// <summary>
        /// InitFrame
        /// </summary>
        private void InitFrame()
            this.scene = i_scene;
            this.room = i_room;
            //自定义的场景图片控件
            this.sceneContr = new ScenePictrueControl();
            this.AddChidren(sceneContr);
            sceneContr.InitControl(this.scene);
            //场景点击
            sceneContr.ButtonClickEvent += (sender, e) =>
        {
            RemoveAll();
            var sceneRowLayout = new RowLayout
            {
                Height = Application.GetRealHeight(440),
                LineColor = ZigbeeColor.Current.GXCGrayBackgroundColor,
                Tag = scene
                this.SceneUpHandler();
            };
            AddChidren(sceneRowLayout);
            sceneImg = new ImageView()
            {
                X = Application.GetRealWidth(179),
                Width = Application.GetRealWidth(844),
                Height = Application.GetRealHeight(397),
                ImagePath = scene.IconPathType == 0 ? scene.IconPath : System.IO.Path.Combine(Config.Instance.FullPath, scene.IconPath),
                Radius = (uint)Application.GetRealHeight(17)
            };
            sceneRowLayout.AddChidren(sceneImg);
            //阴影
            var btnShadow = new PicViewControl(sceneImg.Width + Application.GetRealWidth(14 * 2), sceneImg.Height + Application.GetRealHeight(43), false);
            btnShadow.X = sceneImg.X - Application.GetRealWidth(14);
            btnShadow.UnSelectedImagePath = "Scene/SceneShadow.png";
            sceneRowLayout.AddChidren(btnShadow);
            btnShadow.ButtonClickEvent += this.SceneUpHandler;
            var leftFL = new FrameLayout
            {
                X = Application.GetRealWidth(CommonFormResouce.X_Left),
                Y = Application.GetRealHeight(58),
                Width = Application.GetRealWidth(251),
                Height = Application.GetRealHeight(282),
                BackgroundColor = 0xd6333333,
                Radius = (uint)Application.GetRealHeight(17)
            };
            sceneRowLayout.AddChidren(leftFL);
            var collectionBtn = new Button
            {
                X = Application.GetRealWidth(23),
                Y = Application.GetRealHeight(23),
                Width = Application.GetMinRealAverage(65),
                Height = Application.GetMinRealAverage(65),
                UnSelectedImagePath = "Item/Collection.png",
                SelectedImagePath = "Item/CollectionSelected.png",
                IsSelected = HdlRoomLogic.Current.IsCollectInRoom(scene),
                Tag = scene
            };
            leftFL.AddChidren(collectionBtn);
            var sceneNameBtn = new Button()
            {
                Width = Application.GetRealWidth(176),
                Height = Application.GetRealHeight(150),
                TextColor = ZigbeeColor.Current.GXCTextWhiteColor,
                Text = scene.Name,
                Gravity = Gravity.Center,
                IsMoreLines = true
            };
            leftFL.AddChidren(sceneNameBtn);
            var collection = new Button
            {
                Tag = scene
            };
            leftFL.AddChidren(collection);
            collection.MouseUpEventHandler += (sender, e) =>
            //收藏
            sceneContr.AddCollectionControl();
            sceneContr.CollectEvent += (collect) =>
            {
                if (room.IsLove)
                {
                    HdlSceneLogic.Current.DeleteScene(HdlRoomLogic.Current.GetLoveRoom(), scene);
                    RemoveViewByTag(collectionBtn.Tag);
                }
                else
                {
                    collectionBtn.IsSelected = !collectionBtn.IsSelected;
                    if (collectionBtn.IsSelected)
                    {
                        HdlSceneLogic.Current.AddScene(HdlRoomLogic.Current.GetLoveRoom(), scene);
                    }
                    else
                    {
                        HdlSceneLogic.Current.DeleteScene(HdlRoomLogic.Current.GetLoveRoom(), scene);
                    }
                    this.RemoveFromParent();
                }
            };
            delayTimeBtn = new Button
            {
                X = Application.GetRealWidth(780),
                Y = Application.GetRealHeight(317),
                Width = Application.GetRealWidth(200),
                Height = Application.GetRealHeight(58),
                Text = CommonFormResouce.GetTimeString(scene.SceneDelayTime),
                TextAlignment = TextAlignment.CenterRight,
                TextColor = ZigbeeColor.Current.GXCTextSelectedColor3
            };
            sceneRowLayout.AddChidren(delayTimeBtn);
            //延时时间
            this.btnDelayTime = new NormalViewControl(200, 58, true);
            btnDelayTime.X = Application.GetRealWidth(780);
            btnDelayTime.Y = Application.GetRealHeight(317);
            btnDelayTime.Text = CommonFormResouce.GetTimeString(scene.SceneDelayTime);
            btnDelayTime.TextAlignment = TextAlignment.CenterRight;
            btnDelayTime.TextColor = ZigbeeColor.Current.GXCTextSelectedColor3;
            btnDelayTime.IsBold = true;
            this.AddChidren(btnDelayTime);
            delayImgBtn = new Button
            {
                X = Application.GetRealWidth(900),
                Y = Application.GetRealHeight(30),
                Width = Application.GetMinRealAverage(52),
                Height = Application.GetMinRealAverage(52),
                UnSelectedImagePath = "Scene/Delaying.png",
                Visible=false
            };
            sceneRowLayout.AddChidren(delayImgBtn);
            //延时图标
            this.btnDelayIcon = new IconViewControl(52);
            btnDelayIcon.X = Application.GetRealWidth(900);
            btnDelayIcon.Y = Application.GetRealHeight(30);
            btnDelayIcon.Width = Application.GetMinRealAverage(52);
            btnDelayIcon.Height = Application.GetMinRealAverage(52);
            btnDelayIcon.UnSelectedImagePath = "Scene/Delaying.png";
            this.AddChidren(btnDelayIcon);
            btnDelayIcon.Visible = false;
            sceneRowLayout.SubViewWidth = Application.GetRealWidth(199);
            if (isInitControlFinish == true)
            {
                //编辑场景的回调函数会重新刷新控件
                //所以这里不再初始化
                return;
            }
            this.isInitControlFinish = true;
            //添加左边的空白区域
            var btnTemp1 = new NormalViewControl(Application.GetRealWidth(58), sceneContr.btnScenePic.Height, false);
            this.AddLeftView(btnTemp1);
            //定时
            var btnDelay = new NormalViewControl(Application.GetRealWidth(199), sceneRowLayout.Height, false);
            var btnDelay = new NormalViewControl(Application.GetRealWidth(199), sceneContr.btnScenePic.Height, false);
            btnDelay.BackgroundColor = ZigbeeColor.Current.GXCTextSelectedColor;
            btnDelay.TextID = R.MyInternationalizationString.Delay;
            btnDelay.TextColor = ZigbeeColor.Current.GXCTextWhiteColor;
            btnDelay.TextAlignment = TextAlignment.Center;
            btnDelay.Tag = scene.SceneDelayTime;
            btnDelay.Radius = (uint)Application.GetRealHeight(17);
            sceneRowLayout.AddLeftView(btnDelay);
            btnDelay.SetCornerWithSameRadius(Application.GetRealHeight(17), HDLUtils.RectCornerTopLeft | HDLUtils.RectCornerTopRight |
                HDLUtils.RectCornerBottomLeft | HDLUtils.RectCornerBottomRight);
            this.AddLeftView(btnDelay);
            //变更按钮的高度
            btnDelay.Height = sceneImg.Height;
            btnDelay.Height = sceneContr.btnScenePic.Height;
            btnDelay.Y = 0;
             //编辑
             var btnEditor = new NormalViewControl(Application.GetRealWidth(199), sceneImg.Height, false);
            var btnEditor = new NormalViewControl(Application.GetRealWidth(199), sceneContr.btnScenePic.Height, false);
            btnEditor.BackgroundColor = ZigbeeColor.Current.GXCEditBackGroundColor;
            btnEditor.TextID = R.MyInternationalizationString.Edit;
            btnEditor.TextColor = ZigbeeColor.Current.GXCTextWhiteColor;
@@ -191,7 +140,7 @@
            btnEditor.SetCornerWithSameRadius(Application.GetRealHeight(17), HDLUtils.RectCornerBottomLeft | HDLUtils.RectCornerTopLeft);
            //删除
            var btnDelete = new NormalViewControl(Application.GetRealWidth(199), sceneImg.Height, false);
            var btnDelete = new NormalViewControl(Application.GetRealWidth(199), sceneContr.btnScenePic.Height, false);
            btnDelete.Tag = scene;
            btnDelete.BackgroundColor = ZigbeeColor.Current.GXCRedColor;
            btnDelete.TextID = R.MyInternationalizationString.Delete;
@@ -202,11 +151,16 @@
            if (room.IsSharedRoom == false && room.IsLove == false)
            {
                //不是分享,并且不是收藏
                sceneRowLayout.AddRightView(btnEditor);
                sceneRowLayout.AddRightView(btnDelete);
                this.AddRightView(btnEditor);
                this.AddRightView(btnDelete);
                //变更按钮的高度
                btnEditor.Height = sceneImg.Height;
                btnDelete.Height = sceneImg.Height;
                btnEditor.Height = sceneContr.btnScenePic.Height;
                btnEditor.Y = 0;
                btnDelete.Height = sceneContr.btnScenePic.Height;
                btnDelete.Y = 0;
                //添加右边空白区域
                var btnTemp2 = new NormalViewControl(Application.GetRealWidth(58), sceneContr.btnScenePic.Height, false);
                this.AddRightView(btnTemp2);
            }
            //删除场景
@@ -253,6 +207,8 @@
            {
                try
                {
                    //关闭左滑菜单
                    this.HideMenu();
                    var targetList = new List<SceneTargetDeviceUI> { };
                    CommonPage.Loading.Start();
                    //从网关中反序列化出对应的房间设备
@@ -339,6 +295,30 @@
                        }
                        else
                        {
                            this.InitControl(s, r);
                        }
                    }
                    else
                    {
                        CommonFormResouce.ShowTip(Language.StringByID(R.MyInternationalizationString.FailedPleaseTryAgain));
                    }
                    var sceneView = new CategoryAddScene();
                    Phone.UserView.HomePage.Instance.AddChidren(sceneView);
                    Phone.UserView.HomePage.Instance.PageIndex += 1;
                    sceneView.isModify = true;
                    sceneView.modifyRoom = room;
                    sceneView.modifySceneUI = scene;
                    sceneView.modifySceneTargetDevicesList = targetList;
                    sceneView.Show();
                    sceneView.EditorAction = (s, r) =>
                    {
                        if (r.Id != room.Id)
                        {
                            RemoveFromParent();
                        }
                        else
                        {
                            Init(s, r);
                        }
                    };
@@ -366,63 +346,64 @@
                timeSelect.Init();
                timeSelect.TimeAction = (t) =>
                {
                    //隐藏右划菜单
                    this.HideMenu();
                    scene.SceneDelayTime = t;
                    delayTimeBtn.Text = CommonFormResouce.GetTimeString(t);
                    btnDelayTime.Text = CommonFormResouce.GetTimeString(t);
                };
            };
        }
        #endregion
        /// <summary>
        /// SceneUpHandler
        ///
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="args"></param>
        private async void SceneUpHandler(object sender, MouseEventArgs args)
        /// <param name="btnScenePic"></param>
        /// <param name="btnSceneName"></param>
        private async void SceneUpHandler()
        {
            if (scene.RemainTime > 0 && scene.SceneDelayTime == 0)
            if (scene.SceneDelayTime <= 0 && scene.RemainTime <= 0)
            {
                CommonFormResouce.ShowTip(Language.StringByID(R.MyInternationalizationString.TheSceneIsDelaying));
                return;
                //如果没有延迟的话,直接开启Loading特效
                this.StartLoadingApreal();
            }
            //1成功 0失败
            //后面补上相关提示
            // Error参数含义
            //<para>1:网关无法解析命令数据。</para>
            //<para>2:协调器正在升级或备份/恢复数据
            //<para>3:操作设备/组/场景不存在</para>
            //<para>4:其他错误</para>
            //<para>5:数据传输错误(在某次客户端向网关发送数据的过程中,网关在合理时间范围内接收客户端数据不完整导致该错误发生。如客户端向网关一次发送100个字节的数据,但网关等待接收了一秒只接收了80个字节。发生该错误,网关将主动关闭客户端连接)</para>
            var sceneOpenAllData = await ZigBee.Device.Scene.ControlSceneAsync(scene.Id, scene.SceneDelayTime);
            if (sceneOpenAllData == null || sceneOpenAllData.sceneOpenData == null)
            //调用场景
            var result = await HdlSceneLogic.Current.ControlScene(scene);
            if (result == false)
            {
                return;
            }
            if (sceneOpenAllData.sceneOpenData.Result == 0)
            {
                if (sceneOpenAllData.errorResponData == null)
                {
                    return;
                }
                CommonFormResouce.ShowTip(Language.StringByID(R.MyInternationalizationString.ControlSceneFail));
            }
            scene.RemainTime = scene.SceneDelayTime;
            scene.SceneDelayTime = 0;
            if (scene.RemainTime <= 0)
            {
                return;
            }
            int myRemainTime = scene.RemainTime;
            //开启内部延时时间线程(旨在全部地方的同一场景时间同步)
            HdlSceneLogic.Current.StartDelayTimeThread(scene);
            new System.Threading.Thread(() =>
            {
                while (scene.RemainTime > 0)
                while (myRemainTime > 0 && this.Parent != null)
                {
                    System.Threading.Thread.Sleep(1000);
                    Application.RunOnMainThread(() =>
                    {
                        SetTimeText(CommonFormResouce.GetTimeString(scene.RemainTime));
                    });
                    scene.RemainTime -= 1;
                    myRemainTime--;
                }
                Application.RunOnMainThread(() =>
                {
                    if (this.Parent != null)
                    {
                    SetTimeImage();
                        //直接开启Loading特效
                        this.StartLoadingApreal();
                    }
                });
            })
            { IsBackground = true }.Start();
@@ -434,8 +415,8 @@
        /// <param name="name"></param>
        public void SetTimeText(string name)
        {
            delayImgBtn.Visible = true;
            delayTimeBtn.Text = name;
            btnDelayIcon.Visible = true;
            btnDelayTime.Text = name;
        }
        /// <summary>
@@ -443,8 +424,65 @@
        /// </summary>
        public void SetTimeImage()
        {
            delayImgBtn.Visible = false;
            delayTimeBtn.Text = string.Empty;
            btnDelayIcon.Visible = false;
            btnDelayTime.Text = string.Empty;
        }
        /// <summary>
        /// 开启Loading特效
        /// </summary>
        public void StartLoadingApreal()
        {
            //弄个遮罩遮住
            var frameBack1 = new FrameLayout();
            frameBack1.Y = sceneContr.btnScenePic.Y;
            frameBack1.X = sceneContr.btnScenePic.X;
            frameBack1.Width = sceneContr.btnScenePic.Width;
            frameBack1.Height = sceneContr.btnScenePic.Height;
            frameBack1.Radius = (uint)Application.GetRealHeight(17);
            frameBack1.BackgroundColor = 0xb3000000;
            this.AddChidren(frameBack1);
            var frameBack2 = new FrameLayout();
            frameBack2.Y = sceneContr.btnSceneName.Y;
            frameBack2.X = sceneContr.btnSceneName.X;
            frameBack2.Width = sceneContr.btnSceneName.Width;
            frameBack2.Height = sceneContr.btnSceneName.Height;
            frameBack2.Radius = (uint)Application.GetRealHeight(17);
            frameBack2.BackgroundColor = 0xb3000000;
            this.AddChidren(frameBack2);
            //再加个转圈的
            var loadContr = new MyProgressLoading();
            loadContr.LoadingBackgroundColor = UserCenterColor.Current.Transparent;
            frameBack1.AddChidren(loadContr);
            loadContr.StartLoading(1000);
            loadContr.DisponeEvent += () =>
            {
                frameBack1.RemoveFromParent();
                frameBack2.RemoveFromParent();
            };
        }
        /// <summary>
        /// 自定义控件(需要的它移除事件)
        /// </summary>
        private class MyProgressLoading : ProgressLoading
        {
            /// <summary>
            /// 控件销毁的事件
            /// </summary>
            public Action DisponeEvent = null;
            /// <summary>
            /// 控件销毁
            /// </summary>
            public override void RemoveFromParent()
            {
                base.RemoveFromParent();
                this.DisponeEvent?.Invoke();
                this.DisponeEvent = null;
            }
        }
    }
}