IMGUIHooks.cs 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Reflection;
  5. using System.Text;
  6. using Harmony;
  7. using UnityEngine;
  8. using static UnityEngine.GUI;
  9. namespace XUnity.AutoTranslator.Plugin.Core.IMGUI
  10. {
  11. public static class IMGUIHooks
  12. {
  13. public static readonly Type[] All = new[] {
  14. typeof( BeginGroupHook ),
  15. typeof( BoxHook ),
  16. typeof( DoRepeatButtonHook ),
  17. typeof( DoLabelHook ),
  18. typeof( DoButtonHook ),
  19. typeof( DoModalWindowHook ),
  20. typeof( DoWindowHook ),
  21. typeof( DoTextFieldHook ),
  22. typeof( DoToggleHook ),
  23. };
  24. }
  25. [Harmony, HarmonyAfter( Constants.KnownPlugins.DynamicTranslationLoader )]
  26. public static class BeginGroupHook
  27. {
  28. static bool Prepare( HarmonyInstance instance )
  29. {
  30. return Constants.Types.GUI != null;
  31. }
  32. static MethodBase TargetMethod( HarmonyInstance instance )
  33. {
  34. return AccessTools.Method( Constants.Types.GUI, "BeginGroup", new[] { typeof( Rect ), typeof( GUIContent ), typeof( GUIStyle ) } );
  35. }
  36. static void Prefix( GUIContent content )
  37. {
  38. AutoTranslationPlugin.Current.Hook_TextChanged( content );
  39. }
  40. }
  41. [Harmony, HarmonyAfter( Constants.KnownPlugins.DynamicTranslationLoader )]
  42. public static class BoxHook
  43. {
  44. static bool Prepare( HarmonyInstance instance )
  45. {
  46. return Constants.Types.GUI != null;
  47. }
  48. static MethodBase TargetMethod( HarmonyInstance instance )
  49. {
  50. return AccessTools.Method( Constants.Types.GUI, "Box", new[] { typeof( Rect ), typeof( GUIContent ), typeof( GUIStyle ) } );
  51. }
  52. static void Prefix( GUIContent content )
  53. {
  54. AutoTranslationPlugin.Current.Hook_TextChanged( content );
  55. }
  56. }
  57. [Harmony, HarmonyAfter( Constants.KnownPlugins.DynamicTranslationLoader )]
  58. public static class DoRepeatButtonHook
  59. {
  60. static bool Prepare( HarmonyInstance instance )
  61. {
  62. return Constants.Types.GUI != null;
  63. }
  64. static MethodBase TargetMethod( HarmonyInstance instance )
  65. {
  66. return AccessTools.Method( Constants.Types.GUI, "DoRepeatButton", new[] { typeof( Rect ), typeof( GUIContent ), typeof( GUIStyle ), typeof( FocusType ) } );
  67. }
  68. static void Prefix( GUIContent content )
  69. {
  70. AutoTranslationPlugin.Current.Hook_TextChanged( content );
  71. }
  72. }
  73. [Harmony, HarmonyAfter( Constants.KnownPlugins.DynamicTranslationLoader )]
  74. public static class DoLabelHook
  75. {
  76. static bool Prepare( HarmonyInstance instance )
  77. {
  78. return Constants.Types.GUI != null;
  79. }
  80. static MethodBase TargetMethod( HarmonyInstance instance )
  81. {
  82. return AccessTools.Method( Constants.Types.GUI, "DoLabel", new[] { typeof( Rect ), typeof( GUIContent ), typeof( IntPtr ) } );
  83. }
  84. static void Prefix( GUIContent content )
  85. {
  86. AutoTranslationPlugin.Current.Hook_TextChanged( content );
  87. }
  88. }
  89. [Harmony, HarmonyAfter( Constants.KnownPlugins.DynamicTranslationLoader )]
  90. public static class DoButtonHook
  91. {
  92. static bool Prepare( HarmonyInstance instance )
  93. {
  94. return Constants.Types.GUI != null;
  95. }
  96. static MethodBase TargetMethod( HarmonyInstance instance )
  97. {
  98. return AccessTools.Method( Constants.Types.GUI, "DoButton", new[] { typeof( Rect ), typeof( GUIContent ), typeof( IntPtr ) } );
  99. }
  100. static void Prefix( GUIContent content )
  101. {
  102. AutoTranslationPlugin.Current.Hook_TextChanged( content );
  103. }
  104. }
  105. [Harmony, HarmonyAfter( Constants.KnownPlugins.DynamicTranslationLoader )]
  106. public static class DoModalWindowHook
  107. {
  108. static bool Prepare( HarmonyInstance instance )
  109. {
  110. return Constants.Types.GUI != null;
  111. }
  112. static MethodBase TargetMethod( HarmonyInstance instance )
  113. {
  114. return AccessTools.Method( Constants.Types.GUI, "DoModalWindow", new[] { typeof( int ), typeof( Rect ), typeof( WindowFunction ), typeof( GUIContent ), typeof( GUIStyle ), typeof( GUISkin ) } );
  115. }
  116. static void Prefix( GUIContent content )
  117. {
  118. AutoTranslationPlugin.Current.Hook_TextChanged( content );
  119. }
  120. }
  121. [Harmony, HarmonyAfter( Constants.KnownPlugins.DynamicTranslationLoader )]
  122. public static class DoWindowHook
  123. {
  124. static bool Prepare( HarmonyInstance instance )
  125. {
  126. return Constants.Types.GUI != null;
  127. }
  128. static MethodBase TargetMethod( HarmonyInstance instance )
  129. {
  130. return AccessTools.Method( Constants.Types.GUI, "DoWindow", new[] { typeof( int ), typeof( Rect ), typeof( WindowFunction ), typeof( GUIContent ), typeof( GUIStyle ), typeof( GUISkin ), typeof( bool ) } );
  131. }
  132. static void Prefix( GUIContent title )
  133. {
  134. AutoTranslationPlugin.Current.Hook_TextChanged( title );
  135. }
  136. }
  137. [Harmony, HarmonyAfter( Constants.KnownPlugins.DynamicTranslationLoader )]
  138. public static class DoButtonGridHook
  139. {
  140. static bool Prepare( HarmonyInstance instance )
  141. {
  142. return Constants.Types.GUI != null;
  143. }
  144. static MethodBase TargetMethod( HarmonyInstance instance )
  145. {
  146. return AccessTools.Method( Constants.Types.GUI, "DoButtonGrid", new[] { typeof( Rect ), typeof( int ), typeof( GUIContent[] ), typeof( int ), typeof( GUIStyle ), typeof( GUIStyle ), typeof( GUIStyle ), typeof( GUIStyle ) } );
  147. }
  148. static void Prefix( GUIContent[] contents )
  149. {
  150. foreach( var content in contents )
  151. {
  152. AutoTranslationPlugin.Current.Hook_TextChanged( content );
  153. }
  154. }
  155. }
  156. [Harmony, HarmonyAfter( Constants.KnownPlugins.DynamicTranslationLoader )]
  157. public static class DoTextFieldHook
  158. {
  159. static bool Prepare( HarmonyInstance instance )
  160. {
  161. return Constants.Types.GUI != null;
  162. }
  163. static MethodBase TargetMethod( HarmonyInstance instance )
  164. {
  165. return AccessTools.Method( Constants.Types.GUI, "DoTextField", new[] { typeof( Rect ), typeof( int ), typeof( GUIContent ), typeof( bool ), typeof( int ), typeof( GUIStyle ), typeof( string ) } );
  166. }
  167. static void Prefix( GUIContent content )
  168. {
  169. AutoTranslationPlugin.Current.Hook_TextChanged( content );
  170. }
  171. }
  172. [Harmony, HarmonyAfter( Constants.KnownPlugins.DynamicTranslationLoader )]
  173. public static class DoToggleHook
  174. {
  175. static bool Prepare( HarmonyInstance instance )
  176. {
  177. return Constants.Types.GUI != null;
  178. }
  179. static MethodBase TargetMethod( HarmonyInstance instance )
  180. {
  181. return AccessTools.Method( Constants.Types.GUI, "DoToggle", new[] { typeof( Rect ), typeof( int ), typeof( bool ), typeof( GUIContent ), typeof( IntPtr ) } );
  182. }
  183. static void Prefix( GUIContent content )
  184. {
  185. AutoTranslationPlugin.Current.Hook_TextChanged( content );
  186. }
  187. }
  188. }