vicinityslotscontainer.c 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642
  1. class VicinitySlotsContainer: Container
  2. {
  3. protected ref AttachmentsGroupContainer m_Container;
  4. protected int m_ItemsCount;
  5. protected int m_SlotsCount;
  6. protected ref array<EntityAI> m_ShowedItems;
  7. void VicinitySlotsContainer( LayoutHolder parent )
  8. {
  9. m_Container = new AttachmentsGroupContainer(this);
  10. ref SlotsContainer con = new SlotsContainer( m_Container, null );
  11. m_Container.Insert( con );
  12. m_Body.Insert( m_Container );
  13. for( int j = 0; j < ITEMS_IN_ROW; j++ )
  14. {
  15. SlotsIcon icon = con.GetSlotIcon( j );
  16. WidgetEventHandler.GetInstance().RegisterOnDropReceived( icon.GetPanelWidget(), m_Parent, "OnDropReceivedFromIcon" );
  17. WidgetEventHandler.GetInstance().RegisterOnDropReceived( icon.GetGhostSlot(), m_Parent, "OnDropReceivedFromHeader" );
  18. WidgetEventHandler.GetInstance().RegisterOnDropReceived( icon.GetMainWidget(), m_Parent, "OnDropReceivedFromHeader" );
  19. WidgetEventHandler.GetInstance().RegisterOnDraggingOver( icon.GetPanelWidget(), m_Parent, "DraggingOverIcon" );
  20. WidgetEventHandler.GetInstance().RegisterOnDraggingOver( icon.GetGhostSlot(), m_Parent, "DraggingOverHeader" );
  21. WidgetEventHandler.GetInstance().RegisterOnDraggingOver( icon.GetMainWidget(), m_Parent, "DraggingOverHeader" );
  22. WidgetEventHandler.GetInstance().RegisterOnDoubleClick( icon.GetPanelWidget(), this, "DoubleClick" );
  23. WidgetEventHandler.GetInstance().RegisterOnMouseButtonUp( icon.GetPanelWidget(), this, "MouseClick" );
  24. WidgetEventHandler.GetInstance().RegisterOnMouseButtonDown( icon.GetPanelWidget(), this, "MouseButtonDown" );
  25. }
  26. con.SetColumnCount(0);
  27. con.SetForceShow(true);
  28. WidgetEventHandler.GetInstance().RegisterOnDropReceived( m_Container.GetMainWidget(), m_Parent, "OnDropReceivedFromHeader" );
  29. WidgetEventHandler.GetInstance().RegisterOnDraggingOver( m_Container.GetMainWidget(), m_Parent, "DraggingOverHeader" );
  30. m_ShowedItems = new array<EntityAI>;
  31. }
  32. bool IsItemWithContainerActive()
  33. {
  34. EntityAI ent = GetFocusedItem();
  35. return ent && ( ent.GetInventory().GetCargo() || (ent.GetSlotsCountCorrect() > 0 && ent.CanDisplayAnyAttachmentSlot()) );
  36. //TODO: also check for cargo visibility maybe?
  37. }
  38. override bool IsItemWithQuantityActive()
  39. {
  40. EntityAI ent = GetFocusedItem();
  41. return ent && QuantityConversions.HasItemQuantity( ent ) && ent.CanBeSplit();
  42. }
  43. override bool IsItemActive()
  44. {
  45. EntityAI ent = GetFocusedItem();
  46. return ent && !IsItemWithQuantityActive() && !IsItemWithContainerActive();
  47. }
  48. bool IsEmptyItemActive()
  49. {
  50. EntityAI ent = GetFocusedItem();
  51. return ent == null;
  52. }
  53. //TODO MW Adjust this
  54. override bool IsDisplayable()
  55. {
  56. return true;
  57. }
  58. bool IsTakeable()
  59. {
  60. EntityAI ent = GetFocusedItem();
  61. return ent.IsTakeable();
  62. }
  63. override bool CanCombineAmmo()
  64. {
  65. PlayerBase m_player = PlayerBase.Cast( GetGame().GetPlayer() );
  66. ItemBase ent = ItemBase.Cast( GetFocusedItem() );
  67. ItemBase item_in_hands = ItemBase.Cast( GetGame().GetPlayer().GetHumanInventory().GetEntityInHands() );
  68. ActionManagerClient amc;
  69. Class.CastTo(amc, m_player.GetActionManager());
  70. return ( amc.CanPerformActionFromInventory( item_in_hands, ent ) || amc.CanSetActionFromInventory( item_in_hands, ent ) );
  71. }
  72. override bool EquipItem()
  73. {
  74. if (CanEquip())
  75. {
  76. EntityAI ent = GetFocusedItem();
  77. bool res = false;
  78. if( ent && !ent.IsInherited( Magazine ))
  79. {
  80. res = GetGame().GetPlayer().PredictiveTakeOrSwapAttachment( ent );
  81. if(!res)
  82. {
  83. res = GetGame().GetPlayer().GetInventory().TakeEntityToInventory(InventoryMode.JUNCTURE,FindInventoryLocationType.ATTACHMENT,ent);
  84. }
  85. }
  86. return res;
  87. }
  88. return false;
  89. }
  90. override bool InspectItem()
  91. {
  92. EntityAI ent = GetFocusedItem();
  93. if( ent )
  94. {
  95. InspectItem( ent );
  96. return true;
  97. }
  98. return false;
  99. }
  100. override bool TransferItem()
  101. {
  102. if (CanTakeToInventory())
  103. {
  104. ItemBase ent = ItemBase.Cast(GetFocusedItem());
  105. if (ent)
  106. {
  107. if (ent.IsTakeable())
  108. {
  109. InventoryLocation il = new InventoryLocation;
  110. GetGame().GetPlayer().GetInventory().FindFreeLocationFor( ent, FindInventoryLocationType.CARGO, il );
  111. if (il.IsValid() && GetGame().GetPlayer().GetInventory().LocationCanAddEntity( il ))
  112. {
  113. SplitItemUtils.TakeOrSplitToInventoryLocation( PlayerBase.Cast( GetGame().GetPlayer() ), il );
  114. return true;
  115. }
  116. }
  117. }
  118. }
  119. return false;
  120. }
  121. override bool Combine()
  122. {
  123. ItemBase ent = ItemBase.Cast( GetFocusedItem() );
  124. ItemBase item_in_hands = ItemBase.Cast( GetGame().GetPlayer().GetHumanInventory().GetEntityInHands() );
  125. Icon hands_icon = ItemManager.GetInstance().GetHandsPreview().GetIcon();
  126. if( item_in_hands && ent && hands_icon )
  127. {
  128. return hands_icon.CombineItems( item_in_hands, ent );
  129. }
  130. return false;
  131. }
  132. override bool Select()
  133. {
  134. SlotsIcon selected_slot = ItemManager.GetInstance().GetSelectedIcon();
  135. EntityAI ent = GetFocusedItem();
  136. ItemBase selected_item = ItemBase.Cast(ItemManager.GetInstance().GetSelectedItem());
  137. if( !(selected_slot && selected_slot.IsOutOfReach() ) )
  138. {
  139. if( selected_item )
  140. {
  141. if( ent != selected_item)
  142. {
  143. if( selected_item && GetGame().GetPlayer().CanDropEntity( selected_item ) )
  144. {
  145. bool draggable = false;
  146. PlayerBase player = PlayerBase.Cast(GetGame().GetPlayer());
  147. draggable = !player.GetInventory().HasInventoryReservation( selected_item, null ) && !player.IsItemsToDelete();
  148. draggable = draggable && selected_item.GetInventory().CanRemoveEntity();
  149. if( draggable && m_ShowedItems.Find( selected_item ) == -1 )
  150. {
  151. if( selected_item.GetTargetQuantityMax() < selected_item.GetQuantity() )
  152. selected_item.SplitIntoStackMaxClient( null, -1 );
  153. else
  154. player.PhysicalPredictiveDropItem( selected_item );
  155. ItemManager.GetInstance().SetSelectedItemEx(null, null, null);
  156. return true;
  157. }
  158. }
  159. }
  160. }
  161. else
  162. {
  163. if( ent && ent.GetInventory().CanRemoveEntity())
  164. {
  165. EntityAI item_in_hands = GetGame().GetPlayer().GetHumanInventory().GetEntityInHands();
  166. if( item_in_hands )
  167. {
  168. if( GameInventory.CanSwapEntitiesEx( item_in_hands, ent ) )
  169. {
  170. GetGame().GetPlayer().PredictiveSwapEntities( item_in_hands, ent );
  171. return true;
  172. }
  173. }
  174. else
  175. {
  176. if( GetGame().GetPlayer().GetHumanInventory().CanAddEntityInHands( ent ) )
  177. {
  178. GetGame().GetPlayer().PredictiveTakeEntityToHands( ent );
  179. return true;
  180. }
  181. }
  182. }
  183. }
  184. }
  185. return false;
  186. }
  187. void ~VicinitySlotsContainer()
  188. {
  189. for ( int i = 0; i < m_Container.Count(); i++ )
  190. {
  191. Container c = ClosableContainer.Cast( m_Container.Get( i / ITEMS_IN_ROW ) );
  192. if( c && c.GetMainWidget() )
  193. {
  194. delete m_Container.Get( i / ITEMS_IN_ROW ).GetMainWidget();
  195. }
  196. }
  197. }
  198. override void SetLayoutName()
  199. {
  200. m_LayoutName = WidgetLayoutName.Container;
  201. }
  202. override void OnShow()
  203. {
  204. super.OnShow();
  205. }
  206. int GetRowSlotCount()
  207. {
  208. return GetFocusedContainer().GetColumnCount();
  209. }
  210. //! Decides on the icon visibility
  211. bool ExcludeFromContainer (EntityAI item)
  212. {
  213. int mask = item.GetHideIconMask();
  214. return mask & EInventoryIconVisibility.HIDE_VICINITY;
  215. }
  216. void ShowItemsInContainers( array<EntityAI> items )
  217. {
  218. EntityAI item;
  219. EntityAI selectedItem = ItemManager.GetInstance().GetSelectedItem();
  220. SlotsIcon icon;
  221. int x;
  222. int visible_items_count = 0;
  223. int visible_rows = 0;
  224. ref array<EntityAI> visible_items = new array<EntityAI>;
  225. for ( x = 0; x < items.Count(); ++x )
  226. {
  227. item = items.Get( x );
  228. if ( item == null || ExcludeFromContainer(item) )
  229. continue;
  230. visible_items.Insert( item );
  231. visible_items_count++;
  232. }
  233. RecomputeNumberOfContainers( visible_items );
  234. for ( x = 0; x < visible_items_count; ++x )
  235. {
  236. item = visible_items.Get( x );
  237. int row = (int)Math.Floor( x / ITEMS_IN_ROW );
  238. int column = x % ITEMS_IN_ROW;
  239. icon = SlotsContainer.Cast( m_Container.Get( row ) ).GetSlotIcon( column );
  240. icon.GetMainWidget().Show( true );
  241. icon.GetPanelWidget().SetUserID( item.GetID() );
  242. #ifdef PLATFORM_CONSOLE
  243. if (selectedItem == item)
  244. {
  245. icon.GetMicromanagedPanel().Show(true);
  246. }
  247. else
  248. {
  249. icon.GetMicromanagedPanel().Show(false);
  250. }
  251. #endif
  252. if ( m_ShowedItems.Find( item ) != x )
  253. icon.Init( item );
  254. icon.UpdateInterval();
  255. bool draggable = ItemManager.GetInstance().EvaluateContainerDragabilityDefault(item);
  256. if ( !draggable && GetDragWidget() == icon.GetPanelWidget() )
  257. CancelWidgetDragging();
  258. ItemManager.GetInstance().SetWidgetDraggable( icon.GetPanelWidget(), draggable );
  259. ref map<int, ref Container> showed_items = ( VicinityContainer.Cast( m_Parent ) ).m_ShowedItemsIDs;
  260. Container conta = Container.Cast( showed_items.Get( item.GetID() ) );
  261. if ( conta )
  262. {
  263. conta.SetSlotIcon(icon);
  264. }
  265. if ( conta && conta.IsDisplayable() )
  266. {
  267. conta.UpdateRadialIcon();
  268. }
  269. else
  270. {
  271. icon.GetRadialIconPanel().Show( false );
  272. if ( conta )
  273. conta.OnHide();
  274. }
  275. }
  276. SlotsContainer slots_last = SlotsContainer.Cast( m_Container.Get( visible_items.Count() / ITEMS_IN_ROW ) );
  277. for ( int c = visible_items_count % ITEMS_IN_ROW; c < ITEMS_IN_ROW; ++c )
  278. {
  279. icon = slots_last.GetSlotIcon( c );
  280. icon.GetMainWidget().Show( false );
  281. icon.Clear();
  282. }
  283. //#ifndef PLATFORM_CONSOLE
  284. if ( visible_items_count % ITEMS_IN_ROW == 0 )
  285. {
  286. slots_last = SlotsContainer.Cast( m_Container.Get( m_Container.Count() - 1 ) );
  287. slots_last.GetSlotIcon( 0 ).GetMainWidget().Show( true );
  288. slots_last.GetSlotIcon( 0 ).GetGhostSlot().Show( false );
  289. slots_last.GetMainWidget().Update();
  290. }
  291. //#endif
  292. m_ShowedItems = visible_items;
  293. }
  294. void DoubleClick(Widget w, int x, int y, int button)
  295. {
  296. if( button == MouseState.LEFT && !g_Game.IsLeftCtrlDown())
  297. {
  298. if( w == null )
  299. {
  300. return;
  301. }
  302. ItemPreviewWidget iw = ItemPreviewWidget.Cast( w.FindAnyWidget( "Render" ) );
  303. if( !iw )
  304. {
  305. string name = w.GetName();
  306. name.Replace( "PanelWidget", "Render" );
  307. iw = ItemPreviewWidget.Cast( w.FindAnyWidget( name ) );
  308. }
  309. if( !iw )
  310. {
  311. iw = ItemPreviewWidget.Cast( w );
  312. }
  313. ItemBase item = ItemBase.Cast( iw.GetItem() );
  314. if( !item )
  315. {
  316. return;
  317. }
  318. if( !item.IsTakeable() )
  319. {
  320. return;
  321. }
  322. if( GetGame().GetPlayer().GetInventory().HasInventoryReservation( item, null ) )
  323. {
  324. return;
  325. }
  326. if( !item.GetInventory().CanRemoveEntity() )
  327. return;
  328. PlayerBase player = PlayerBase.Cast( GetGame().GetPlayer() );
  329. if ( player.GetInventory().HasEntityInInventory( item ) && GetGame().GetPlayer().GetHumanInventory().CanAddEntityInHands( item ) )
  330. {
  331. player.PredictiveTakeEntityToHands( item );
  332. }
  333. else
  334. {
  335. InventoryLocation dst = new InventoryLocation;
  336. player.GetInventory().FindFreeLocationFor( item, FindInventoryLocationType.ANY, dst );
  337. if( dst.IsValid() && player.GetInventory().LocationCanAddEntity( dst ) )
  338. {
  339. SplitItemUtils.TakeOrSplitToInventoryLocation( player, dst );
  340. }
  341. }
  342. HideOwnedTooltip();
  343. InventoryMenu menu = InventoryMenu.Cast( GetGame().GetUIManager().FindMenu( MENU_INVENTORY ) );
  344. if( menu )
  345. {
  346. menu.RefreshQuickbar();
  347. }
  348. }
  349. }
  350. string GetItemQuantityText( EntityAI item )
  351. {
  352. string quantity_text = "";
  353. if ( item.IsInherited( InventoryItem ) )
  354. {
  355. ItemBase item_base = ItemBase.Cast( item );
  356. float quantity = item_base.GetQuantity();
  357. int ammo;
  358. if ( item.IsInherited( Magazine ) )
  359. {
  360. Magazine magazine_item = Magazine.Cast( item );
  361. ammo = magazine_item.GetAmmoCount();
  362. quantity_text = ammo.ToString();
  363. return quantity_text;
  364. }
  365. else if ( item.IsInherited( ItemBook ) )
  366. {
  367. return "";
  368. }
  369. int max = item.GetQuantityMax();
  370. //string unit = item.ConfigGetString( "stackedUnit" );
  371. if ( max > 0 )
  372. {
  373. if ( max == 1 )
  374. {
  375. float tmp = Math.Round( ( quantity / max ) * 100 );
  376. quantity_text = tmp.ToString() + "%";
  377. }
  378. else
  379. {
  380. quantity_text = quantity.ToString();
  381. }
  382. }
  383. }
  384. return quantity_text;
  385. }
  386. int HasItemQuantity( EntityAI item )
  387. {
  388. if ( item.IsInherited( InventoryItem ) )
  389. {
  390. ItemBase item_base = ItemBase.Cast( item );
  391. if ( item.IsInherited( Magazine ) )
  392. {
  393. return QUANTITY_COUNT;
  394. }
  395. else if ( item.IsInherited( ItemBook ) )
  396. {
  397. return QUANTITY_HIDDEN;
  398. }
  399. int max = item.GetQuantityMax();
  400. bool bar = item.ConfigGetBool( "quantityBar" );
  401. if ( max > 0 )
  402. {
  403. if ( max == 1 || bar )
  404. {
  405. return QUANTITY_PROGRESS;
  406. }
  407. else
  408. {
  409. return QUANTITY_COUNT;
  410. }
  411. }
  412. }
  413. return QUANTITY_HIDDEN;
  414. }
  415. float GetItemQuantity( InventoryItem item )
  416. {
  417. float quantity = 0;
  418. if ( item.IsInherited( InventoryItem ) )
  419. {
  420. ItemBase item_base = ItemBase.Cast( item );
  421. if ( item.IsInherited( Magazine ) )
  422. {
  423. Magazine magazine_item = Magazine.Cast( item );
  424. quantity = magazine_item.GetAmmoCount();
  425. }
  426. else
  427. {
  428. quantity = item_base.GetQuantity();
  429. }
  430. }
  431. return quantity;
  432. }
  433. // Mouse button DOWN
  434. void MouseButtonDown( Widget w, int x, int y, int button)
  435. {
  436. string name = w.GetName();
  437. name.Replace( "PanelWidget", "Render" );
  438. ItemPreviewWidget item_preview = ItemPreviewWidget.Cast( w.FindAnyWidget( name ) );
  439. ItemBase item = ItemBase.Cast( item_preview.GetItem() );
  440. bool draggable = ItemManager.GetInstance().EvaluateContainerDragabilityDefault(item);
  441. ItemManager.GetInstance().SetWidgetDraggable( w, draggable );
  442. }
  443. // Mouse button UP <---- exist button down MouseButtonDown ^
  444. void MouseClick( Widget w, int x, int y, int button)
  445. {
  446. string name = w.GetName();
  447. name.Replace( "PanelWidget", "Render" );
  448. ItemPreviewWidget item_preview = ItemPreviewWidget.Cast( w.FindAnyWidget( name ) );
  449. EntityAI item = item_preview.GetItem();
  450. InventoryItem itemAtPos = InventoryItem.Cast( item );
  451. #ifdef DIAG_DEVELOPER
  452. if (itemAtPos && GetDayZGame().IsLeftCtrlDown() && button == MouseState.RIGHT)
  453. {
  454. ShowActionMenu(itemAtPos);
  455. }
  456. else if (m_Parent)
  457. #else
  458. if (m_Parent)
  459. #endif
  460. {
  461. ref map<int, ref Container> showed_items = ( VicinityContainer.Cast( m_Parent ) ).m_ShowedItemsIDs;
  462. if ( item && showed_items )
  463. {
  464. if (button == MouseState.LEFT)
  465. {
  466. VicinityContainer.Cast(m_Parent).ToggleContainer(w, item);
  467. }
  468. if (button == MouseState.RIGHT)
  469. {
  470. if (itemAtPos)
  471. {
  472. itemAtPos.OnRightClick();
  473. }
  474. }
  475. else if (button == MouseState.MIDDLE)
  476. {
  477. InspectItem(itemAtPos);
  478. return;
  479. }
  480. }
  481. }
  482. }
  483. override void OnDropReceivedFromHeader( Widget w, int x, int y, Widget receiver )
  484. {
  485. ItemPreviewWidget ipw = ItemPreviewWidget.Cast( w.FindAnyWidget("Render") );
  486. if( !ipw )
  487. {
  488. string name = w.GetName();
  489. name.Replace( "PanelWidget", "Render" );
  490. ipw = ItemPreviewWidget.Cast( w.FindAnyWidget( name ) );
  491. }
  492. if( !ipw )
  493. {
  494. ipw = ItemPreviewWidget.Cast( w );
  495. }
  496. if( !ipw.IsInherited( ItemPreviewWidget ) )
  497. {
  498. return;
  499. }
  500. PlayerBase player = PlayerBase.Cast( GetGame().GetPlayer() );
  501. ItemBase item = ItemBase.Cast(ipw.GetItem());
  502. if( item )
  503. {
  504. if( !item.GetInventory().CanRemoveEntity() )
  505. return;
  506. if( player.CanDropEntity( item ) )
  507. {
  508. if( item.GetTargetQuantityMax() < item.GetQuantity() )
  509. item.SplitIntoStackMaxClient( null, -1 );
  510. else
  511. player.PhysicalPredictiveDropItem( item );
  512. }
  513. }
  514. }
  515. void RecomputeNumberOfContainers( array<EntityAI> items )
  516. {
  517. int number_of_containers = m_Container.m_Body.Count();
  518. int number_of_containers_needed = ( items.Count() / ITEMS_IN_ROW ) + 1;
  519. int difference = number_of_containers_needed - number_of_containers;
  520. int g;
  521. for (g = number_of_containers; g < number_of_containers_needed; g++)
  522. {
  523. SlotsContainer con = new SlotsContainer( m_Container, null );
  524. m_Container.Insert(con, -1, false);
  525. for (int j = 0; j < ITEMS_IN_ROW; j++)
  526. {
  527. SlotsIcon icon = con.GetSlotIcon(j);
  528. WidgetEventHandler.GetInstance().RegisterOnDropReceived(icon.GetPanelWidget(), m_Parent, "OnDropReceivedFromIcon");
  529. WidgetEventHandler.GetInstance().RegisterOnDropReceived(icon.GetGhostSlot(), m_Parent, "OnDropReceivedFromHeader");
  530. WidgetEventHandler.GetInstance().RegisterOnDropReceived(icon.GetMainWidget(), m_Parent, "OnDropReceivedFromHeader");
  531. WidgetEventHandler.GetInstance().RegisterOnDraggingOver(icon.GetPanelWidget(), m_Parent, "DraggingOverIcon");
  532. WidgetEventHandler.GetInstance().RegisterOnDraggingOver(icon.GetGhostSlot(), m_Parent, "DraggingOverHeader");
  533. WidgetEventHandler.GetInstance().RegisterOnDraggingOver(icon.GetMainWidget(), m_Parent, "DraggingOverHeader");
  534. WidgetEventHandler.GetInstance().RegisterOnDoubleClick(icon.GetPanelWidget(), this, "DoubleClick");
  535. WidgetEventHandler.GetInstance().RegisterOnMouseButtonUp(icon.GetPanelWidget(), this, "MouseClick");
  536. WidgetEventHandler.GetInstance().RegisterOnMouseButtonDown(icon.GetPanelWidget(), this, "MouseButtonDown");
  537. }
  538. con.SetColumnCount(items.Count() % ITEMS_IN_ROW);
  539. }
  540. for (g = number_of_containers - 1 ; g >= number_of_containers_needed ; g--)
  541. {
  542. Widget w = m_Container.m_Body.Get(g).GetMainWidget();
  543. delete w;
  544. m_Container.m_Body.Remove(g);
  545. }
  546. if ( (items.Count() % ITEMS_IN_ROW) == 0 )
  547. {
  548. SlotsContainer.Cast( m_Container.Get( number_of_containers_needed - 1 ) ).SetColumnCount( ITEMS_IN_ROW );
  549. }
  550. else
  551. {
  552. SlotsContainer.Cast( m_Container.Get( number_of_containers_needed - 1 ) ).SetColumnCount( items.Count() % ITEMS_IN_ROW );
  553. }
  554. for ( int i = 0; i < number_of_containers_needed - 1; i++ )
  555. {
  556. SlotsContainer.Cast( m_Container.Get( i ) ).SetColumnCount( ITEMS_IN_ROW );
  557. }
  558. RecomputeOpenedContainers();
  559. m_Container.RecomputeOpenedContainers();
  560. }
  561. }