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