GUIElement.cs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313
  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. /// Determines if the element can be navigated to by using keys/buttons (e.g. the 'Tab' button on the keyboard.
  109. /// </summary>
  110. public bool AcceptsKeyFocus
  111. {
  112. get { return Internal_GetAcceptsKeyFocus(mCachedPtr); }
  113. set { Internal_SetAcceptsKeyFocus(mCachedPtr, value); }
  114. }
  115. /// <summary>
  116. /// Destroys this element and all its children. Removes the element from parent layout/panel.
  117. /// </summary>
  118. /// <remarks>
  119. /// Calling methods on a destroyed element is a no-operation. Destroyed elements aren't allowed to be assigned as
  120. /// children of other elements, or be parents of other elements.
  121. /// </remarks>
  122. public virtual void Destroy()
  123. {
  124. Internal_Destroy(mCachedPtr);
  125. }
  126. /// <summary>
  127. /// Sets element position relative to parent GUI panel.
  128. /// </summary>
  129. /// <param name="x">X position of the element in pixels, relative to parent GUI panel.</param>
  130. /// <param name="y">Y position of the element in pixels, relative to parent GUI panel.</param>
  131. /// <remarks>
  132. /// Be aware that this value will be ignored if GUI element is part of a layout because the layout controls placement
  133. /// of child elements.
  134. /// </remarks>
  135. public void SetPosition(int x, int y)
  136. {
  137. Internal_SetPosition(mCachedPtr, x, y);
  138. }
  139. /// <summary>
  140. /// Sets a fixed element width.
  141. /// </summary>
  142. /// <param name="width">Width in pixels.</param>
  143. public void SetWidth(int width)
  144. {
  145. Internal_SetWidth(mCachedPtr, width);
  146. }
  147. /// <summary>
  148. /// Sets a flexible element width. Element will be resized according to its contents and parent layout but will
  149. /// always stay within the provided range.
  150. /// </summary>
  151. /// <param name="minWidth">Minimum width in pixels. Element will never be smaller than this width.</param>
  152. /// <param name="maxWidth">Maximum width in pixels. Element will never be larger than this width. Specify zero for
  153. /// unlimited width.</param>
  154. public void SetFlexibleWidth(int minWidth, int maxWidth)
  155. {
  156. Internal_SetFlexibleWidth(mCachedPtr, minWidth, maxWidth);
  157. }
  158. /// <summary>
  159. /// Sets a fixed element height.
  160. /// </summary>
  161. /// <param name="height">Height in pixels.</param>
  162. public void SetHeight(int height)
  163. {
  164. Internal_SetHeight(mCachedPtr, height);
  165. }
  166. /// <summary>
  167. /// Sets a flexible element height. Element will be resized according to its contents and parent layout but will
  168. /// always stay within the provided range.
  169. /// </summary>
  170. /// <param name="minHeight">Minimum height in pixels. Element will never be smaller than this height.</param>
  171. /// <param name="maxHeight">Maximum height in pixels. Element will never be larger than this height. Specify zero
  172. /// for unlimited height.</param>
  173. public void SetFlexibleHeight(int minHeight, int maxHeight)
  174. {
  175. Internal_SetFlexibleHeight(mCachedPtr, minHeight, maxHeight);
  176. }
  177. /// <summary>
  178. /// Resets element bounds to their initial values dictated by the element's style.
  179. /// </summary>
  180. public void ResetDimensions()
  181. {
  182. Internal_ResetDimensions(mCachedPtr);
  183. }
  184. /// <summary>
  185. /// Assigns a new context menu that will be opened when the element is right clicked.
  186. /// </summary>
  187. /// <param name="menu">Object containing context menu contents. Can be null if no menu is wanted.</param>
  188. public void SetContextMenu(ContextMenu menu)
  189. {
  190. IntPtr menuPtr = IntPtr.Zero;
  191. if (menu != null)
  192. menuPtr = menu.GetCachedPtr();
  193. Internal_SetContextMenu(mCachedPtr, menuPtr);
  194. }
  195. /// <summary>
  196. /// Triggered by the native interop object when the element gains keyboard focus.
  197. /// </summary>
  198. private void Internal_OnFocusGained()
  199. {
  200. if (OnFocusGained != null)
  201. OnFocusGained();
  202. }
  203. /// <summary>
  204. /// Triggered by the native interop object when the element loses keyboard focus.
  205. /// </summary>
  206. private void Internal_OnFocusLost()
  207. {
  208. if (OnFocusLost != null)
  209. OnFocusLost();
  210. }
  211. [MethodImpl(MethodImplOptions.InternalCall)]
  212. private static extern bool Internal_GetVisible(IntPtr nativeInstance);
  213. [MethodImpl(MethodImplOptions.InternalCall)]
  214. private static extern void Internal_SetVisible(IntPtr nativeInstance, bool visible);
  215. [MethodImpl(MethodImplOptions.InternalCall)]
  216. private static extern bool Internal_GetActive(IntPtr nativeInstance);
  217. [MethodImpl(MethodImplOptions.InternalCall)]
  218. private static extern void Internal_SetActive(IntPtr nativeInstance, bool enabled);
  219. [MethodImpl(MethodImplOptions.InternalCall)]
  220. private static extern bool Internal_GetDisabled(IntPtr nativeInstance);
  221. [MethodImpl(MethodImplOptions.InternalCall)]
  222. private static extern void Internal_SetDisabled(IntPtr nativeInstance, bool disabled);
  223. [MethodImpl(MethodImplOptions.InternalCall)]
  224. private static extern void Internal_SetFocus(IntPtr nativeInstance, bool focus);
  225. [MethodImpl(MethodImplOptions.InternalCall)]
  226. private static extern bool Internal_GetBlocking(IntPtr nativeInstance);
  227. [MethodImpl(MethodImplOptions.InternalCall)]
  228. private static extern void Internal_SetBlocking(IntPtr nativeInstance, bool blocking);
  229. [MethodImpl(MethodImplOptions.InternalCall)]
  230. private static extern bool Internal_GetAcceptsKeyFocus(IntPtr nativeInstance);
  231. [MethodImpl(MethodImplOptions.InternalCall)]
  232. private static extern void Internal_SetAcceptsKeyFocus(IntPtr nativeInstance, bool accepts);
  233. [MethodImpl(MethodImplOptions.InternalCall)]
  234. private static extern GUILayout Internal_GetParent(IntPtr nativeInstance);
  235. [MethodImpl(MethodImplOptions.InternalCall)]
  236. private static extern void Internal_SetPosition(IntPtr nativeInstance, int x, int y);
  237. [MethodImpl(MethodImplOptions.InternalCall)]
  238. private static extern void Internal_SetWidth(IntPtr nativeInstance, int width);
  239. [MethodImpl(MethodImplOptions.InternalCall)]
  240. private static extern void Internal_SetFlexibleWidth(IntPtr nativeInstance, int minWidth, int maxWidth);
  241. [MethodImpl(MethodImplOptions.InternalCall)]
  242. private static extern void Internal_SetHeight(IntPtr nativeInstance, int height);
  243. [MethodImpl(MethodImplOptions.InternalCall)]
  244. private static extern void Internal_SetFlexibleHeight(IntPtr nativeInstance, int minHeight, int maxHeight);
  245. [MethodImpl(MethodImplOptions.InternalCall)]
  246. private static extern void Internal_ResetDimensions(IntPtr nativeInstance);
  247. [MethodImpl(MethodImplOptions.InternalCall)]
  248. private static extern void Internal_GetBounds(IntPtr nativeInstance, out Rect2I value);
  249. [MethodImpl(MethodImplOptions.InternalCall)]
  250. private static extern void Internal_SetBounds(IntPtr nativeInstance, ref Rect2I value);
  251. [MethodImpl(MethodImplOptions.InternalCall)]
  252. private static extern void Internal_GetVisualBounds(IntPtr nativeInstance, out Rect2I value);
  253. [MethodImpl(MethodImplOptions.InternalCall)]
  254. private static extern void Internal_SetContextMenu(IntPtr nativeInstance, IntPtr contextMenu);
  255. [MethodImpl(MethodImplOptions.InternalCall)]
  256. private static extern string Internal_GetStyle(IntPtr nativeInstance);
  257. [MethodImpl(MethodImplOptions.InternalCall)]
  258. private static extern void Internal_SetStyle(IntPtr nativeInstance, string style);
  259. [MethodImpl(MethodImplOptions.InternalCall)]
  260. private static extern void Internal_Destroy(IntPtr nativeInstance);
  261. }
  262. /** @} */
  263. }