Dayz Explorer 1.29.162510
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;
14 protected TextWidget m_PnlPagesLoadingText;
15 protected ButtonWidget m_BtnPagesFirst;
16 protected ButtonWidget m_BtnPagesLast;
17
18 protected Widget m_FilterSearchIP;
19 protected Widget m_FilterSearchIPBox;
20 protected Widget m_FilterPanelPing;
21 protected Widget m_FilterPanelAccTime;
22
25
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
158 {
159
160 }
161
162 override void RefreshList()
163 {
164 for ( int i = 0; i < m_EntriesSorted.Count(); i++ )
165 {
166 m_EntriesSorted.GetElement(i).Clear();
167 }
168 m_ServerListEntries.Clear();
169
170 OnlineServices.m_ServersAsyncInvoker.Insert( m_Menu.OnLoadServersAsync, EScriptInvokerInsertFlags.NONE );
171
172 m_LoadingFinished = false;
173 m_Loading = true;
177 m_PageIndex = 0;
178 m_SelectedServer = null;
179
180 super.RefreshList();
181
182 m_ServerListScroller.VScrollToPos01( 0 );
183
187 UpdateStatusBar();
188 }
189
190 override void ResetFilters()
191 {
192 m_Filters.ResetFilters();
193
195
196 if (m_Loading)
197 {
199 }
200 }
201
202 override void ApplyFilters()
203 {
204 m_Filters.SaveFilters();
205 RefreshList();
208 }
209
211 {
212 OnlineServices.m_ServersAsyncInvoker.Remove( m_Menu.OnLoadServersAsync );
213
214 m_LoadingFinished = true;
215 m_Loading = false;
216
218
220 UpdateStatusBar();
221
223
224 if (m_TotalLoadedServers == 0)
225 {
226 switch (m_TabType)
227 {
228 case TabType.OFFICIAL:
229 case TabType.COMMUNITY:
230 {
232 break;
233 }
234 }
235 }
236
237 int totalVisibleEntries = 0;
238 foreach(string serverID, ServerBrowserEntry entry: m_EntryWidgets)
239 {
240 if (entry.GetRoot().IsVisible())
241 totalVisibleEntries++;
242 }
243
244 if (GetTabType() == TabType.FAVORITE && totalVisibleEntries == 0)
245 g_Game.GetCallQueue(CALL_CATEGORY_GUI).Call(m_Menu.SwitchToOfficalTab);
246 }
247
248 override void OnLoadServersAsyncPC(GetServersResult result_list, EBiosError error, string response)
249 {
250 if (result_list)
251 {
252 int count = result_list.m_Results.Count();
253 if (count > 0)
254 {
255 for (int i = 0; i < count; i++)
256 {
257 GetServersResultRow result = result_list.m_Results[i];
259
260 result.m_SortName = result.m_Name.ToInt();
261 result.m_SortTime = GetTimeOfDayEnum(result.m_TimeOfDay);
262
263 if (PassFilter(result))
264 {
265 int sorted_index = AddSorted(result);
267 {
270 }
271 }
272
273 if (!m_Menu || m_Menu.GetServersLoadingTab() != m_TabType)
274 {
275 return;
276 }
277 }
278 }
279 else
280 {
281 m_Menu.SetServersLoadingTab(TabType.NONE);
282 }
283 }
284 else
285 {
286 m_Menu.SetServersLoadingTab(TabType.NONE);
287 }
288
289 if (response == "thelastone")
290 {
292 }
293 else
294 {
295 m_ServersEstimateCount = result_list.m_NumServers;
296 }
297
299 UpdateStatusBar();
300 }
301
306
307 override bool OnClick(Widget w, int x, int y, int button)
308 {
309 super.OnClick(w, x, y, button);
310
311 if (button == MouseState.LEFT)
312 {
313 if (w == m_ResetFilters)
314 {
315 ResetFilters();
316 }
317 else if (w == m_ApplyFilter)
318 {
319 ApplyFilters();
320 return true;
321 }
322 else if (w == m_RefreshList)
323 {
325 {
327 }
328 else
329 {
330 RefreshList();
331 }
332
333 return true;
334 }
335 else if (w == m_BtnPagePrev)
336 {
338 return true;
339 }
340 else if (w == m_BtnPageNext)
341 {
343 return true;
344 }
345 else if (w == m_BtnPagesLast)
346 {
348 return true;
349 }
350 else if (w == m_BtnPagesFirst)
351 {
353 return true;
354 }
355 else if (w == m_BtnShowDetails)
356 {
358 return true;
359 }
360 else if (w == m_BtnShowFilters)
361 {
363 return true;
364 }
365 else
366 {
367 bool click = OnClickPage(w);
368 if (click)
369 {
370 return true;
371 }
372
373 return false;
374 }
375 }
376 return false;
377 }
378
379 override bool OnMouseEnter(Widget w, int x, int y)
380 {
381 if (IsFocusable(w))
382 {
384
385 if (w == m_FilterSearchText)
386 {
387 SetFocus(m_FilterSearchTextBox);
388 }
389 else if (w == m_FilterSearchIP)
390 {
391 SetFocus(m_FilterSearchIPBox);
392 }
393
394 return true;
395 }
396 return false;
397 }
398
399 override bool OnMouseLeave(Widget w, Widget enterW, int x, int y)
400 {
401 if (IsFocusable(w))
402 {
403 ColorNormal(w);
404
405 if (w == m_FilterSearchText || w == m_FilterSearchIP)
406 {
407 SetFocus( null );
408 }
409
410 return true;
411 }
412 return false;
413 }
414
415 override bool OnMouseButtonUp( Widget w, int x, int y, int button )
416 {
417 if ( button == MouseState.LEFT )
418 {
419 if ( w == m_HostSort )
420 {
421 ToggleSort( ESortType.HOST );
423 return true;
424 }
425 else if ( w == m_TimeSort )
426 {
427 ToggleSort( ESortType.TIME );
429 return true;
430 }
431 else if ( w == m_PopulationSort )
432 {
433 ToggleSort( ESortType.POPULATION );
435 return true;
436 }
437 else if ( w == m_SlotsSort )
438 {
439 ToggleSort( ESortType.SLOTS );
441 return true;
442 }
443 else if ( w == m_PingSort )
444 {
445 ToggleSort( ESortType.PING );
447 return true;
448 }
449 else if ( w == m_MapSort )
450 {
451 ToggleSort( ESortType.MAP );
453 return true;
454 }
455 }
456 return false;
457 }
458
459 override void OnFilterChanged()
460 {
461 //m_FiltersChanged.Show(true);
462
464
465 if (m_Loading)
466 {
468 }
469 }
470
472 {
473 if ( m_PageIndex > 0 )
474 {
476 }
477 else
478 {
480 }
481 }
482
484 {
485 if ( m_PageIndex < (m_PagesCount - 1) )
486 {
488 }
489 else
490 {
491 SetPageIndex( 0 );
492 }
493 }
494
496 {
498 }
499
501 {
502 SetPageIndex( 0 );
503 }
504
505 bool OnClickPage(Widget w)
506 {
507 for ( int i = 0; i < m_BtnPages.Count(); ++i )
508 {
509 if ( m_BtnPages[i] == w )
510 {
511 SetPageIndex( m_PageStartNum + i - 1 );
512 return true;
513 }
514 }
515
516 return false;
517 }
518
519 void SetPageIndex(int page_index)
520 {
521 m_PageIndex = page_index;
524 Focus();
525 }
526
528 {
529 ESortOrder order = ESortOrder.ASCENDING;
530
531 if ( m_SortType != type )
532 {
533 if ( m_SortInverted[type] == true )
534 {
535 m_EntriesSorted[type].Invert();
536 }
537
538 m_SortInverted[type] = false;
539 }
540 else
541 {
542 if ( m_SortOrder == ESortOrder.ASCENDING )
543 {
544 m_EntriesSorted[type].Invert();
545 m_SortInverted[type] = true;
546 order = ESortOrder.DESCENDING;
547 }
548 else
549 {
550 m_EntriesSorted[type].Invert();
551 m_SortInverted[type] = false;
552 }
553 }
554
555 SetSort( type, order );
556 }
557
558 override void SetSort( ESortType type, ESortOrder order )
559 {
560 super.SetSort( type, order);
561
562 #ifdef PLATFORM_WINDOWS
563 m_Root.FindAnyWidget( "host_sort" ).Show( false );
564 m_Root.FindAnyWidget( "population_sort" ).Show( false );
565 m_Root.FindAnyWidget( "slots_sort" ).Show( false );
566
567 m_Root.FindAnyWidget( "time_sort" ).Show( false );
568 m_Root.FindAnyWidget( "ping_sort" ).Show( false );
569 m_Root.FindAnyWidget( "map_sort" ).Show( false );
570
571 TextWidget root;
572 root = TextWidget.Cast( m_Root.FindAnyWidget( "server_list_content_header_host_label" ) );
573 root.SetColor( ARGBF( 1, 1, 1, 1 ) );
574 root = TextWidget.Cast( m_Root.FindAnyWidget( "server_list_content_header_population_label" ) );
575 root.SetColor( ARGBF( 1, 1, 1, 1 ) );
576 root = TextWidget.Cast( m_Root.FindAnyWidget( "server_list_content_header_slots_label" ) );
577 root.SetColor( ARGBF( 1, 1, 1, 1 ) );
578
579 root = TextWidget.Cast( m_Root.FindAnyWidget( "server_list_content_header_ping_label" ) );
580 root.SetColor( ARGBF( 1, 1, 1, 1 ) );
581 root = TextWidget.Cast( m_Root.FindAnyWidget( "server_list_content_header_time_label" ) );
582 root.SetColor( ARGBF( 1, 1, 1, 1 ) );
583
584 string r_name;
585 string w_name;
586
587 switch ( type )
588 {
589 case ESortType.HOST:
590 {
591 r_name = "server_list_content_header_host_label";
592 w_name = "host_sort";
593 break;
594 }
595 case ESortType.TIME:
596 {
597 r_name = "server_list_content_header_time_label";
598 w_name = "time_sort";
599 break;
600 }
601 case ESortType.POPULATION:
602 {
603 r_name = "server_list_content_header_population_label";
604 w_name = "population_sort";
605 break;
606 }
607 case ESortType.SLOTS:
608 {
609 r_name = "server_list_content_header_slots_label";
610 w_name = "slots_sort";
611 break;
612 }
613 case ESortType.PING:
614 {
615 r_name = "server_list_content_header_ping_label";
616 w_name = "ping_sort";
617 break;
618 }
619 case ESortType.MAP:
620 {
621 r_name = "server_list_content_header_map_label";
622 w_name = "map_sort";
623 break;
624 }
625 }
626
627 root = TextWidget.Cast( m_Root.FindAnyWidget( r_name ) );
628 root.SetColor( ARGBF( 1, 1, 0, 0 ) );
629
630 m_Root.FindAnyWidget( w_name ).Show( true );
631 m_Root.FindAnyWidget( w_name + "_asc" ).Show( !m_SortOrder );
632 m_Root.FindAnyWidget( w_name + "_dsc" ).Show( m_SortOrder );
633 #endif
634 }
635
636 int GetTimeOfDayEnum( string time_of_day )
637 {
638 m_TempTime.Clear();
639
640 time_of_day.Split( ":", m_TempTime );
641
642 int minutes = 0;
643
644 if ( m_TempTime.Count() > 0 )
645 {
646 int h = m_TempTime[0].ToInt();
647
648 if ( h >= 5 )
649 {
650 h -= 5;
651 }
652 else
653 {
654 h += 24;
655 }
656
657 minutes = h * 60;
658 }
659
660 if ( m_TempTime.Count() > 1 )
661 {
662 int m = m_TempTime[0].ToInt();
663 minutes += m;
664 }
665
666 return minutes;
667 }
668
669 // Return sorted index
670 override int AddSorted( GetServersResultRow entry )
671 {
672 int index_host = SortedInsert( entry, ESortType.HOST );
673 int index_time = SortedInsert( entry, ESortType.TIME );
674 int index_popu = SortedInsert( entry, ESortType.POPULATION );
675 int index_slot = SortedInsert( entry, ESortType.SLOTS );
676 int index_ping = SortedInsert( entry, ESortType.PING );
677 int index_favo = SortedInsert( entry, ESortType.FAVORITE );
678 int index_pass = SortedInsert( entry, ESortType.PASSWORDED );
679 int index_map = SortedInsert( entry, ESortType.MAP );
680
681 switch ( m_SortType )
682 {
683 case ESortType.HOST:
684 return index_host;
685 case ESortType.TIME:
686 return index_time;
687 case ESortType.POPULATION:
688 return index_popu;
689 case ESortType.SLOTS:
690 return index_slot;
691 case ESortType.PING:
692 return index_ping;
693 case ESortType.FAVORITE:
694 return index_favo;
695 case ESortType.PASSWORDED:
696 return index_pass;
697 case ESortType.MAP:
698 return index_map;
699 }
700
701 return 0;
702 }
703
705 {
706 return SortedInsertEx(entry, sort_type, m_SortInverted[sort_type]);
707 }
708
709 private int SortedInsertEx(GetServersResultRow entry, ESortType sortType, bool isDescending)
710 {
712 int indexMax = list.Count() - 1;
713 int indexMin = 0;
714 int targetIndex = Math.Floor( indexMax / 2 );
715 int comparisonMultiplier = 1;
716
717 // if order is descending, then invert comparison results
718 if (isDescending == true)
719 {
720 comparisonMultiplier = -1;
721 }
722
723 if ( indexMax == -1 )
724 {
725 list.Insert( entry );
726 return 0;
727 }
728
729 while ( true )
730 {
731 int comparisonResult = comparisonMultiplier * entry.CompareTo(list[targetIndex], sortType);
732
733 if ((indexMax - indexMin) <= 1)
734 {
735 for (int i = indexMin; i <= indexMax; i++ )
736 {
737 comparisonResult = comparisonMultiplier * entry.CompareTo(list[i], sortType);
738
739 if ( comparisonResult > 0 )
740 {
741 list.InsertAt( entry, i );
742 return i;
743 }
744 }
745
746 // adding entry AFTER indexMax
747 targetIndex = Math.Min(indexMax + 1, list.Count());
748 list.InsertAt(entry, targetIndex);
749 return targetIndex;
750 }
751
752 if (comparisonResult == 0)
753 {
754 list.InsertAt(entry, targetIndex);
755 return targetIndex;
756 }
757
758 if (comparisonResult > 0)
759 {
760 indexMax = targetIndex;
761 }
762
763 else if (comparisonResult < 0)
764 {
765 indexMin = targetIndex;
766 }
767
768 targetIndex = indexMin + Math.Floor((indexMax - indexMin) / 2);
769 }
770
771 return 0;
772 }
773
774 // DEPRECATED
775 int SortedInsertAsc( GetServersResultRow entry, ESortType sort_type )
776 {
777 array<ref GetServersResultRow> list = m_EntriesSorted[sort_type];
778
779 int i;
780 int index_min = 0;
781 int index_max = list.Count() - 1;
782 int target_index = Math.Floor( index_max / 2 );
783
784 if ( index_max == -1 )
785 {
786 list.Insert( entry );
787 return 0;
788 }
789
790 if ( sort_type == ESortType.HOST )
791 {
792 string entry_value_str = entry.GetValueStr(ESortType.HOST);
793
794 while ( true )
795 {
796 string target_value_str = list[target_index].GetValueStr(ESortType.HOST);
797
798 if ( entry_value_str == target_value_str || ((index_max - index_min) <= 1) )
799 {
800 for ( i = index_min; i <= index_max; i++ )
801 {
802 if ( entry_value_str <= list[i].GetValueStr(ESortType.HOST) )
803 {
804 list.InsertAt( entry, i );
805 return i;
806 }
807 }
808
809 index_max++;
810 list.InsertAt( entry, index_max );
811 return target_index;
812 }
813 else if ( entry_value_str < target_value_str )
814 {
815 index_max = target_index;
816 target_index = Math.Floor( target_index / 2 );
817 }
818 else if ( entry_value_str > target_value_str )
819 {
820 index_min = target_index;
821 target_index += Math.Floor( (index_max - index_min) / 2 );
822 }
823 }
824 }
825 else
826 {
827 int entry_value_int = entry.GetValueInt( sort_type );
828
829 while ( true )
830 {
831 int target_value_int = list[target_index].GetValueInt( sort_type );
832
833 if ( entry_value_int == target_value_int || ((index_max - index_min) <= 1) )
834 {
835 for ( i = index_min; i <= index_max; i++ )
836 {
837 if ( entry_value_int <= list[i].GetValueInt( sort_type ) )
838 {
839 list.InsertAt( entry, i );
840 return i;
841 }
842 }
843
844 index_max++;
845 list.InsertAt( entry, index_max );
846 return target_index;
847 }
848 else if ( entry_value_int < target_value_int )
849 {
850 index_max = target_index;
851 target_index = Math.Floor( target_index / 2 );
852 }
853 else if ( entry_value_int > target_value_int )
854 {
855 index_min = target_index;
856 target_index += Math.Floor( (index_max - index_min) / 2 );
857 }
858 }
859 }
860
861 return target_index;
862 }
863
864 // DEPRECATED
865 int SortedInsertDesc( GetServersResultRow entry, ESortType sort_type )
866 {
867 array<ref GetServersResultRow> list = m_EntriesSorted[sort_type];
868
869 int i;
870 int index_min = 0;
871 int index_max = list.Count() - 1;
872 int target_index = Math.Floor( index_max / 2 );
873
874 if ( index_max == -1 )
875 {
876 list.Insert( entry );
877 return 0;
878 }
879
880 if ( sort_type == ESortType.HOST )
881 {
882 string entry_value_str = entry.GetValueStr(ESortType.HOST);
883
884 while ( true )
885 {
886 string target_value_str = list[target_index].GetValueStr(ESortType.HOST);
887
888 if ( entry_value_str == target_value_str || ((index_max - index_min) <= 1) )
889 {
890 for ( i = index_min; i <= index_max; i++ )
891 {
892 if ( entry_value_str >= list[i].GetValueStr(ESortType.HOST) )
893 {
894 list.InsertAt( entry, i );
895 return i;
896 }
897 }
898
899 index_max++;
900 list.InsertAt( entry, index_max );
901 return target_index;
902 }
903 else if ( entry_value_str > target_value_str )
904 {
905 index_max = target_index;
906 target_index = Math.Floor( target_index / 2 );
907 }
908 else if ( entry_value_str < target_value_str )
909 {
910 index_min = target_index;
911 target_index += Math.Floor( (index_max - index_min) / 2 );
912 }
913 }
914 }
915 else
916 {
917 int entry_value_int = entry.GetValueInt( sort_type );
918
919 while ( true )
920 {
921 int target_value_int = list[target_index].GetValueInt( sort_type );
922
923 if ( entry_value_int == target_value_int || ((index_max - index_min) <= 1) )
924 {
925 for ( i = index_min; i <= index_max; i++ )
926 {
927 if ( entry_value_int >= list[i].GetValueInt( sort_type ) )
928 {
929 list.InsertAt( entry, i );
930 return i;
931 }
932 }
933
934 index_max++;
935 list.InsertAt( entry, index_max );
936 return target_index;
937 }
938 else if ( entry_value_int > target_value_int )
939 {
940 index_max = target_index;
941 target_index = Math.Floor( target_index / 2 );
942 }
943 else if ( entry_value_int < target_value_int )
944 {
945 index_min = target_index;
946 target_index += Math.Floor( (index_max - index_min) / 2 );
947 }
948 }
949 }
950
951 return target_index;
952 }
953
954 void UpdatePageButtons()
955 {
956 m_PagesCount = Math.Ceil( m_TotalLoadedServers / SERVERS_VISIBLE_COUNT );
957 if ( m_PagesCount > 1 )
958 {
959 m_PnlPagesPanel.Show( true );
960
961 int i;
962 int btn_index_center = Math.Round( PAGES_BUTTONS_COUNT / 2) - 1;
963 m_PageStartNum = 1;
964 m_PageEndNum = PAGES_BUTTONS_COUNT;
965
966 if ( m_PagesCount <= PAGES_BUTTONS_COUNT )
967 {
968 m_PageEndNum = m_PagesCount;
969
970 // Pages are less like buttons - changing selected button
971 for ( i = 1; i <= m_BtnPages.Count(); ++i )
972 {
973 bool is_page_button_enable = ( i <= m_PagesCount );
974
975 int page_index = (i - 1);
976 m_BtnPages[page_index].Show( is_page_button_enable );
977 m_BtnPages[page_index].SetText( i.ToString() );
978
979 if ( m_PageIndex == page_index )
980 {
981 m_BtnPages[page_index].SetState( true );
982 }
983 else
984 {
985 m_BtnPages[page_index].SetState( false );
986 }
987 }
988 }
989 else
990 {
991 // Pages are more like buttons
992 if ( m_PageIndex <= btn_index_center )
993 {
994 //Left side (start of pages)
995 //m_PageStartNum = 1;
996 //m_PageEndNum = PAGES_BUTTONS_COUNT;
997 }
998 else
999 {
1000 m_PageStartNum = m_PageIndex - btn_index_center + 1;
1001 m_PageEndNum = m_PageIndex + (PAGES_BUTTONS_COUNT - btn_index_center);
1002
1003 if ( m_PageEndNum > m_PagesCount )
1004 {
1005 // Right side (end of pages)
1006 m_PageStartNum -= m_PageEndNum - m_PagesCount;
1007 m_PageEndNum -= m_PageEndNum - m_PagesCount;
1008 }
1009 }
1010
1011
1012 // Button Selection
1013 int selected_btn_index = m_PageIndex;
1014 if ( m_PageIndex > btn_index_center )
1015 {
1016 if ( m_PageEndNum == m_PagesCount )
1017 {
1018 //Right
1019 selected_btn_index = PAGES_BUTTONS_COUNT - (m_PagesCount - m_PageIndex);
1020 }
1021 else
1022 {
1023 //Center
1024 selected_btn_index = btn_index_center;
1025 }
1026 }
1027
1028
1029 for ( i = 0; i < m_BtnPages.Count(); ++i )
1030 {
1031 m_BtnPages[i].SetText( (m_PageStartNum + i).ToString() );
1032 m_BtnPages[i].SetState( ( i == selected_btn_index ) );
1033 }
1034 }
1035
1036 // Button GoTo Prev Page
1037 if ( m_PageIndex > 0 )
1038 {
1039 m_BtnPagePrev.SetText( "<" );
1040 m_BtnPagePrev.Enable( true );
1041 }
1042 else
1043 {
1044 m_BtnPagePrev.SetText( "" );
1045 m_BtnPagePrev.Enable( false );
1046 }
1047
1048 // Button GoTo Next Page
1049 if ( m_PageIndex < (m_PagesCount - 1) )
1050 {
1051 m_BtnPageNext.SetText( ">" );
1052 m_BtnPageNext.Enable( true );
1053 }
1054 else
1055 {
1056 m_BtnPageNext.SetText( "" );
1057 m_BtnPageNext.Enable( false );
1058 }
1059
1060 // Button GoTo First Page
1061 if ( m_PageStartNum == 1 )
1062 {
1063 m_BtnPagesFirst.SetText( "" );
1064 m_BtnPagesFirst.Enable( false );
1065 }
1066 else
1067 {
1068 m_BtnPagesFirst.SetText( "<<" );
1069 m_BtnPagesFirst.Enable( true );
1070 }
1071
1072 // Button GoTo Last Page
1073 if ( m_PageEndNum == m_PagesCount )
1074 {
1075 m_BtnPagesLast.SetText( "" );
1076 m_BtnPagesLast.Enable( false );
1077 }
1078 else
1079 {
1080 m_BtnPagesLast.SetText( ">>" );
1081 m_BtnPagesLast.Enable( true );
1082 }
1083 }
1084 else
1085 {
1086 m_PnlPagesPanel.Show(false);
1087 }
1088 }
1089
1090 override void UpdateServerList()
1091 {
1092 int lastFilledIndexOnPage = 0;
1094
1095 ServerBrowserEntry entry;
1096
1097 m_EntryWidgets.Clear();
1098
1099 for (int i = 0; i < SERVERS_VISIBLE_COUNT; ++i)
1100 {
1101 int serverIndex = i + (SERVERS_VISIBLE_COUNT * m_PageIndex);
1102
1103 if (serverIndex < m_EntriesSorted[m_SortType].Count())
1104 {
1105 GetServersResultRow server_info = m_EntriesSorted[m_SortType][serverIndex];
1106
1107 if (server_info.m_Favorite)
1108 {
1109 m_OnlineFavServers.Insert(server_info.GetIpPort());
1110 }
1111
1112 server_info.m_IsSelected = (server_info.GetIpPort() == m_CurrentSelectedServer);
1113
1114 entry = GetServerEntryByIndex(i, server_info.GetIpPort());
1115 entry.Show(true);
1116 entry.SetIsOnline(true);
1117 entry.FillInfo(server_info);
1118 entry.SetMods(m_EntryMods.Get(server_info.m_Id));
1119 entry.UpdateEntry();
1120
1121 lastFilledIndexOnPage++;
1122 }
1123 else
1124 {
1125 entry = GetServerEntryByIndex(i, "-1");
1126
1127 if (entry)
1128 {
1129 entry.Show(false);
1130 }
1131 }
1132 }
1133
1134 LoadExtraEntries(lastFilledIndexOnPage);
1135 m_ServerList.Update();
1136 }
1137
1138 void UpdateStatusBar()
1139 {
1140 string serversFound = string.Format("#servers_found: %1", m_TotalLoadedServers);
1141 if ( m_LoadingFinished )
1142 {
1143 m_LoadingText.SetText( serversFound );
1144 }
1145 else
1146 {
1147 m_LoadingText.SetText( string.Format("#dayz_game_loading %1", serversFound) );
1148 }
1149 }
1150
1151 override void OnLoadServerModsAsync( string server_id, array<string> mods )
1152 {
1153 super.OnLoadServerModsAsync( server_id, mods );
1154
1155 if ( m_EntryWidgets.Contains( server_id ) )
1156 {
1157 m_EntryWidgets.Get( server_id ).SetMods( mods );
1158 }
1159 }
1160
1161 protected ServerBrowserEntry GetServerEntryByIndex( int index, string server_id )
1162 {
1163 ref ServerBrowserEntry entry;
1164
1165 if ( index >= 0 )
1166 {
1167 if ( index < m_ServerListEntries.Count() )
1168 {
1169 entry = m_ServerListEntries[index];
1170 }
1171 else
1172 {
1173 entry = new ServerBrowserEntry( null, index, this );
1174 m_ServerList.AddChild( entry.GetRoot(), false );
1175
1176 m_ServerListEntries.Insert(entry);
1177 }
1178 }
1179 else
1180 {
1181 return null;
1182 }
1183
1184 // Refresh list
1185 m_EntryWidgets.Insert( server_id, entry );
1186
1187 return entry;
1188 }
1189
1190 override bool IsFocusable( Widget w )
1191 {
1192 if ( w )
1193 {
1194 if ( super.IsFocusable( w ) )
1195 {
1196 return true;
1197 }
1198
1199 if ( w == m_ServerListScroller )
1200 {
1201 return false;
1202 }
1203
1204 if ( w == m_HostSort || w == m_TimeSort || w == m_PopulationSort || w == m_SlotsSort || w == m_PingSort || w == m_FilterSearchIP || w == m_MapSort )
1205 {
1206 return true;
1207 }
1208
1210 {
1211 return true;
1212 }
1213
1214 return false;
1215 }
1216 return false;
1217 }
1218
1220 {
1221 ButtonWidget btn = ButtonWidget.Cast( m_RefreshList );
1222 btn.SetText( "#menu_cancel" );
1223 }
1224
1226 {
1227 ButtonWidget btn = ButtonWidget.Cast( m_RefreshList );
1228 btn.SetText( "#STR_server_browser_tab_root_filters_root_filters_content_refresh_list_button0" );
1229 }
1230
1232 {
1234 }
1235
1237 {
1239 }
1240
1241 override void SwitchToDetails(bool focus = true)
1242 {
1244 }
1245
1246 override void SwitchToFilters(bool focus = true)
1247 {
1248 m_FilterRoot.Show(true);
1249 m_RightAreaHeaderText.SetText("#STR_server_browser_menu_server_filters");
1250 m_DetailsRoot.Show(false);
1251 m_BtnShowDetails.Show(true);
1252 }
1253
1254 override void ShowServerDetails()
1255 {
1256 super.ShowServerDetails();
1257
1258 if (m_TabType != TabType.FAVORITE && m_TabType != TabType.LAN)
1259 {
1260 m_BtnShowFilters.Show(true);
1261 m_FilterRoot.Show(false);
1262 }
1263 }
1264}
EScriptInvokerInsertFlags
Definition tools.c:130
EBiosError
Possible Error codes for bios API. This is the list of errors that can be returned from bios API....
ESortOrder
ESortType
GetServersResult the output structure of the GetServers operation.
GetServersResultRow the output structure of the GetServers operation that represents one game server.
Definition enmath.c:7
ref TStringArray m_TempTime
int GetTimeOfDayEnum(string time_of_day)
override bool IsFocusable(Widget w)
override void ShowServerDetails()
override void ApplyFilters()
override bool OnClick(Widget w, int x, int y, int button)
void ToggleSort(ESortType type)
override bool OnMouseLeave(Widget w, Widget enterW, int x, int y)
override void SwitchToDetails(bool focus=true)
override void SetSort(ESortType type, ESortOrder order)
override void SwitchToFilters(bool focus=true)
void SetPageIndex(int page_index)
override int AddSorted(GetServersResultRow entry)
ref array< ButtonWidget > m_BtnPages
ref array< ref ServerBrowserEntry > m_ServerListEntries
override void ResetFilters()
ButtonWidget m_BtnPagesFirst
override void RefreshList()
ServerBrowserEntry GetServerEntryByIndex(int index, string server_id)
override void OnFilterChanged()
override bool OnMouseEnter(Widget w, int x, int y)
int SortedInsert(GetServersResultRow entry, ESortType sort_type)
override void Construct(Widget parent, ServerBrowserMenuNew menu, TabType type)
const int PAGES_BUTTONS_COUNT
ButtonWidget m_BtnPagesLast
override void OnLoadServersAsyncPC(GetServersResult result_list, EBiosError error, string response)
const int SERVERS_VISIBLE_COUNT
override bool OnMouseButtonUp(Widget w, int x, int y, int button)
bool OnClickPage(Widget w)
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
MouseState
Definition ensystem.c:311
const int CALL_CATEGORY_GUI
Definition tools.c:9
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
void ButtonDisable(Widget w)
ButtonWidget m_BtnPageNext
ref map< ESortType, ESortOrder > m_SortInverted
ButtonWidget m_BtnShowFilters
ref map< string, ref ServerBrowserEntry > m_EntryWidgets
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
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
void ShowServerDetails()
Widget m_FilterSearchTextBox
bool IsFocusable(Widget w)
ref ServerBrowserDetailsContainer m_Details
void OnLoadServerModsAsync(string server_id, array< string > mods)
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
int m_PageIndex