Dayz Build 1.29.163047, Scripts Rev. 123548
Dayz Code Explorer by Zeroy
Loading...
Searching...
No Matches
serverbrowsertabpc.c
Go to the documentation of this file.
2{
3 protected const int SERVERS_VISIBLE_COUNT = 24;
4 protected const int PAGES_BUTTONS_COUNT = 10;
5
6 protected int m_TotalServersCount; //UNUSED
7 protected int m_PageIndex;
8 protected int m_PageStartNum;
9 protected int m_PageEndNum;
10 protected int m_PagesCount;
11 protected int m_ServersEstimateCount;
12
13 protected Widget m_PnlPagesPanel;
15 protected ButtonWidget m_BtnPagesFirst;
16 protected ButtonWidget m_BtnPagesLast;
17
22
25
26 protected ref TStringArray m_TempTime = new TStringArray();
27
28 protected override void Construct(Widget parent, ServerBrowserMenuNew menu, TabType type)
29 {
30 #ifdef PLATFORM_CONSOLE
31 m_Root = g_Game.GetWorkspace().CreateWidgets("gui/layouts/new_ui/server_browser/xbox/server_browser_tab.layout", parent);
32 #else
33 #ifdef PLATFORM_WINDOWS
34 m_Root = g_Game.GetWorkspace().CreateWidgets("gui/layouts/new_ui/server_browser/pc/server_browser_tab_pages.layout", parent);
35 #endif
36 #endif
37
38 m_ServerListScroller = ScrollWidget.Cast(m_Root.FindAnyWidget("server_list_scroller"));
39 m_ServerList = SpacerBaseWidget.Cast(m_ServerListScroller.FindAnyWidget("server_list_content"));
40 m_ServerListScroller.VScrollToPos01(0);
41
47
56
57 m_Menu = menu;
58 m_TabType = type;
59
60 m_RightAreaHeaderText = TextWidget.Cast(m_Root.FindAnyWidget("right_area_header_text"));
61 m_BtnShowFilters = ButtonWidget.Cast(m_Root.FindAnyWidget("show_filters_button"));
62
63 m_DetailsRoot = m_Root.FindAnyWidget("details_root");
64 m_BtnShowDetails = ButtonWidget.Cast(m_Root.FindAnyWidget("show_details_button"));
65
66 m_FilterRoot = m_Root.FindAnyWidget("filters_root");
67 m_FilterContent = m_Root.FindAnyWidget("filters_content");
68 m_ApplyFilter = m_Root.FindAnyWidget("apply_filter_button");
69 m_RefreshList = m_Root.FindAnyWidget("refresh_list_button");
70 m_FiltersChanged = m_Root.FindAnyWidget("unapplied_filters_notify");
71 m_HostSort = m_Root.FindAnyWidget("server_list_content_header_host");
72 m_TimeSort = m_Root.FindAnyWidget("server_list_content_header_time");
73 m_PopulationSort = m_Root.FindAnyWidget("server_list_content_header_population");
74 m_SlotsSort = m_Root.FindAnyWidget("server_list_content_header_slots");
75 m_PingSort = m_Root.FindAnyWidget("server_list_content_header_ping");
76 m_MapSort = m_Root.FindAnyWidget("server_list_content_header_map");
77
78 m_FilterSearchText = m_Root.FindAnyWidget("search_name_setting");
79 m_FilterSearchTextBox = m_Root.FindAnyWidget("search_name_setting_option");
80 m_FilterSearchIP = m_Root.FindAnyWidget("search_ip_setting");
81 m_FilterSearchIPBox = m_Root.FindAnyWidget("search_ip_setting_option");
82
83 m_FilterPanelAccTime = m_Root.FindAnyWidget("accelerated_time_setting");
84 m_FilterPanelPing = m_Root.FindAnyWidget("ping_setting");
85 //m_FilterPanelPing.SetHandler(this);
86
87 m_LoadingText = TextWidget.Cast(m_Root.FindAnyWidget("loading_servers_info"));
88
90
91 m_Filters = new ServerBrowserFilterContainer(m_Root.FindAnyWidget("filters_content"), this);
92
93 m_Root.SetHandler(this);
94
95 SetSort(ESortType.HOST, ESortOrder.ASCENDING);
96
98
99 int page_button_num = 1;
100 ButtonWidget page_button = ButtonWidget.Cast(m_Root.FindAnyWidget("servers_navigation_page" + page_button_num));
101
102 if (PAGES_BUTTONS_COUNT < 3 || PAGES_BUTTONS_COUNT > 10)
103 {
104 Error("ServerBrowserTabPage->PAGES_BUTTONS_COUNT must be in range 3 - 10!");
105 return;
106 }
107
108 while (page_button)
109 {
110 page_button.Show(false);
111
112 if (page_button_num <= PAGES_BUTTONS_COUNT)
113 {
114 m_BtnPages.Insert(page_button);
115 }
116
117 page_button_num++;
118 page_button = ButtonWidget.Cast(m_Root.FindAnyWidget("servers_navigation_page"+ page_button_num));
119 }
120
121 m_ResetFilters = ButtonWidget.Cast(m_Root.FindAnyWidget( "reset_filter_button"));
122
123 m_PnlPagesPanel = m_Root.FindAnyWidget("servers_navigation_spacer");
124 m_BtnPagePrev = ButtonWidget.Cast(m_Root.FindAnyWidget("servers_navigation_prev"));
125 m_BtnPageNext = ButtonWidget.Cast(m_Root.FindAnyWidget("servers_navigation_next"));
126 m_BtnPagesFirst = ButtonWidget.Cast(m_Root.FindAnyWidget("servers_navigation_page_first"));
127 m_BtnPagesLast = ButtonWidget.Cast(m_Root.FindAnyWidget("servers_navigation_page_last"));
128 m_PageIndex = 0;
129 m_PnlPagesPanel.Show(true);
130
132
133 m_Details = new ServerBrowserDetailsContainer(m_Root.FindAnyWidget("details_content"), this);
134
135 if (m_TabType == TabType.FAVORITE || m_TabType == TabType.LAN)
136 {
137 m_Root.FindAnyWidget("filters_content").Show(false);
138 m_Root.FindAnyWidget("reset_filter_button").Show(false);
139 m_ApplyFilter.Show(false);
140 m_Root.FindAnyWidget("spacer").Show(false);
141 m_Root.FindAnyWidget("spacer1").Show(false);
142 m_Root.FindAnyWidget("spacer5").Show(false);
143 m_BtnShowFilters.Show(false);
144 m_FilterRoot.Show(true);
145 }
146
147 if (m_TabType != TabType.FAVORITE && m_TabType != TabType.LAN)
148 {
150 }
151 else
152 {
154 }
155
156 #ifdef DIAG_DEVELOPER
157 InitDummyServers();
158 #endif
159 }
160
161 override void RefreshList()
162 {
163 #ifdef DIAG_DEVELOPER
164 if (m_DummyServersEnabled)
165 {
166 RefreshDummyList();
167 return;
168 }
169 #endif
170
171 int entriesSortedCount = m_EntriesSorted.Count();
172 for ( int i = 0; i < entriesSortedCount; ++i )
173 {
174 m_EntriesSorted.GetElement(i).Clear();
175 }
176
177 m_ServerListEntries.Clear();
178
180
181 m_LoadingFinished = false;
182 m_Loading = true;
186 m_PageIndex = 0;
187 m_SelectedServer = null;
188
189 super.RefreshList();
190
191 m_ServerListScroller.VScrollToPos01( 0 );
192
197 }
198
199 override void ResetFilters()
200 {
201 m_Filters.ResetFilters();
202
204
205 if (m_Loading)
206 {
208 }
209 }
210
211 override void ApplyFilters()
212 {
213 m_Filters.SaveFilters();
214 RefreshList();
217 }
218
220 {
222
223 m_LoadingFinished = true;
224 m_Loading = false;
225
227
230
232
233 if (m_TotalLoadedServers == 0)
234 {
235 switch (m_TabType)
236 {
237 case TabType.OFFICIAL:
238 case TabType.COMMUNITY:
239 {
241 break;
242 }
243 }
244 }
245
246 int totalVisibleEntries = 0;
247 foreach(string serverID, ServerBrowserEntry entry: m_EntryWidgets)
248 {
249 if (entry.GetRoot().IsVisible())
250 totalVisibleEntries++;
251 }
252
253 if (GetTabType() == TabType.FAVORITE && totalVisibleEntries == 0)
254 g_Game.GetCallQueue(CALL_CATEGORY_GUI).Call(m_Menu.SwitchToOfficalTab);
255 }
256
257 override void OnLoadServersAsyncPC(GetServersResult result_list, EBiosError error, string response)
258 {
259 #ifdef DIAG_DEVELOPER
260 if (m_DummyServersEnabled)
261 return;
262 #endif
263
264 if (result_list)
265 {
266 int count = result_list.m_Results.Count();
267 if (count > 0)
268 {
269 for (int i = 0; i < count; i++)
270 {
271 GetServersResultRow result = result_list.m_Results[i];
273
274 result.m_SortName = result.m_Name.ToInt();
275 result.m_SortTime = GetTimeOfDayEnum(result.m_TimeOfDay);
276
277 if (PassFilter(result))
278 {
279 int sorted_index = AddSorted(result);
281 {
284 }
285 }
286
287 if (!m_Menu || m_Menu.GetServersLoadingTab() != m_TabType)
288 {
289 return;
290 }
291 }
292 }
293 else
294 {
295 m_Menu.SetServersLoadingTab(TabType.NONE);
296 }
297 }
298 else
299 {
300 m_Menu.SetServersLoadingTab(TabType.NONE);
301 }
302
303 if (response == "thelastone")
304 {
306 }
307 else
308 {
310 }
311
314 }
315
320
321 override bool OnClick(Widget w, int x, int y, int button)
322 {
323 super.OnClick(w, x, y, button);
324
325 if (button == MouseState.LEFT)
326 {
327 if (w == m_ResetFilters)
328 {
329 ResetFilters();
330 }
331 else if (w == m_ApplyFilter)
332 {
333 ApplyFilters();
334 return true;
335 }
336 else if (w == m_RefreshList)
337 {
339 {
341 }
342 else
343 {
344 RefreshList();
345 }
346
347 return true;
348 }
349 else if (w == m_BtnPagePrev)
350 {
352 return true;
353 }
354 else if (w == m_BtnPageNext)
355 {
357 return true;
358 }
359 else if (w == m_BtnPagesLast)
360 {
362 return true;
363 }
364 else if (w == m_BtnPagesFirst)
365 {
367 return true;
368 }
369 else if (w == m_BtnShowDetails)
370 {
372 return true;
373 }
374 else if (w == m_BtnShowFilters)
375 {
377 return true;
378 }
379 else
380 {
381 bool click = OnClickPage(w);
382 if (click)
383 {
384 return true;
385 }
386
387 return false;
388 }
389 }
390 return false;
391 }
392
393 override bool OnMouseEnter(Widget w, int x, int y)
394 {
395 if (IsFocusable(w))
396 {
398
399 if (w == m_FilterSearchText)
400 {
402 }
403 else if (w == m_FilterSearchIP)
404 {
406 }
407
408 return true;
409 }
410 return false;
411 }
412
413 override bool OnMouseLeave(Widget w, Widget enterW, int x, int y)
414 {
415 if (IsFocusable(w))
416 {
417 ColorNormal(w);
418
419 if (w == m_FilterSearchText || w == m_FilterSearchIP)
420 {
421 SetFocus( null );
422 }
423
424 return true;
425 }
426 return false;
427 }
428
429 override bool OnMouseButtonUp( Widget w, int x, int y, int button )
430 {
431 if ( button == MouseState.LEFT )
432 {
433 if ( w == m_HostSort )
434 {
435 ToggleSort( ESortType.HOST );
437 return true;
438 }
439 else if ( w == m_TimeSort )
440 {
441 ToggleSort( ESortType.TIME );
443 return true;
444 }
445 else if ( w == m_PopulationSort )
446 {
447 ToggleSort( ESortType.POPULATION );
449 return true;
450 }
451 else if ( w == m_SlotsSort )
452 {
453 ToggleSort( ESortType.SLOTS );
455 return true;
456 }
457 else if ( w == m_PingSort )
458 {
459 ToggleSort( ESortType.PING );
461 return true;
462 }
463 else if ( w == m_MapSort )
464 {
465 ToggleSort( ESortType.MAP );
467 return true;
468 }
469 }
470 return false;
471 }
472
473 override void OnFilterChanged()
474 {
475 //m_FiltersChanged.Show(true);
476
478
479 if (m_Loading)
480 {
482 }
483 }
484
486 {
487 if ( m_PageIndex > 0 )
488 {
490 }
491 else
492 {
494 }
495 }
496
498 {
499 if ( m_PageIndex < (m_PagesCount - 1) )
500 {
502 }
503 else
504 {
505 SetPageIndex( 0 );
506 }
507 }
508
510 {
512 }
513
515 {
516 SetPageIndex( 0 );
517 }
518
520 {
521 for ( int i = 0; i < m_BtnPages.Count(); ++i )
522 {
523 if ( m_BtnPages[i] == w )
524 {
525 SetPageIndex( m_PageStartNum + i - 1 );
526 return true;
527 }
528 }
529
530 return false;
531 }
532
533 void SetPageIndex(int page_index)
534 {
535 m_PageIndex = page_index;
538 Focus();
539 }
540
542 {
543 ESortOrder order = ESortOrder.ASCENDING;
544
545 if ( m_SortType != type )
546 {
547 if ( m_SortInverted[type] == true )
548 {
549 m_EntriesSorted[type].Invert();
550 }
551
552 m_SortInverted[type] = false;
553 }
554 else
555 {
556 if ( m_SortOrder == ESortOrder.ASCENDING )
557 {
558 m_EntriesSorted[type].Invert();
559 m_SortInverted[type] = true;
560 order = ESortOrder.DESCENDING;
561 }
562 else
563 {
564 m_EntriesSorted[type].Invert();
565 m_SortInverted[type] = false;
566 }
567 }
568
569 SetSort( type, order );
570 }
571
572 override void SetSort( ESortType type, ESortOrder order )
573 {
574 super.SetSort( type, order);
575
576 #ifdef PLATFORM_WINDOWS
577 m_Root.FindAnyWidget( "host_sort" ).Show( false );
578 m_Root.FindAnyWidget( "population_sort" ).Show( false );
579 m_Root.FindAnyWidget( "slots_sort" ).Show( false );
580
581 m_Root.FindAnyWidget( "time_sort" ).Show( false );
582 m_Root.FindAnyWidget( "ping_sort" ).Show( false );
583 m_Root.FindAnyWidget( "map_sort" ).Show( false );
584
585 TextWidget root;
586 root = TextWidget.Cast( m_Root.FindAnyWidget( "server_list_content_header_host_label" ) );
587 root.SetColor( ARGBF( 1, 1, 1, 1 ) );
588 root = TextWidget.Cast( m_Root.FindAnyWidget( "server_list_content_header_population_label" ) );
589 root.SetColor( ARGBF( 1, 1, 1, 1 ) );
590 root = TextWidget.Cast( m_Root.FindAnyWidget( "server_list_content_header_slots_label" ) );
591 root.SetColor( ARGBF( 1, 1, 1, 1 ) );
592
593 root = TextWidget.Cast( m_Root.FindAnyWidget( "server_list_content_header_ping_label" ) );
594 root.SetColor( ARGBF( 1, 1, 1, 1 ) );
595 root = TextWidget.Cast( m_Root.FindAnyWidget( "server_list_content_header_time_label" ) );
596 root.SetColor( ARGBF( 1, 1, 1, 1 ) );
597
598 string r_name;
599 string w_name;
600
601 switch ( type )
602 {
603 case ESortType.HOST:
604 {
605 r_name = "server_list_content_header_host_label";
606 w_name = "host_sort";
607 break;
608 }
609 case ESortType.TIME:
610 {
611 r_name = "server_list_content_header_time_label";
612 w_name = "time_sort";
613 break;
614 }
615 case ESortType.POPULATION:
616 {
617 r_name = "server_list_content_header_population_label";
618 w_name = "population_sort";
619 break;
620 }
621 case ESortType.SLOTS:
622 {
623 r_name = "server_list_content_header_slots_label";
624 w_name = "slots_sort";
625 break;
626 }
627 case ESortType.PING:
628 {
629 r_name = "server_list_content_header_ping_label";
630 w_name = "ping_sort";
631 break;
632 }
633 case ESortType.MAP:
634 {
635 r_name = "server_list_content_header_map_label";
636 w_name = "map_sort";
637 break;
638 }
639 }
640
641 root = TextWidget.Cast( m_Root.FindAnyWidget( r_name ) );
642 root.SetColor( ARGBF( 1, 1, 0, 0 ) );
643
644 m_Root.FindAnyWidget( w_name ).Show( true );
645 m_Root.FindAnyWidget( w_name + "_asc" ).Show( !m_SortOrder );
646 m_Root.FindAnyWidget( w_name + "_dsc" ).Show( m_SortOrder );
647 #endif
648 }
649
650 int GetTimeOfDayEnum( string time_of_day )
651 {
652 m_TempTime.Clear();
653
654 time_of_day.Split( ":", m_TempTime );
655
656 int minutes = 0;
657
658 if ( m_TempTime.Count() > 0 )
659 {
660 int h = m_TempTime[0].ToInt();
661
662 if ( h >= 5 )
663 {
664 h -= 5;
665 }
666 else
667 {
668 h += 24;
669 }
670
671 minutes = h * 60;
672 }
673
674 if ( m_TempTime.Count() > 1 )
675 {
676 int m = m_TempTime[0].ToInt();
677 minutes += m;
678 }
679
680 return minutes;
681 }
682
683 // Return sorted index
684 override int AddSorted( GetServersResultRow entry )
685 {
686 int index_host = SortedInsert( entry, ESortType.HOST );
687 int index_time = SortedInsert( entry, ESortType.TIME );
688 int index_popu = SortedInsert( entry, ESortType.POPULATION );
689 int index_slot = SortedInsert( entry, ESortType.SLOTS );
690 int index_ping = SortedInsert( entry, ESortType.PING );
691 int index_favo = SortedInsert( entry, ESortType.FAVORITE );
692 int index_pass = SortedInsert( entry, ESortType.PASSWORDED );
693 int index_map = SortedInsert( entry, ESortType.MAP );
694
695 switch ( m_SortType )
696 {
697 case ESortType.HOST:
698 return index_host;
699 case ESortType.TIME:
700 return index_time;
701 case ESortType.POPULATION:
702 return index_popu;
703 case ESortType.SLOTS:
704 return index_slot;
705 case ESortType.PING:
706 return index_ping;
707 case ESortType.FAVORITE:
708 return index_favo;
709 case ESortType.PASSWORDED:
710 return index_pass;
711 case ESortType.MAP:
712 return index_map;
713 }
714
715 return 0;
716 }
717
719 {
720 return SortedInsertEx(entry, sort_type, m_SortInverted[sort_type]);
721 }
722
723 private int SortedInsertEx(GetServersResultRow entry, ESortType sortType, bool isDescending)
724 {
726 int indexMax = list.Count() - 1;
727 int indexMin = 0;
728 int targetIndex = Math.Floor( indexMax / 2 );
729 int comparisonMultiplier = 1;
730
731 // if order is descending, then invert comparison results
732 if (isDescending == true)
733 {
734 comparisonMultiplier = -1;
735 }
736
737 if ( indexMax == -1 )
738 {
739 list.Insert( entry );
740 return 0;
741 }
742
743 while ( true )
744 {
745 int comparisonResult = comparisonMultiplier * entry.CompareTo(list[targetIndex], sortType);
746
747 if ((indexMax - indexMin) <= 1)
748 {
749 for (int i = indexMin; i <= indexMax; i++ )
750 {
751 comparisonResult = comparisonMultiplier * entry.CompareTo(list[i], sortType);
752
753 if ( comparisonResult > 0 )
754 {
755 list.InsertAt( entry, i );
756 return i;
757 }
758 }
759
760 // adding entry AFTER indexMax
761 targetIndex = Math.Min(indexMax + 1, list.Count());
762 list.InsertAt(entry, targetIndex);
763 return targetIndex;
764 }
765
766 if (comparisonResult == 0)
767 {
768 list.InsertAt(entry, targetIndex);
769 return targetIndex;
770 }
771
772 if (comparisonResult > 0)
773 {
774 indexMax = targetIndex;
775 }
776
777 else if (comparisonResult < 0)
778 {
779 indexMin = targetIndex;
780 }
781
782 targetIndex = indexMin + Math.Floor((indexMax - indexMin) / 2);
783 }
784
785 return 0;
786 }
787
788 // DEPRECATED
790 {
792
793 int i;
794 int index_min = 0;
795 int index_max = list.Count() - 1;
796 int target_index = Math.Floor( index_max / 2 );
797
798 if ( index_max == -1 )
799 {
800 list.Insert( entry );
801 return 0;
802 }
803
804 if ( sort_type == ESortType.HOST )
805 {
806 string entry_value_str = entry.GetValueStr(ESortType.HOST);
807
808 while ( true )
809 {
810 string target_value_str = list[target_index].GetValueStr(ESortType.HOST);
811
812 if ( entry_value_str == target_value_str || ((index_max - index_min) <= 1) )
813 {
814 for ( i = index_min; i <= index_max; i++ )
815 {
816 if ( entry_value_str <= list[i].GetValueStr(ESortType.HOST) )
817 {
818 list.InsertAt( entry, i );
819 return i;
820 }
821 }
822
823 index_max++;
824 list.InsertAt( entry, index_max );
825 return target_index;
826 }
827 else if ( entry_value_str < target_value_str )
828 {
829 index_max = target_index;
830 target_index = Math.Floor( target_index / 2 );
831 }
832 else if ( entry_value_str > target_value_str )
833 {
834 index_min = target_index;
835 target_index += Math.Floor( (index_max - index_min) / 2 );
836 }
837 }
838 }
839 else
840 {
841 int entry_value_int = entry.GetValueInt( sort_type );
842
843 while ( true )
844 {
845 int target_value_int = list[target_index].GetValueInt( sort_type );
846
847 if ( entry_value_int == target_value_int || ((index_max - index_min) <= 1) )
848 {
849 for ( i = index_min; i <= index_max; i++ )
850 {
851 if ( entry_value_int <= list[i].GetValueInt( sort_type ) )
852 {
853 list.InsertAt( entry, i );
854 return i;
855 }
856 }
857
858 index_max++;
859 list.InsertAt( entry, index_max );
860 return target_index;
861 }
862 else if ( entry_value_int < target_value_int )
863 {
864 index_max = target_index;
865 target_index = Math.Floor( target_index / 2 );
866 }
867 else if ( entry_value_int > target_value_int )
868 {
869 index_min = target_index;
870 target_index += Math.Floor( (index_max - index_min) / 2 );
871 }
872 }
873 }
874
875 return target_index;
876 }
877
879 {
881 if (m_PagesCount < 1)
882 m_PagesCount = 1;
883
884 if ( m_PagesCount > 1 )
885 {
886 m_PnlPagesPanel.Show( true );
887
888 int i;
889 int btn_index_center = Math.Round( PAGES_BUTTONS_COUNT / 2) - 1;
890 m_PageStartNum = 1;
892
894 {
896
897 // Pages are less like buttons - changing selected button
898 for ( i = 1; i <= m_BtnPages.Count(); ++i )
899 {
900 bool is_page_button_enable = ( i <= m_PagesCount );
901
902 int page_index = (i - 1);
903 m_BtnPages[page_index].Show( is_page_button_enable );
904 m_BtnPages[page_index].SetText( i.ToString() );
905
906 if ( m_PageIndex == page_index )
907 {
908 m_BtnPages[page_index].SetState( true );
909 }
910 else
911 {
912 m_BtnPages[page_index].SetState( false );
913 }
914 }
915 }
916 else
917 {
918 // Pages are more like buttons
919 if ( m_PageIndex <= btn_index_center )
920 {
921 //Left side (start of pages)
922 //m_PageStartNum = 1;
923 //m_PageEndNum = PAGES_BUTTONS_COUNT;
924 }
925 else
926 {
927 m_PageStartNum = m_PageIndex - btn_index_center + 1;
928 m_PageEndNum = m_PageIndex + (PAGES_BUTTONS_COUNT - btn_index_center);
929
931 {
932 // Right side (end of pages)
935 }
936 }
937
938
939 // Button Selection
940 int selected_btn_index = m_PageIndex;
941 if ( m_PageIndex > btn_index_center )
942 {
943 if ( m_PageEndNum == m_PagesCount )
944 {
945 //Right
946 selected_btn_index = PAGES_BUTTONS_COUNT - (m_PagesCount - m_PageIndex);
947 }
948 else
949 {
950 //Center
951 selected_btn_index = btn_index_center;
952 }
953 }
954
955
956 for ( i = 0; i < m_BtnPages.Count(); ++i )
957 {
958 m_BtnPages[i].SetText( (m_PageStartNum + i).ToString() );
959 m_BtnPages[i].SetState( ( i == selected_btn_index ) );
960 }
961 }
962
963 // Button GoTo Prev Page
964 if ( m_PageIndex > 0 )
965 {
966 m_BtnPagePrev.SetText( "<" );
967 m_BtnPagePrev.Enable( true );
968 }
969 else
970 {
971 m_BtnPagePrev.SetText( "" );
972 m_BtnPagePrev.Enable( false );
973 }
974
975 // Button GoTo Next Page
976 if ( m_PageIndex < (m_PagesCount - 1) )
977 {
978 m_BtnPageNext.SetText( ">" );
979 m_BtnPageNext.Enable( true );
980 }
981 else
982 {
983 m_BtnPageNext.SetText( "" );
984 m_BtnPageNext.Enable( false );
985 }
986
987 // Button GoTo First Page
988 if ( m_PageStartNum == 1 )
989 {
990 m_BtnPagesFirst.SetText( "" );
991 m_BtnPagesFirst.Enable( false );
992 }
993 else
994 {
995 m_BtnPagesFirst.SetText( "<<" );
996 m_BtnPagesFirst.Enable( true );
997 }
998
999 // Button GoTo Last Page
1000 if ( m_PageEndNum == m_PagesCount )
1001 {
1002 m_BtnPagesLast.SetText( "" );
1003 m_BtnPagesLast.Enable( false );
1004 }
1005 else
1006 {
1007 m_BtnPagesLast.SetText( ">>" );
1008 m_BtnPagesLast.Enable( true );
1009 }
1010 }
1011 else
1012 {
1013 m_PnlPagesPanel.Show(false);
1014 }
1015 }
1016
1017 override void UpdateServerList()
1018 {
1019 int lastFilledIndexOnPage = 0;
1021
1022 ServerBrowserEntry entry;
1023
1024 m_EntryWidgets.Clear();
1025
1026 for (int i = 0; i < SERVERS_VISIBLE_COUNT; ++i)
1027 {
1028 int serverIndex = i + (SERVERS_VISIBLE_COUNT * m_PageIndex);
1029
1030 if (serverIndex < m_EntriesSorted[m_SortType].Count())
1031 {
1032 GetServersResultRow server_info = m_EntriesSorted[m_SortType][serverIndex];
1033
1034 if (server_info.m_Favorite)
1035 {
1036 m_OnlineFavServers.Insert(server_info.GetIpPort());
1037 }
1038
1039 server_info.m_IsSelected = (server_info.GetIpPort() == m_CurrentSelectedServer);
1040
1041 entry = GetServerEntryByIndex(i, server_info.GetIpPort());
1042 entry.Show(true);
1043 entry.SetIsOnline(true);
1044 entry.FillInfo(server_info);
1045 entry.SetMods(m_EntryMods.Get(server_info.m_Id));
1046 entry.UpdateEntry();
1047
1048 lastFilledIndexOnPage++;
1049 }
1050 else
1051 {
1052 entry = GetServerEntryByIndex(i, "-1");
1053
1054 if (entry)
1055 {
1056 entry.Show(false);
1057 }
1058 }
1059 }
1060
1061 LoadExtraEntries(lastFilledIndexOnPage);
1062 m_ServerList.Update();
1063 }
1064
1066 {
1067 string serversFound = string.Format("#servers_found: %1", m_TotalLoadedServers);
1068 if ( m_LoadingFinished )
1069 {
1070 m_LoadingText.SetText( serversFound );
1071 }
1072 else
1073 {
1074 m_LoadingText.SetText( string.Format("#dayz_game_loading %1", serversFound) );
1075 }
1076 }
1077
1078 override void OnLoadServerModsAsync( string server_id, array<string> mods )
1079 {
1080 super.OnLoadServerModsAsync( server_id, mods );
1081
1082 if ( m_EntryWidgets.Contains( server_id ) )
1083 {
1084 m_EntryWidgets.Get( server_id ).SetMods( mods );
1085 }
1086 }
1087
1088 protected ServerBrowserEntry GetServerEntryByIndex( int index, string server_id )
1089 {
1090 ref ServerBrowserEntry entry;
1091
1092 if ( index >= 0 )
1093 {
1094 if ( index < m_ServerListEntries.Count() )
1095 {
1096 entry = m_ServerListEntries[index];
1097 }
1098 else
1099 {
1100 entry = new ServerBrowserEntry( null, index, this );
1101 m_ServerList.AddChild( entry.GetRoot(), false );
1102
1103 m_ServerListEntries.Insert(entry);
1104 }
1105 }
1106 else
1107 {
1108 return null;
1109 }
1110
1111 // Refresh list
1112 m_EntryWidgets.Insert( server_id, entry );
1113
1114 return entry;
1115 }
1116
1117 override bool IsFocusable( Widget w )
1118 {
1119 if ( w )
1120 {
1121 if ( super.IsFocusable( w ) )
1122 {
1123 return true;
1124 }
1125
1126 if ( w == m_ServerListScroller )
1127 {
1128 return false;
1129 }
1130
1131 if ( w == m_HostSort || w == m_TimeSort || w == m_PopulationSort || w == m_SlotsSort || w == m_PingSort || w == m_FilterSearchIP || w == m_MapSort )
1132 {
1133 return true;
1134 }
1135
1137 {
1138 return true;
1139 }
1140
1141 return false;
1142 }
1143 return false;
1144 }
1145
1147 {
1148 ButtonWidget btn = ButtonWidget.Cast( m_RefreshList );
1149 btn.SetText( "#menu_cancel" );
1150 }
1151
1153 {
1154 ButtonWidget btn = ButtonWidget.Cast( m_RefreshList );
1155 btn.SetText( "#STR_server_browser_tab_root_filters_root_filters_content_refresh_list_button0" );
1156 }
1157
1159 {
1161 }
1162
1164 {
1166 }
1167
1168 override void SwitchToDetails(bool focus = true)
1169 {
1171 }
1172
1173 override void SwitchToFilters(bool focus = true)
1174 {
1175 m_FilterRoot.Show(true);
1176 m_RightAreaHeaderText.SetText("#STR_server_browser_menu_server_filters");
1177 m_DetailsRoot.Show(false);
1178 m_BtnShowDetails.Show(true);
1179 }
1180
1181 override void ShowServerDetails()
1182 {
1183 super.ShowServerDetails();
1184
1185 if (m_TabType != TabType.FAVORITE && m_TabType != TabType.LAN)
1186 {
1187 m_BtnShowFilters.Show(true);
1188 m_FilterRoot.Show(false);
1189 }
1190 }
1191
1192#ifdef DIAG_DEVELOPER
1193 protected void RefreshDummyList()
1194 {
1195 for (int i = 0; i < m_EntriesSorted.Count(); ++i)
1196 {
1197 m_EntriesSorted.GetElement(i).Clear();
1198 }
1199
1200 m_ServerListEntries.Clear();
1201 m_EntryWidgets.Clear();
1202 m_OnlineFavServers.Clear();
1203
1204 m_Menu.SetServersLoadingTab(m_TabType);
1205 m_LoadingFinished = false;
1206 m_Loading = true;
1207 m_Initialized = true;
1208 m_BegunLoading = false;
1209 m_LastLoadedPage = 0;
1210 m_TotalPages = -1;
1211 m_TotalServers = 0;
1214 m_TotalServersCount = 0;
1215 m_ServersEstimateCount = 0;
1216 m_PageIndex = 0;
1217 m_SelectedServer = null;
1218
1219 m_Menu.DeselectCurrentServer();
1220
1221 m_CurrentFilterInput = m_Filters.GetFilterOptionsPC();
1222
1223 if (!m_DummyServers || !m_DummyServers.m_Results)
1224 {
1225 m_LoadingFinished = true;
1226 m_Loading = false;
1227 m_Menu.SetServersLoadingTab(TabType.NONE);
1229 UpdatePageButtons();
1230 UpdateStatusBar();
1231 return;
1232 }
1233
1234 int count = m_DummyServers.m_Results.Count();
1235 for (int j = 0; j < count; ++j)
1236 {
1237 GetServersResultRow result = m_DummyServers.m_Results[j];
1238
1239 result.m_SortName = result.m_Name.ToInt();
1240 result.m_SortTime = GetTimeOfDayEnum(result.m_TimeOfDay);
1241
1242 string ipPort = result.GetIpPort();
1243 result.m_Favorite = m_Menu.IsFavorited(ipPort);
1244
1245 if (m_TabType == TabType.FAVORITE && !result.m_Favorite)
1246 continue;
1247
1248 if (PassLocalFilters(result))
1249 AddSorted(result);
1250 }
1251
1252 m_TotalServersCount = m_DummyServers.m_NumServers;
1254 m_ServersEstimateCount = m_TotalLoadedServers;
1255
1256 m_LoadingFinished = true;
1257 m_Loading = false;
1258 m_Menu.SetServersLoadingTab(TabType.NONE);
1259
1260 ButtonCancelToRefresh();
1262
1263 m_ServerListScroller.VScrollToPos01(0);
1264
1266 UpdatePageButtons();
1267 UpdateStatusBar();
1268
1269 if (m_TotalLoadedServers == 0)
1270 {
1271 if (m_TabType != TabType.FAVORITE && m_TabType != TabType.LAN)
1272 {
1274 }
1275 }
1276 }
1277
1278 override void OnDummyServersEnabledChanged()
1279 {
1280 super.OnDummyServersEnabledChanged();
1281
1282 RefreshList();
1283 }
1284
1285 override int GetServersVisibleCount()
1286 {
1287 return SERVERS_VISIBLE_COUNT;
1288 }
1289#endif
1290
1291 // DEPRECATED BELOW
1292 [Obsolete("1.29: No replacement")]
1294 {
1296
1297 int i;
1298 int index_min = 0;
1299 int index_max = list.Count() - 1;
1300 int target_index = Math.Floor( index_max / 2 );
1301
1302 if ( index_max == -1 )
1303 {
1304 list.Insert( entry );
1305 return 0;
1306 }
1307
1308 if ( sort_type == ESortType.HOST )
1309 {
1310 string entry_value_str = entry.GetValueStr(ESortType.HOST);
1311
1312 while ( true )
1313 {
1314 string target_value_str = list[target_index].GetValueStr(ESortType.HOST);
1315
1316 if ( entry_value_str == target_value_str || ((index_max - index_min) <= 1) )
1317 {
1318 for ( i = index_min; i <= index_max; i++ )
1319 {
1320 if ( entry_value_str >= list[i].GetValueStr(ESortType.HOST) )
1321 {
1322 list.InsertAt( entry, i );
1323 return i;
1324 }
1325 }
1326
1327 index_max++;
1328 list.InsertAt( entry, index_max );
1329 return target_index;
1330 }
1331 else if ( entry_value_str > target_value_str )
1332 {
1333 index_max = target_index;
1334 target_index = Math.Floor( target_index / 2 );
1335 }
1336 else if ( entry_value_str < target_value_str )
1337 {
1338 index_min = target_index;
1339 target_index += Math.Floor( (index_max - index_min) / 2 );
1340 }
1341 }
1342 }
1343 else
1344 {
1345 int entry_value_int = entry.GetValueInt( sort_type );
1346
1347 while ( true )
1348 {
1349 int target_value_int = list[target_index].GetValueInt( sort_type );
1350
1351 if ( entry_value_int == target_value_int || ((index_max - index_min) <= 1) )
1352 {
1353 for ( i = index_min; i <= index_max; i++ )
1354 {
1355 if ( entry_value_int >= list[i].GetValueInt( sort_type ) )
1356 {
1357 list.InsertAt( entry, i );
1358 return i;
1359 }
1360 }
1361
1362 index_max++;
1363 list.InsertAt( entry, index_max );
1364 return target_index;
1365 }
1366 else if ( entry_value_int > target_value_int )
1367 {
1368 index_max = target_index;
1369 target_index = Math.Floor( target_index / 2 );
1370 }
1371 else if ( entry_value_int < target_value_int )
1372 {
1373 index_min = target_index;
1374 target_index += Math.Floor( (index_max - index_min) / 2 );
1375 }
1376 }
1377 }
1378
1379 return target_index;
1380 }
1381}
EScriptInvokerInsertFlags
Definition tools.c:130
int m_PageIndex
bool m_Initialized
EBiosError
Possible Error codes for bios API.
ESortOrder
ESortType
GetServersResult the output structure of the GetServers operation.
ref GetServersResultRowArray m_Results
GetServersResultRow the output structure of the GetServers operation that represents one game server.
int GetValueInt(ESortType sort_type)
int CompareTo(GetServersResultRow other, ESortType sortType)
string GetValueStr(ESortType sort_type)
Definition enmath.c:7
static ref ScriptInvoker m_ServersAsyncInvoker
proto bool Remove(func fn, int flags=EScriptInvokerRemoveFlags.ALL)
remove specific call from list
proto bool Insert(func fn, int flags=EScriptInvokerInsertFlags.IMMEDIATE)
insert method to list
override bool IsFocusable(Widget w)
ServerBrowserEntry GetServerEntryByIndex(int index, string server_id)
override void OnFilterChanged()
override void RefreshList()
override bool OnMouseLeave(Widget w, Widget enterW, int x, int y)
override void UpdateServerList()
const int PAGES_BUTTONS_COUNT
int SortedInsertEx(GetServersResultRow entry, ESortType sortType, bool isDescending)
void SetPageIndex(int page_index)
int SortedInsertAsc(GetServersResultRow entry, ESortType sort_type)
override void SetSort(ESortType type, ESortOrder order)
void ToggleSort(ESortType type)
override void OnLoadServersAsyncPC(GetServersResult result_list, EBiosError error, string response)
bool OnClickPage(Widget w)
override int AddSorted(GetServersResultRow entry)
ServerBrowserEntry GetServerEntryByIndex(int index)
override void SwitchToFilters(bool focus=true)
override void ApplyFilters()
override void OnLoadServerModsAsync(string server_id, array< string > mods)
ref array< ref ServerBrowserEntry > m_ServerListEntries
override void ShowServerDetails()
int SortedInsertDesc(GetServersResultRow entry, ESortType sort_type)
ref TStringArray m_TempTime
ref array< ButtonWidget > m_BtnPages
int SortedInsert(GetServersResultRow entry, ESortType sort_type)
override void SwitchToDetails(bool focus=true)
override bool OnMouseEnter(Widget w, int x, int y)
ButtonWidget m_BtnPagesFirst
ButtonWidget m_BtnPagesLast
int GetTimeOfDayEnum(string time_of_day)
override void Construct(Widget parent, ServerBrowserMenuNew menu, TabType type)
override bool OnClick(Widget w, int x, int y, int button)
override bool OnMouseButtonUp(Widget w, int x, int y, int button)
override void ResetFilters()
override void LoadExtraEntries(int index)
Result for an object found in CGame.IsBoxCollidingGeometryProxy.
DayZGame g_Game
Definition dayzgame.c:3942
proto string ToString()
void Error(string err)
Messagebox with error message.
Definition endebug.c:90
array< string > TStringArray
Definition enscript.c:712
void Obsolete(string msg="")
Definition enscript.c:371
static proto float Round(float f)
Returns mathematical round of value.
static proto float Min(float x, float y)
Returns smaller of two given values.
static proto float Floor(float f)
Returns floor of value.
MouseState
Definition ensystem.c:311
void Split(string sample, out array< string > output)
Splits string into array of strings separated by 'sample'.
Definition enstring.c:396
proto native int ToInt()
Converts string to integer.
const int CALL_CATEGORY_GUI
Definition tools.c:9
proto native void SetFocus(Widget w)
proto native void SetSort(int sort, bool immedUpdate=true)
Icon x
Icon y
void ColorNormal(Widget w)
void ColorHighlight(Widget w)
int ARGBF(float fa, float fr, float fg, float fb)
Converts <0.0, 1.0> ARGB into color.
Definition proto.c:332
ref ServerBrowserFilterContainer m_Filters
ref map< ESortType, ref array< ref GetServersResultRow > > m_EntriesSorted
TabType GetTabType()
TabType m_TabType
Widget m_FilterSearchText
Widget m_FiltersChanged
void ApplyFilters()
Widget m_SlotsSort
TextWidget m_RightAreaHeaderText
bool m_LoadingFinished
ServerBrowserEntry m_SelectedServer
int m_CurrentLoadedPage
void ButtonDisable(Widget w)
ref GetServersInput m_CurrentFilterInput
ButtonWidget m_BtnPageNext
ref map< ESortType, ESortOrder > m_SortInverted
ButtonWidget m_BtnShowFilters
ref map< string, ref ServerBrowserEntry > m_EntryWidgets
int m_TotalPages
bool m_BegunLoading
void SwitchToDetails(bool focus=true)
TabType
ScrollWidget m_ServerListScroller
bool PassFilter(GetServersResultRow result)
Widget m_PingSort
int m_TotalLoadedServers
string m_CurrentSelectedServer
Widget m_ApplyFilter
ServerBrowserMenuNew m_Menu
void ResetFilters()
void UpdateServerList()
void SwitchToFilters(bool focus=true)
ref map< string, ref array< string > > m_EntryMods
void Focus()
bool m_Loading
int m_LastLoadedPage
ESortType m_SortType
TextWidget m_LoadingText
Widget m_PopulationSort
Widget m_MapSort
Widget m_HostSort
ButtonWidget m_BtnPagePrev
void ButtonEnable(Widget w)
ESortOrder m_SortOrder
SpacerBaseWidget m_ServerList
int m_TotalServers
void ShowServerDetails()
Widget m_FilterSearchTextBox
bool IsFocusable(Widget w)
ref ServerBrowserDetailsContainer m_Details
Widget m_FilterRoot
Widget m_ResetFilters
Widget m_DetailsRoot
Widget m_RefreshList
Widget m_TimeSort
Widget m_FilterContent
ref set< string > m_OnlineFavServers
ButtonWidget m_BtnShowDetails
int AddSorted(GetServersResultRow entry)
Widget m_Root
Definition sizetochild.c:91