serverbrowsertabpc.c 28 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247
  1. class ServerBrowserTabPc extends ServerBrowserTab
  2. {
  3. protected const int SERVERS_VISIBLE_COUNT = 24;
  4. protected const int PAGES_BUTTONS_COUNT = 10;
  5. protected int m_TotalServersCount; //UNUSED
  6. protected int m_PageIndex;
  7. protected int m_PageStartNum;
  8. protected int m_PageEndNum;
  9. protected int m_PagesCount;
  10. protected int m_ServersEstimateCount;
  11. protected Widget m_PnlPagesPanel;
  12. protected TextWidget m_PnlPagesLoadingText;
  13. protected ButtonWidget m_BtnPagesFirst;
  14. protected ButtonWidget m_BtnPagesLast;
  15. protected Widget m_FilterSearchIP;
  16. protected Widget m_FilterSearchIPBox;
  17. protected Widget m_FilterPanelPing;
  18. protected Widget m_FilterPanelAccTime;
  19. protected ref array<ButtonWidget> m_BtnPages;
  20. protected ref array<ref ServerBrowserEntry> m_ServerListEntries;
  21. protected ref TStringArray m_TempTime = new TStringArray;
  22. protected override void Construct(Widget parent, ServerBrowserMenuNew menu, TabType type)
  23. {
  24. #ifdef PLATFORM_CONSOLE
  25. m_Root = GetGame().GetWorkspace().CreateWidgets("gui/layouts/new_ui/server_browser/xbox/server_browser_tab.layout", parent);
  26. #else
  27. #ifdef PLATFORM_WINDOWS
  28. m_Root = GetGame().GetWorkspace().CreateWidgets("gui/layouts/new_ui/server_browser/pc/server_browser_tab_pages.layout", parent);
  29. #endif
  30. #endif
  31. m_ServerListScroller = ScrollWidget.Cast(m_Root.FindAnyWidget("server_list_scroller"));
  32. m_ServerList = SpacerBaseWidget.Cast(m_ServerListScroller.FindAnyWidget("server_list_content"));
  33. m_ServerListScroller.VScrollToPos01(0);
  34. m_ServerListEntries = new array<ref ServerBrowserEntry>;
  35. m_EntryWidgets = new map<string, ref ServerBrowserEntry>;
  36. m_SortInverted = new map<ESortType, ESortOrder>;
  37. m_EntriesSorted = new map<ESortType, ref array<ref GetServersResultRow>>;
  38. m_EntryMods = new map<string, ref array<string>>;
  39. m_EntriesSorted[ESortType.HOST] = new array<ref GetServersResultRow>;
  40. m_EntriesSorted[ESortType.TIME] = new array<ref GetServersResultRow>;
  41. m_EntriesSorted[ESortType.POPULATION] = new array<ref GetServersResultRow>;
  42. m_EntriesSorted[ESortType.SLOTS] = new array<ref GetServersResultRow>;
  43. m_EntriesSorted[ESortType.PING] = new array<ref GetServersResultRow>;
  44. m_EntriesSorted[ESortType.FAVORITE] = new array<ref GetServersResultRow>;
  45. m_EntriesSorted[ESortType.PASSWORDED] = new array<ref GetServersResultRow>;
  46. m_EntriesSorted[ESortType.MAP] = new array<ref GetServersResultRow>;
  47. m_Menu = menu;
  48. m_TabType = type;
  49. m_RightAreaHeaderText = TextWidget.Cast(m_Root.FindAnyWidget("right_area_header_text"));
  50. m_BtnShowFilters = ButtonWidget.Cast(m_Root.FindAnyWidget("show_filters_button"));
  51. m_DetailsRoot = m_Root.FindAnyWidget("details_root");
  52. m_BtnShowDetails = ButtonWidget.Cast(m_Root.FindAnyWidget("show_details_button"));
  53. m_FilterRoot = m_Root.FindAnyWidget("filters_root");
  54. m_FilterContent = m_Root.FindAnyWidget("filters_content");
  55. m_ApplyFilter = m_Root.FindAnyWidget("apply_filter_button");
  56. m_RefreshList = m_Root.FindAnyWidget("refresh_list_button");
  57. m_FiltersChanged = m_Root.FindAnyWidget("unapplied_filters_notify");
  58. m_HostSort = m_Root.FindAnyWidget("server_list_content_header_host");
  59. m_TimeSort = m_Root.FindAnyWidget("server_list_content_header_time");
  60. m_PopulationSort = m_Root.FindAnyWidget("server_list_content_header_population");
  61. m_SlotsSort = m_Root.FindAnyWidget("server_list_content_header_slots");
  62. m_PingSort = m_Root.FindAnyWidget("server_list_content_header_ping");
  63. m_MapSort = m_Root.FindAnyWidget("server_list_content_header_map");
  64. m_FilterSearchText = m_Root.FindAnyWidget("search_name_setting");
  65. m_FilterSearchTextBox = m_Root.FindAnyWidget("search_name_setting_option");
  66. m_FilterSearchIP = m_Root.FindAnyWidget("search_ip_setting");
  67. m_FilterSearchIPBox = m_Root.FindAnyWidget("search_ip_setting_option");
  68. m_FilterPanelAccTime = m_Root.FindAnyWidget("accelerated_time_setting");
  69. m_FilterPanelPing = m_Root.FindAnyWidget("ping_setting");
  70. //m_FilterPanelPing.SetHandler(this);
  71. m_LoadingText = TextWidget.Cast(m_Root.FindAnyWidget("loading_servers_info"));
  72. ButtonDisable(m_ApplyFilter);
  73. m_Filters = new ServerBrowserFilterContainer(m_Root.FindAnyWidget("filters_content"), this);
  74. m_Root.SetHandler(this);
  75. SetSort(ESortType.HOST, ESortOrder.ASCENDING);
  76. m_BtnPages = new array<ButtonWidget>();
  77. int page_button_num = 1;
  78. ButtonWidget page_button = ButtonWidget.Cast(m_Root.FindAnyWidget("servers_navigation_page" + page_button_num));
  79. if (PAGES_BUTTONS_COUNT < 3 || PAGES_BUTTONS_COUNT > 10)
  80. {
  81. Error("ServerBrowserTabPage->PAGES_BUTTONS_COUNT must be in range 3 - 10!");
  82. return;
  83. }
  84. while (page_button)
  85. {
  86. page_button.Show(false);
  87. if (page_button_num <= PAGES_BUTTONS_COUNT)
  88. {
  89. m_BtnPages.Insert(page_button);
  90. }
  91. page_button_num++;
  92. page_button = ButtonWidget.Cast(m_Root.FindAnyWidget("servers_navigation_page"+ page_button_num));
  93. }
  94. m_ResetFilters = ButtonWidget.Cast(m_Root.FindAnyWidget( "reset_filter_button"));
  95. m_PnlPagesPanel = m_Root.FindAnyWidget("servers_navigation_spacer");
  96. m_BtnPagePrev = ButtonWidget.Cast(m_Root.FindAnyWidget("servers_navigation_prev"));
  97. m_BtnPageNext = ButtonWidget.Cast(m_Root.FindAnyWidget("servers_navigation_next"));
  98. m_BtnPagesFirst = ButtonWidget.Cast(m_Root.FindAnyWidget("servers_navigation_page_first"));
  99. m_BtnPagesLast = ButtonWidget.Cast(m_Root.FindAnyWidget("servers_navigation_page_last"));
  100. m_PageIndex = 0;
  101. m_PnlPagesPanel.Show(true);
  102. UpdatePageButtons();
  103. m_Details = new ServerBrowserDetailsContainer(m_Root.FindAnyWidget("details_content"), this);
  104. if (m_TabType == TabType.FAVORITE || m_TabType == TabType.LAN)
  105. {
  106. m_Root.FindAnyWidget("filters_content").Show(false);
  107. m_Root.FindAnyWidget("reset_filter_button").Show(false);
  108. m_ApplyFilter.Show(false);
  109. m_Root.FindAnyWidget("spacer").Show(false);
  110. m_Root.FindAnyWidget("spacer1").Show(false);
  111. m_Root.FindAnyWidget("spacer5").Show(false);
  112. m_BtnShowFilters.Show(false);
  113. m_FilterRoot.Show(true);
  114. }
  115. if (m_TabType != TabType.FAVORITE && m_TabType != TabType.LAN)
  116. {
  117. SwitchToFilters();
  118. }
  119. else
  120. {
  121. SwitchToDetails();
  122. }
  123. }
  124. void ~ServerBrowserTabPc()
  125. {
  126. }
  127. override void RefreshList()
  128. {
  129. for ( int i = 0; i < m_EntriesSorted.Count(); i++ )
  130. {
  131. m_EntriesSorted.GetElement(i).Clear();
  132. }
  133. m_ServerListEntries.Clear();
  134. OnlineServices.m_ServersAsyncInvoker.Insert( m_Menu.OnLoadServersAsync, EScriptInvokerInsertFlags.NONE );
  135. m_LoadingFinished = false;
  136. m_Loading = true;
  137. m_TotalServersCount = 0;
  138. m_TotalLoadedServers = 0;
  139. m_ServersEstimateCount = 0;
  140. m_PageIndex = 0;
  141. m_SelectedServer = null;
  142. super.RefreshList();
  143. m_ServerListScroller.VScrollToPos01( 0 );
  144. ButtonRefreshToCancel();
  145. UpdateServerList();
  146. UpdatePageButtons();
  147. UpdateStatusBar();
  148. }
  149. override void ResetFilters()
  150. {
  151. m_Filters.ResetFilters();
  152. ButtonEnable(m_ApplyFilter);
  153. if (m_Loading)
  154. {
  155. ButtonDisable(m_RefreshList);
  156. }
  157. }
  158. override void ApplyFilters()
  159. {
  160. m_Filters.SaveFilters();
  161. RefreshList();
  162. ButtonDisable(m_ApplyFilter);
  163. ButtonEnable(m_RefreshList);
  164. }
  165. void LoadingServersStop()
  166. {
  167. OnlineServices.m_ServersAsyncInvoker.Remove( m_Menu.OnLoadServersAsync );
  168. m_LoadingFinished = true;
  169. m_Loading = false;
  170. ButtonCancelToRefresh();
  171. UpdateServerList();
  172. UpdateStatusBar();
  173. ButtonEnable(m_RefreshList);
  174. if (m_TotalLoadedServers == 0)
  175. {
  176. if (GetTabType() != TabType.FAVORITE && GetTabType() != TabType.LAN)
  177. SwitchToFilters();
  178. }
  179. }
  180. override void OnLoadServersAsyncPC(ref GetServersResult result_list, EBiosError error, string response)
  181. {
  182. if (result_list)
  183. {
  184. int count = result_list.m_Results.Count();
  185. if (count > 0)
  186. {
  187. for (int i = 0; i < count; i++)
  188. {
  189. GetServersResultRow result = result_list.m_Results[i];
  190. m_TotalServersCount++;
  191. result.m_SortName = result.m_Name.ToInt();
  192. result.m_SortTime = GetTimeOfDayEnum(result.m_TimeOfDay);
  193. if (PassFilter(result))
  194. {
  195. int sorted_index = AddSorted(result);
  196. if (sorted_index < (m_PageIndex * SERVERS_VISIBLE_COUNT + SERVERS_VISIBLE_COUNT))
  197. {
  198. UpdateServerList();
  199. UpdatePageButtons();
  200. }
  201. }
  202. if (!m_Menu || m_Menu.GetServersLoadingTab() != m_TabType)
  203. {
  204. return;
  205. }
  206. }
  207. }
  208. else
  209. {
  210. m_Menu.SetServersLoadingTab(TabType.NONE);
  211. }
  212. }
  213. else
  214. {
  215. m_Menu.SetServersLoadingTab(TabType.NONE);
  216. }
  217. if (response == "thelastone")
  218. {
  219. OnLoadServersAsyncPCFinished();
  220. }
  221. else
  222. {
  223. m_ServersEstimateCount = result_list.m_NumServers;
  224. }
  225. UpdateServerList();
  226. UpdateStatusBar();
  227. }
  228. void OnLoadServersAsyncPCFinished()
  229. {
  230. LoadingServersStop();
  231. }
  232. override bool OnClick(Widget w, int x, int y, int button)
  233. {
  234. super.OnClick(w, x, y, button);
  235. if (button == MouseState.LEFT)
  236. {
  237. if (w == m_ResetFilters)
  238. {
  239. ResetFilters();
  240. }
  241. else if (w == m_ApplyFilter)
  242. {
  243. ApplyFilters();
  244. return true;
  245. }
  246. else if (w == m_RefreshList)
  247. {
  248. if (m_Loading && !m_LoadingFinished)
  249. {
  250. LoadingServersStop();
  251. }
  252. else
  253. {
  254. RefreshList();
  255. }
  256. return true;
  257. }
  258. else if (w == m_BtnPagePrev)
  259. {
  260. OnClickPagePrev();
  261. return true;
  262. }
  263. else if (w == m_BtnPageNext)
  264. {
  265. OnClickPageNext();
  266. return true;
  267. }
  268. else if (w == m_BtnPagesLast)
  269. {
  270. OnClickPageEnd();
  271. return true;
  272. }
  273. else if (w == m_BtnPagesFirst)
  274. {
  275. OnClickPageFirst();
  276. return true;
  277. }
  278. else if (w == m_BtnShowDetails)
  279. {
  280. OnClickDetails();
  281. return true;
  282. }
  283. else if (w == m_BtnShowFilters)
  284. {
  285. OnClickFilters();
  286. return true;
  287. }
  288. else
  289. {
  290. bool click = OnClickPage(w);
  291. if (click)
  292. {
  293. return true;
  294. }
  295. return false;
  296. }
  297. }
  298. return false;
  299. }
  300. override bool OnMouseEnter(Widget w, int x, int y)
  301. {
  302. if (IsFocusable(w))
  303. {
  304. ColorHighlight(w);
  305. if (w == m_FilterSearchText)
  306. {
  307. SetFocus(m_FilterSearchTextBox);
  308. }
  309. else if (w == m_FilterSearchIP)
  310. {
  311. SetFocus(m_FilterSearchIPBox);
  312. }
  313. return true;
  314. }
  315. return false;
  316. }
  317. override bool OnMouseLeave(Widget w, Widget enterW, int x, int y)
  318. {
  319. if (IsFocusable(w))
  320. {
  321. ColorNormal(w);
  322. if (w == m_FilterSearchText || w == m_FilterSearchIP)
  323. {
  324. SetFocus( null );
  325. }
  326. return true;
  327. }
  328. return false;
  329. }
  330. override bool OnMouseButtonUp( Widget w, int x, int y, int button )
  331. {
  332. if ( button == MouseState.LEFT )
  333. {
  334. if ( w == m_HostSort )
  335. {
  336. ToggleSort( ESortType.HOST );
  337. UpdateServerList();
  338. return true;
  339. }
  340. else if ( w == m_TimeSort )
  341. {
  342. ToggleSort( ESortType.TIME );
  343. UpdateServerList();
  344. return true;
  345. }
  346. else if ( w == m_PopulationSort )
  347. {
  348. ToggleSort( ESortType.POPULATION );
  349. UpdateServerList();
  350. return true;
  351. }
  352. else if ( w == m_SlotsSort )
  353. {
  354. ToggleSort( ESortType.SLOTS );
  355. UpdateServerList();
  356. return true;
  357. }
  358. else if ( w == m_PingSort )
  359. {
  360. ToggleSort( ESortType.PING );
  361. UpdateServerList();
  362. return true;
  363. }
  364. else if ( w == m_MapSort )
  365. {
  366. ToggleSort( ESortType.MAP );
  367. UpdateServerList();
  368. return true;
  369. }
  370. }
  371. return false;
  372. }
  373. override void OnFilterChanged()
  374. {
  375. //m_FiltersChanged.Show(true);
  376. ButtonEnable(m_ApplyFilter);
  377. if (m_Loading)
  378. {
  379. ButtonDisable(m_RefreshList);
  380. }
  381. }
  382. void OnClickPagePrev()
  383. {
  384. if ( m_PageIndex > 0 )
  385. {
  386. SetPageIndex( m_PageIndex - 1);
  387. }
  388. else
  389. {
  390. SetPageIndex( m_PagesCount - 1 );
  391. }
  392. }
  393. void OnClickPageNext()
  394. {
  395. if ( m_PageIndex < (m_PagesCount - 1) )
  396. {
  397. SetPageIndex( m_PageIndex + 1 );
  398. }
  399. else
  400. {
  401. SetPageIndex( 0 );
  402. }
  403. }
  404. void OnClickPageEnd()
  405. {
  406. SetPageIndex( m_PagesCount - 1 );
  407. }
  408. void OnClickPageFirst()
  409. {
  410. SetPageIndex( 0 );
  411. }
  412. bool OnClickPage(Widget w)
  413. {
  414. for ( int i = 0; i < m_BtnPages.Count(); ++i )
  415. {
  416. if ( m_BtnPages[i] == w )
  417. {
  418. SetPageIndex( m_PageStartNum + i - 1 );
  419. return true;
  420. }
  421. }
  422. return false;
  423. }
  424. void SetPageIndex(int page_index)
  425. {
  426. m_PageIndex = page_index;
  427. UpdateServerList();
  428. UpdatePageButtons();
  429. Focus();
  430. }
  431. void ToggleSort( ESortType type )
  432. {
  433. ESortOrder order = ESortOrder.ASCENDING;
  434. if ( m_SortType != type )
  435. {
  436. if ( m_SortInverted[type] == true )
  437. {
  438. m_EntriesSorted[type].Invert();
  439. }
  440. m_SortInverted[type] = false;
  441. }
  442. else
  443. {
  444. if ( m_SortOrder == ESortOrder.ASCENDING )
  445. {
  446. m_EntriesSorted[type].Invert();
  447. m_SortInverted[type] = true;
  448. order = ESortOrder.DESCENDING;
  449. }
  450. else
  451. {
  452. m_EntriesSorted[type].Invert();
  453. m_SortInverted[type] = false;
  454. }
  455. }
  456. SetSort( type, order );
  457. }
  458. override void SetSort( ESortType type, ESortOrder order )
  459. {
  460. super.SetSort( type, order);
  461. #ifdef PLATFORM_WINDOWS
  462. m_Root.FindAnyWidget( "host_sort" ).Show( false );
  463. m_Root.FindAnyWidget( "population_sort" ).Show( false );
  464. m_Root.FindAnyWidget( "slots_sort" ).Show( false );
  465. m_Root.FindAnyWidget( "time_sort" ).Show( false );
  466. m_Root.FindAnyWidget( "ping_sort" ).Show( false );
  467. m_Root.FindAnyWidget( "map_sort" ).Show( false );
  468. TextWidget root;
  469. root = TextWidget.Cast( m_Root.FindAnyWidget( "server_list_content_header_host_label" ) );
  470. root.SetColor( ARGBF( 1, 1, 1, 1 ) );
  471. root = TextWidget.Cast( m_Root.FindAnyWidget( "server_list_content_header_population_label" ) );
  472. root.SetColor( ARGBF( 1, 1, 1, 1 ) );
  473. root = TextWidget.Cast( m_Root.FindAnyWidget( "server_list_content_header_slots_label" ) );
  474. root.SetColor( ARGBF( 1, 1, 1, 1 ) );
  475. root = TextWidget.Cast( m_Root.FindAnyWidget( "server_list_content_header_ping_label" ) );
  476. root.SetColor( ARGBF( 1, 1, 1, 1 ) );
  477. root = TextWidget.Cast( m_Root.FindAnyWidget( "server_list_content_header_time_label" ) );
  478. root.SetColor( ARGBF( 1, 1, 1, 1 ) );
  479. string r_name;
  480. string w_name;
  481. switch ( type )
  482. {
  483. case ESortType.HOST:
  484. {
  485. r_name = "server_list_content_header_host_label";
  486. w_name = "host_sort";
  487. break;
  488. }
  489. case ESortType.TIME:
  490. {
  491. r_name = "server_list_content_header_time_label";
  492. w_name = "time_sort";
  493. break;
  494. }
  495. case ESortType.POPULATION:
  496. {
  497. r_name = "server_list_content_header_population_label";
  498. w_name = "population_sort";
  499. break;
  500. }
  501. case ESortType.SLOTS:
  502. {
  503. r_name = "server_list_content_header_slots_label";
  504. w_name = "slots_sort";
  505. break;
  506. }
  507. case ESortType.PING:
  508. {
  509. r_name = "server_list_content_header_ping_label";
  510. w_name = "ping_sort";
  511. break;
  512. }
  513. case ESortType.MAP:
  514. {
  515. r_name = "server_list_content_header_map_label";
  516. w_name = "map_sort";
  517. break;
  518. }
  519. }
  520. root = TextWidget.Cast( m_Root.FindAnyWidget( r_name ) );
  521. root.SetColor( ARGBF( 1, 1, 0, 0 ) );
  522. m_Root.FindAnyWidget( w_name ).Show( true );
  523. m_Root.FindAnyWidget( w_name + "_asc" ).Show( !m_SortOrder );
  524. m_Root.FindAnyWidget( w_name + "_dsc" ).Show( m_SortOrder );
  525. #endif
  526. }
  527. int GetTimeOfDayEnum( string time_of_day )
  528. {
  529. m_TempTime.Clear();
  530. time_of_day.Split( ":", m_TempTime );
  531. int minutes = 0;
  532. if ( m_TempTime.Count() > 0 )
  533. {
  534. int h = m_TempTime[0].ToInt();
  535. if ( h >= 5 )
  536. {
  537. h -= 5;
  538. }
  539. else
  540. {
  541. h += 24;
  542. }
  543. minutes = h * 60;
  544. }
  545. if ( m_TempTime.Count() > 1 )
  546. {
  547. int m = m_TempTime[0].ToInt();
  548. minutes += m;
  549. }
  550. return minutes;
  551. }
  552. // Return sorted index
  553. override int AddSorted( GetServersResultRow entry )
  554. {
  555. int index_host = SortedInsert( entry, ESortType.HOST );
  556. int index_time = SortedInsert( entry, ESortType.TIME );
  557. int index_popu = SortedInsert( entry, ESortType.POPULATION );
  558. int index_slot = SortedInsert( entry, ESortType.SLOTS );
  559. int index_ping = SortedInsert( entry, ESortType.PING );
  560. int index_favo = SortedInsert( entry, ESortType.FAVORITE );
  561. int index_pass = SortedInsert( entry, ESortType.PASSWORDED );
  562. int index_map = SortedInsert( entry, ESortType.MAP );
  563. switch ( m_SortType )
  564. {
  565. case ESortType.HOST:
  566. return index_host;
  567. case ESortType.TIME:
  568. return index_time;
  569. case ESortType.POPULATION:
  570. return index_popu;
  571. case ESortType.SLOTS:
  572. return index_slot;
  573. case ESortType.PING:
  574. return index_ping;
  575. case ESortType.FAVORITE:
  576. return index_favo;
  577. case ESortType.PASSWORDED:
  578. return index_pass;
  579. case ESortType.MAP:
  580. return index_map;
  581. }
  582. return 0;
  583. }
  584. int SortedInsert(GetServersResultRow entry, ESortType sort_type)
  585. {
  586. return SortedInsertEx(entry, sort_type, m_SortInverted[sort_type]);
  587. }
  588. private int SortedInsertEx(GetServersResultRow entry, ESortType sortType, bool isDescending)
  589. {
  590. array<ref GetServersResultRow> list = m_EntriesSorted[sortType];
  591. int indexMax = list.Count() - 1;
  592. int indexMin = 0;
  593. int targetIndex = Math.Floor( indexMax / 2 );
  594. int comparisonMultiplier = 1;
  595. // if order is descending, then invert comparison results
  596. if (isDescending == true)
  597. {
  598. comparisonMultiplier = -1;
  599. }
  600. if ( indexMax == -1 )
  601. {
  602. list.Insert( entry );
  603. return 0;
  604. }
  605. while ( true )
  606. {
  607. int comparisonResult = comparisonMultiplier * entry.CompareTo(list[targetIndex], sortType);
  608. if ((indexMax - indexMin) <= 1)
  609. {
  610. for (int i = indexMin; i <= indexMax; i++ )
  611. {
  612. comparisonResult = comparisonMultiplier * entry.CompareTo(list[i], sortType);
  613. if ( comparisonResult > 0 )
  614. {
  615. list.InsertAt( entry, i );
  616. return i;
  617. }
  618. }
  619. // adding entry AFTER indexMax
  620. targetIndex = Math.Min(indexMax + 1, list.Count());
  621. list.InsertAt(entry, targetIndex);
  622. return targetIndex;
  623. }
  624. if (comparisonResult == 0)
  625. {
  626. list.InsertAt(entry, targetIndex);
  627. return targetIndex;
  628. }
  629. if (comparisonResult > 0)
  630. {
  631. indexMax = targetIndex;
  632. }
  633. else if (comparisonResult < 0)
  634. {
  635. indexMin = targetIndex;
  636. }
  637. targetIndex = indexMin + Math.Floor((indexMax - indexMin) / 2);
  638. }
  639. return 0;
  640. }
  641. // DEPRECATED
  642. int SortedInsertAsc( GetServersResultRow entry, ESortType sort_type )
  643. {
  644. array<ref GetServersResultRow> list = m_EntriesSorted[sort_type];
  645. int i;
  646. int index_min = 0;
  647. int index_max = list.Count() - 1;
  648. int target_index = Math.Floor( index_max / 2 );
  649. if ( index_max == -1 )
  650. {
  651. list.Insert( entry );
  652. return 0;
  653. }
  654. if ( sort_type == ESortType.HOST )
  655. {
  656. string entry_value_str = entry.GetValueStr(ESortType.HOST);
  657. while ( true )
  658. {
  659. string target_value_str = list[target_index].GetValueStr(ESortType.HOST);
  660. if ( entry_value_str == target_value_str || ((index_max - index_min) <= 1) )
  661. {
  662. for ( i = index_min; i <= index_max; i++ )
  663. {
  664. if ( entry_value_str <= list[i].GetValueStr(ESortType.HOST) )
  665. {
  666. list.InsertAt( entry, i );
  667. return i;
  668. }
  669. }
  670. index_max++;
  671. list.InsertAt( entry, index_max );
  672. return target_index;
  673. }
  674. else if ( entry_value_str < target_value_str )
  675. {
  676. index_max = target_index;
  677. target_index = Math.Floor( target_index / 2 );
  678. }
  679. else if ( entry_value_str > target_value_str )
  680. {
  681. index_min = target_index;
  682. target_index += Math.Floor( (index_max - index_min) / 2 );
  683. }
  684. }
  685. }
  686. else
  687. {
  688. int entry_value_int = entry.GetValueInt( sort_type );
  689. while ( true )
  690. {
  691. int target_value_int = list[target_index].GetValueInt( sort_type );
  692. if ( entry_value_int == target_value_int || ((index_max - index_min) <= 1) )
  693. {
  694. for ( i = index_min; i <= index_max; i++ )
  695. {
  696. if ( entry_value_int <= list[i].GetValueInt( sort_type ) )
  697. {
  698. list.InsertAt( entry, i );
  699. return i;
  700. }
  701. }
  702. index_max++;
  703. list.InsertAt( entry, index_max );
  704. return target_index;
  705. }
  706. else if ( entry_value_int < target_value_int )
  707. {
  708. index_max = target_index;
  709. target_index = Math.Floor( target_index / 2 );
  710. }
  711. else if ( entry_value_int > target_value_int )
  712. {
  713. index_min = target_index;
  714. target_index += Math.Floor( (index_max - index_min) / 2 );
  715. }
  716. }
  717. }
  718. return target_index;
  719. }
  720. // DEPRECATED
  721. int SortedInsertDesc( GetServersResultRow entry, ESortType sort_type )
  722. {
  723. array<ref GetServersResultRow> list = m_EntriesSorted[sort_type];
  724. int i;
  725. int index_min = 0;
  726. int index_max = list.Count() - 1;
  727. int target_index = Math.Floor( index_max / 2 );
  728. if ( index_max == -1 )
  729. {
  730. list.Insert( entry );
  731. return 0;
  732. }
  733. if ( sort_type == ESortType.HOST )
  734. {
  735. string entry_value_str = entry.GetValueStr(ESortType.HOST);
  736. while ( true )
  737. {
  738. string target_value_str = list[target_index].GetValueStr(ESortType.HOST);
  739. if ( entry_value_str == target_value_str || ((index_max - index_min) <= 1) )
  740. {
  741. for ( i = index_min; i <= index_max; i++ )
  742. {
  743. if ( entry_value_str >= list[i].GetValueStr(ESortType.HOST) )
  744. {
  745. list.InsertAt( entry, i );
  746. return i;
  747. }
  748. }
  749. index_max++;
  750. list.InsertAt( entry, index_max );
  751. return target_index;
  752. }
  753. else if ( entry_value_str > target_value_str )
  754. {
  755. index_max = target_index;
  756. target_index = Math.Floor( target_index / 2 );
  757. }
  758. else if ( entry_value_str < target_value_str )
  759. {
  760. index_min = target_index;
  761. target_index += Math.Floor( (index_max - index_min) / 2 );
  762. }
  763. }
  764. }
  765. else
  766. {
  767. int entry_value_int = entry.GetValueInt( sort_type );
  768. while ( true )
  769. {
  770. int target_value_int = list[target_index].GetValueInt( sort_type );
  771. if ( entry_value_int == target_value_int || ((index_max - index_min) <= 1) )
  772. {
  773. for ( i = index_min; i <= index_max; i++ )
  774. {
  775. if ( entry_value_int >= list[i].GetValueInt( sort_type ) )
  776. {
  777. list.InsertAt( entry, i );
  778. return i;
  779. }
  780. }
  781. index_max++;
  782. list.InsertAt( entry, index_max );
  783. return target_index;
  784. }
  785. else if ( entry_value_int > target_value_int )
  786. {
  787. index_max = target_index;
  788. target_index = Math.Floor( target_index / 2 );
  789. }
  790. else if ( entry_value_int < target_value_int )
  791. {
  792. index_min = target_index;
  793. target_index += Math.Floor( (index_max - index_min) / 2 );
  794. }
  795. }
  796. }
  797. return target_index;
  798. }
  799. void UpdatePageButtons()
  800. {
  801. m_PagesCount = Math.Ceil( m_TotalLoadedServers / SERVERS_VISIBLE_COUNT );
  802. if ( m_PagesCount > 1 )
  803. {
  804. m_PnlPagesPanel.Show( true );
  805. int i;
  806. int btn_index_center = Math.Round( PAGES_BUTTONS_COUNT / 2) - 1;
  807. m_PageStartNum = 1;
  808. m_PageEndNum = PAGES_BUTTONS_COUNT;
  809. if ( m_PagesCount <= PAGES_BUTTONS_COUNT )
  810. {
  811. m_PageEndNum = m_PagesCount;
  812. // Pages are less like buttons - changing selected button
  813. for ( i = 1; i <= m_BtnPages.Count(); ++i )
  814. {
  815. bool is_page_button_enable = ( i <= m_PagesCount );
  816. int page_index = (i - 1);
  817. m_BtnPages[page_index].Show( is_page_button_enable );
  818. m_BtnPages[page_index].SetText( i.ToString() );
  819. if ( m_PageIndex == page_index )
  820. {
  821. m_BtnPages[page_index].SetState( true );
  822. }
  823. else
  824. {
  825. m_BtnPages[page_index].SetState( false );
  826. }
  827. }
  828. }
  829. else
  830. {
  831. // Pages are more like buttons
  832. if ( m_PageIndex <= btn_index_center )
  833. {
  834. //Left side (start of pages)
  835. //m_PageStartNum = 1;
  836. //m_PageEndNum = PAGES_BUTTONS_COUNT;
  837. }
  838. else
  839. {
  840. m_PageStartNum = m_PageIndex - btn_index_center + 1;
  841. m_PageEndNum = m_PageIndex + (PAGES_BUTTONS_COUNT - btn_index_center);
  842. if ( m_PageEndNum > m_PagesCount )
  843. {
  844. // Right side (end of pages)
  845. m_PageStartNum -= m_PageEndNum - m_PagesCount;
  846. m_PageEndNum -= m_PageEndNum - m_PagesCount;
  847. }
  848. }
  849. // Button Selection
  850. int selected_btn_index = m_PageIndex;
  851. if ( m_PageIndex > btn_index_center )
  852. {
  853. if ( m_PageEndNum == m_PagesCount )
  854. {
  855. //Right
  856. selected_btn_index = PAGES_BUTTONS_COUNT - (m_PagesCount - m_PageIndex);
  857. }
  858. else
  859. {
  860. //Center
  861. selected_btn_index = btn_index_center;
  862. }
  863. }
  864. for ( i = 0; i < m_BtnPages.Count(); ++i )
  865. {
  866. m_BtnPages[i].SetText( (m_PageStartNum + i).ToString() );
  867. m_BtnPages[i].SetState( ( i == selected_btn_index ) );
  868. }
  869. }
  870. // Button GoTo Prev Page
  871. if ( m_PageIndex > 0 )
  872. {
  873. m_BtnPagePrev.SetText( "<" );
  874. m_BtnPagePrev.Enable( true );
  875. }
  876. else
  877. {
  878. m_BtnPagePrev.SetText( "" );
  879. m_BtnPagePrev.Enable( false );
  880. }
  881. // Button GoTo Next Page
  882. if ( m_PageIndex < (m_PagesCount - 1) )
  883. {
  884. m_BtnPageNext.SetText( ">" );
  885. m_BtnPageNext.Enable( true );
  886. }
  887. else
  888. {
  889. m_BtnPageNext.SetText( "" );
  890. m_BtnPageNext.Enable( false );
  891. }
  892. // Button GoTo First Page
  893. if ( m_PageStartNum == 1 )
  894. {
  895. m_BtnPagesFirst.SetText( "" );
  896. m_BtnPagesFirst.Enable( false );
  897. }
  898. else
  899. {
  900. m_BtnPagesFirst.SetText( "<<" );
  901. m_BtnPagesFirst.Enable( true );
  902. }
  903. // Button GoTo Last Page
  904. if ( m_PageEndNum == m_PagesCount )
  905. {
  906. m_BtnPagesLast.SetText( "" );
  907. m_BtnPagesLast.Enable( false );
  908. }
  909. else
  910. {
  911. m_BtnPagesLast.SetText( ">>" );
  912. m_BtnPagesLast.Enable( true );
  913. }
  914. }
  915. else
  916. {
  917. m_PnlPagesPanel.Show(false);
  918. }
  919. }
  920. override void UpdateServerList()
  921. {
  922. int lastFilledIndexOnPage = 0;
  923. m_TotalLoadedServers = m_EntriesSorted[m_SortType].Count();
  924. ServerBrowserEntry entry;
  925. m_EntryWidgets.Clear();
  926. for (int i = 0; i < SERVERS_VISIBLE_COUNT; ++i)
  927. {
  928. int serverIndex = i + (SERVERS_VISIBLE_COUNT * m_PageIndex);
  929. if (serverIndex < m_EntriesSorted[m_SortType].Count())
  930. {
  931. GetServersResultRow server_info = m_EntriesSorted[m_SortType][serverIndex];
  932. if (server_info.m_Favorite)
  933. {
  934. m_OnlineFavServers.Insert(server_info.m_Id);
  935. }
  936. server_info.m_IsSelected = (server_info.m_Id == m_CurrentSelectedServer);
  937. entry = GetServerEntryByIndex(i, server_info.m_Id);
  938. entry.Show(true);
  939. entry.SetIsOnline(true);
  940. entry.FillInfo(server_info);
  941. entry.SetMods(m_EntryMods.Get(server_info.m_Id));
  942. entry.UpdateEntry();
  943. lastFilledIndexOnPage++;
  944. }
  945. else
  946. {
  947. entry = GetServerEntryByIndex(i, "-1");
  948. if (entry)
  949. {
  950. entry.Show(false);
  951. }
  952. }
  953. }
  954. LoadExtraEntries(lastFilledIndexOnPage);
  955. m_ServerList.Update();
  956. }
  957. void UpdateStatusBar()
  958. {
  959. string serversFound = string.Format("#servers_found: %1", m_TotalLoadedServers);
  960. if ( m_LoadingFinished )
  961. {
  962. m_LoadingText.SetText( serversFound );
  963. }
  964. else
  965. {
  966. m_LoadingText.SetText( string.Format("#dayz_game_loading %1", serversFound) );
  967. }
  968. }
  969. override void OnLoadServerModsAsync( string server_id, array<string> mods )
  970. {
  971. super.OnLoadServerModsAsync( server_id, mods );
  972. if ( m_EntryWidgets.Contains( server_id ) )
  973. {
  974. m_EntryWidgets.Get( server_id ).SetMods( mods );
  975. }
  976. }
  977. protected ServerBrowserEntry GetServerEntryByIndex( int index, string server_id )
  978. {
  979. ref ServerBrowserEntry entry;
  980. if ( index >= 0 )
  981. {
  982. if ( index < m_ServerListEntries.Count() )
  983. {
  984. entry = m_ServerListEntries[index];
  985. }
  986. else
  987. {
  988. entry = new ServerBrowserEntry( null, index, this );
  989. m_ServerList.AddChild( entry.GetRoot(), false );
  990. m_ServerListEntries.Insert(entry);
  991. }
  992. }
  993. else
  994. {
  995. return null;
  996. }
  997. // Refresh list
  998. m_EntryWidgets.Insert( server_id, entry );
  999. return entry;
  1000. }
  1001. override bool IsFocusable( Widget w )
  1002. {
  1003. if ( w )
  1004. {
  1005. if ( super.IsFocusable( w ) )
  1006. {
  1007. return true;
  1008. }
  1009. if ( w == m_ServerListScroller )
  1010. {
  1011. return false;
  1012. }
  1013. if ( w == m_HostSort || w == m_TimeSort || w == m_PopulationSort || w == m_SlotsSort || w == m_PingSort || w == m_FilterSearchIP || w == m_MapSort )
  1014. {
  1015. return true;
  1016. }
  1017. if ( w == m_FilterPanelAccTime || m_FilterPanelPing )
  1018. {
  1019. return true;
  1020. }
  1021. return false;
  1022. }
  1023. return false;
  1024. }
  1025. void ButtonRefreshToCancel()
  1026. {
  1027. ButtonWidget btn = ButtonWidget.Cast( m_RefreshList );
  1028. btn.SetText( "#menu_cancel" );
  1029. }
  1030. void ButtonCancelToRefresh()
  1031. {
  1032. ButtonWidget btn = ButtonWidget.Cast( m_RefreshList );
  1033. btn.SetText( "#STR_server_browser_tab_root_filters_root_filters_content_refresh_list_button0" );
  1034. }
  1035. void OnClickDetails()
  1036. {
  1037. ShowServerDetails();
  1038. }
  1039. void OnClickFilters()
  1040. {
  1041. SwitchToFilters();
  1042. }
  1043. override void SwitchToDetails(bool focus = true)
  1044. {
  1045. ShowServerDetails();
  1046. }
  1047. override void SwitchToFilters(bool focus = true)
  1048. {
  1049. m_FilterRoot.Show(true);
  1050. m_RightAreaHeaderText.SetText("#STR_server_browser_menu_server_filters");
  1051. m_DetailsRoot.Show(false);
  1052. m_BtnShowDetails.Show(true);
  1053. }
  1054. override void ShowServerDetails()
  1055. {
  1056. super.ShowServerDetails();
  1057. if (m_TabType != TabType.FAVORITE && m_TabType != TabType.LAN)
  1058. {
  1059. m_BtnShowFilters.Show(true);
  1060. m_FilterRoot.Show(false);
  1061. }
  1062. }
  1063. }