private static async Task LoadJsonModelIntoGeneratedJsonSchemaView( ViewStack viewStack, ModelToJsonSchema schemaGenerator, JsonSchema schema, string jsonModel) { JObject model = JsonReader.GetReader().Read <JObject>(jsonModel); JsonSchemaToView viewGenerator = new JsonSchemaToView(schemaGenerator); GameObject generatedView = await viewGenerator.ToView(schema); viewStack.ShowView(generatedView); var presenter = new JsonSchemaPresenter(viewGenerator); presenter.targetView = generatedView; Log.d("Model BEFORE changes: " + model.ToPrettyString()); var changedModel = await presenter.LoadModelIntoView(model.DeepClone() as JObject); await JsonSchemaPresenter.ChangesSavedViaConfirmButton(generatedView); Log.d("Model AFTER changes: " + changedModel.ToPrettyString()); viewStack.SwitchBackToLastView(generatedView); var changedFields = MergeJson.GetDiff(model, changedModel); Log.d("Fields changed: " + changedFields?.ToPrettyString()); }
/// <summary> /// Generates a new view from a target model T and adds it as a child gameobject so /// that the developer can start modifying it afterwards. This should typically be /// triggered in Editor time, but if no modification of the UI is needed it could also /// be done on runtime. The generated view can be saved as a prefab and loaded later during /// runtime when the actual instance of the model T should be shown in it. /// </summary> private async Task GenerateViewFromClass <T>() { var generatedView = gameObject.AddChild(await JsonSchemaToView.NewViewGenerator().GenerateViewFrom <T>(true)); var newFieldViews = generatedView.GetFieldViewMap(); if (gameObject.GetChildCount() > 0) { var viewToUpdate = gameObject.GetChildren().First(); // First only log out the field views that changed in a fresh generated UI: viewToUpdate.GetFieldViewMap().LogAnyDiffToNewFieldViews(newFieldViews); // Then also fix them automatically: viewToUpdate.GetFieldViewMap().UpdateFieldViews(newFieldViews, autoDeleteRemovedFields: true); } }
private static async Task LoadModelIntoGeneratedView(ViewStack viewStack, ModelToJsonSchema schemaGenerator, JsonSchema schema) { MyUserModel model = NewExampleUserInstance(); { await Dialog.ShowInfoDialog("Manually connecting the model instance to the view", "First an example to connect the " + "model to a generated view via a manual presenter 'MyManualPresenter1'", "Show manual presenter example"); var viewGenerator = new JsonSchemaToView(schemaGenerator); GameObject generatedView = await viewGenerator.ToView(schema); viewStack.ShowView(generatedView); var presenter = new MyManualPresenter1(); presenter.targetView = generatedView; Log.d("Model BEFORE changes: " + JsonWriter.AsPrettyString(model)); await presenter.LoadModelIntoView(model); viewStack.SwitchBackToLastView(generatedView); Log.d("Model AFTER changes: " + JsonWriter.AsPrettyString(model)); } { await Dialog.ShowInfoDialog("Using JsonSchemaPresenter to autmatically connect the model instance and view", "The second option is to use a generic JObjectPresenter to connect the model to the generated view", "Show JsonSchemaPresenter example"); var viewGenerator = new JsonSchemaToView(schemaGenerator); GameObject generatedView = await viewGenerator.ToView(schema); viewStack.ShowView(generatedView); var presenter = new JsonSchemaPresenter(viewGenerator); presenter.targetView = generatedView; Log.d("Model BEFORE changes: " + JsonWriter.AsPrettyString(model)); MyUserModel changedModel = await presenter.LoadViaJsonIntoView(model); viewStack.SwitchBackToLastView(generatedView); Log.d("Model AFTER changes: " + JsonWriter.AsPrettyString(changedModel)); var changedFields = MergeJson.GetDiff(model, changedModel); Log.d("Fields changed: " + changedFields?.ToPrettyString()); } }
private async Task ShowModelInstanceInView() { // Get the previously created view (see above) var uiView = gameObject.GetChild(0); AssertV2.IsNotNull(uiView, "uiView"); // Create some example model instance: var modelInstance = Ui18_1_JsonSchemaUiGenerator.NewExampleUserInstance(); JsonSchemaPresenter p = new JsonSchemaPresenter(JsonSchemaToView.NewViewGenerator()); p.targetView = uiView; var changedInstance = await p.LoadViaJsonIntoView(modelInstance); uiView.Destroy(); // Close the view by destroying it after the user done with it var changedFields = MergeJson.GetDiff(modelInstance, changedInstance); Log.d("Fields changed: " + changedFields?.ToPrettyString()); }
/// <summary> Generate a UI from the passed arbitrary class </summary> private static async Task <GameObject> NewUiFor <T>() { return(await JsonSchemaToView.NewViewGenerator().GenerateViewFrom <T>()); }