DialogBox.cs 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  1. using System;
  2. using BansheeEngine;
  3. namespace BansheeEditor
  4. {
  5. public class DialogBox : ModalWindow
  6. {
  7. public enum Type
  8. {
  9. OK,
  10. OKCancel,
  11. YesNo,
  12. YesNoCancel,
  13. RetryCancel,
  14. RetryAbortIgnore,
  15. TryCancelContinue
  16. }
  17. public enum ResultType
  18. {
  19. Yes,
  20. No,
  21. OK,
  22. Cancel,
  23. Retry,
  24. Abort,
  25. Ignore,
  26. Try,
  27. Continue,
  28. None
  29. }
  30. private Action<ResultType> resultCallback;
  31. private Type type;
  32. private GUILabel messageLabel;
  33. private ResultType result = ResultType.None;
  34. private bool constructed;
  35. public ResultType Result
  36. {
  37. get { return result; }
  38. }
  39. public static DialogBox Open(LocString title, LocString message, Type type, Action<ResultType> resultCallback = null)
  40. {
  41. return new DialogBox(title, message, type, resultCallback);
  42. }
  43. protected DialogBox(LocString title, LocString message, Type type, Action<ResultType> resultCallback)
  44. : base(false)
  45. {
  46. this.resultCallback = resultCallback;
  47. this.type = type;
  48. constructed = true;
  49. SetupGUI();
  50. Title = title;
  51. messageLabel.SetContent(message);
  52. Width = 280;
  53. Height = messageLabel.Bounds.height + 60;
  54. }
  55. private void OnInitialize()
  56. {
  57. if (constructed)
  58. SetupGUI();
  59. }
  60. private void OnEditorUpdate()
  61. {
  62. if (Input.IsButtonDown(ButtonCode.Return))
  63. {
  64. switch (type)
  65. {
  66. case Type.OK:
  67. case Type.OKCancel:
  68. ButtonClicked(ResultType.OK);
  69. break;
  70. case Type.RetryAbortIgnore:
  71. case Type.RetryCancel:
  72. ButtonClicked(ResultType.Retry);
  73. break;
  74. case Type.TryCancelContinue:
  75. ButtonClicked(ResultType.Try);
  76. break;
  77. case Type.YesNo:
  78. case Type.YesNoCancel:
  79. ButtonClicked(ResultType.Yes);
  80. break;
  81. }
  82. }
  83. if (Input.IsButtonDown(ButtonCode.Escape))
  84. {
  85. switch (type)
  86. {
  87. case Type.OK:
  88. ButtonClicked(ResultType.OK);
  89. break;
  90. case Type.RetryAbortIgnore:
  91. ButtonClicked(ResultType.Ignore);
  92. break;
  93. case Type.OKCancel:
  94. case Type.RetryCancel:
  95. case Type.YesNoCancel:
  96. case Type.TryCancelContinue:
  97. ButtonClicked(ResultType.Cancel);
  98. break;
  99. case Type.YesNo:
  100. ButtonClicked(ResultType.No);
  101. break;
  102. }
  103. }
  104. }
  105. private void SetupGUI()
  106. {
  107. messageLabel = new GUILabel("", EditorStyles.MultiLineLabel,
  108. GUIOption.FixedWidth(260), GUIOption.FlexibleHeight(0, 600));
  109. GUILayoutY layoutY = GUI.AddLayoutY();
  110. layoutY.AddSpace(10);
  111. GUILayoutX messageLayout = layoutY.AddLayoutX();
  112. messageLayout.AddFlexibleSpace();
  113. messageLayout.AddElement(messageLabel);
  114. messageLayout.AddFlexibleSpace();
  115. layoutY.AddSpace(10);
  116. GUILayoutX btnLayout = layoutY.AddLayoutX();
  117. btnLayout.AddFlexibleSpace();
  118. switch (type)
  119. {
  120. case Type.OK:
  121. {
  122. GUIButton okBtn = new GUIButton(new LocEdString("OK"));
  123. okBtn.OnClick += () => ButtonClicked(ResultType.OK);
  124. btnLayout.AddElement(okBtn);
  125. }
  126. break;
  127. case Type.OKCancel:
  128. {
  129. GUIButton okBtn = new GUIButton(new LocEdString("OK"));
  130. okBtn.OnClick += () => ButtonClicked(ResultType.OK);
  131. GUIButton cancelBtn = new GUIButton(new LocEdString("Cancel"));
  132. cancelBtn.OnClick += () => ButtonClicked(ResultType.Cancel);
  133. btnLayout.AddElement(okBtn);
  134. btnLayout.AddSpace(20);
  135. btnLayout.AddElement(cancelBtn);
  136. }
  137. break;
  138. case Type.RetryAbortIgnore:
  139. {
  140. GUIButton retryBtn = new GUIButton(new LocEdString("Retry"));
  141. retryBtn.OnClick += () => ButtonClicked(ResultType.Retry);
  142. GUIButton abortBtn = new GUIButton(new LocEdString("Abort"));
  143. abortBtn.OnClick += () => ButtonClicked(ResultType.Abort);
  144. GUIButton ignoreBtn = new GUIButton(new LocEdString("Ignore"));
  145. ignoreBtn.OnClick += () => ButtonClicked(ResultType.Ignore);
  146. btnLayout.AddElement(retryBtn);
  147. btnLayout.AddSpace(20);
  148. btnLayout.AddElement(abortBtn);
  149. btnLayout.AddSpace(20);
  150. btnLayout.AddElement(ignoreBtn);
  151. }
  152. break;
  153. case Type.RetryCancel:
  154. {
  155. GUIButton retryBtn = new GUIButton(new LocEdString("Retry"));
  156. retryBtn.OnClick += () => ButtonClicked(ResultType.Retry);
  157. GUIButton cancelBtn = new GUIButton(new LocEdString("Cancel"));
  158. cancelBtn.OnClick += () => ButtonClicked(ResultType.Cancel);
  159. btnLayout.AddElement(retryBtn);
  160. btnLayout.AddSpace(20);
  161. btnLayout.AddElement(cancelBtn);
  162. }
  163. break;
  164. case Type.TryCancelContinue:
  165. {
  166. GUIButton tryBtn = new GUIButton(new LocEdString("Try"));
  167. tryBtn.OnClick += () => ButtonClicked(ResultType.Try);
  168. GUIButton cancelBtn = new GUIButton(new LocEdString("Cancel"));
  169. cancelBtn.OnClick += () => ButtonClicked(ResultType.Cancel);
  170. GUIButton continueBtn = new GUIButton(new LocEdString("Continue"));
  171. continueBtn.OnClick += () => ButtonClicked(ResultType.Continue);
  172. btnLayout.AddElement(tryBtn);
  173. btnLayout.AddSpace(20);
  174. btnLayout.AddElement(cancelBtn);
  175. btnLayout.AddSpace(20);
  176. btnLayout.AddElement(continueBtn);
  177. }
  178. break;
  179. case Type.YesNo:
  180. {
  181. GUIButton yesBtn = new GUIButton(new LocEdString("Yes"));
  182. yesBtn.OnClick += () => ButtonClicked(ResultType.Yes);
  183. GUIButton noBtn = new GUIButton(new LocEdString("No"));
  184. noBtn.OnClick += () => ButtonClicked(ResultType.No);
  185. btnLayout.AddElement(yesBtn);
  186. btnLayout.AddSpace(20);
  187. btnLayout.AddElement(noBtn);
  188. }
  189. break;
  190. case Type.YesNoCancel:
  191. {
  192. GUIButton yesBtn = new GUIButton(new LocEdString("Yes"));
  193. yesBtn.OnClick += () => ButtonClicked(ResultType.Yes);
  194. GUIButton noBtn = new GUIButton(new LocEdString("No"));
  195. noBtn.OnClick += () => ButtonClicked(ResultType.No);
  196. GUIButton cancelBtn = new GUIButton(new LocEdString("Cancel"));
  197. cancelBtn.OnClick += () => ButtonClicked(ResultType.Cancel);
  198. btnLayout.AddElement(yesBtn);
  199. btnLayout.AddSpace(20);
  200. btnLayout.AddElement(noBtn);
  201. btnLayout.AddSpace(20);
  202. btnLayout.AddElement(cancelBtn);
  203. }
  204. break;
  205. }
  206. btnLayout.AddFlexibleSpace();
  207. layoutY.AddFlexibleSpace();
  208. }
  209. private void ButtonClicked(ResultType result)
  210. {
  211. this.result = result;
  212. if (resultCallback != null)
  213. resultCallback(result);
  214. Close();
  215. }
  216. }
  217. }