namespace UIWidgets { using System; using UnityEngine; /// /// Base class for the dialog to add/edit data. /// /// Data type. /// Point type. /// DataForm type. public class TrackDataDialogBase : MonoBehaviour where TDataForm : TrackDataFormBase where TData : ITrackData where TPoint : IComparable { /// /// Dialog template. /// [SerializeField] public Dialog DialogTemplate; /// /// Create header text. /// [SerializeField] public string HeaderCreate = "Create Task"; /// /// Create button text. /// [SerializeField] public string ButtonCreate = "Create"; /// /// Cancel button text. /// [SerializeField] public string ButtonCancel = "Cancel"; /// /// Edit header text. /// [SerializeField] public string HeaderEdit = "Edit Task"; /// /// Save button text. /// [SerializeField] public string ButtonEdit = "Save"; /// /// Create data with specified StartPoint. /// /// StartPoint. /// Function to call after data created. public void Create(TPoint startPoint, Action onSuccess) { var dialog = DialogTemplate.Clone(); var form = dialog.GetComponent(); form.Create(startPoint); OpenDialog(dialog, form, HeaderCreate, ButtonCreate, onSuccess); } /// /// Edit data. /// /// Data. /// Function to call after data edited. public void Edit(TData data, Action onSuccess) { var dialog = DialogTemplate.Clone(); var form = dialog.GetComponent(); form.Edit(data); OpenDialog(dialog, form, HeaderEdit, ButtonEdit, onSuccess); } /// /// Open dialog. /// /// Dialog instance. /// Form. /// Title. /// OK button text. /// Function to call on OK button click. protected void OpenDialog(Dialog dialog, TDataForm form, string title, string okButton, Action onSuccess) { #if CSHARP_7_3_OR_NEWER bool OkAction(DialogBase dialogInstance, int index) #else Func OkAction = (dialogInstance, index) => #endif { onSuccess(form.Data); return true; } #if !CSHARP_7_3_OR_NEWER ; #endif var actions = new DialogButton[] { new DialogButton(okButton, OkAction), new DialogButton(ButtonCancel, DialogBase.DefaultClose), }; dialog.Show( title: title, buttons: actions, focusButton: okButton, modal: true, modalColor: new Color(0, 0, 0, 0.8f)); } } }