using System; using System.Collections.Generic; using UnityEngine; namespace MeshUtility { public delegate IEnumerable Validator(GameObject root); /// /// Exportダイアログの共通機能 /// /// * ExportRoot 管理 /// * Invalidate 管理 /// /// public class ExporterDialogState : IDisposable { public void Dispose() { ExportRoot = null; ExportRootChanged = null; } #region ExportRoot管理 GameObject m_root; public event Action ExportRootChanged; void RaiseExportRootChanged() { var tmp = ExportRootChanged; if (tmp == null) return; tmp(m_root); } public GameObject ExportRoot { get { return m_root; } set { if (m_root == value) { return; } m_root = value; m_requireValidation = true; RaiseExportRootChanged(); } } #endregion #region Validation管理 bool m_requireValidation = true; public void Invalidate() { // UpdateRoot(ExportRoot); m_requireValidation = true; } List m_validations = new List(); public IReadOnlyList Validations => m_validations; /// /// EditorWindow.OnGUI から /// /// if (Event.current.type == EventType.Layout) /// { /// m_state.Validate(ValidatorFactory()); /// } /// /// IEnumerable ValidatorFactory() /// { /// yield break; /// } /// /// のように呼び出してね /// public void Validate(IEnumerable validators) { if (m_requireValidation) { m_validations.Clear(); m_requireValidation = false; foreach (var validator in validators) { foreach (var validation in validator(ExportRoot)) { try { m_validations.Add(validation); if (validation.ErrorLevel == ErrorLevels.Critical) { // 打ち切り return; } } catch (Exception ex) { // ERROR m_validations.Add(Validation.Critical(ex.Message)); return; } } } } } #endregion } }