slotscontainer.c 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285
  1. class SlotsContainer: Container
  2. {
  3. protected ref array<ref SlotsIcon> m_Icons;
  4. int m_VisibleColumnCount;
  5. void SlotsContainer( LayoutHolder parent, EntityAI slot_parent )
  6. {
  7. m_Icons = new array<ref SlotsIcon>;
  8. for ( int i = 0; i < ITEMS_IN_ROW; i++ )
  9. {
  10. if ( GetRootWidget().FindAnyWidget( "Icon" + i ) )
  11. m_Icons.Insert( new SlotsIcon( this, GetRootWidget().FindAnyWidget( "Icon" + i ), i , slot_parent) );
  12. /*else
  13. {
  14. Widget child = GetRootWidget().GetChildren();
  15. while ( child )
  16. {
  17. child = child.GetSibling();
  18. }
  19. }*/
  20. }
  21. }
  22. override void SetDefaultFocus( bool while_micromanagment_mode = false )
  23. {
  24. m_FocusedColumn = 0;
  25. for (int i = 0; i < GetColumnCount(); i++)
  26. {
  27. SlotsIcon icon = m_Icons[i];
  28. if (icon.IsVisible())
  29. {
  30. m_FocusedColumn = i;
  31. break;
  32. }
  33. }
  34. SetFocus( m_FocusedColumn );
  35. }
  36. override void SetLastFocus()
  37. {
  38. SetDefaultFocus();
  39. }
  40. void SetFocus( int index )
  41. {
  42. if ( index >= 0 && index < m_Icons.Count() )
  43. {
  44. m_Icons.Get( index ).GetSelectedPanel().Show( true );
  45. }
  46. UpdateIcon();
  47. }
  48. void SetVisibleFocus( int index )
  49. {
  50. Unfocus();
  51. int visible_icons_count = 0;
  52. m_FocusedColumn = 0;
  53. for (int i = 0; i < GetColumnCount(); i++)
  54. {
  55. SlotsIcon icon = m_Icons[i];
  56. if (icon.IsVisible())
  57. {
  58. m_FocusedColumn = i;
  59. if (visible_icons_count == index)
  60. break;
  61. visible_icons_count++;
  62. }
  63. }
  64. SetFocus( m_FocusedColumn );
  65. }
  66. int GetVisibleFocus()
  67. {
  68. int visible_icons_count = 0;
  69. for (int i = 0; i < GetColumnCount(); i++)
  70. {
  71. if (m_FocusedColumn == i)
  72. {
  73. return visible_icons_count;
  74. }
  75. SlotsIcon icon = m_Icons[i];
  76. if (icon.IsVisible())
  77. {
  78. visible_icons_count++;
  79. }
  80. }
  81. return visible_icons_count - 1;
  82. }
  83. override void SetNextRightActive()
  84. {
  85. Unfocus();
  86. int index = m_FocusedColumn + 1;
  87. for (int i = 0; i < GetColumnCount(); i++ )
  88. {
  89. if (index >= GetColumnCount())
  90. {
  91. index = 0;
  92. }
  93. SlotsIcon icon = m_Icons[index];
  94. if (icon.IsVisible())
  95. {
  96. m_FocusedColumn = index;
  97. break;
  98. }
  99. index++;
  100. }
  101. UpdateIcon();
  102. }
  103. override void SetNextLeftActive()
  104. {
  105. Unfocus();
  106. int index = m_FocusedColumn - 1;
  107. for (int i = 0; i < GetColumnCount(); i++ )
  108. {
  109. if (index < 0)
  110. {
  111. index = GetColumnCount() - 1;
  112. }
  113. SlotsIcon icon = m_Icons[index];
  114. if (icon.IsVisible())
  115. {
  116. m_FocusedColumn = index;
  117. break;
  118. }
  119. index--;
  120. }
  121. UpdateIcon();
  122. }
  123. void UpdateIcon()
  124. {
  125. float x, y;
  126. SlotsIcon icon = GetSlotIcon( m_FocusedColumn );
  127. icon.GetSelectedPanel().Show( true );
  128. icon.GetSelectedPanel().GetScreenPos( x, y );
  129. EntityAI focused_item = GetFocusedItem();
  130. if ( focused_item )
  131. {
  132. PrepareOwnedTooltip( focused_item, -1, y ); //custom positioning for the controller
  133. }
  134. else
  135. {
  136. PrepareOwnedSlotsTooltip( icon.GetSelectedPanel(), icon.GetSlotDisplayName(), icon.GetSlotDesc(), x, y );
  137. }
  138. }
  139. override void UnfocusAll()
  140. {
  141. for (int i = 0; i < m_Icons.Count(); i++)
  142. {
  143. m_Icons.Get( i ).GetSelectedPanel().Show( false );
  144. }
  145. }
  146. override void Unfocus()
  147. {
  148. Widget w = m_Icons.Get( m_FocusedColumn ).GetSelectedPanel();
  149. if ( w )
  150. {
  151. w.Show( false );
  152. }
  153. }
  154. override bool SelectItem()
  155. {
  156. ItemBase item = ItemBase.Cast( GetFocusedItem() );
  157. SlotsIcon icon = GetFocusedSlotsIcon();
  158. if( item && !item.IsLockedInSlot() && !icon.IsOutOfReach() && !icon.IsReserved() && item.IsTakeable() && item.CanPutIntoHands(null))
  159. {
  160. ItemManager.GetInstance().SetSelectedItemEx(item, null, icon);
  161. return true;
  162. }
  163. return false;
  164. }
  165. override bool IsEmpty()
  166. {
  167. return false;
  168. }
  169. override bool IsDisplayable()
  170. {
  171. if (m_ForcedShow)
  172. return true;
  173. for (int i = 0; i < m_ColumnCount; i++)
  174. {
  175. if ( GetSlotIcon(i).IsVisible() )
  176. {
  177. return true;
  178. }
  179. }
  180. return false;
  181. }
  182. SlotsIcon GetSlotIcon( int index )
  183. {
  184. if ( m_Icons.IsValidIndex( index ) )
  185. {
  186. return m_Icons.Get( index );
  187. }
  188. return null;
  189. }
  190. override SlotsIcon GetFocusedSlotsIcon()
  191. {
  192. if (m_Icons.Count())
  193. {
  194. return m_Icons.Get(m_FocusedColumn);
  195. }
  196. return null;
  197. }
  198. override EntityAI GetFocusedItem()
  199. {
  200. SlotsIcon focus_icon = GetFocusedSlotsIcon();
  201. if(focus_icon && !focus_icon.IsReserved())
  202. {
  203. return EntityAI.Cast(focus_icon.GetObject());
  204. }
  205. return null;
  206. }
  207. override void SetLayoutName()
  208. {
  209. #ifdef PLATFORM_CONSOLE
  210. m_LayoutName = WidgetLayoutName.InventorySlotsContainerXbox;
  211. #else
  212. switch ( InventoryMenu.GetWidthType() )
  213. {
  214. case ScreenWidthType.NARROW:
  215. {
  216. m_LayoutName = WidgetLayoutName.InventorySlotsContainerNarrow;
  217. break;
  218. }
  219. case ScreenWidthType.MEDIUM:
  220. {
  221. m_LayoutName = WidgetLayoutName.InventorySlotsContainerMedium;
  222. break;
  223. }
  224. case ScreenWidthType.WIDE:
  225. {
  226. m_LayoutName = WidgetLayoutName.InventorySlotsContainerWide;
  227. break;
  228. }
  229. }
  230. #endif
  231. }
  232. //! Returns 'true' if radial icon is VISIBLE and also OPEN (individual icon or any icon, use parameter..)
  233. bool VerifySlotsIconVisibility(int idx = -1)
  234. {
  235. if (idx != -1)
  236. {
  237. return m_Icons[idx].IsVisible() && m_Icons[idx].GetRadialIconPanel().IsVisible() && m_Icons[idx].GetRadialIcon().IsVisible();
  238. }
  239. else
  240. {
  241. int count = m_Icons.Count();
  242. for (int i = 0; i < count; i++)
  243. {
  244. if (m_Icons[i].IsVisible() && m_Icons[i].GetRadialIconPanel().IsVisible() && m_Icons[i].GetRadialIcon().IsVisible())
  245. {
  246. return true;
  247. }
  248. }
  249. }
  250. return false;
  251. }
  252. }