EditorWindow.cs 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Runtime.CompilerServices;
  4. using BansheeEngine;
  5. namespace BansheeEditor
  6. {
  7. public class EditorWindow : ScriptObject
  8. {
  9. public int Width { get { return Internal_GetWidth(mCachedPtr); } }
  10. public int Height { get { return Internal_GetHeight(mCachedPtr); } }
  11. public bool HasFocus { get { return Internal_HasFocus(mCachedPtr); } }
  12. protected GUIPanel GUI;
  13. private List<GUIPanel> panels = new List<GUIPanel>();
  14. public static T OpenWindow<T>() where T : EditorWindow
  15. {
  16. return (T)Internal_CreateOrGetInstance(typeof(T).Namespace, typeof(T).Name);
  17. }
  18. public Vector2I ScreenToWindowPos(Vector2I screenPos)
  19. {
  20. Vector2I windowPos;
  21. Internal_ScreenToWindowPos(mCachedPtr, screenPos, out windowPos);
  22. return windowPos;
  23. }
  24. public Vector2I WindowToScreenPos(Vector2I windowPos)
  25. {
  26. Vector2I screenPos;
  27. Internal_WindowToScreenPos(mCachedPtr, windowPos, out screenPos);
  28. return screenPos;
  29. }
  30. private void OnInitializeInternal()
  31. {
  32. GUI = CreatePanel(0, 0, Width, Height);
  33. }
  34. private void OnDestroyInternal()
  35. {
  36. GUIPanel[] panelsCopy = panels.ToArray();
  37. for (int i = 0; i < panelsCopy.Length; i++)
  38. DestroyPanel(panelsCopy[i]);
  39. }
  40. protected virtual void WindowResized(int width, int height)
  41. {
  42. GUI.SetArea(0, 0, width, height);
  43. }
  44. protected virtual void FocusChanged(bool inFocus)
  45. {
  46. }
  47. internal GUIPanel CreatePanel(int x, int y, int width, int height)
  48. {
  49. GUIPanel newPanel = new GUIPanel();
  50. Internal_InitializeGUIPanel(mCachedPtr, newPanel);
  51. newPanel.Initialize();
  52. newPanel.SetArea(x, y, width, height);
  53. panels.Add(newPanel);
  54. return newPanel;
  55. }
  56. internal void DestroyPanel(GUIPanel panel)
  57. {
  58. panel.Destroy();
  59. panels.Remove(panel);
  60. Internal_DestroyGUIPanel(mCachedPtr, panel);
  61. }
  62. [MethodImpl(MethodImplOptions.InternalCall)]
  63. private static extern EditorWindow Internal_CreateOrGetInstance(string ns, string typeName);
  64. [MethodImpl(MethodImplOptions.InternalCall)]
  65. private static extern void Internal_InitializeGUIPanel(IntPtr nativeInstance, GUIPanel panel);
  66. [MethodImpl(MethodImplOptions.InternalCall)]
  67. private static extern void Internal_DestroyGUIPanel(IntPtr nativeInstance, GUIPanel panel);
  68. [MethodImpl(MethodImplOptions.InternalCall)]
  69. private static extern int Internal_GetWidth(IntPtr nativeInstance);
  70. [MethodImpl(MethodImplOptions.InternalCall)]
  71. private static extern int Internal_GetHeight(IntPtr nativeInstance);
  72. [MethodImpl(MethodImplOptions.InternalCall)]
  73. private static extern bool Internal_HasFocus(IntPtr nativeInstance);
  74. [MethodImpl(MethodImplOptions.InternalCall)]
  75. private static extern void Internal_ScreenToWindowPos(IntPtr nativeInstance, Vector2I position, out Vector2I windowPos);
  76. [MethodImpl(MethodImplOptions.InternalCall)]
  77. private static extern void Internal_WindowToScreenPos(IntPtr nativeInstance, Vector2I position, out Vector2I screenPos);
  78. }
  79. }