xm
2020-05-07 c1de48884fa145a16a0f8bcee93274dcfaa0ff82
ZigbeeApp/Shared/Phone/UserCenter/SharedContent/AddNewSharedListRoomForm.cs
New file
@@ -0,0 +1,491 @@
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;
using ZigBee.Device;
namespace Shared.Phone.UserCenter.SharedContent
{
    /// <summary>
    /// 配置新共享内容的主界面
    /// </summary>
    public class AddNewSharedListRoomForm : EditorCommonForm
    {
        #region ■ 变量声明___________________________
        /// <summary>
        /// 列表控件
        /// </summary>
        private VerticalListControl listView = null;
        /// <summary>
        /// 分享按钮
        /// </summary>
        private BottomClickButton btnShard = null;
        /// <summary>
        /// 成员信息
        /// </summary>
        private MemberInfoRes memberResult = null;
        /// <summary>
        /// 成员的分享数据
        /// </summary>
        private MemberShardInfoData memberShardInfo = null;
        /// <summary>
        /// 选择的房间
        /// </summary>
        private Dictionary<string, Common.Room> dicSelectRoom = new Dictionary<string, Common.Room>();
        /// <summary>
        /// 当前选择的楼层ID
        /// </summary>
        private string nowSelectFloorId = string.Empty;
        #endregion
        #region ■ 初始化_____________________________
        /// <summary>
        /// 画面显示(底层会固定调用此方法,借以完成画面创建)
        /// </summary>
        /// <param name="i_memberResult">成员信息</param>
        /// <param name="i_memberShardInfo">成员的共享信息</param>
        public void ShowForm(MemberInfoRes i_memberResult, MemberShardInfoData i_memberShardInfo)
        {
            this.memberResult = i_memberResult;
            this.memberShardInfo = i_memberShardInfo;
            //设置头部信息
            base.SetTitleText(Language.StringByID(R.MyInternationalizationString.uAddShared));
            //初始化右上角的控件
            this.InitTopRightMenuControl();
            //初始化中部信息
            this.InitMiddleFrame();
        }
        /// <summary>
        /// 初始化中部信息
        /// </summary>
        private void InitMiddleFrame()
        {
            //清空bodyFrame
            this.ClearBodyFrame();
            var frameBack = new FrameLayout();
            frameBack.Height = Application.GetRealHeight(141);
            frameBack.BackgroundColor = UserCenterColor.Current.White;
            bodyFrameLayout.AddChidren(frameBack);
            //房间列表
            var btnTitle = new NormalViewControl(800, 60, true);
            btnTitle.X = ControlCommonResourse.XXLeft;
            btnTitle.Y = Application.GetRealHeight(52);
            btnTitle.TextID = R.MyInternationalizationString.RoomList;
            btnTitle.TextColor = UserCenterColor.Current.TextColor2;
            btnTitle.TextSize = 15;
            frameBack.AddChidren(btnTitle);
            this.listView = new VerticalListControl(29);
            listView.Y = frameBack.Bottom;
            listView.Height = bodyFrameLayout.Height - frameBack.Bottom;
            listView.BackgroundColor = UserCenterColor.Current.White;
            bodyFrameLayout.AddChidren(listView);
            this.btnShard = new BottomClickButton();
            btnShard.TextID = R.MyInternationalizationString.uShared2;
            bodyFrameLayout.AddChidren(btnShard);
            btnShard.Visible = false;
            btnShard.ButtonClickEvent += (sender, e) =>
            {
                var listRoom = new List<Common.Room>();
                foreach (var room in this.dicSelectRoom.Values)
                {
                    listRoom.Add(room);
                }
                //执行分享指定区域
                this.DoSharedContentByRoom(listRoom);
            };
            HdlThreadLogic.Current.RunThread(() =>
            {
                //初始化区域列表
                this.InitAreaListRow(this.nowSelectFloorId);
            });
        }
        /// <summary>
        /// 初始化右上角的控件
        /// </summary>
        private void InitTopRightMenuControl()
        {
            //获取楼层
            var dicFloor = HdlRoomLogic.Current.GetFloorSortList();
            if (dicFloor.Count == 0)
            {
                return;
            }
            var btnIconContr = new MostRightIconControl(69, 69);
            btnIconContr.UnSelectedImagePath = "Item/Drop_Down.png";
            topFrameLayout.AddChidren(btnIconContr);
            btnIconContr.InitControl();
            var btnFloor = new NormalViewControl(300, 69, true);
            btnFloor.Gravity = Gravity.CenterVertical;
            btnFloor.X = btnIconContr.X + btnIconContr.btnIcon.X - Application.GetRealWidth(300);
            btnFloor.TextAlignment = TextAlignment.CenterRight;
            topFrameLayout.AddChidren(btnFloor);
            foreach (var floorId in dicFloor.Keys)
            {
                //第一个楼层
                this.nowSelectFloorId = floorId;
                btnFloor.Text = dicFloor[floorId];
                break;
            }
            btnIconContr.ButtonClickEvent += (sender, e) =>
            {
                //楼层菜单
                var contr = new TopRightFloorMenuControl(dicFloor.Count, 2, Language.StringByID(R.MyInternationalizationString.SelectFloor));
                foreach (var floorId in dicFloor.Keys)
                {
                    contr.AddRowMenu(floorId, () =>
                    {
                        //记录起选择的ID
                        this.nowSelectFloorId = floorId;
                        btnFloor.Text = dicFloor[this.nowSelectFloorId];
                        //初始化中部信息
                        this.InitMiddleFrame();
                    });
                }
            };
        }
        #endregion
        #region ■ 区域列表___________________________
        /// <summary>
        /// 初始化区域列表
        /// </summary>
        /// <param name="floorId">楼层ID</param>
        private void InitAreaListRow(string floorId)
        {
            dicSelectRoom.Clear();
            var listRoom = HdlRoomLogic.Current.GetFloorSortRoom(floorId, false);
            HdlThreadLogic.Current.RunMain(() =>
            {
                var listDataRoom = new List<Common.Room>();
                for (int i = 0; i < listRoom.Count; i++)
                {
                    //检测能否显示该房间
                    if (this.CheckCanShowRow(listRoom[i]) == true)
                    {
                        listDataRoom.Add(listRoom[i]);
                    }
                }
                for (int i = 0; i < listDataRoom.Count; i++)
                {
                    //添加房间行
                    this.AddRoomRow(listDataRoom[i], i != listDataRoom.Count - 1);
                }
                //调整真实高度
                listView.AdjustRealHeight(Application.GetRealHeight(23));
                if (listView.Y + listView.Height > btnShard.Y)
                {
                    //当这个列表控件的高度已经超过了【分享按钮】时,将它的高度直接扩大到最大化
                    listView.RecoverHeight();
                    //然后再添加一个空白的控件,促使它能够向上滑动
                    var frameTemp = new FrameLayout();
                    frameTemp.Height = bodyFrameLayout.Height - btnShard.Y;
                    listView.AddChidren(frameTemp);
                }
                if (listDataRoom.Count == 0)
                {
                    //如果没有能够共享的房间
                    bodyFrameLayout.RemoveAll();
                    //无可共享的房间
                    this.ShowNotDataImage(bodyFrameLayout, Language.StringByID(R.MyInternationalizationString.uNotCanShardRoomMsg), "Item/NotShardPic.png", 383, 279);
                }
            });
        }
        /// <summary>
        /// 添加房间行
        /// </summary>
        /// <param name="room"></param>
        /// <param name="addLine"></param>
        private void AddRoomRow(Common.Room room, bool addLine)
        {
            var row = new FrameRowControl(listView.rowSpace / 2);
            row.MainKeys = room.Id;
            listView.AddChidren(row);
            //图标
            var btnIcon = row.AddLeftIcon(81);
            btnIcon.UnSelectedImagePath = "Item/RoomIconSelected.png";
            //房间名
            var btnName = row.AddLeftCaption(room.Name, 650);
            btnName.TextSize = 15;
            if (addLine == true)
            {
                //底线
                row.AddBottomLine();
            }
            row.ButtonClickEvent += (sender, e) =>
            {
                var form = new AddNewSharedContentForm();
                form.AddForm(room, memberShardInfo);
            };
            //选择
            var btnSelect = row.AddMostRightEmptyIcon(69, 69);
            btnSelect.UnSelectedImagePath = "Item/ItemUnSelected.png";
            btnSelect.SelectedImagePath = "Item/ItemSelected.png";
            row.ChangedChidrenBindMode(btnSelect, ChidrenBindMode.NotBind);
            btnSelect.ButtonClickEvent += (sender, e) =>
            {
                if (btnSelect.IsSelected == true)
                {
                    btnSelect.IsSelected = false;
                    dicSelectRoom.Remove(room.Id);
                    if (dicSelectRoom.Count == 0)
                    {
                        btnShard.Visible = false;
                    }
                }
                else
                {
                    btnSelect.IsSelected = true;
                    dicSelectRoom[room.Id] = room;
                    if (btnShard.Visible == false)
                    {
                        btnShard.Visible = true;
                    }
                }
            };
        }
        #endregion
        #region ■ 分享指定区域_______________________
        /// <summary>
        /// 执行分享指定区域
        /// </summary>
        /// <param name="room">指定要分享的房间</param>
        public void DoSharedContentByRoom(List<Common.Room> listRoom)
        {
            //获取需要上传的设备(按房间List顺序分组)
            var dicDevice = new Dictionary<int, List<CommonDevice>>();
            //获取需要上传的场景,这个东西不要获取它的绑定目标(按房间List顺序分组)
            var dicScene = new Dictionary<int, List<Common.SceneUI>>();
            //获取需要上传的房间数据
            int fileCount = this.GetUpLoadRoomData(listRoom, dicDevice, dicScene);
            var listCheckFile = new HashSet<string>();
            HdlThreadLogic.Current.RunThread(async () =>
            {
                //打开进度条
                this.ShowProgressBar();
                for (int index = 0; index < listRoom.Count; index++)
                {
                    //执行上传
                    var result = await HdlShardLogic.Current.DoUploadSharedContent(memberShardInfo, listRoom[index], dicDevice[index], dicScene[index], fileCount, listCheckFile);
                    if (result == false)
                    {
                        break;
                    }
                }
                //关闭进度条
                this.CloseProgressBar();
                //不管成功还是失败,都刷新界面
                Application.RunOnMainThread(() =>
                {
                    if (this.Parent != null)
                    {
                        //重新刷新界面
                        this.InitMiddleFrame();
                    }
                });
            });
        }
        /// <summary>
        /// 获取需要上传的房间数据
        /// </summary>
        /// <param name="listRoom">需要上传的房间列表</param>
        /// <param name="dicDevice">获取需要上传的设备(按房间List顺序分组)</param>
        /// <param name="dicScene">获取需要上传的场景,这个东西不要获取它的绑定目标(按房间List顺序分组)</param>
        /// <returns></returns>
        private int GetUpLoadRoomData(List<Common.Room> listRoom, Dictionary<int, List<CommonDevice>> dicDevice, Dictionary<int, List<Common.SceneUI>> dicScene)
        {
            var listAllFile = new HashSet<string>();
            for (int i = 0; i < listRoom.Count; i++)
            {
                //按房间List顺序分组的设备列表
                var listDevice = new List<CommonDevice>();
                dicDevice[i] = listDevice;
                //按房间List顺序分组的场景列表
                var listScene = new List<Common.SceneUI>();
                dicScene[i] = listScene;
                //获取房间全部设备
                foreach (var deviceKeys in listRoom[i].ListDevice)
                {
                    var device = Common.LocalDevice.Current.GetDevice(deviceKeys);
                    if (device == null || memberShardInfo.dicAllShardKeys.ContainsKey(device.FilePath) == true)
                    {
                        //异常
                        continue;
                    }
                    string deviceFile = device.FilePath;
                    if (memberShardInfo.dicAllShardKeys.ContainsKey(deviceFile) == false)
                    {
                        //或者已经分享了的,不再显示
                        listDevice.Add(device);
                        if (listAllFile.Contains(deviceFile) == false)
                        {
                            listAllFile.Add(deviceFile);
                        }
                    }
                }
                //获取场景里面嵌套的子设备和子场景(计算总数用)
                var listCheck = new HashSet<string>();
                var listChirdDevice = new List<CommonDevice>();
                var listChirdScene = new List<Common.SceneUI>();
                //获取房间全部场景
                foreach (var sceneId in listRoom[i].ListSceneId)
                {
                    var sceneUi = HdlSceneLogic.Current.GetSceneUIBySceneId(sceneId);
                    if (sceneUi == null || memberShardInfo.dicAllShardKeys.ContainsKey(sceneUi.FileName) == true)
                    {
                        //异常,或者已经分享了的,不再显示
                        continue;
                    }
                    listScene.Add(sceneUi);
                    //从缓存获取场景的执行目标(这个函数是计算总数用)
                    HdlShardLogic.Current.GetSceneDeviceList(sceneUi, listCheck, listChirdScene, listChirdDevice);
                    if (listAllFile.Contains(sceneUi.FileName) == false)
                    {
                        listAllFile.Add(sceneUi.FileName);
                    }
                }
                foreach (var device in listChirdDevice)
                {
                    //嵌套子设备的文件名字(计算总数用)
                    string deviceFile = device.FilePath;
                    if (listAllFile.Contains(deviceFile) == false)
                    {
                        listAllFile.Add(deviceFile);
                    }
                }
                foreach (var secene in listChirdScene)
                {
                    //嵌套子场景的文件名字(计算总数用)
                    if (listAllFile.Contains(secene.FileName) == false)
                    {
                        listAllFile.Add(secene.FileName);
                    }
                }
                //房间文件
                listAllFile.Add(listRoom[i].FileName);
            }
            //如果有楼层的话
            if (Common.Config.Instance.Home.FloorDics.Count > 0)
            {
                return listAllFile.Count + 1;
            }
            return listAllFile.Count;
        }
        #endregion
        #region ■ 界面重新激活事件___________________
        /// <summary>
        /// 自身的上层界面关闭后,它自身处于最上层时,触发的事件
        /// </summary>
        public override int FormActionAgainEvent()
        {
            //重新刷新界面
            this.InitMiddleFrame();
            return 1;
        }
        #endregion
        #region ■ 一般方法___________________________
        /// <summary>
        /// 检测该房间能否显示
        /// </summary>
        /// <param name="room"></param>
        /// <returns></returns>
        private bool CheckCanShowRow(Common.Room room)
        {
            if (room.ListDevice.Count == 0 && room.ListSceneId.Count == 0)
            {
                return false;
            }
            if (room.IsLove == true)
            {
                return false;
            }
            if (memberShardInfo.dicShardRoom.ContainsKey(room.FileName) == false)
            {
                //没有这个房间
                return true;
            }
            foreach (var deviceKeys in room.ListDevice)
            {
                var device = Common.LocalDevice.Current.GetDevice(deviceKeys);
                if (device == null)
                {
                    continue;
                }
                if (memberShardInfo.dicAllShardKeys.ContainsKey(device.FilePath) == false)
                {
                    //存在未分享的设备的话,此房间可以显示
                    return true;
                }
            }
            foreach (var sceneId in room.ListSceneId)
            {
                var sceneUi = HdlSceneLogic.Current.GetSceneUIBySceneId(sceneId);
                if (sceneUi == null)
                {
                    continue;
                }
                if (memberShardInfo.dicAllShardKeys.ContainsKey(sceneUi.FileName) == false)
                {
                    //存在未分享的场景的话,此房间可以显示
                    return true;
                }
            }
            return false;
        }
        #endregion
        #region ■ 结构体_____________________________
        /// <summary>
        /// 接收分享数据
        /// </summary>
        private class MemberShardInfoResult
        {
            /// <summary>
            /// 文件名字
            /// </summary>
            public string ShareName = string.Empty;
            /// <summary>
            /// 主键
            /// </summary>
            public string DistributedMark = string.Empty;
        }
        #endregion
    }
}