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));
}
}
}