//------------------------------------------------------------ // Game Framework // Copyright © 2013-2021 Jiang Yin. All rights reserved. // Homepage: https://gameframework.cn/ // Feedback: mailto:ellan@gameframework.cn //------------------------------------------------------------ using GameFramework; using TMPro; using UnityEngine; using UnityEngine.Serialization; using UnityEngine.UI; using UnityGameFramework.Runtime; namespace UI { public class DialogForm : UGuiForm { [SerializeField] private TMP_Text _titleText = null; [SerializeField] private TMP_Text _messageText = null; [SerializeField] private GameObject[] _modeObjects = null; [SerializeField] private TMP_Text[] _confirmTexts = null; [SerializeField] private TMP_Text[] _cancelTexts = null; [SerializeField] private TMP_Text[] _otherTexts = null; private int _dialogMode = 1; private bool _pauseGame = false; private object _userData = null; private GameFrameworkAction _onClickConfirmGFAction = null; private GameFrameworkAction _onClickCancelGFAction = null; private GameFrameworkAction _onClickOtherGFAction = null; private DialogFormContext _context = null; public int DialogMode => _dialogMode; public bool PauseGame => _pauseGame; public object UserData => _userData; public void OnConfirmButtonClick() { Close(); if (_onClickConfirmGFAction != null) { _onClickConfirmGFAction(_userData); } } public void OnCancelButtonClick() { Close(); if (_onClickCancelGFAction != null) { _onClickCancelGFAction(_userData); } } public void OnOtherButtonClick() { Close(); if (_onClickOtherGFAction != null) { _onClickOtherGFAction(_userData); } } #if UNITY_2017_3_OR_NEWER protected override void OnOpen(object userData) #else protected internal override void OnOpen(object userData) #endif { base.OnOpen(userData); if (userData is DialogFormContext context) { RefreshUI(context); return; } if (userData is DialogFormRawData dialogParams) { RefreshUI(BuildContext(dialogParams)); return; } Log.Warning("DialogForm requires DialogFormContext or DialogParams as userData."); } #if UNITY_2017_3_OR_NEWER protected override void OnClose(bool isShutdown, object userData) #else protected internal override void OnClose(bool isShutdown, object userData) #endif { if (_pauseGame) { GameEntry.Base.ResumeGame(); } _dialogMode = 1; _titleText.text = string.Empty; _messageText.text = string.Empty; _pauseGame = false; _userData = null; _context = null; RefreshConfirmText(string.Empty); _onClickConfirmGFAction = null; RefreshCancelText(string.Empty); _onClickCancelGFAction = null; RefreshOtherText(string.Empty); _onClickOtherGFAction = null; base.OnClose(isShutdown, userData); } public void RefreshUI(DialogFormContext context) { if (context == null) { Log.Warning("DialogForm context is invalid."); return; } _context = context; _dialogMode = context.Mode; RefreshDialogMode(); _titleText.text = context.Title; _messageText.text = context.Message; _pauseGame = context.PauseGame; RefreshPauseGame(); _userData = context.UserData; RefreshConfirmText(context.ConfirmText); _onClickConfirmGFAction = context.OnClickConfirm; RefreshCancelText(context.CancelText); _onClickCancelGFAction = context.OnClickCancel; RefreshOtherText(context.OtherText); _onClickOtherGFAction = context.OnClickOther; } private static DialogFormContext BuildContext(DialogFormRawData rawData) { if (rawData == null) { return null; } return new DialogFormContext { Mode = rawData.Mode, Title = rawData.Title, Message = rawData.Message, PauseGame = rawData.PauseGame, ConfirmText = rawData.ConfirmText, OnClickConfirm = rawData.OnClickConfirm, CancelText = rawData.CancelText, OnClickCancel = rawData.OnClickCancel, OtherText = rawData.OtherText, OnClickOther = rawData.OnClickOther, UserData = rawData.UserData }; } private void RefreshDialogMode() { for (int i = 1; i <= _modeObjects.Length; i++) { _modeObjects[i - 1].SetActive(i == _dialogMode); } } private void RefreshPauseGame() { if (_pauseGame) { GameEntry.Base.PauseGame(); } } private void RefreshConfirmText(string confirmText) { if (string.IsNullOrEmpty(confirmText)) { confirmText = GameEntry.Localization.GetString("Dialog.ConfirmButton"); } for (int i = 0; i < _confirmTexts.Length; i++) { _confirmTexts[i].text = confirmText; } } private void RefreshCancelText(string cancelText) { if (string.IsNullOrEmpty(cancelText)) { cancelText = GameEntry.Localization.GetString("Dialog.CancelButton"); } for (int i = 0; i < _cancelTexts.Length; i++) { _cancelTexts[i].text = cancelText; } } private void RefreshOtherText(string otherText) { if (string.IsNullOrEmpty(otherText)) { otherText = GameEntry.Localization.GetString("Dialog.OtherButton"); } for (int i = 0; i < _otherTexts.Length; i++) { _otherTexts[i].text = otherText; } } } }