示例#1
0
        public override DevUIView CreateViewFromEntity(UID entity, string name = "")
        {
            if (entityManager == null)
            {
                entityManager = Kernel.Instance.Container.Resolve <IEntityManager>();
            }

            if (entityManager == null)
            {
                Debug.LogError("Could not locate entity-manager");
            }

            List <IComponent> components = entityManager.GetAllComponents(entity);

            DevUIView resultView = CreateView((name == null || name == "")?"entity-" + entity.ID : name, false, false);



            List <MemoryBrowser> mBrowsers = new List <MemoryBrowser>();

            foreach (IComponent comp in components)
            {
                MemoryBrowser mB = Create(resultView, comp, true, (key, value) => {
                    entityManager.EntityModified(entity);
                });
                mBrowsers.Add(mB);
            }

            return(resultView);
        }
示例#2
0
 public override void RemoveViewToArchieve(DevUIView view)
 {
     RemoveViewFromModel(view);
     fileSystem.RemoveFile(view.currentFilename);
     // save view to archieve path (true)
     SaveViewToPath(view, true);
 }
示例#3
0
        public override DevUIView CreateViewFromPOCO(object viewObject, string name)
        {
            DevUIView resultView = CreateView(name, false, false);

            Create(resultView, viewObject);
            return(resultView);
        }
示例#4
0
        protected override void AfterInitialize()
        {
            // this is called right after the Base-Classes Initialize-Method. _eventManager and disposableManager are set
            rxViews = new ReactiveCollection <DevUIView>();

            // TODO: get rid of EveryUpdate
            Observable.EveryUpdate().Subscribe(_ => {
                if (UnityEngine.Input.GetKeyDown(KeyCode.F8))
                {
                    ToggleScriptingConsole();
                }
            }).AddTo(disposables);

            OnEvent <Events.UIViewRenamed>().Subscribe(evt => {
                if (evt.view.currentFilename != null)
                {
                    // there is already an representation! delete it and create it new
                    fileSystem.RemoveFile(evt.view.currentFilename);
                    // save to default-location but force a new name
                    SaveViewToPath(evt.view, false, true);
                }
            }).AddTo(disposables);


            // on startup create some sample data
            ReactivePriorityExecutionList rxStartup = Kernel.Instance.rxStartup;

            rxStartup.Add(UtilsObservable.LoadScene(developmentSceneID), Priorities.PRIORITY_EARLY);

            //TODO: This is a workaround to close the dev console on start. Usually the loadDevelopmentConsole command published above should load the scene deactivated (makeActive set to false) which doesn't seem to work.
            // To Ensure that the
            rxStartup.Add(() => {
                CloseScriptingConsole();
            }, Priorities.PRIORITY_DEFAULT); // with using PRIORITY_DEFAULT which is called after the PRIORITY_EARLY-Block it is ensured that the scene is fully loaded, before this block is executed


            rxStartup.Add(LoadViews().Do(pr => {
                logging.Info("progress:" + pr);
            }).Last().Select(_ => true)

                          , Priorities.PRIORITY_DEFAULT); // Default Priority

            // on shutdown persist the current views
            Kernel.Instance.rxShutDown.Add(() => {
                SaveViews();
            });


            OnEvent <Events.PickedEntity>().Subscribe(evt => {
                DevUIView view = CreateViewFromEntity(evt.entity);
            }).AddTo(disposables);
        }
示例#5
0
        public override DevUIView CreateView(string viewName, bool dynamicallyCreated = false, bool extensionAllowed = true)
        {
            DevUIView view = GetView(viewName);

            if (view != null)
            {
                return(view);
            }
            DevUIView newView = new DevUIView(viewName, dynamicallyCreated);

            newView.extensionAllowed = extensionAllowed;
            rxViews.Add(newView);
            return(newView);
        }
示例#6
0
        private void SaveViewToPath(DevUIView view, bool saveToArchieve = false, bool forceNewFilename = false)
        {
            string viewAsString = serializer.Serialize(view);

            if (saveToArchieve)
            {
                string saveAsFilename = DateTime.Now.ToFileTime() + "-" + view.Name + ".json";
                fileSystem.WriteStringToFileAtDomain(FileSystem.FSDomain.DevUIViewsArchieve, saveAsFilename, viewAsString);
                view.currentFilename = fileSystem.GetPath(FileSystem.FSDomain.DevUIViewsArchieve, saveAsFilename);
            }
            else
            {
                string saveAsFilename = (view.currentFilename == null || forceNewFilename) ? view.Name + ".json" : Path.GetFileName(view.currentFilename);
                fileSystem.WriteStringToFileAtDomain(FileSystem.FSDomain.DevUIViews, saveAsFilename, viewAsString);
                view.currentFilename = fileSystem.GetPath(FileSystem.FSDomain.DevUIViews, saveAsFilename);
            }
        }
示例#7
0
        private MemoryBrowser Create(DevUIView resultView, object viewObject, bool autoupdate = false, Action <object, object> onValueChanged = null)
        {
            DevUIButton compButton = new DevUIButton(viewObject.GetType().ToString(), () => { });

            resultView.AddElement(compButton);

            MemoryBrowser mB = new MemoryBrowser(viewObject);

            Dictionary <string, DevUIKeyValue> dict = new Dictionary <string, DevUIKeyValue>();

            foreach (string key in mB.rxCurrentSnapShot.Keys)
            {
                object obj = mB.rxCurrentSnapShot[key];

                if (obj == null || MemoryBrowser.IsSimple(obj.GetType()) || obj is Vector3 || obj is Vector2 || obj is Vector4)
                {
                    DevUIKeyValue uiKV = new DevUIKeyValue(key, obj == null ? "null" : obj.ToString());
                    uiKV.OnValueChangeRequested = (newVal) => {
                        mB.SetValue(key, newVal);
                        if (onValueChanged != null)
                        {
                            onValueChanged(key, newVal);
                        }
                    };
                    resultView.AddElement(uiKV);
                    dict[key] = uiKV;
                }
                else if (obj is IDevUIVisible)
                {
                    DevUIKeyValue uiKV = new DevUIKeyValue(key, obj == null ? "null" : "'" + obj.ToString() + "'");
                    resultView.AddElement(uiKV);
                    // TODO: Detect changes in custom-type
                }
                else if (obj is IList && ((IList)obj).Count > 0)
                {
                    IList  thelist      = (IList)obj;
                    object firstElement = thelist[0];
                    if (firstElement is IDevUIVisible)
                    {
                        resultView.AddElement(new DevUIButton(key + "(List)", null));

                        for (int i = 0; i < thelist.Count; i++)
                        {
                            object        listObj = thelist[i];
                            DevUIKeyValue uiKV    = new DevUIKeyValue(key, i + "| " + listObj == null ? "null" : "'" + listObj.ToString() + "'");
                            resultView.AddElement(uiKV);
                            // TODO: detect list changes
                        }
                    }
                }
            }

            if (autoupdate && dict.Count > 0)
            {
                mB.rxCurrentSnapShot
                .ObserveReplace()
                .Subscribe(evt => {
                    if (evt.OldValue == evt.NewValue)
                    {
                        return;
                    }

                    string key = evt.Key;
                    if (dict.ContainsKey(key))
                    {
                        DevUIKeyValue uiKV = dict[key];
                        uiKV.Value         = evt.NewValue.ToString();
                    }
                })
                .AddTo(resultView.disposables);     // when the view is disposed, also dispose this subscription
            }
            else
            {
                // TODO: no button if we cannot show any values?
                resultView.RemoveElement(compButton);
            }


            // Poll the data at a this interval for every component
            // TODO: Make this more efficient: only the view that is in focus!?
            timeService.CreateGlobalTimer(1.0f, () => {
                mB.UpdateCurrentSnapshot();
                logging.Info("UPDATED SNAPSHOT");
            }, 0);

            return(mB);
        }
示例#8
0
        public override IObservable <float> LoadViews()
        {
            List <string> viewFiles = fileSystem.GetFilesInDomain(FileSystem.FSDomain.DevUIViews, "", "*.json");

            float progressFactor       = 1.0f / viewFiles.Count;
            float progress             = 0;
            IObservable <float> result = Observable.Return(progressFactor);

            // check if we already used a viewname
            HashSet <string> usedViewNames = new HashSet <string>();

            List <string> tempCurrentViewFiles = new List <string>(viewPathsLoaded);

            foreach (string viewFile in viewFiles)
            {
                result = result.Concat(Observable.Start(() => {
                    Debug.Log("thread: " + System.Threading.Thread.CurrentThread.Name);
                    // did we already load this view? if yes, skip
                    if (tempCurrentViewFiles.Contains(viewFile))
                    {
                        // remove file from temp list (the ones that stays in list are the ones to be deleted afterwards)
                        tempCurrentViewFiles.Remove(viewFile);
                        return(null);
                    }

                    string viewDataAsString = fileSystem.LoadFileAsString(viewFile);
                    return(viewDataAsString);
                }).ObserveOnMainThread().Select(fileData => {
                    try {
                        if (fileData != null)
                        {
                            DevUIView viewData = serializer.DeserializeToObject <DevUIView>(fileData);

                            if (usedViewNames.Contains(viewData.Name))
                            {
                                logging.Warn("There is already already a view with the name " + viewData.Name + "! This results in merged views");
                            }

                            DevUIView view = GetView(viewData.Name);
                            if (view == null)
                            {
                                // a new view
                                view = CreateView(viewData.Name, viewData.createdDynamically);
                                view.extensionAllowed = viewData.extensionAllowed;
                            }
                            usedViewNames.Add(viewData.Name);
                            view.currentFilename = viewFile;

                            foreach (DevUIElement uiElem in viewData.uiElements)
                            {
                                view.AddElement(uiElem, false);
                            }

                            viewPathsLoaded.Add(viewFile);
                        }
                    }
                    catch (Exception e) {
                        Debug.LogWarning("Could not load viewElement! Ignoring!");
                    }
                    return("");
                }).Select(_ => { progress += progressFactor; return(progress); }));
            }

            result = result.Finally(() => {
                // are there any files left, that were loaded before, but now vanished?
                foreach (string oldPath in tempCurrentViewFiles)
                {
                    DevUIView view = rxViews.Where(v => v.currentFilename == oldPath).FirstOrDefault();
                    if (view != null)
                    {
                        RemoveViewFromModel(view);
                    }
                }
            });

            return(result.ObserveOnMainThread());
        }
示例#9
0
 public override void RemoveViewFromModel(DevUIView view)
 {
     rxViews.Remove(view);
     viewPathsLoaded.Remove(view.currentFilename);
     view.Dispose();
 }
示例#10
0
 public abstract void RemoveViewToArchieve(DevUIView view);
示例#11
0
 public abstract void RemoveViewFromModel(DevUIView view);