vicinitycontainer.c 20 KB

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