vicinitycontainer.c 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703
  1. class VicinityContainer: CollapsibleContainer
  2. {
  3. ref VicinitySlotsContainer m_VicinityIconsContainer;
  4. ref map<EntityAI, ref Container> m_ShowedItems = new ref map<EntityAI, ref Container>;
  5. ref map<int, ref Container> m_ShowedItemsIDs = new ref map<int, ref Container>;
  6. ref array<EntityAI> m_ShowedItemIcons = new array<EntityAI>;
  7. ref map<CargoBase, ref Container> m_ShowedCargos = new ref map<CargoBase, ref Container>;
  8. protected bool m_IsProcessing = false; // Prevents refreshing every time a child is added while it is still processing
  9. const float DISTANCE_TO_ENTITIES = 1.0;
  10. const float DISTANCE_TO_THE_REST = 0.5;
  11. void VicinityContainer( LayoutHolder parent, int sort = -1 )
  12. {
  13. m_VicinityIconsContainer = new VicinitySlotsContainer( this );
  14. m_Body.Insert( m_VicinityIconsContainer );
  15. m_VicinityIconsContainer.GetRootWidget().SetColor(166 << 24 | 120 << 16 | 120 << 8 | 120);
  16. #ifndef PLATFORM_CONSOLE
  17. LeftArea leftArea = LeftArea.Cast(GetParent());
  18. if (leftArea)
  19. {
  20. leftArea.GetSlotsHeader().AddChild(GetHeader().GetRootWidget());
  21. leftArea.GetSlotsArea().AddChild(m_VicinityIconsContainer.GetRootWidget());
  22. }
  23. #endif
  24. m_MainWidget = m_RootWidget.FindAnyWidget( "body" );
  25. WidgetEventHandler.GetInstance().RegisterOnChildAdd( m_MainWidget, this, "OnChildAdd" );
  26. WidgetEventHandler.GetInstance().RegisterOnChildRemove( m_MainWidget, this, "OnChildRemove" );
  27. RecomputeOpenedContainers();
  28. m_CollapsibleHeader.SetName("#container_vicinity");
  29. LoadDefaultState();
  30. }
  31. bool IsVicinityContainerIconsActive()
  32. {
  33. return m_VicinityIconsContainer.IsActive();
  34. }
  35. VicinitySlotsContainer GetVicinityIconsContainer()
  36. {
  37. return m_VicinityIconsContainer;
  38. }
  39. bool IsContainerWithCargoActive()
  40. {
  41. return ( ContainerWithCargo.Cast( GetFocusedContainer() ) != null );
  42. }
  43. bool IsItemWithAttachmentsActive()
  44. {
  45. return ( ContainerWithCargoAndAttachments.Cast( GetFocusedContainer() ) != null );
  46. }
  47. bool IsItemWithCategoriesActive()
  48. {
  49. return ( AttachmentCategoriesContainer.Cast( GetFocusedContainer() ) != null );
  50. }
  51. void TraverseShowedItems()
  52. {
  53. map<string, bool> serialized_types = new map<string, bool>();
  54. for ( int i = 0; i < m_ShowedItems.Count(); i++ )
  55. {
  56. EntityAI entity = m_ShowedItems.GetKey( i );
  57. Container container = m_ShowedItems.GetElement( i );
  58. string type = entity.GetType();
  59. if ( container.IsInherited( ContainerWithCargo ) )
  60. {
  61. if ( !serialized_types.Contains( type ) )
  62. {
  63. ContainerWithCargo item_with_cargo = ContainerWithCargo.Cast( container );
  64. serialized_types.Insert( type, item_with_cargo.IsOpened() );
  65. }
  66. }
  67. }
  68. if ( serialized_types.Count() > 0 )
  69. {
  70. FileSerializer file = new FileSerializer();
  71. if ( file.Open( "inventory_state.save", FileMode.APPEND ) )
  72. {
  73. file.Write( serialized_types.Count() );
  74. for ( i = 0; i < serialized_types.Count(); i++ )
  75. {
  76. file.Write( serialized_types.GetKey( i ) );
  77. file.Write( serialized_types.GetElement( i ) );
  78. }
  79. }
  80. file.Close();
  81. }
  82. }
  83. override void DraggingOverHeader( Widget w, int x, int y, Widget receiver )
  84. {
  85. if ( w == null )
  86. {
  87. return;
  88. }
  89. ItemPreviewWidget ipw = ItemPreviewWidget.Cast( w.FindAnyWidget( "Render" ) );
  90. if ( !ipw )
  91. {
  92. string name = w.GetName();
  93. name.Replace( "PanelWidget", "Render" );
  94. ipw = ItemPreviewWidget.Cast( w.FindAnyWidget( name ) );
  95. }
  96. if ( !ipw && ItemPreviewWidget.Cast( w ) )
  97. {
  98. ipw = ItemPreviewWidget.Cast( w );
  99. }
  100. if ( !ipw || !ipw.GetItem() )
  101. {
  102. return;
  103. }
  104. if ( ipw.GetItem() && GetGame().GetPlayer().CanDropEntity( ipw.GetItem() ) && ipw.GetItem().GetInventory().CanRemoveEntity() && m_ShowedItemIcons.Find( ipw.GetItem() ) == -1 )
  105. {
  106. ColorManager.GetInstance().SetColor( w, ColorManager.GREEN_COLOR );
  107. ItemManager.GetInstance().HideDropzones();
  108. ItemManager.GetInstance().GetLeftDropzone().SetAlpha( 1 );
  109. #ifndef PLATFORM_CONSOLE
  110. bool ignorePointer = ItemManager.GetInstance().GetLeftSlotsScroller().GetFlags() & WidgetFlags.IGNOREPOINTER;
  111. if (!ignorePointer)
  112. {
  113. ItemManager.GetInstance().GetLeftSlotsScroller().SetFlags(WidgetFlags.IGNOREPOINTER);
  114. }
  115. #endif
  116. }
  117. else
  118. {
  119. ColorManager.GetInstance().SetColor( w, ColorManager.RED_COLOR );
  120. ItemManager.GetInstance().ShowSourceDropzone( ipw.GetItem() );
  121. }
  122. }
  123. void DraggingOverIcon( Widget w, int x, int y, Widget receiver )
  124. {
  125. string name = receiver.GetName();
  126. name.Replace("PanelWidget", "Render");
  127. ItemPreviewWidget receiver_iw = ItemPreviewWidget.Cast( receiver.FindAnyWidget(name) );
  128. EntityAI receiver_item = receiver_iw.GetItem();
  129. ItemPreviewWidget ipw = ItemPreviewWidget.Cast( w.FindAnyWidget( "Render" ) );
  130. if ( !ipw )
  131. {
  132. name = w.GetName();
  133. name.Replace( "PanelWidget", "Render" );
  134. ipw = ItemPreviewWidget.Cast( w.FindAnyWidget( name ) );
  135. }
  136. if ( !ipw && ItemPreviewWidget.Cast( w ) )
  137. {
  138. ipw = ItemPreviewWidget.Cast( w );
  139. }
  140. if (!ipw)
  141. {
  142. return;
  143. }
  144. if ( !ItemBase.Cast( receiver_item ) || !ipw.GetItem() )
  145. {
  146. return;
  147. }
  148. if ( ipw.GetItem().GetInventory().CanRemoveEntity() || m_ShowedItemIcons.Find( ipw.GetItem() ) > -1 )
  149. {
  150. if ( ( ItemBase.Cast( receiver_item ) ).CanBeCombined( ItemBase.Cast( ipw.GetItem() ) ) )
  151. {
  152. ColorManager.GetInstance().SetColor( w, ColorManager.COMBINE_COLOR );
  153. ItemManager.GetInstance().HideDropzones();
  154. ItemManager.GetInstance().GetLeftDropzone().SetAlpha( 1 );
  155. return;
  156. }
  157. else if ( GameInventory.CanSwapEntitiesEx( receiver_item, ipw.GetItem() ) )
  158. {
  159. ColorManager.GetInstance().SetColor( w, ColorManager.SWAP_COLOR );
  160. ItemManager.GetInstance().HideDropzones();
  161. ItemManager.GetInstance().GetLeftDropzone().SetAlpha( 1 );
  162. return;
  163. }
  164. /*else if( GetGame().GetPlayer().CanDropEntity( ipw.GetItem() ) )
  165. {
  166. ColorManager.GetInstance().SetColor( w, ColorManager.GREEN_COLOR );
  167. ItemManager.GetInstance().HideDropzones();
  168. ItemManager.GetInstance().GetLeftDropzone().SetAlpha( 1 );
  169. return;
  170. }*/
  171. }
  172. ColorManager.GetInstance().SetColor( w, ColorManager.RED_COLOR );
  173. ItemManager.GetInstance().ShowSourceDropzone( ipw.GetItem() );
  174. }
  175. void OnDropReceivedFromIcon( Widget w, int x, int y, Widget receiver )
  176. {
  177. string name = receiver.GetName();
  178. name.Replace("PanelWidget", "Render");
  179. ItemPreviewWidget receiver_iw = ItemPreviewWidget.Cast( receiver.FindAnyWidget(name) );
  180. EntityAI receiver_item = receiver_iw.GetItem();
  181. ItemPreviewWidget ipw = ItemPreviewWidget.Cast( w.FindAnyWidget( "Render" ) );
  182. if ( !ipw )
  183. {
  184. name = w.GetName();
  185. name.Replace( "PanelWidget", "Render" );
  186. ipw = ItemPreviewWidget.Cast( w.FindAnyWidget( name ) );
  187. }
  188. if ( !ItemBase.Cast( receiver_item ) || !ipw.GetItem() )
  189. {
  190. return;
  191. }
  192. EntityAI item = ipw.GetItem();
  193. bool equal_typed = item.GetType() == receiver_item.GetType();
  194. if ( !receiver_item.IsInherited( ItemBase ) || item == null )
  195. {
  196. return;
  197. }
  198. PlayerBase player = PlayerBase.Cast( GetGame().GetPlayer() );
  199. if ( !item.GetInventory().CanRemoveEntity() )
  200. return;
  201. if ( ( ItemBase.Cast( receiver_item ) ).CanBeCombined( ItemBase.Cast( item ) ) )
  202. {
  203. ( ItemBase.Cast( receiver_item ) ).CombineItemsClient( ItemBase.Cast( item ) );
  204. }
  205. else if( GameInventory.CanSwapEntitiesEx( receiver_item, item ) )
  206. {
  207. InventoryLocation il1 = new InventoryLocation;
  208. InventoryLocation il2 = new InventoryLocation;
  209. receiver_item.GetInventory().GetCurrentInventoryLocation( il1 );
  210. item.GetInventory().GetCurrentInventoryLocation( il2 );
  211. if( !receiver_item.GetInventory().CanRemoveEntity() || ( il1.GetType() == InventoryLocationType.GROUND && il2.GetType() == InventoryLocationType.GROUND ) )
  212. return;
  213. player.PredictiveSwapEntities( item, receiver_item );
  214. }
  215. ItemManager.GetInstance().HideDropzones();
  216. ItemManager.GetInstance().SetIsDragging( false );
  217. PrepareOwnedTooltip(item);
  218. InventoryMenu menu = InventoryMenu.Cast( GetGame().GetUIManager().FindMenu( MENU_INVENTORY ) );
  219. if ( menu )
  220. {
  221. menu.RefreshQuickbar();
  222. }
  223. }
  224. void OnLeftPanelDropReceived( Widget w, int x, int y, Widget receiver )
  225. {
  226. OnDropReceivedFromHeader( w, x, y, receiver );
  227. }
  228. void OnDropReceivedFromEmptySpace( Widget w, int x, int y, Widget receiver )
  229. {
  230. OnDropReceivedFromHeader( w, x, y, receiver );
  231. }
  232. override void OnDropReceivedFromHeader(Widget w, int x, int y, Widget receiver)
  233. {
  234. if (!w)
  235. return;
  236. ItemManager.GetInstance().HideDropzones();
  237. ItemManager.GetInstance().SetIsDragging(false);
  238. ItemPreviewWidget ipw = ItemPreviewWidget.Cast(w.FindAnyWidget("Render"));
  239. if (!ipw)
  240. {
  241. string name = w.GetName();
  242. name.Replace("PanelWidget", "Render");
  243. ipw = ItemPreviewWidget.Cast(w.FindAnyWidget(name));
  244. }
  245. if (!ipw)
  246. {
  247. ipw = ItemPreviewWidget.Cast(w);
  248. if (!ipw)
  249. return;
  250. }
  251. EntityAI item = ipw.GetItem();
  252. if (!ipw.IsInherited(ItemPreviewWidget) || !item)
  253. return;
  254. if (!item.GetInventory().CanRemoveEntity() || m_ShowedItemIcons.Find(item) > -1)
  255. return;
  256. PlayerBase player = PlayerBase.Cast(GetGame().GetPlayer());
  257. if (player.CanDropEntity(item))
  258. {
  259. ItemBase itemBase = ItemBase.Cast(item);
  260. if (itemBase)
  261. {
  262. if (itemBase.GetTargetQuantityMax() < itemBase.GetQuantity())
  263. itemBase.SplitIntoStackMaxClient(null, -1);
  264. else
  265. player.PhysicalPredictiveDropItem(itemBase);
  266. }
  267. }
  268. InventoryMenu menu = InventoryMenu.Cast( GetGame().GetUIManager().FindMenu( MENU_INVENTORY ) );
  269. if ( menu )
  270. {
  271. menu.RefreshQuickbar();
  272. }
  273. }
  274. override void UpdateInterval()
  275. {
  276. PlayerBase player = PlayerBase.Cast( GetGame().GetPlayer() );
  277. if (!player)
  278. return;
  279. super.UpdateInterval();
  280. EntityAI eai;
  281. vector pos = player.GetPosition();
  282. ref array<EntityAI> objects;
  283. VicinityItemManager.GetInstance().Update( player.GetDeltaT() );
  284. objects = VicinityItemManager.GetInstance().GetVicinityItems();
  285. //GetItemsShowableInInventory
  286. array<EntityAI> showable_items = new array<EntityAI>;
  287. bool isUsedMicromanagment = false;
  288. EntityAI selectesItem = ItemManager.GetInstance().GetSelectedItem();
  289. int m_OldShowedItemIconsCount = m_ShowedItemIcons.Count();
  290. if (selectesItem && ItemManager.GetInstance().IsMicromanagmentMode())
  291. {
  292. if (m_ShowedItemIcons.Find(selectesItem) != -1)
  293. {
  294. isUsedMicromanagment = true;
  295. }
  296. }
  297. m_ShowedItemIcons.Clear();
  298. GameInventory game_inventory = player.GetInventory();
  299. for ( int i = 0; i < objects.Count(); i++ )
  300. {
  301. eai = objects.Get( i );
  302. if ( eai == null || game_inventory.IsPlaceholderEntity( eai ) )
  303. continue; // noproxy: ignore body placeholder
  304. BaseBuildingBase base_building = BaseBuildingBase.Cast(eai);
  305. if (base_building && !base_building.IsPlayerInside(player,""))
  306. continue;
  307. if (eai.IsInventoryVisible())
  308. {
  309. showable_items.Insert(eai);
  310. if (!eai.DisableVicinityIcon())
  311. {
  312. m_ShowedItemIcons.Insert(eai);
  313. }
  314. }
  315. }
  316. if (isUsedMicromanagment && m_ShowedItemIcons.Find(selectesItem) == -1 )
  317. {
  318. //ItemManager.GetInstance().SetItemMicromanagmentMode(false);
  319. ItemManager.GetInstance().SetSelectedItemEx(null, null, null);
  320. isUsedMicromanagment = false;
  321. }
  322. //MW HOTFIX - old containers must be removed before new one are added (part of initialize are refreshed whole structure - need proper fix to avoid it)
  323. ref map<EntityAI, ref Container> new_showed_items = new ref map<EntityAI, ref Container>;
  324. Container con;
  325. for ( i = 0; i < showable_items.Count(); i++ )
  326. {
  327. new_showed_items.Insert(showable_items[i],null);
  328. }
  329. bool need_update_focus = false;
  330. for ( i = 0; i < m_ShowedItems.Count(); i++ )
  331. {
  332. EntityAI ent = m_ShowedItems.GetKey( i );
  333. m_ShowedItems.GetElement( i ).UpdateInterval();
  334. con = m_ShowedItems.GetElement( i );
  335. if ( !new_showed_items.Contains( ent ) )
  336. {
  337. if ( selectesItem && selectesItem.GetHierarchyRoot() == ent)
  338. {
  339. //ItemManager.GetInstance().SetItemMicromanagmentMode(false);
  340. ItemManager.GetInstance().SetSelectedItemEx(null, null, null);
  341. }
  342. GetMainWidget().Update();
  343. if ( con.IsActive() )
  344. need_update_focus = true;
  345. Container.Cast( GetParent() ).Remove( con );
  346. Remove( con );
  347. }
  348. else
  349. {
  350. UpdateHeader(ent,con,player); //squeezed here, the map is iterated over enough already..
  351. }
  352. }
  353. //////////
  354. bool accessInventory = PlayerBase.DEBUG_INVENTORY_ACCESS;
  355. accessInventory |= FreeDebugCamera.GetInstance() && FreeDebugCamera.GetInstance().IsActive();
  356. //ref map<EntityAI, ref Container> new_showed_items = new ref map<EntityAI, ref Container>;
  357. new_showed_items.Clear();
  358. ref map<int, ref Container> showed_items_IDs = new ref map<int, ref Container>;
  359. for ( i = 0; i < showable_items.Count(); i++ )
  360. {
  361. EntityAI entity = showable_items.Get( i );
  362. if ( entity )
  363. {
  364. if ( game_inventory && !m_ShowedItems.Contains( entity ) )
  365. {
  366. string config = "CfgVehicles " + entity.GetType() + " GUIInventoryAttachmentsProps";
  367. if ( GetGame().ConfigIsExisting( config ) )
  368. {
  369. AttachmentCategoriesContainer ac = new AttachmentCategoriesContainer( m_Parent, -1 );
  370. ac.SetEntity( entity );
  371. new_showed_items.Insert( entity, ac );
  372. showed_items_IDs.Insert( entity.GetID(), ac);
  373. }
  374. else if ( entity.GetSlotsCountCorrect() > 0 && entity.GetInventory().GetCargo() )
  375. {
  376. if ( entity.IsInherited( DayZInfected ) )
  377. {
  378. if ( entity.IsAlive() )
  379. {
  380. continue;
  381. }
  382. ZombieContainer zmb_cnt = new ZombieContainer( m_Parent, -1 );
  383. zmb_cnt.SetEntity( entity );
  384. new_showed_items.Insert( entity, zmb_cnt );
  385. showed_items_IDs.Insert( entity.GetID(), zmb_cnt );
  386. Container.Cast( GetParent() ).Insert( zmb_cnt );
  387. }
  388. else
  389. {
  390. ContainerWithCargoAndAttachments iwca = new ContainerWithCargoAndAttachments( this, -1 );
  391. iwca.SetEntity( entity, false );
  392. new_showed_items.Insert( entity, iwca );
  393. showed_items_IDs.Insert( entity.GetID(), iwca );
  394. }
  395. }
  396. else if ( entity.GetInventory().GetCargo() )
  397. {
  398. ContainerWithCargo iwc = new ContainerWithCargo( this, -1 );
  399. iwc.SetEntity( entity, 0, false );
  400. new_showed_items.Insert( entity, iwc );
  401. showed_items_IDs.Insert( entity.GetID(), iwc );
  402. iwc.UpdateInterval();
  403. }
  404. else if ( entity.GetSlotsCountCorrect() > 0 )
  405. {
  406. if ( entity.HasEnergyManager() )
  407. {
  408. ContainerWithElectricManager iwem = new ContainerWithElectricManager( this, -1 );
  409. iwem.SetEntity( entity, false );
  410. new_showed_items.Insert( entity, iwem );
  411. showed_items_IDs.Insert( entity.GetID(), iwem );
  412. }
  413. else
  414. {
  415. if ( entity.IsInherited( PlayerBase ) )
  416. {
  417. //! Allow view access of inventory if in free camera. Write access is elsewhere
  418. if (accessInventory == false)
  419. {
  420. if ( entity.IsAlive() && ( !PlayerBase.Cast( entity ).IsUnconscious() && !PlayerBase.Cast( entity ).IsRestrained() ) )
  421. {
  422. continue;
  423. }
  424. }
  425. PlayerContainer plyr_cnt = new PlayerContainer( m_Parent, false );
  426. plyr_cnt.SetPlayer( PlayerBase.Cast( entity ) );
  427. Container.Cast( GetParent() ).Insert( plyr_cnt );
  428. ( Container.Cast( m_Parent ) ).Refresh();
  429. new_showed_items.Insert( entity, plyr_cnt );
  430. showed_items_IDs.Insert( entity.GetID(), plyr_cnt);
  431. }
  432. else
  433. {
  434. ContainerWithCargoAndAttachments iwcas = new ContainerWithCargoAndAttachments( this, -1 );
  435. iwcas.SetEntity( entity, false );
  436. new_showed_items.Insert( entity, iwcas );
  437. showed_items_IDs.Insert( entity.GetID(), iwcas );
  438. iwcas.UpdateInterval();
  439. }
  440. }
  441. }
  442. }
  443. else
  444. {
  445. //TODO MW: remove old containers on one spot (hotfix)
  446. con = m_ShowedItems.Get( entity );
  447. if ( con )
  448. {
  449. if ( entity.IsInherited( PlayerBase ) )
  450. {
  451. //! Allow view access of inventory if in free camera. Write access is elsewhere
  452. if ( !accessInventory && entity.IsAlive() && ( !PlayerBase.Cast( entity ).IsUnconscious() && !PlayerBase.Cast( entity ).IsRestrained() ) )
  453. {
  454. GetMainWidget().Update();
  455. if ( con.IsActive() )
  456. need_update_focus = true;
  457. Container.Cast( GetParent() ).Remove( con );
  458. Remove( con );
  459. continue;
  460. }
  461. }
  462. if ( entity.IsInherited( BaseBuildingBase ) )
  463. {
  464. if ( !BaseBuildingBase.Cast(entity).IsPlayerInside(player,""))
  465. {
  466. GetMainWidget().Update();
  467. if ( con.IsActive() )
  468. need_update_focus = true;
  469. Container.Cast( GetParent() ).Remove( con );
  470. Remove( con );
  471. continue;
  472. }
  473. }
  474. new_showed_items.Insert( entity, m_ShowedItems.Get( entity ) );
  475. showed_items_IDs.Insert( entity.GetID(), m_ShowedItemsIDs.Get( entity.GetID() ) );
  476. }
  477. }
  478. }
  479. }
  480. ref map<CargoBase, ref Container> new_showed_cargos = new ref map<CargoBase, ref Container>;
  481. auto cargoes = VicinityItemManager.GetInstance().GetVicinityCargos();
  482. for ( i = 0; i < cargoes.Count(); i++ )
  483. {
  484. CargoBase cgo = cargoes.Get( i );
  485. if ( cgo )
  486. {
  487. if (game_inventory && !m_ShowedCargos.Contains( cgo ) )
  488. {
  489. ContainerWithCargo pxc = new ContainerWithCargo( this, -1 );
  490. pxc.SetEntity( cgo.GetCargoOwner(), cgo.GetOwnerCargoIndex(), false );
  491. new_showed_cargos.Insert( cgo, pxc );
  492. pxc.UpdateInterval();
  493. }
  494. else
  495. {
  496. if ( m_ShowedCargos.Get( cgo ) )
  497. {
  498. new_showed_cargos.Insert( cgo, m_ShowedCargos.Get( cgo ) );
  499. }
  500. }
  501. }
  502. }
  503. for ( int ic = 0; ic < m_ShowedCargos.Count(); ic++ )
  504. {
  505. CargoBase cgo2 = m_ShowedCargos.GetKey( ic );
  506. m_ShowedCargos.GetElement( ic ).UpdateInterval();
  507. if ( !new_showed_cargos.Contains( cgo2 ) )
  508. {
  509. Container con2 = m_ShowedCargos.GetElement( ic );
  510. if( con2.IsActive() )
  511. need_update_focus = true;
  512. GetMainWidget().Update();
  513. Container.Cast( GetParent() ).Remove( con2 );
  514. Remove( con2 );
  515. }
  516. }
  517. m_ShowedItems = new_showed_items;
  518. m_ShowedItemsIDs = showed_items_IDs;
  519. m_ShowedCargos = new_showed_cargos;
  520. //Because WTF (zombie container)
  521. Container.Cast( GetParent() ).RecomputeOpenedContainers();
  522. if (need_update_focus)
  523. SetFirstActive();
  524. //RecomputeOpenedContainers();
  525. UpdateCollapseButtons();
  526. m_VicinityIconsContainer.ShowItemsInContainers( m_ShowedItemIcons );
  527. if ( m_ShowedItemIcons.Count() != m_OldShowedItemIconsCount )
  528. {
  529. Inventory in = Inventory.Cast( GetRoot() );
  530. if ( in )
  531. in.UpdateConsoleToolbar();
  532. }
  533. }
  534. void ToggleContainer( Widget w, EntityAI item )
  535. {
  536. SlotsIcon slots_icon;
  537. Container c;
  538. w.GetUserData(slots_icon);
  539. if ( item )
  540. {
  541. c = Container.Cast( m_ShowedItems.Get( item ) );
  542. }
  543. if (c)
  544. {
  545. ToggleContainer(c);
  546. }
  547. }
  548. override bool CanOpenCloseContainerEx(EntityAI focusedEntity)
  549. {
  550. if (focusedEntity)
  551. {
  552. ClosableContainer c = ClosableContainer.Cast( m_ShowedItems.Get( focusedEntity ) );
  553. if (c && c.IsDisplayable())
  554. {
  555. return true;
  556. }
  557. }
  558. return false;
  559. }
  560. //Call from ExpandCollapseContainer - not call
  561. void ToggleContainer( notnull Container conta )
  562. {
  563. conta.Toggle();
  564. }
  565. override void ExpandCollapseContainer()
  566. {
  567. EntityAI item = GetFocusedItem();
  568. Container conta;
  569. if (m_ShowedItems && item)
  570. {
  571. conta = m_ShowedItems.Get( item );
  572. if (conta)
  573. {
  574. ToggleContainer( conta );
  575. }
  576. }
  577. }
  578. override bool OnChildRemove( Widget w, Widget child )
  579. {
  580. w.Update();
  581. float x, y;
  582. w.GetScreenSize( x, y );
  583. if ( w == GetMainWidget() )
  584. {
  585. GetMainWidget().Update();
  586. m_Parent.OnChildRemove( w, child );
  587. }
  588. return true;
  589. }
  590. override bool OnChildAdd( Widget w, Widget child )
  591. {
  592. if ( w == GetMainWidget() )
  593. {
  594. GetMainWidget().Update();
  595. m_Parent.OnChildAdd( w, child );
  596. }
  597. return true;
  598. }
  599. override void CollapseButtonOnMouseButtonDown(Widget w)
  600. {
  601. super.CollapseButtonOnMouseButtonDown(w);
  602. ItemManager.GetInstance().SetDefaultHeaderOpenState( "VICINITY", !m_Hidden );
  603. }
  604. //! Updates header dragability to be consistent with current 'icon' behaviour
  605. void UpdateHeader(EntityAI entity, Container cont, PlayerBase player)
  606. {
  607. bool draggable = ItemManager.GetInstance().EvaluateContainerDragabilityDefault(entity);
  608. if (cont.GetHeader())
  609. {
  610. if (GetDragWidget() == cont.GetHeader())
  611. {
  612. CancelWidgetDragging();
  613. }
  614. ItemManager.GetInstance().SetWidgetDraggable(cont.GetHeader().GetMainWidget(),draggable);
  615. }
  616. }
  617. }