GUIElement.cs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Runtime.CompilerServices;
  6. namespace BansheeEngine
  7. {
  8. /** @addtogroup GUI_Engine
  9. * @{
  10. */
  11. /// <summary>
  12. /// Base class for all GUI elements. Every GUI element can at least be positioned in it's parent layout/panel and be
  13. /// hidden/visible, focused/unfocused and assigned a context menu.
  14. /// </summary>
  15. public abstract class GUIElement : ScriptObject
  16. {
  17. /// <summary>
  18. /// Triggered when a GUI element receives keyboard focus.
  19. /// </summary>
  20. public Action OnFocusGained;
  21. /// <summary>
  22. /// Triggered when a GUI element loses keyboard focus.
  23. /// </summary>
  24. public Action OnFocusLost;
  25. /// <summary>
  26. /// Returns the layout this element belongs to, if any.
  27. /// </summary>
  28. public GUILayout Parent
  29. {
  30. get { return Internal_GetParent(mCachedPtr); }
  31. }
  32. /// <summary>
  33. /// Name of the style that determines the appearance of this GUI element.
  34. /// </summary>
  35. public string Style
  36. {
  37. get { return Internal_GetStyle(mCachedPtr); }
  38. set { Internal_SetStyle(mCachedPtr, value); }
  39. }
  40. /// <summary>
  41. /// Gets or sets non-clipped bounds of the GUI element. Relative to a parent GUI panel.
  42. /// </summary>
  43. public Rect2I Bounds
  44. {
  45. get
  46. {
  47. Rect2I bounds;
  48. Internal_GetBounds(mCachedPtr, out bounds);
  49. return bounds;
  50. }
  51. set { Internal_SetBounds(mCachedPtr, ref value); }
  52. }
  53. /// <summary>
  54. /// Gets or sets non-clipped bounds of the GUI element including the margins. Relative to a parent GUI panel.
  55. /// </summary>
  56. public Rect2I VisualBounds
  57. {
  58. get
  59. {
  60. Rect2I bounds;
  61. Internal_GetVisualBounds(mCachedPtr, out bounds);
  62. return bounds;
  63. }
  64. }
  65. /// <summary>
  66. /// Makes the element hidden or visible. This will not affect the layout as the room for the element will still
  67. /// be reserved in the parent layout, use <see cref="Active"/> if you need to affect the layout as well.
  68. /// </summary>
  69. public bool Visible
  70. {
  71. set { Internal_SetVisible(mCachedPtr, value); }
  72. get { return Internal_GetVisible(mCachedPtr); }
  73. }
  74. /// <summary>
  75. /// Activates or deactivates the element, making it hidden or visible. When disabled it is essentially removed from
  76. /// the parent achieving the similar effect as if the element was destroyed.
  77. /// </summary>
  78. public bool Active
  79. {
  80. set { Internal_SetActive(mCachedPtr, value); }
  81. get { return Internal_GetActive(mCachedPtr); }
  82. }
  83. /// <summary>
  84. /// Disables or enables the element. Disabled elements cannot be interacted with and have a faded out appearance.
  85. /// </summary>
  86. public bool Disabled
  87. {
  88. set { Internal_SetDisabled(mCachedPtr, value); }
  89. get { return Internal_GetDisabled(mCachedPtr); }
  90. }
  91. /// <summary>
  92. /// Assigns or removes keyboard focus on this element.
  93. /// </summary>
  94. public bool Focus
  95. {
  96. set { Internal_SetFocus(mCachedPtr, value); }
  97. }
  98. /// <summary>
  99. /// Determines will this element block elements underneath it from receiving events like pointer click, hover
  100. /// on/off or be able to gain focus. True by default.
  101. /// </summary>
  102. public bool Blocking
  103. {
  104. get { return Internal_GetBlocking(mCachedPtr); }
  105. set { Internal_SetBlocking(mCachedPtr, value); }
  106. }
  107. /// <summary>
  108. /// Destroys this element and all its children. Removes the element from parent layout/panel.
  109. /// </summary>
  110. /// <remarks>
  111. /// Calling methods on a destroyed element is a no-operation. Destroyed elements aren't allowed to be assigned as
  112. /// children of other elements, or be parents of other elements.
  113. /// </remarks>
  114. public virtual void Destroy()
  115. {
  116. Internal_Destroy(mCachedPtr);
  117. }
  118. /// <summary>
  119. /// Sets element position relative to parent GUI panel.
  120. /// </summary>
  121. /// <param name="x">X position of the element in pixels, relative to parent GUI panel.</param>
  122. /// <param name="y">Y position of the element in pixels, relative to parent GUI panel.</param>
  123. /// <remarks>
  124. /// Be aware that this value will be ignored if GUI element is part of a layout because the layout controls placement
  125. /// of child elements.
  126. /// </remarks>
  127. public void SetPosition(int x, int y)
  128. {
  129. Internal_SetPosition(mCachedPtr, x, y);
  130. }
  131. /// <summary>
  132. /// Sets a fixed element width.
  133. /// </summary>
  134. /// <param name="width">Width in pixels.</param>
  135. public void SetWidth(int width)
  136. {
  137. Internal_SetWidth(mCachedPtr, width);
  138. }
  139. /// <summary>
  140. /// Sets a flexible element width. Element will be resized according to its contents and parent layout but will
  141. /// always stay within the provided range.
  142. /// </summary>
  143. /// <param name="minWidth">Minimum width in pixels. Element will never be smaller than this width.</param>
  144. /// <param name="maxWidth">Maximum width in pixels. Element will never be larger than this width. Specify zero for
  145. /// unlimited width.</param>
  146. public void SetFlexibleWidth(int minWidth, int maxWidth)
  147. {
  148. Internal_SetFlexibleWidth(mCachedPtr, minWidth, maxWidth);
  149. }
  150. /// <summary>
  151. /// Sets a fixed element height.
  152. /// </summary>
  153. /// <param name="height">Height in pixels.</param>
  154. public void SetHeight(int height)
  155. {
  156. Internal_SetHeight(mCachedPtr, height);
  157. }
  158. /// <summary>
  159. /// Sets a flexible element height. Element will be resized according to its contents and parent layout but will
  160. /// always stay within the provided range.
  161. /// </summary>
  162. /// <param name="minHeight">Minimum height in pixels. Element will never be smaller than this height.</param>
  163. /// <param name="maxHeight">Maximum height in pixels. Element will never be larger than this height. Specify zero
  164. /// for unlimited height.</param>
  165. public void SetFlexibleHeight(int minHeight, int maxHeight)
  166. {
  167. Internal_SetFlexibleHeight(mCachedPtr, minHeight, maxHeight);
  168. }
  169. /// <summary>
  170. /// Resets element bounds to their initial values dictated by the element's style.
  171. /// </summary>
  172. public void ResetDimensions()
  173. {
  174. Internal_ResetDimensions(mCachedPtr);
  175. }
  176. /// <summary>
  177. /// Assigns a new context menu that will be opened when the element is right clicked.
  178. /// </summary>
  179. /// <param name="menu">Object containing context menu contents. Can be null if no menu is wanted.</param>
  180. public void SetContextMenu(ContextMenu menu)
  181. {
  182. IntPtr menuPtr = IntPtr.Zero;
  183. if (menu != null)
  184. menuPtr = menu.GetCachedPtr();
  185. Internal_SetContextMenu(mCachedPtr, menuPtr);
  186. }
  187. /// <summary>
  188. /// Triggered by the native interop object when the element gains keyboard focus.
  189. /// </summary>
  190. private void Internal_OnFocusGained()
  191. {
  192. if (OnFocusGained != null)
  193. OnFocusGained();
  194. }
  195. /// <summary>
  196. /// Triggered by the native interop object when the element loses keyboard focus.
  197. /// </summary>
  198. private void Internal_OnFocusLost()
  199. {
  200. if (OnFocusLost != null)
  201. OnFocusLost();
  202. }
  203. [MethodImpl(MethodImplOptions.InternalCall)]
  204. private static extern bool Internal_GetVisible(IntPtr nativeInstance);
  205. [MethodImpl(MethodImplOptions.InternalCall)]
  206. private static extern void Internal_SetVisible(IntPtr nativeInstance, bool visible);
  207. [MethodImpl(MethodImplOptions.InternalCall)]
  208. private static extern bool Internal_GetActive(IntPtr nativeInstance);
  209. [MethodImpl(MethodImplOptions.InternalCall)]
  210. private static extern void Internal_SetActive(IntPtr nativeInstance, bool enabled);
  211. [MethodImpl(MethodImplOptions.InternalCall)]
  212. private static extern bool Internal_GetDisabled(IntPtr nativeInstance);
  213. [MethodImpl(MethodImplOptions.InternalCall)]
  214. private static extern void Internal_SetDisabled(IntPtr nativeInstance, bool disabled);
  215. [MethodImpl(MethodImplOptions.InternalCall)]
  216. private static extern void Internal_SetFocus(IntPtr nativeInstance, bool focus);
  217. [MethodImpl(MethodImplOptions.InternalCall)]
  218. private static extern bool Internal_GetBlocking(IntPtr nativeInstance);
  219. [MethodImpl(MethodImplOptions.InternalCall)]
  220. private static extern void Internal_SetBlocking(IntPtr nativeInstance, bool blocking);
  221. [MethodImpl(MethodImplOptions.InternalCall)]
  222. private static extern GUILayout Internal_GetParent(IntPtr nativeInstance);
  223. [MethodImpl(MethodImplOptions.InternalCall)]
  224. private static extern void Internal_SetPosition(IntPtr nativeInstance, int x, int y);
  225. [MethodImpl(MethodImplOptions.InternalCall)]
  226. private static extern void Internal_SetWidth(IntPtr nativeInstance, int width);
  227. [MethodImpl(MethodImplOptions.InternalCall)]
  228. private static extern void Internal_SetFlexibleWidth(IntPtr nativeInstance, int minWidth, int maxWidth);
  229. [MethodImpl(MethodImplOptions.InternalCall)]
  230. private static extern void Internal_SetHeight(IntPtr nativeInstance, int height);
  231. [MethodImpl(MethodImplOptions.InternalCall)]
  232. private static extern void Internal_SetFlexibleHeight(IntPtr nativeInstance, int minHeight, int maxHeight);
  233. [MethodImpl(MethodImplOptions.InternalCall)]
  234. private static extern void Internal_ResetDimensions(IntPtr nativeInstance);
  235. [MethodImpl(MethodImplOptions.InternalCall)]
  236. private static extern void Internal_GetBounds(IntPtr nativeInstance, out Rect2I value);
  237. [MethodImpl(MethodImplOptions.InternalCall)]
  238. private static extern void Internal_SetBounds(IntPtr nativeInstance, ref Rect2I value);
  239. [MethodImpl(MethodImplOptions.InternalCall)]
  240. private static extern void Internal_GetVisualBounds(IntPtr nativeInstance, out Rect2I value);
  241. [MethodImpl(MethodImplOptions.InternalCall)]
  242. private static extern void Internal_SetContextMenu(IntPtr nativeInstance, IntPtr contextMenu);
  243. [MethodImpl(MethodImplOptions.InternalCall)]
  244. private static extern string Internal_GetStyle(IntPtr nativeInstance);
  245. [MethodImpl(MethodImplOptions.InternalCall)]
  246. private static extern void Internal_SetStyle(IntPtr nativeInstance, string style);
  247. [MethodImpl(MethodImplOptions.InternalCall)]
  248. private static extern void Internal_Destroy(IntPtr nativeInstance);
  249. }
  250. /** @} */
  251. }