tzy
2021-05-14 ee5f2543624a0e3ae9d046062b822727a31685e1
HDL_ON/UI/UI2/3-Intelligence/Scene/CatchSceneAddPage.cs
New file
@@ -0,0 +1,674 @@
using System;
using System.Collections.Generic;
using System.Threading;
using HDL_ON.DAL.Server;
using HDL_ON.Entity;
using HDL_ON.UI.CSS;
using Shared;
namespace HDL_ON.UI
{
    public class CatchSceneAddPage : FrameLayout
    {
        FrameLayout bodyView;
        private ImageView addSceneImageView;
        private FrameLayout sceneNameView;
        private Button btnEditSceneNameIcon;
        private Button btnSceneName;
        private FrameLayout belongToZoneRow;
        private Button btnBelongToZoneRight;
        private Button btnZoneName;
        private Scene scene;
        private Button btnChooseZoneViewTitle;
        private VerticalScrolViewLayout functionListView;
        private Button btnComplete;
        #region 图标选择部分图标
        /// <summary>
        /// 背景图选项区域
        /// </summary>
        FrameLayout pictureOptionView;
        /// <summary>
        /// 背景图选项选择区域
        /// </summary>
        VerticalScrolViewLayout optionView;
        /// <summary>
        /// 默认图库按钮
        /// </summary>
        Button btnDefaultGallery;
        /// <summary>
        /// 拍照按钮
        /// </summary>
        Button btnTakePicture;
        /// <summary>
        /// 相册按钮
        /// </summary>
        Button btnAlbum;
        /// <summary>
        /// 取消按钮
        /// </summary>
        Button btnCancel;
        #endregion
        /// <summary>
        /// 捕捉的区域列表
        /// </summary>
        private List<Room> catchRooms = new List<Room>();
        /// <summary>
        /// 回调更新
        /// </summary>
        Action backAction;
        public CatchSceneAddPage(Scene s,Action a)
        {
            bodyView = this;
            scene = s;
            backAction =()=>{
                a();
                RemoveFromParent();
            };
        }
        public void LoadPage()
        {
            new TopViewDiv(bodyView, Language.StringByID(StringId.CatchScene)).LoadTopView();
            bodyView.BackgroundColor = CSS_Color.BackgroundColor;
            var contentView = new VerticalScrolViewLayout()
            {
                Y = Application.GetRealHeight(64),
                Height = Application.GetRealHeight(603 - 50),
            };
            bodyView.AddChidren(contentView);
            contentView.AddChidren(new Button() {
                Height = Application.GetRealWidth(12),
                BackgroundColor = CSS_Color.MainBackgroundColor,
            });
            var sceneBgView = new FrameLayout()
            {
                Height = Application.GetRealWidth(188 + 24),
                BackgroundColor = CSS_Color.MainBackgroundColor,
            };
            contentView.AddChidren(sceneBgView);
            addSceneImageView = new ImageView()
            {
                Gravity = Gravity.CenterHorizontal,
                Width = Application.GetRealWidth(252),
                Height = Application.GetRealWidth(184),
                Radius = (uint)Application.GetRealWidth(12),
            };
            sceneBgView.AddChidren(addSceneImageView);
            //2020-12-03 修改图片加载方法
            ImageUtlis.Current.LoadLocalOrNetworkImages(scene.ImagePath, addSceneImageView);
            /// <summary>
            /// 修改场景背景事件
            /// </summary>
            addSceneImageView.MouseUpEventHandler = (sender, e) =>
            {
                LoadPictureOptionView();
            };
            #region 场景名称row
            sceneNameView = new FrameLayout()
            {
                Height = Application.GetRealWidth(50),
                BackgroundColor = CSS_Color.MainBackgroundColor,
            };
            contentView.AddChidren(sceneNameView);
            Button btnSceneTitle = new Button()
            {
                X = Application.GetRealWidth(16),
                Width = Application.GetRealWidth(90),
                TextAlignment = TextAlignment.CenterLeft,
                TextColor = CSS_Color.FirstLevelTitleColor,
                TextSize = CSS_FontSize.TextFontSize,
                TextID = StringId.SceneName,
            };
            sceneNameView.AddChidren(btnSceneTitle);
            btnEditSceneNameIcon = new Button()
            {
                X = Application.GetRealWidth(333),
                Gravity = Gravity.CenterVertical,
                Width = Application.GetMinRealAverage(28),
                Height = Application.GetMinRealAverage(28),
                UnSelectedImagePath = "Public/EditIcon.png",
            };
            sceneNameView.AddChidren(btnEditSceneNameIcon);
            btnSceneName = new Button()
            {
                X = Application.GetRealWidth(100),
                Width = Application.GetRealWidth(230),
                TextAlignment = TextAlignment.CenterRight,
                TextColor = CSS_Color.PromptingColor1,
                TextSize = CSS_FontSize.TextFontSize,
                Text = scene.name
            };
            sceneNameView.AddChidren(btnSceneName);
            Button btnSceneNameLine = new Button()
            {
                Y = Application.GetRealWidth(49),
                Gravity = Gravity.CenterHorizontal,
                Height = Application.GetRealHeight(1),
                Width = Application.GetRealWidth(343),
                BackgroundColor = CSS_Color.BackgroundColor,
            };
            sceneNameView.AddChidren(btnSceneNameLine);
            #endregion
            #region 所属区域row
            belongToZoneRow = new FrameLayout()
            {
                Y = sceneNameView.Bottom,
                Height = Application.GetRealWidth(50),
                BackgroundColor = CSS_Color.MainBackgroundColor,
            };
            contentView.AddChidren(belongToZoneRow);
            Button btnBelongToTitle = new Button()
            {
                X = Application.GetRealWidth(16),
                Width = Application.GetRealWidth(90),
                TextAlignment = TextAlignment.CenterLeft,
                TextColor = CSS_Color.FirstLevelTitleColor,
                TextSize = CSS_FontSize.TextFontSize,
                TextID = StringId.LocationManagement,
            };
            belongToZoneRow.AddChidren(btnBelongToTitle);
            btnBelongToZoneRight = new Button()
            {
                X = Application.GetRealWidth(339),
                Gravity = Gravity.CenterVertical,
                Width = Application.GetMinRealAverage(16),
                Height = Application.GetMinRealAverage(16),
                UnSelectedImagePath = "Public/Right.png",
            };
            belongToZoneRow.AddChidren(btnBelongToZoneRight);
            btnZoneName = new Button()
            {
                X = Application.GetRealWidth(100),
                Width = Application.GetRealWidth(230),
                TextAlignment = TextAlignment.CenterRight,
                TextColor = CSS_Color.PromptingColor1,
                TextSize = CSS_FontSize.TextFontSize,
                Text = scene.GetRoomListName() == "" ? Language.StringByID(StringId.WholeZone) : scene.GetRoomListName()
            };
            belongToZoneRow.AddChidren(btnZoneName);
            contentView.AddChidren(new Button()
            {
                Y = belongToZoneRow.Bottom,
                Height = Application.GetRealHeight(8),
                BackgroundColor = CSS_Color.BackgroundColor,
            });
            #endregion
            #region 选择区域
            FrameLayout chooseZoneView = new FrameLayout()
            {
                Height = Application.GetRealWidth(44),
                BackgroundColor = CSS_Color.MainBackgroundColor,
            };
            contentView.AddChidren(chooseZoneView);
            btnChooseZoneViewTitle = new Button()
            {
                X = Application.GetRealWidth(16),
                TextAlignment = TextAlignment.CenterLeft,
                TextColor = CSS_Color.MainColor,
                TextSize = CSS_FontSize.SubheadingFontSize,
                TextID = StringId.ChooseCatchZone,
                IsBold = true,
            };
            chooseZoneView.AddChidren(btnChooseZoneViewTitle);
            functionListView = new VerticalScrolViewLayout()
            {
                Height = 0,
            };
            contentView.AddChidren(functionListView);
            LoadRoomRow(functionListView);
            Button btnLine1 = new Button()
            {
                Height = Application.GetRealHeight(8),
                BackgroundColor = CSS_Color.BackgroundColor,
            };
            contentView.AddChidren(btnLine1);
            #endregion
            Button btnBottomLine = new Button()
            {
                Y = Application.GetRealHeight(667 - 50) - 1,
                Height = 1,
                BackgroundColor = CSS_Color.BackgroundColor,
            };
            bodyView.AddChidren(btnBottomLine);
            btnComplete = new Button()
            {
                Y = Application.GetRealHeight(667 - 50),
                Height = Application.GetRealHeight(50),
                TextAlignment = TextAlignment.Center,
                SelectedTextColor = CSS_Color.MainColor,
                TextColor = CSS_Color.BackgroundColor,
                TextSize = CSS_FontSize.SubheadingFontSize,
                TextID = StringId.NextStep,
                BackgroundColor = CSS_Color.MainBackgroundColor,
                SelectedBackgroundColor = CSS_Color.MainBackgroundColor,
            };
            bodyView.AddChidren(btnComplete);
            btnComplete.MouseUpEventHandler = (sender, e) => {
                if(btnComplete.IsSelected)
                {
                    if (string.IsNullOrEmpty(scene.name))
                    {
                        new Tip()
                        {
                            CloseTime = 1,
                            Text = Language.StringByID(StringId.SceneNameCannotBeEmpty),
                            Direction = AMPopTipDirection.None,
                        }.Show(bodyView);
                        return;
                    }
                    foreach (var tempRoom in FunctionList.List.scenes)
                    {
                        if (scene.name == tempRoom.name)
                        {
                            new PublicAssmebly().TipMsg(StringId.Tip, StringId.SceneNameAlreadyExists);
                            return;
                        }
                    }
                    var catchFunctionList = new List<Function>();
                    foreach(var temp in FunctionList.List.Functions)
                    {
                        foreach(var catchRoom in catchRooms)
                        {
                            if(temp.roomIds.Contains(catchRoom.roomId))
                            {
                                catchFunctionList.Add(temp);
                            }
                        }
                    }
                    var view = new CatchSceneCatchFunctionListPage(scene, catchFunctionList, backAction);
                    MainPage.BasePageView.AddChidren(view);
                    view.LoadPage();
                    MainPage.BasePageView.PageIndex = MainPage.BasePageView.ChildrenCount - 1;
                }
            };
        }
        /// <summary>
        /// 加载功能列表
        /// </summary>
        void LoadRoomRow(VerticalScrolViewLayout functionListView)
        {
            functionListView.RemoveAll();
            var roomCount = SpatialInfo.CurrentSpatial.RoomList.Count;
            functionListView.Height = Application.GetRealWidth(51 * roomCount);
            int i = 0;
            foreach(var room in SpatialInfo.CurrentSpatial.RoomList)
            {
                if (i < roomCount )
                {
                    functionListView.AddChidren(new Button()
                    {
                        Gravity = Gravity.CenterHorizontal,
                        Width = Application.GetRealWidth(343),
                        Height = Application.GetRealWidth(1),
                        BackgroundColor = CSS_Color.BackgroundColor,
                    });
                }
                i++;
                var row = new FrameLayout()
                {
                    Height = Application.GetRealWidth(50),
                    BackgroundColor = CSS_Color.MainBackgroundColor,
                };
                functionListView.AddChidren(row);
                Button btnChoose = new Button()
                {
                    X = Application.GetRealWidth(331),
                    Gravity = Gravity.CenterVertical,
                    Width = Application.GetMinRealAverage(28),
                    Height = Application.GetMinRealAverage(28),
                    UnSelectedImagePath = "Public/ChooseIcon.png",
                    SelectedImagePath = "Public/ChooseOnIcon.png",
                };
                row.AddChidren(btnChoose);
                var btnRoomName = new TextButton()
                {
                    X = Application.GetRealWidth(16),
                    TextAlignment = TextAlignment.CenterLeft,
                    TextColor = CSS_Color.FirstLevelTitleColor,
                    TextSize = CSS_FontSize.TextFontSize,
                    Text = room.roomName,
                };
                row.AddChidren(btnRoomName);
                btnRoomName.Width = Utlis.GetRealWidthByTextButton(btnRoomName)+Application.GetRealWidth(12);
                var btnRoomFloor = new TextButton()
                {
                    X = btnRoomName.Right,
                    TextAlignment = TextAlignment.CenterLeft,
                    TextColor = CSS_Color.PromptingColor1,
                    TextSize = CSS_FontSize.PromptFontSize_FirstLevel,
                    Text = room.floorName,
                };
                row.AddChidren(btnRoomFloor);
                btnRoomFloor.Width = Utlis.GetRealWidthByTextButton(btnRoomFloor) + Application.GetRealWidth(12);
                EventHandler<MouseEventArgs> eventHandler = (sender, e) => {
                    btnChoose.IsSelected = !btnChoose.IsSelected;
                    if (btnChoose.IsSelected)
                    {
                        catchRooms.Add(room);
                    }else
                    {
                        catchRooms.Remove(room);
                    }
                    if (catchRooms.Count == 1)
                    {
                        btnComplete.IsSelected = true;
                    }
                    else if (catchRooms.Count == 0)
                    {
                        btnComplete.IsSelected = false;
                    }
                };
                btnRoomFloor.MouseUpEventHandler = eventHandler;
                btnRoomName.MouseUpEventHandler = eventHandler;
                btnChoose.MouseUpEventHandler = eventHandler;
                row.MouseUpEventHandler = eventHandler;
            }
        }
        /// <summary>
        /// 加载图标选择选项
        /// </summary>
        void LoadPictureOptionView()
        {
            var pView = new FrameLayout()
            {
                BackgroundColor = CSS_Color.DialogTransparentColor1,
            };
            bodyView.AddChidren(pView);
            pictureOptionView = new FrameLayout()
            {
                Y = Application.GetRealHeight(445),
                Height = Application.GetRealHeight(250),
                AnimateSpeed = 0.3f,
                Animate = Animate.DownToUp,
            };
            pView.AddChidren(pictureOptionView);
            optionView = new VerticalScrolViewLayout()
            {
                Gravity = Gravity.CenterHorizontal,
                Width = Application.GetRealWidth(343),
                Height = Application.GetRealHeight(150),
                BackgroundColor = CSS_Color.MainBackgroundColor,
                Radius = (uint)Application.GetRealWidth(12),
            };
            pictureOptionView.AddChidren(optionView);
            btnDefaultGallery = new Button()
            {
                Height = Application.GetRealHeight(50),
                TextAlignment = TextAlignment.Center,
                TextColor = CSS_Color.TextualColor,
                SelectedTextColor = CSS_Color.MainColor,
                TextSize = CSS_FontSize.SubheadingFontSize,
                TextID = StringId.DefaultGallery,
            };
            optionView.AddChidren(btnDefaultGallery);
            optionView.AddChidren(new Button() { Height = Application.GetRealHeight(1), Width = Application.GetRealWidth(343), BackgroundColor = CSS_Color.DividingLineColor });
            btnTakePicture = new Button()
            {
                Height = Application.GetRealHeight(50),
                TextAlignment = TextAlignment.Center,
                TextColor = CSS_Color.TextualColor,
                SelectedTextColor = CSS_Color.MainColor,
                TextSize = CSS_FontSize.SubheadingFontSize,
                TextID = StringId.TakePicture,
            };
            optionView.AddChidren(btnTakePicture);
            optionView.AddChidren(new Button() { Height = Application.GetRealHeight(1), Width = Application.GetRealWidth(343), BackgroundColor = CSS_Color.DividingLineColor });
            btnAlbum = new Button()
            {
                Height = Application.GetRealHeight(50),
                TextAlignment = TextAlignment.Center,
                TextColor = CSS_Color.TextualColor,
                SelectedTextColor = CSS_Color.MainColor,
                TextSize = CSS_FontSize.SubheadingFontSize,
                TextID = StringId.Album,
            };
            optionView.AddChidren(btnAlbum);
            optionView.AddChidren(new Button() { Height = Application.GetRealHeight(1), Width = Application.GetRealWidth(343), BackgroundColor = CSS_Color.DividingLineColor });
            btnCancel = new Button()
            {
                Gravity = Gravity.CenterHorizontal,
                Y = Application.GetRealHeight(8) + optionView.Bottom,
                Width = Application.GetRealWidth(343),
                Height = Application.GetRealHeight(50),
                BackgroundColor = CSS_Color.MainBackgroundColor,
                Radius = (uint)Application.GetRealWidth(12),
                TextID = StringId.Cancel,
                TextColor = CSS_Color.WarningColor,
                TextSize = CSS_FontSize.SubheadingFontSize,
            };
            pictureOptionView.AddChidren(btnCancel);
            LoadEvent_PictureOptionViewEventList(pView);
        }
        /// <summary>
        /// 加载背景图选择区域事件列表
        /// </summary>
        void LoadEvent_PictureOptionViewEventList(FrameLayout pView)
        {
            pictureOptionView.MouseUpEventHandler = (sender, e) =>
            {
                pictureOptionView.Parent.RemoveFromParent();
            };
            pView.MouseUpEventHandler = (sender, e) =>
            {
                pictureOptionView.Parent.RemoveFromParent();
            };
            btnCancel.MouseUpEventHandler = (sender, e) =>
            {
                pictureOptionView.Parent.RemoveFromParent();
            };
            btnTakePicture.MouseDownEventHandler = (sender, e) => {
                btnTakePicture.IsSelected = true;
            };
            btnTakePicture.MouseUpEventHandler = (sender, e) =>
            {
                btnTakePicture.IsSelected = false;
                var imageName = Guid.NewGuid().ToString();
                CropImage.TakePicture((imagePath) =>
                {
                    CropImageCallBack(imagePath);
                }, imageName, 4, 3);
                pictureOptionView.Parent.RemoveFromParent();
            };
            btnAlbum.MouseDownEventHandler = (sender, e) => {
                btnAlbum.IsSelected = true;
            };
            btnAlbum.MouseUpEventHandler = (sender, e) =>
            {
                btnAlbum.IsSelected = false;
                //从相册选择图片裁剪
                var imageName = Guid.NewGuid().ToString();
                //var imageName = scene.sid;
                CropImage.SelectPicture((imagePath) =>
                {
                    CropImageCallBack(imagePath);
                }, imageName, 4, 3);
                //if (pageTitleId == StringId.EditScene)
                //{
                //    scene.SaveFunctionData();
                //}
                pictureOptionView.Parent.RemoveFromParent();
            };
            btnDefaultGallery.MouseUpEventHandler = (sender, e) => {
                pictureOptionView.Parent.RemoveFromParent();
                Action<string> action = (obj) => {
                    scene.ImagePath = obj;
                    addSceneImageView.ImageBytes = null;//解决有ImageBytes不加载ImagePath
                    addSceneImageView.ImagePath = scene.ImagePath;
                };
                var galleryPage = new GalleryPage(scene.ImagePath, action);
                MainPage.BasePageView.AddChidren(galleryPage);
                galleryPage.LoadPage(true);
                MainPage.BasePageView.PageIndex = MainPage.BasePageView.ChildrenCount - 1;
            };
        }
        /// <summary>
        /// 裁剪完照片回调,统一处理
        /// </summary>
        /// <param name="imagePath">裁剪后的真实路径</param>
        /// <param name="imageName">自定义的图片名称</param>
        void CropImageCallBack(string selectImagePath)
        {
            if (string.IsNullOrEmpty(selectImagePath) == true)
            {
                return;
            }
            //上传成功到回调
            Action<string> uploadSuccessAction = (imageUrl) =>
            {
                //2020-12-03 需要讲最新的图片路径同步到云端
                scene.ImagePath = imageUrl;
            };
            //上传图片到云端
            UploadImage(selectImagePath, addSceneImageView, scene, uploadSuccessAction);
        }
        /// <summary>
        /// 上传图片方法
        /// </summary>
        /// <param name="selectImagePath">裁剪后的图片路径</param>
        /// <param name="imageView"></param>
        /// <param name="uploadSuccessAction"></param>
        void UploadImage(string selectImagePath, ImageView imageView, Scene mScene, Action<string> uploadSuccessAction)
        {
            try
            {
                //MainPage.Log("SelectPicture 裁剪图片返回路径: " + selectImagePath);
                //1.读取裁剪后的图片,然后删除
                var imageBytes = Shared.IO.FileUtils.ReadFile(selectImagePath);
                System.IO.File.Delete(selectImagePath);
                var waitPage = new Loading();
                bodyView.AddChidren(waitPage);
                waitPage.Start(Language.StringByID(StringId.PleaseWait));
                //开始上传
                new Thread(() =>
                {
                    try
                    {
                        var newImageName = mScene.name.Trim() + ".png";
                        var uploadImageObj = new UploadImageObj()
                        {
                            prefix = "Scene" + Utlis.GetTimestamp(),
                            fileName = newImageName,
                            uid = mScene.sid,
                            content = imageBytes,
                        };
                        var imageUrl = ImageUtlis.Current.UploadImage(uploadImageObj);
                        if (!string.IsNullOrEmpty(imageUrl) && imageUrl.Contains(newImageName))
                        {
                            //上传成功
                            Application.RunOnMainThread(() =>
                            {
                                //Utlis.WriteLine("上传成功:" + imageUrl);
                                //1.2如果是自定义图片删除之前的
                                if (!string.IsNullOrEmpty(imageView.ImagePath) && !imageView.ImagePath.Contains("Classification/Room/Roombg"))
                                {
                                    //Utlis.WriteLine("删除: " + imageView.ImagePath);
                                    System.IO.File.Delete(imageView.ImagePath);
                                }
                                //重命名保存
                                ImageUtlis.Current.WriteFileByBytes(imageUrl, imageBytes);
                                imageView.ImagePath = null;
                                imageView.ImageBytes = imageBytes;
                                //上传成功
                                Utlis.ShowTip(Language.StringByID(StringId.UploadSuccessfully));
                                uploadSuccessAction?.Invoke(imageUrl);
                            });
                        }
                        else
                        {
                            //上传失败
                            Application.RunOnMainThread(() =>
                            {
                                //上传失败
                                Utlis.ShowTip(Language.StringByID(StringId.UploadFailed));
                            });
                        }
                    }
                    catch (Exception ex)
                    {
                    }
                    finally
                    {
                        Application.RunOnMainThread(() =>
                        {
                            if (waitPage != null)
                            {
                                waitPage.RemoveFromParent();
                                waitPage = null;
                            }
                        });
                    }
                })
                { IsBackground = true }.Start();
            }
            catch { }
        }
    }
}