Dayz Explorer 1.28.160049
Loading...
Searching...
No Matches
serverbrowsertab.c
Go to the documentation of this file.
9
10enum SelectedPanel
11{
15 DETAILS
16}
17
18enum ServerBrowserRightAreaView
19{
20 FILTERS,
21 DETAILS
22}
23
24class ServerBrowserTab extends ScriptedWidgetEventHandler
25{
26 protected Widget m_Root;
27 protected ScrollWidget m_ServerListScroller;
28 protected SpacerBaseWidget m_ServerList;
29
30 //protected ref array<ref GetServersResultRow> m_Entries;
31
34
35 protected ref ServerBrowserFilterContainer m_Filters;
36
37 protected ServerBrowserMenuNew m_Menu;
38 protected ServerBrowserEntry m_SelectedServer;
39
40 protected TabType m_TabType;
43
44 protected SelectedPanel m_SelectedPanel;
45 protected bool m_Initialized;
46 protected bool m_BegunLoading;
47 protected bool m_Loading;
48 protected int m_TotalServers; // UNUSED
49 protected int m_TotalLoadedServers;
50 protected int m_LastLoadedPage;
51 protected int m_TotalPages;
52 protected bool m_LoadingFinished;
53 protected int m_CurrentPageNum;
54
55 protected string m_CurrentSelectedServer;
56 protected int m_CurrentLoadedPage;
58
59 protected Widget m_ApplyFilter;
60 protected Widget m_RefreshList;
61 protected Widget m_ResetFilters;
62 protected Widget m_FiltersChanged;
63 protected Widget m_HostSort;
64 protected Widget m_TimeSort;
65 protected Widget m_PopulationSort;
66 protected Widget m_SlotsSort;
67 protected Widget m_PingSort;
68 protected Widget m_MapSort;
69 protected Widget m_FilterSearchText;
70 protected Widget m_FilterSearchTextBox;
71 protected TextWidget m_LoadingText;
72 protected ButtonWidget m_BtnPagePrev;
73 protected ButtonWidget m_BtnPageNext;
74
77 protected ref set<string> m_OnlineFavServers;
78
79 protected TextWidget m_RightAreaHeaderText;
80 protected Widget m_FilterRoot;
81 protected Widget m_FilterContent;
82 protected ButtonWidget m_BtnShowDetails;
83
84 protected Widget m_DetailsRoot;
85 protected ButtonWidget m_BtnShowFilters;
86
87 protected ref ServerBrowserDetailsContainer m_Details;
88
89 void ServerBrowserTab(Widget parent, ServerBrowserMenuNew menu, TabType type)
90 {
91 Construct(parent, menu, type);
92 m_OnlineFavServers = new set<string>();
93 GetGame().GetContentDLCService().m_OnChange.Insert(OnDLCChange);
94 }
95
96 protected void Construct(Widget parent, ServerBrowserMenuNew menu, TabType type)
97 {
101 m_LoadingText = TextWidget.Cast(m_Root.FindAnyWidget("loading_servers_info"));
102 }
103
105 {
106 if ( m_Filters )
107 m_Filters.SaveFilters();
108
109 if (m_Root)
110 delete m_Root;
111
112 if (GetGame().GetContentDLCService())
113 GetGame().GetContentDLCService().m_OnChange.Remove(OnDLCChange);
114 }
115
116 ServerBrowserMenuNew GetRootMenu()
117 {
118 return m_Menu;
119 }
120
122 {
123 return m_LoadingFinished;
124 }
125
126 void OnDLCChange(EDLCId dlcId)
127 {
128 switch (dlcId)
129 {
130 case EDLCId.DLC_FROSTLINE:
131 {
132 array<ServerBrowserEntry> serverEntries = m_EntryWidgets.GetValueArray();
133 foreach (ServerBrowserEntry entry : serverEntries)
134 {
135 entry.RefreshDLCIcon();
136 }
137 break;
138 }
139
140 default:
141 break;
142 }
143 }
144
145 void ScrollToEntry( ServerBrowserEntry entry )
146 {
147 if ( entry )
148 {
149 float x, y;
150 float x_s, y_s;
151 float x_l, y_l;
152
153 Widget root = entry.GetRoot();
154 Widget first_child = root.GetParent().GetChildren();
155 Widget last_child = first_child;
156 while ( last_child )
157 {
158 if ( last_child.GetSibling() )
159 last_child = last_child.GetSibling();
160 else
161 break;
162 }
163
164 root.GetParent().Update();
165 root.Update();
166
167 m_ServerListScroller.GetScreenPos( x, y );
168 m_ServerListScroller.GetScreenSize( x_s, y_s );
169
170 float bottom_pos = y + y_s;
171
172 root.GetScreenPos( x_l, y_l );
173 root.GetScreenSize( x_s, y_s );
174
175 if ( root == first_child )
176 {
177 m_ServerListScroller.VScrollToPos01( 0 );
178 }
179 else if ( root == last_child )
180 {
181 m_ServerListScroller.VScrollToPos01( 1 );
182 }
183 else if ( y_l + y_s >= bottom_pos )
184 {
185 m_ServerListScroller.VScrollToPos( m_ServerListScroller.GetVScrollPos() + y_s );
186 }
187 else if ( y_l <= y )
188 {
189 m_ServerListScroller.VScrollToPos( m_ServerListScroller.GetVScrollPos() - y_s );
190 }
191 }
192 }
193
194 void Focus()
195 {
197 {
198 UpdateServerList();
199
202 }
203 }
204
205 void OnFilterFocusLost(Widget w)
206 {
207 m_SelectedPanel = SelectedPanel.FILTERS;
208 m_Menu.FilterFocus(false);
209 }
210
211 void OnFilterFocus(Widget w)
212 {
213 m_SelectedPanel = SelectedPanel.FILTERS;
214 m_Menu.FilterFocus(true);
215 }
216
217 void OnDetailsFocusLost(Widget w)
218 {
219 m_SelectedPanel = SelectedPanel.DETAILS;
220 m_Menu.DetailsFocus(false);
221 }
222
223 void OnDetailsFocus(Widget w)
224 {
225 m_SelectedPanel = SelectedPanel.DETAILS;
226 m_Menu.DetailsFocus(true);
227 }
228
230
231 void ServerListFocus(bool focus, bool favorite)
232 {
233 if (!m_Menu)
234 return;
235
236 m_Menu.ServerListFocus(focus, favorite);
237 }
238
239 override bool OnFocus(Widget w, int x, int y)
240 {
241 if (IsFocusable(w))
242 {
243 if (w == m_FilterSearchTextBox)
244 {
246 return false;
247 }
248 else
249 {
251 }
252
253 #ifdef PLATFORM_CONSOLE
254 string aButtonLabel;
255 if (w == m_RefreshList || w == m_ApplyFilter || w == m_ResetFilters || w == m_BtnShowDetails || w == m_BtnShowFilters)
256 {
257 #ifdef PLATFORM_PS4
258 aButtonLabel = "#ps4_ingame_menu_select";
259 #else
260 aButtonLabel = "#layout_xbox_ingame_menu_select";
261 #endif
262 }
263 else
264 {
265 aButtonLabel = "#dialog_change";
266 }
267
268 m_Menu.UpdateAButtonLabel(aButtonLabel);
269 #endif
270
271 return true;
272 }
273 return false;
274 }
275
276 override bool OnFocusLost(Widget w, int x, int y)
277 {
278 if (IsFocusable(w))
279 {
280 if (w == m_FilterSearchTextBox)
281 {
283 return true;
284 }
285 else
286 {
287 ColorNormal(w);
288 }
289 return true;
290 }
291 return false;
292 }
293
294 override bool OnMouseEnter(Widget w, int x, int y)
295 {
296 if (IsFocusable(w))
297 {
299 if (w == m_FilterSearchText)
300 {
301 SetFocus(m_FilterSearchTextBox);
302 return true;
303 }
304 return true;
305 }
306 return false;
307 }
308
309 override bool OnMouseLeave(Widget w, Widget enterW, int x, int y)
310 {
311 if (IsFocusable(w))
312 {
313 if (enterW == m_FilterSearchText || enterW == m_FilterSearchTextBox)
314 {
315 }
316 else
317 {
318 ColorNormal(w);
319 }
320 return true;
321 }
322 return false;
323 }
324
325 bool IsFocusable(Widget w)
326 {
327 if (w)
328 {
329 return (w == m_ApplyFilter || w == m_RefreshList || w == m_ResetFilters || w == m_FilterSearchText || w == m_FilterSearchTextBox || w == m_BtnShowDetails || w == m_BtnShowFilters);
330 }
331 return false;
332 }
333
334 // Unused?!
336
337 void PressA();
338
339 void PressX()
340 {
341 if ( m_Menu.GetServersLoadingTab() == TabType.NONE )
342 RefreshList();
343 }
344
345 void PressY();
349 void Left();
350 void LeftHold();
352 void Right();
353 void RightHold();
355 void Up();
356 void Down();
358
359 void OnLoadServerModsAsync(string server_id, array<string> mods)
360 {
361 m_EntryMods.Set( server_id, mods );
362 }
363
365 {
366 Widget focused = GetFocus();
367 if ( !focused )
368 return;
369 Widget sibling = focused.GetSibling();
370 if ( !sibling )
371 return;
372
373 if ( focused.GetName() == "server_browser_list_entry_root" )
374 {
375 if ( sibling )
376 SetFocus( focused.GetSibling() );
377 else
378 SetFocus( focused.GetParent().GetSibling().GetChildren() );
379 }
380 }
381
383 {
384 Widget focused = GetFocus();
385 if ( focused && focused.GetName() == "server_browser_list_entry_root" )
386 {
387 Widget sibling = focused.GetParent().GetChildren();
388 if ( focused == sibling )
389 return;
390
391 while ( sibling )
392 {
393 if ( sibling && sibling.GetSibling() == focused )
394 {
395 SetFocus( sibling );
396 }
397 else
398 {
399 sibling = sibling.GetSibling();
400 }
401 }
402 }
403 }
404
405 // Unused?!
407
408 // Unused?!
410
411 void SetCurrentPage(int page_num)
412 {
413 m_CurrentPageNum = page_num;
414 }
415
417 {
418 return m_CurrentPageNum;
419 }
420
422 {
424 }
425
427 {
428 m_Filters.ResetFilters();
429 }
430
432
434 {
435 m_Menu.AddFavoritesToFilter( input );
436 }
437
439 {
440 m_Menu.SetServersLoadingTab( m_TabType );
441
442 m_LoadingFinished = false;
443 m_Initialized = true;
444 m_BegunLoading = false;
446 m_TotalPages = -1;
447 m_TotalServers = 0;
450
451 m_Menu.DeselectCurrentServer();
452
453 m_EntryWidgets.Clear();
454
455 #ifndef PLATFORM_WINDOWS // XBOX OR PS
456 m_CurrentFilterInput = m_Filters.GetFilterOptionsConsoles();
459 m_CurrentFilterInput.m_SortOrder = m_SortOrder;
460 #else // PLATFORM_WINDOWS
461 m_CurrentFilterInput = m_Filters.GetFilterOptionsPC();
462 #ifdef PLATFORM_CONSOLE // PC client with -XBOX flag
464 #else
465 m_CurrentFilterInput.m_Page = 0;
466 #endif
467 #endif
468
469 m_Loading = true;
470 switch ( m_TabType )
471 {
472 case TabType.OFFICIAL:
473 {
474 m_CurrentFilterInput.SetOfficialFilter( true );
476 break;
477 }
478 case TabType.COMMUNITY:
479 {
480 m_CurrentFilterInput.SetOfficialFilter( false );
482 break;
483 }
484 case TabType.LAN:
485 {
486 m_CurrentFilterInput.SetLAN();
488 break;
489 }
490 }
491 }
492
501
502 void SelectServer(ServerBrowserEntry server)
503 {
504 #ifdef PLATFORM_CONSOLE
505 ScrollToEntry(server);
506 #endif
507
508 m_SelectedServer = server;
509
510 m_CurrentSelectedServer = m_SelectedServer.GetServerData().m_Id;
511
512 if (!m_Menu)
513 return;
514
515 m_Menu.SelectServer(server);
516 }
517
518 void OnLoadServersAsyncPC(GetServersResult result_list, EBiosError error, string response);
519
520 void OnLoadServersAsyncConsole(GetServersResult result_list, EBiosError error, string response);
521
522 void UpdateServerList();
523
524 void SetSort( ESortType type, ESortOrder order )
525 {
526 m_SortOrder = order;
527 m_SortType = type;
528 }
529
530 bool IsPingInRange( int ping, string max_ping )
531 {
532 int max = max_ping.Substring( 1, max_ping.Length() - 1 ).ToInt();
533
534 if ( ping < max )
535 return true;
536 return false;
537 }
538
540 {
541 if ( !m_Menu || m_Menu.GetServersLoadingTab() != m_TabType )
542 {
543 return false;
544 }
545
546 if ( m_Filters.m_PingFilter.IsSet() )
547 {
548 if ( !IsPingInRange( result.m_Ping, m_Filters.m_PingFilter.GetStringValue() ) )
549 {
550 return false;
551 }
552 }
553
554 return true;
555 }
556
557 // Adds extra servers to the END of the list
558 protected void LoadExtraEntries(int index);
559
560 void Connect( ServerBrowserEntry server )
561 {
562 if ( !m_Menu )
563 return;
564
565 if ( m_Menu.GetServersLoadingTab() != TabType.NONE )
566 return;
567
568 m_SelectedServer = server;
569 m_Menu.Connect( server );
570 }
571
573 {
574 switch ( m_SortType )
575 {
576 case ESortType.HOST:
577 {
578 return "name";
579 }
580 case ESortType.TIME:
581 {
582 return "name";
583 }
584 case ESortType.POPULATION:
585 {
586 return "currentNumberPlayers";
587 }
588 case ESortType.SLOTS:
589 {
590 return "freeSlots";
591 }
592 case ESortType.PING:
593 {
594 return "name";
595 }
596 }
597 return "";
598 }
599
601 {
602 return -1;
603 }
604
605 void Unfavorite( string uid )
606 {
607 ServerBrowserEntry entry;
608 if ( m_EntryWidgets.Find( uid, entry ) )
609 {
610 entry.SetFavorite( false );
611 }
612 }
613
615 {
616 return m_TabType;
617 }
618
619 void ButtonEnable( Widget w )
620 {
621 w.ClearFlags( WidgetFlags.IGNOREPOINTER );
622 ColorNormal(w);
623 }
624
625 void ButtonDisable( Widget w )
626 {
627 w.SetFlags( WidgetFlags.IGNOREPOINTER );
628 ColorDisable(w);
629 }
630
631 //Coloring functions (Until WidgetStyles are useful)
632 void ColorHighlight( Widget w )
633 {
634 if ( w.IsInherited( ButtonWidget ) )
635 {
636 ButtonWidget button = ButtonWidget.Cast( w );
637 button.SetTextColor( ARGB( 255, 200, 0, 0 ) );
638 }
639
640 w.SetColor( ARGB( 255, 0, 0, 0) );
641
642 TextWidget text1 = TextWidget.Cast(w.FindAnyWidget( w.GetName() + "_text" ) );
643 TextWidget text2 = TextWidget.Cast(w.FindAnyWidget( w.GetName() + "_label" ) );
644 TextWidget text3 = TextWidget.Cast(w.FindAnyWidget( w.GetName() + "_text_1" ) );
645 ImageWidget image = ImageWidget.Cast( w.FindAnyWidget( w.GetName() + "_image" ) );
646 Widget option = Widget.Cast( w.FindAnyWidget( w.GetName() + "_option_wrapper" ) );
647 Widget option_label = w.FindAnyWidget( "option_label" );
648
649 if ( text1 )
650 {
651 text1.SetColor( ARGB( 255, 255, 0, 0 ) );
652 }
653
654 if ( text2 )
655 {
656 text2.SetColor( ARGB( 255, 255, 0, 0 ) );
657 }
658
659 if ( text3 )
660 {
661 text3.SetColor( ARGB( 255, 255, 0, 0 ) );
662 w.SetAlpha(1);
663 }
664
665 if ( image )
666 {
667 image.SetColor( ARGB( 255, 200, 0, 0 ) );
668 }
669
670 if ( option )
671 {
672 option.SetColor( ARGB( 255, 255, 0, 0 ) );
673 }
674
675 if ( option_label )
676 {
677 option_label.SetColor( ARGB( 255, 255, 0, 0 ) );
678 }
679 }
680
681 void ColorNormal( Widget w )
682 {
683 if ( (w.GetFlags() & WidgetFlags.IGNOREPOINTER) == WidgetFlags.IGNOREPOINTER )
684 {
685 return;
686 }
687
688 if ( w.IsInherited( ButtonWidget ) )
689 {
690 ButtonWidget button = ButtonWidget.Cast( w );
691 button.SetTextColor( ARGB( 255, 255, 255, 255 ) );
692 }
693
694 TextWidget text1 = TextWidget.Cast(w.FindAnyWidget( w.GetName() + "_text" ) );
695 TextWidget text2 = TextWidget.Cast(w.FindAnyWidget( w.GetName() + "_text_1" ) );
696 TextWidget text3 = TextWidget.Cast(w.FindAnyWidget( w.GetName() + "_label" ) );
697 ImageWidget image = ImageWidget.Cast( w.FindAnyWidget( w.GetName() + "_image" ) );
698 Widget option = w.FindAnyWidget( w.GetName() + "_option_wrapper" );
699 Widget option_label = w.FindAnyWidget( "option_label" );
700
701 if ( text1 )
702 {
703 text1.SetColor( ARGB( 255, 255, 255, 255 ) );
704 }
705
706 if ( text2 )
707 {
708 text2.SetColor( ARGB( 255, 255, 255, 255 ) );
709 }
710
711 if ( text3 )
712 {
713 text3.SetColor( ARGB( 255, 255, 255, 255 ) );
714 w.SetAlpha(0);
715 }
716
717 if ( image )
718 {
719 image.SetColor( ARGB( 255, 255, 255, 255 ) );
720 }
721
722 if ( option )
723 {
724 option.SetColor( ARGB( 150, 255, 255, 255 ) );
725 }
726
727 if ( option_label )
728 {
729 option_label.SetColor( ARGB( 255, 255, 255, 255 ) );
730 }
731 }
732
733 void ColorDisable( Widget w )
734 {
735 #ifdef PLATFORM_WINDOWS
736 SetFocus( null );
737 #endif
738
739 if ( w )
740 {
741 ButtonWidget button = ButtonWidget.Cast( w );
742 if ( button )
743 {
744 button.SetTextColor( ColorManager.COLOR_DISABLED_TEXT );
745 }
746 }
747 }
748
750 {
751 switch (m_SelectedPanel)
752 {
753 case SelectedPanel.BROWSER:
754 {
755 if (m_DetailsRoot.IsVisible())
756 {
757 SwitchToFilters(false);
758 }
759 else if (m_FilterRoot.IsVisible())
760 {
761 SwitchToDetails(false);
762 }
763 break;
764 }
765 case SelectedPanel.DETAILS:
766 {
768 break;
769 }
770 case SelectedPanel.FILTERS:
771 {
773 break;
774 }
775 }
776 }
777
778 // Here for overrides in the classes that inherit from class ServerBrowserTab
779 void SwitchToDetails(bool focus = true);
780 void SwitchToFilters(bool focus = true);
781
782 void SetServerDetails(GetServersResultRow server_info, bool online)
783 {
784 m_Details.SetDetails(server_info, online);
785 }
786
788 {
789 m_DetailsRoot.Show(true);
790 m_BtnShowDetails.Show(false);
791 m_Root.FindAnyWidget("spacer1").Show(m_TabType != TabType.FAVORITE && m_TabType != TabType.LAN);
792 m_RightAreaHeaderText.SetText("#STR_server_browser_menu_server_details");
793 }
794
796 {
797 return m_FilterRoot;
798 }
799
801 {
802 return m_DetailsRoot;
803 }
804
805 ServerBrowserEntry GetSelectedServer()
806 {
807 return m_SelectedServer;
808 }
809}
bool m_Initialized
EBiosError
Possible Error codes for bios API. This is the list of errors that can be returned from bios API....
ESortOrder
ESortType
proto native ContentDLC GetContentDLCService()
Return DLC service (service for entitlement keys for unlock content)
GetServersInput the input structure of the GetServers operation.
GetServersResult the output structure of the GetServers operation.
GetServersResultRow the output structure of the GetServers operation that represents one game server.
static void LoadServers(notnull GetServersInput inputValues)
override void OnFilterFocus(Widget w)
override void OnFilterFocusLost(Widget w)
override void PressSholderRight()
override bool IsFocusable(Widget w)
override void ColorDisable(Widget w)
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)
override void ColorNormal(Widget w)
override int AddSorted(GetServersResultRow entry)
override bool PassFilter(GetServersResultRow result)
override void OnLoadServersAsyncConsole(GetServersResult result_list, EBiosError error, string response)
override void PressSholderLeft()
override void OnFilterChanged()
override bool OnMouseEnter(Widget w, int x, int y)
override void OnPressShoulder()
override void Construct(Widget parent, ServerBrowserMenuNew menu, TabType type)
override void ColorHighlight(Widget w)
override void OnLoadServersAsyncPC(GetServersResult result_list, EBiosError error, string response)
Result for an object found in CGame.IsBoxCollidingGeometryProxy.
EDLCId
Definition contentdlc.c:4
proto native CGame GetGame()
WidgetFlags
Definition enwidgets.c:58
Icon x
Icon y
int ARGB(int a, int r, int g, int b)
Definition proto.c:322
void LoadExtraEntries(int index)
void ServerBrowserTab(Widget parent, ServerBrowserMenuNew menu, TabType type)
ref ServerBrowserFilterContainer m_Filters
void GetPrevFilter()
ref map< ESortType, ref array< ref GetServersResultRow > > m_EntriesSorted
void OnDetailsFocusLost(Widget w)
TabType GetTabType()
TabType m_TabType
Widget m_FilterSearchText
void SelectServer(ServerBrowserEntry server)
Widget m_FiltersChanged
Widget m_SlotsSort
void GetNextPage()
TextWidget m_RightAreaHeaderText
bool m_LoadingFinished
ServerBrowserEntry m_SelectedServer
void GetNextEntry()
enum TabType BROWSER
int m_CurrentLoadedPage
void ButtonDisable(Widget w)
ref GetServersInput m_CurrentFilterInput
void SwitchRightAreaView()
void SetPanelFocus()
void ServerListFocus(bool focus, bool favorite)
ButtonWidget m_BtnPageNext
ref map< ESortType, ESortOrder > m_SortInverted
bool IsPingInRange(int ping, string max_ping)
ButtonWidget m_BtnShowFilters
ref map< string, ref ServerBrowserEntry > m_EntryWidgets
int m_TotalPages
bool GetIsServerLoadingFinished()
void ScrollToEntry(ServerBrowserEntry entry)
bool m_BegunLoading
void Connect(ServerBrowserEntry server)
enum TabType FILTERS
TabType
@ COMMUNITY
@ NONE
@ LAN
@ OFFICIAL
@ FAVORITE
ScrollWidget m_ServerListScroller
Widget m_PingSort
int m_TotalLoadedServers
string m_CurrentSelectedServer
string GetSortOption()
Widget m_ApplyFilter
void GetPrevEntry()
ServerBrowserMenuNew m_Menu
ref map< string, ref array< string > > m_EntryMods
enum TabType MENU
void Down()
bool m_Loading
SelectedPanel m_SelectedPanel
int m_LastLoadedPage
ESortType m_SortType
ServerBrowserEntry GetSelectedServer()
void GetNextFilter()
TextWidget m_LoadingText
void Up()
Widget m_PopulationSort
Widget m_MapSort
Widget m_HostSort
void Unfavorite(string uid)
ButtonWidget m_BtnPagePrev
void ButtonEnable(Widget w)
ESortOrder m_SortOrder
SpacerBaseWidget m_ServerList
int m_TotalServers
int m_CurrentPageNum
bool IsNotInitialized()
void OnDetailsFocus(Widget w)
void AddFavoritesToFilter(GetServersInput input)
void SetServerDetails(GetServersResultRow server_info, bool online)
Widget GetFilterRoot()
override bool OnFocusLost(Widget w, int x, int y)
int GetCurrentPage()
Widget m_FilterSearchTextBox
ref ServerBrowserDetailsContainer m_Details
Widget m_FilterRoot
Widget m_ResetFilters
Widget m_DetailsRoot
Widget m_RefreshList
override bool OnFocus(Widget w, int x, int y)
Widget GetDetailsRoot()
Widget m_TimeSort
Widget m_FilterContent
void ~ServerBrowserTab()
ref set< string > m_OnlineFavServers
void SetCurrentPage(int page_num)
ButtonWidget m_BtnShowDetails
void OnDLCChange(EDLCId dlcId)
ServerBrowserMenuNew GetRootMenu()
Widget m_Root
Definition sizetochild.c:91