using System; using System.Collections.Generic; using System.Text; namespace Shared.Phone.UserCenter.Residence { /// /// 编辑房间信息的界面 /// public class EditorRoomInforForm : EditorCommonForm { #region ■ 变量声明___________________________ /// /// 结束编辑的事件 /// public Action FinishEditorEvent = null; /// /// 列表控件 /// private FrameListControl listview = null; /// /// 房间对象 /// private Common.Room editorRoom = null; /// /// 克隆对象 /// private Common.Room cloneRoom = null; /// /// 改变房间图片 /// private bool changedRoomPic = false; #endregion #region ■ 初始化_____________________________ /// /// 画面显示(底层会固定调用此方法,借以完成画面创建) /// /// 编辑的房间对象 public void ShowForm(Common.Room i_editorRoom = null) { //弄一点初始值 this.editorRoom = i_editorRoom; this.cloneRoom = HdlRoomLogic.Current.CloneRoomClass(i_editorRoom); if (i_editorRoom.HumidityDevice == string.Empty) { this.cloneRoom.Humidity = -1000; } if (i_editorRoom.TemperatrueDevice == string.Empty) { this.cloneRoom.Temperatrue = -1000; } //设置头部信息 base.SetTitleText(Language.StringByID(R.MyInternationalizationString.uEditorRoom)); //初始化中部信息 this.InitMiddleFrame(); } /// /// 初始化中部信息 /// private void InitMiddleFrame() { //清空bodyFrame this.ClearBodyFrame(); var listBackControl = new VerticalFrameControl(); listBackControl.Height = bodyFrameLayout.Height; bodyFrameLayout.AddChidren(listBackControl); //加一个白色背景 var frameBack1 = new FrameLayout(); frameBack1.Height = Application.GetRealHeight(450); frameBack1.Y = Application.GetRealHeight(196); frameBack1.BackgroundColor = UserCenterColor.Current.White; frameBack1.SetCornerWithSameRadius(Application.GetRealHeight(58), HDLUtils.RectCornerTopLeft | HDLUtils.RectCornerTopRight); listBackControl.frameTable.AddChidren(frameBack1); //初始化信息桌布 var tableContr = new InformationEditorControl(); this.listview = tableContr.InitControl(listBackControl.frameTable, Language.StringByID(R.MyInternationalizationString.uInfoEditor), 1175); //房间图片底部阴影 var btnShadow = new PicViewControl(853, 593); btnShadow.Y = Application.GetRealHeight(58); btnShadow.Gravity = Gravity.CenterHorizontal; btnShadow.UnSelectedImagePath = "Room/RoomShadow.png"; listBackControl.frameTable.AddChidren(btnShadow); //房间图片 var btnPic = new ImageView(); btnPic.Y = Application.GetRealHeight(60); btnPic.Width = this.GetPictrueRealSize(824); btnPic.Height = this.GetPictrueRealSize(549); btnPic.Radius = (uint)Application.GetRealHeight(17); btnPic.Gravity = Gravity.CenterHorizontal; if (this.editorRoom.BackgroundImageType == 0) { btnPic.ImagePath = this.editorRoom.BackgroundImage; } else { btnPic.ImageBytes = Common.Global.ReadFileByHomeId(this.editorRoom.BackgroundImage); } listBackControl.frameTable.AddChidren(btnPic); //图片遮罩 var btnZhezhao = new FrameLayout(); btnZhezhao.Width = btnPic.Width; btnZhezhao.Height = btnPic.Height; btnZhezhao.Y = btnPic.Y; btnZhezhao.Gravity = Gravity.CenterHorizontal; btnZhezhao.BackgroundColor = UserCenterColor.Current.PictrueZhezhaoColor; btnZhezhao.Radius = (uint)Application.GetRealHeight(17); listBackControl.frameTable.AddChidren(btnZhezhao); //分享的房间不能编辑 if (this.editorRoom.IsSharedRoom == false) { btnZhezhao.MouseUpEventHandler += (sender, e) => { //房间图片选择 this.RoomPictrueSelect(btnPic); }; } //变更一下那个白色背景的Y轴,它到图片的中间位置 frameBack1.Y = btnPic.Y + btnPic.Height / 2; //添加全部菜单 this.AddAllMenuRow(tableContr, btnPic); } #endregion #region ■ 添加菜单___________________________ /// /// 添加全部菜单 /// private void AddAllMenuRow(InformationEditorControl tableContr, ImageView btnPic) { //【房间名称】 FrameCaptionInputControl txtRoomName = null; if (this.editorRoom.IsLove == false) { txtRoomName = new FrameCaptionInputControl(Language.StringByID(R.MyInternationalizationString.uRoomName), this.cloneRoom.Name, this.listview.rowSpace / 2); txtRoomName.txtInput.PlaceholderText = Language.StringByID(R.MyInternationalizationString.uPleaseInputRoomName); listview.AddChidren(txtRoomName); txtRoomName.InitControl(); //底线 txtRoomName.AddBottomLine(); } else { //我的喜爱不能编辑名字 var rowRoomName = new FrameCaptionViewControl(Language.StringByID(R.MyInternationalizationString.uRoomName), this.cloneRoom.Name, this.listview.rowSpace / 2); listview.AddChidren(rowRoomName); rowRoomName.UseClickStatu = false; rowRoomName.InitControl(); //底线 rowRoomName.AddBottomLine(); } //该APP为有楼层的模式才开启这个菜单 if (this.editorRoom.IsLove == false && string.IsNullOrEmpty(this.cloneRoom.FloorId) == false) { //【所属楼层】 var btnBelone = new FrameCaptionViewControl(Language.StringByID(R.MyInternationalizationString.uBelongeFloor), Common.Config.Instance.Home.FloorDics[this.cloneRoom.FloorId], this.listview.rowSpace / 2); listview.AddChidren(btnBelone); btnBelone.InitControl(); //底线 btnBelone.AddBottomLine(); //分享的房间不能修改 if (this.editorRoom.IsSharedRoom == false) { //右箭头 btnBelone.AddRightArrow(); btnBelone.ButtonClickEvent += (sender, e) => { //楼层选择 this.ShowSelectFloor(btnBelone); }; } } //【温度】 var rowTemperature = new FrameRowControl(this.listview.rowSpace / 2); listview.AddChidren(rowTemperature); rowTemperature.AddLeftCaption(Language.StringByID(R.MyInternationalizationString.uTemperature), 600); //右箭头 rowTemperature.AddRightArrow(); var btnTemper = rowTemperature.AddMostRightView(Language.StringByID(R.MyInternationalizationString.uNothing), 300); //底线 rowTemperature.AddBottomLine(); //分享的房间不能修改 或者当前住宅不是虚拟的 if (this.editorRoom.IsSharedRoom == false && Common.Config.Instance.Home.IsVirtually == false) { rowTemperature.ButtonClickEvent += (sender, e) => { //显示温度传感器列表 this.ShowTemperatrueDevice(btnTemper); }; } if (string.IsNullOrEmpty(cloneRoom.TemperatrueDevice) == false) { //获取温度 this.GetTemperatrueValue(btnTemper, cloneRoom.TemperatrueDevice); } //【湿度】 var rowHumidity = new FrameRowControl(this.listview.rowSpace / 2); listview.AddChidren(rowHumidity); rowHumidity.AddLeftCaption(Language.StringByID(R.MyInternationalizationString.uHumidity), 600); //右箭头 rowHumidity.AddRightArrow(); var btnHumi = rowHumidity.AddMostRightView(Language.StringByID(R.MyInternationalizationString.uNothing), 300); //底线 rowHumidity.AddBottomLine(); //分享的房间不能修改 或者当前住宅不是虚拟的 if (this.editorRoom.IsSharedRoom == false && Common.Config.Instance.Home.IsVirtually == false) { rowHumidity.ButtonClickEvent += (sender, e) => { //显示湿度传感器列表 this.ShowHumidityDevice(btnHumi); }; } if (string.IsNullOrEmpty(cloneRoom.HumidityDevice) == false) { //获取湿度 this.GetHumidityValue(btnHumi, cloneRoom.HumidityDevice); } //初始化桌布完成 tableContr.FinishInitControl(); tableContr = null; //分享的房间不能保存 if (this.editorRoom.IsSharedRoom == true) { return; } //保存 var btnFinish = new BottomClickButton(); btnFinish.TextID = R.MyInternationalizationString.uSave; bodyFrameLayout.AddChidren(btnFinish); btnFinish.ButtonClickEvent += (sender, e) => { if (txtRoomName != null) { this.cloneRoom.Name = txtRoomName.Text; } //检测能否保存房间 if (this.CheckCanSaveRoom() == false) { return; } //更改图片 if (this.changedRoomPic == true) { if (editorRoom.BackgroundImageType == 1 || editorRoom.BackgroundImageType == 2) { //删除掉原来的自定义图片 if (Common.Global.IsExistsByHomeId(editorRoom.BackgroundImage) == true) { Common.Global.DeleteFilebyHomeId(editorRoom.BackgroundImage); } //备份 HdlAutoBackupLogic.DeleteFile(editorRoom.BackgroundImage); } //自定义图片 if (cloneRoom.BackgroundImageType == 1 || cloneRoom.BackgroundImageType == 2) { //生成图片 string picName = $"RoomIcon_{DateTime.Now.ToString("yyyyMMddHHmmss")}.png"; string picFullName = System.IO.Path.Combine(Common.Config.Instance.FullPath, picName); Shared.IO.FileUtils.WriteFileByBytes(picFullName, btnPic.ImageBytes); cloneRoom.BackgroundImage = picName; //备份 HdlAutoBackupLogic.AddOrEditorFile(picName); } } bool changedFloor = editorRoom.FloorId != cloneRoom.FloorId; editorRoom.FloorId = cloneRoom.FloorId; editorRoom.Name = cloneRoom.Name; editorRoom.HumidityDevice = cloneRoom.HumidityDevice; if (cloneRoom.Humidity != -1000) { editorRoom.Humidity = cloneRoom.Humidity; } editorRoom.TemperatrueDevice = cloneRoom.TemperatrueDevice; if (cloneRoom.Temperatrue != -1000) { editorRoom.Temperatrue = cloneRoom.Temperatrue; } editorRoom.BackgroundImage = cloneRoom.BackgroundImage; editorRoom.BackgroundImageType = cloneRoom.BackgroundImageType; editorRoom.Save(); FinishEditorEvent?.Invoke(this.editorRoom.Name); if (changedFloor == false) { //刷新左滑的房间列表界面的指定房间的信息 MainPage.ListRoomViewFrom.Instance.RefreshRoomInfo(this.editorRoom); } else { //刷新左滑的房间列表界面的房间列表信息 MainPage.ListRoomViewFrom.Instance.RefreshListRoom(); } //算了,这里如果按下保存,则主页需要重新刷新 UserView.UserPage.Instance.RefreshForm = true; this.CloseForm(); }; } #endregion #region ■ 楼层选择___________________________ /// /// 楼层选择 /// /// private void ShowSelectFloor(FrameCaptionViewControl control) { var dicFloor = HdlRoomLogic.Current.GetFloorSortList(); var listKeys = new List(); var listName = new List(); int index = 0; foreach (string keys in dicFloor.Keys) { listKeys.Add(keys); listName.Add(dicFloor[keys]); if (keys == cloneRoom.FloorId) { index = listKeys.Count - 1; } } PickerView.Show(listName, (value) => { control.txtView.Text = listName[value]; //主键修改 cloneRoom.FloorId = listKeys[value]; }, index, Language.StringByID(R.MyInternationalizationString.uBelongeFloor), Language.StringByID(R.MyInternationalizationString.uFinish), Language.StringByID(R.MyInternationalizationString.uCancel)); } #endregion #region ■ 温度传感器相关_____________________ /// /// 显示温度传感器列表 /// /// private void ShowTemperatrueDevice(NormalViewControl btnTemper) { var listDevice = new List(); foreach (var device in Common.LocalDevice.Current.listAllDevice) { //获取温度传感器 if (device is ZigBee.Device.TemperatureSensor && ((ZigBee.Device.TemperatureSensor)device).SensorDiv == 1) { listDevice.Add(device); } } var listSelect = new List() { cloneRoom.TemperatrueDevice }; var form = new SelectDeviceForm(); form.AddForm(listDevice, listSelect, true, true); form.ActionSelectDevice += (list) => { if (list.Count == 0) { cloneRoom.TemperatrueDevice = string.Empty; btnTemper.Text = Language.StringByID(R.MyInternationalizationString.uNothing); return; } cloneRoom.TemperatrueDevice = Common.LocalDevice.Current.GetDeviceMainKeys(list[0]); //获取温度值 this.GetTemperatrueValue(btnTemper, cloneRoom.TemperatrueDevice); }; } /// /// 获取温度值 /// /// /// private void GetTemperatrueValue(NormalViewControl btnTemper, string deviceKey) { var device = Common.LocalDevice.Current.GetDevice(deviceKey); if (device == null) { return; } if (cloneRoom.Temperatrue == -1000) { //没有获取得到过温度 btnTemper.Text = Language.StringByID(R.MyInternationalizationString.Getting); } else { btnTemper.Text = this.cloneRoom.Temperatrue == 0 ? "0.0℃" : this.cloneRoom.Temperatrue.ToString() + "℃"; btnTemper.Text += " " + Language.StringByID(R.MyInternationalizationString.Getting); } HdlGatewayReceiveLogic.Current.RemoveEvent("TemperatrueDevice"); HdlGatewayReceiveLogic.Current.AddAttributeEvent("TemperatrueDevice", ReceiveComandDiv.A设备属性上报, ((report) => { string mainKeys = Common.LocalDevice.Current.GetDeviceMainKeys(report); if (cloneRoom.TemperatrueDevice != mainKeys || btnTemper == null) { return; } var localDevice = Common.LocalDevice.Current.GetDevice(mainKeys); HdlThreadLogic.Current.RunMain(() => { if (((ZigBee.Device.TemperatureSensor)localDevice).Temperatrue == 0) { //0℃ btnTemper.Text = "0.0℃"; this.cloneRoom.Temperatrue = 0; } else { //记录温度 this.cloneRoom.Temperatrue = ((ZigBee.Device.TemperatureSensor)localDevice).Temperatrue; btnTemper.Text = this.cloneRoom.Temperatrue.ToString() + "℃"; } }, ShowErrorMode.NO); })); //发送获取温度的命令 ((ZigBee.Device.TemperatureSensor)device).ReadTemperatureOrHumidity(); } #endregion #region ■ 湿度传感器相关_____________________ /// /// 显示湿度传感器列表 /// /// private void ShowHumidityDevice(NormalViewControl btnHumi) { var listDevice = new List(); foreach (var device in Common.LocalDevice.Current.listAllDevice) { //获取湿度传感器 if (device is ZigBee.Device.TemperatureSensor && ((ZigBee.Device.TemperatureSensor)device).SensorDiv == 2) { listDevice.Add(device); } else if (device.Type == ZigBee.Device.DeviceType.FreshAirHumiditySensor) { listDevice.Add(device); } } var listSelect = new List() { cloneRoom.HumidityDevice }; var form = new SelectDeviceForm(); form.AddForm(listDevice, listSelect, true, true); form.ActionSelectDevice += (list) => { if (list.Count == 0) { cloneRoom.HumidityDevice = string.Empty; btnHumi.Text = Language.StringByID(R.MyInternationalizationString.uNothing); return; } cloneRoom.HumidityDevice = Common.LocalDevice.Current.GetDeviceMainKeys(list[0]); //获取湿度值 this.GetHumidityValue(btnHumi, cloneRoom.HumidityDevice); }; } /// /// 获取湿度值 /// /// /// private void GetHumidityValue(NormalViewControl btnHumi, string deviceKey) { var device = Common.LocalDevice.Current.GetDevice(deviceKey); if (device == null) { return; } if (cloneRoom.Humidity == -1000) { //没有获取得到过湿度 btnHumi.Text = Language.StringByID(R.MyInternationalizationString.Getting); } else { btnHumi.Text = this.cloneRoom.Humidity == 0 ? "0.0%" : this.cloneRoom.Humidity.ToString() + "%"; btnHumi.Text += " " + Language.StringByID(R.MyInternationalizationString.Getting); } HdlGatewayReceiveLogic.Current.RemoveEvent("HumidityDevice"); HdlGatewayReceiveLogic.Current.AddAttributeEvent("HumidityDevice", ReceiveComandDiv.A设备属性上报, (report) => { string mainKeys = Common.LocalDevice.Current.GetDeviceMainKeys(report); if (cloneRoom.HumidityDevice != mainKeys || btnHumi == null) { return; } var localDevice = Common.LocalDevice.Current.GetDevice(mainKeys); HdlThreadLogic.Current.RunMain(() => { decimal humidity = (decimal)localDevice.GetType().InvokeMember("Humidity", System.Reflection.BindingFlags.GetField, null, localDevice, null); if (humidity == 0) { //0 btnHumi.Text = "0.0%"; this.cloneRoom.Humidity = 0; } else { //记录湿度 this.cloneRoom.Humidity = humidity; btnHumi.Text = this.cloneRoom.Humidity.ToString() + "%"; } }, ShowErrorMode.NO); }); //发送获取湿度的命令 device.GetType().InvokeMember("ReadTemperatureOrHumidity", System.Reflection.BindingFlags.InvokeMethod, null, device, null); } #endregion #region ■ 房间图片选择_______________________ /// /// 房间图片选择 /// /// private void RoomPictrueSelect(ImageView imageContr) { var menuContr = new BottomMenuSelectForm(); menuContr.AddForm(3); //默认图库 menuContr.AddMenu(Language.StringByID(R.MyInternationalizationString.LocalPicture), () => { var form = new SelectLocalRoomImageForm(); form.AddForm(); form.FinishSelectEvent = (imgPath) => { if (string.IsNullOrEmpty(imgPath) == true) { return; } this.changedRoomPic = true; this.cloneRoom.BackgroundImageType = 0; this.cloneRoom.BackgroundImage = imgPath; imgPath = IO.FileUtils.GetImageFilePath(imgPath); imageContr.ImageBytes = IO.FileUtils.ReadFile(imgPath); }; }); //拍照 menuContr.AddMenu(Language.StringByID(R.MyInternationalizationString.Photograph), () => { //通过相机拍照裁剪 CropImage.TakePicture((imagePath) => { if (string.IsNullOrEmpty(imagePath) == true) { return; } this.changedRoomPic = true; this.cloneRoom.BackgroundImageType = 1; imageContr.ImageBytes = Shared.IO.FileUtils.ReadFile(imagePath); System.IO.File.Delete(imagePath); }, "HdlPic", 2, 1); }); //我的相册 menuContr.AddMenu(Language.StringByID(R.MyInternationalizationString.MyAblums), () => { //从相册选择图片裁剪 CropImage.SelectPicture((imagePath) => { if (string.IsNullOrEmpty(imagePath) == true) { return; } this.changedRoomPic = true; this.cloneRoom.BackgroundImageType = 2; imageContr.ImageBytes = Shared.IO.FileUtils.ReadFile(imagePath); System.IO.File.Delete(imagePath); }, "HdlPic", 2, 1); }); } #endregion #region ■ 界面关闭___________________________ /// /// 界面关闭 /// public override void CloseFormBefore() { this.FinishEditorEvent = null; HdlGatewayReceiveLogic.Current.RemoveEvent("TemperatrueDevice"); HdlGatewayReceiveLogic.Current.RemoveEvent("HumidityDevice"); base.CloseFormBefore(); } #endregion #region ■ 一般方法___________________________ /// /// 检测能否保存房间 /// /// private bool CheckCanSaveRoom() { if (this.cloneRoom.Name == string.Empty) { //请输入房间名称 this.ShowMassage(ShowMsgType.Error, Language.StringByID(R.MyInternationalizationString.uPleaseInputRoomName)); return false; } if (string.IsNullOrEmpty(this.cloneRoom.FloorId) == true) { if (HdlRoomLogic.Current.GetAllListRooms().Find((obj) => obj.Name == this.cloneRoom.Name && obj.Id != this.cloneRoom.Id) != null) { this.ShowMassage(ShowMsgType.Error, Language.StringByID(R.MyInternationalizationString.HadSameRoom)); return false; } } else { var listRoom = HdlRoomLogic.Current.GetFloorSortRoom(this.cloneRoom.FloorId); if (listRoom.Find((obj) => obj.Name == this.cloneRoom.Name && obj.Id != this.cloneRoom.Id) != null) { this.ShowMassage(ShowMsgType.Error, Language.StringByID(R.MyInternationalizationString.HadSameRoom)); return false; } } return true; } #endregion } }