103 super.OnTabCreate(menuRoot, buttonsLayout,
index);
111 m_Widgets.m_FilterPanelComponent.TryLoad();
236 if (connectedNew != connectedOld)
243 super.OnMenuUpdate(tDelta);
255 super.OnMenuFocusGained();
267 m_NavFilter = CreateNavigationButton(
"MenuFilter",
"#AR-FieldManual_Page_EditorAssetBrowser_Text_3",
false);
271 m_NavRepair = CreateNavigationButton(
UIConstants.MENU_ACTION_SELECT_HOLD,
"#AR-FactionCommander_TaskRepair",
true);
345 m_Widgets.m_AddonDetailsPanelComponent.SetWorkshopItem(null);
412 #ifdef WORKSHOP_DEBUG
452 array<WorkshopItem> rawWorkshopItems = {};
456 if (rawWorkshopItems.IsEmpty())
464 array<ref SCR_WorkshopItem> itemsUnfiltered = {};
473 itemsUnfiltered.Insert(itemRegistered);
480 if (itemsFiltered.IsEmpty())
488 array<SCR_WorkshopItem> itemsSortedWeakPtrs = {};
491 itemsSortedWeakPtrs.Insert(i);
494 bool sortOrder = !
m_Widgets.m_SortingHeaderComponent.GetSortOrderAscending();
495 string currentSortingItem =
m_Widgets.m_SortingHeaderComponent.GetSortElementName();
496 if (currentSortingItem.IsEmpty())
498 currentSortingItem =
"name";
502 switch (currentSortingItem)
505 SCR_Sorting<SCR_WorkshopItem, SCR_CompareWorkshopItemName>.HeapSort(itemsSortedWeakPtrs, sortOrder);
507 case "time_since_played":
508 SCR_Sorting<SCR_WorkshopItem, SCR_CompareWorkshopItemTimeSinceLastPlay>.HeapSort(itemsSortedWeakPtrs, sortOrder);
510 case "time_since_downloaded":
511 SCR_Sorting<SCR_WorkshopItem, SCR_CompareWorkshopItemTimeSinceFirstDownload>.HeapSort(itemsSortedWeakPtrs, sortOrder);
515 array<ref SCR_WorkshopItem> itemsSorted = {};
518 itemsSorted.Insert(i);
526 array<ref SCR_WorkshopItem> itemsAtPage =
SelectItemsAtPage(itemsSorted, pageId);
571 comp.SetWorkshopItem(null);
583 for (
int i = 0; i < nItems; i++)
596 protected void SetPanelsMode(
bool showEmptyPanel,
bool forceFiltersList =
false,
string messagePresetTag =
string.Empty,
bool animateFiltersList =
false)
601 m_Widgets.m_EmptyPanel.SetVisible(showEmptyPanel);
602 m_Widgets.m_FilterPanel.SetVisible(!showEmptyPanel);
603 m_Widgets.m_LeftPanelArea.SetVisible(!showEmptyPanel);
606 m_Widgets.m_EmptyPanelMessage.SetVisible(!messagePresetTag.IsEmpty());
607 m_Widgets.m_MainPanelMessage.SetVisible(!messagePresetTag.IsEmpty());
610 if (!messagePresetTag.IsEmpty())
613 m_Widgets.m_EmptyPanelMessageComponent.SetContentFromPreset(messagePresetTag);
615 m_Widgets.m_MainPanelMessageComponent.SetContentFromPreset(messagePresetTag);
619 if (forceFiltersList)
621 m_Widgets.m_FilterPanelComponent.ShowFilterListBox(
true, animateFiltersList);
622 if (!
m_Widgets.m_FilterPanelComponent.GetFocused())
635 m_Widgets.m_FilterPanelComponent.SetItemsFoundMessage(current, total, current != total);
643 Widget focusedWidget =
GetGame().GetWorkspace().GetFocusedWidget();
697 SetNavigationButtonVisible(
m_NavPrimary, show && !primaryLabel.IsEmpty());
730 wCurrent = wCurrent.GetParent();
737 protected array<ref SCR_WorkshopItem>
SelectItemsAtPage(array<ref SCR_WorkshopItem> items,
int pageId)
739 array<ref SCR_WorkshopItem> itemsOut = {};
742 int nPages =
Math.Ceil(items.Count() / nItemsPerPage);
744 if (pageId < 0 || pageId >= nPages)
747 int idStart = nItemsPerPage * pageId;
748 int idEnd = nItemsPerPage * (pageId + 1) - 1;
750 if (idEnd >= items.Count())
751 idEnd = items.Count() - 1;
753 for (
int i = idStart; i <= idEnd; i++)
755 itemsOut.Insert(items[i]);
770 case SCR_EListMenuWidgetFocus.LIST:
775 focusTarget =
m_Widgets.m_Grid.GetChildren();
780 case SCR_EListMenuWidgetFocus.FILTERING:
782 focusTarget =
m_Widgets.m_FilterPanelComponent.GetWidgets().m_FilterButton;
786 case SCR_EListMenuWidgetFocus.SORTING:
788 focusTarget =
m_Widgets.m_SortingHeader.GetChildren();
792 case SCR_EListMenuWidgetFocus.NULL:
794 GetGame().GetWorkspace().SetFocusedWidget(null);
800 if (!focusTarget || !focusTarget.IsVisible())
801 focusTarget =
m_Widgets.m_SortingHeader.GetChildren();
804 GetGame().GetWorkspace().SetFocusedWidget(focusTarget);
861 if (!item ||
m_Widgets.m_AddonDetailsPanelComponent.GetItem() == item)
864 m_Widgets.m_AddonDetailsPanelComponent.SetWorkshopItem(item);
917 bool show = !
m_Widgets.m_FilterPanelComponent.GetFilterListBoxShown();
918 m_Widgets.m_FilterPanelComponent.ShowFilterListBox(show);
1021 array<WorkshopItem> items = {};
1033 array<ref SCR_WorkshopItem> itemsRegistered = {};
1039 itemsRegistered.Insert(iRegistered);
1042 if (!itemsRegistered.IsEmpty())
1116 if (comp.GetWorkshopItem() == item)
1129 EInputDeviceType inputType = -1;
1131 inputType = EInputDeviceType.MOUSE;
1148 EInputDeviceType inputType = -1;
1150 inputType = EInputDeviceType.MOUSE;
1167 float value =
GetGame().GetInputManager().GetActionValue(name);
1227 protected array<ref SCR_WorkshopItem>
SearchItems(array<ref SCR_WorkshopItem> items,
string searchStr)
1229 array<ref SCR_WorkshopItem> itemsOut = {};
1231 if (searchStr.IsEmpty())
1241 string searchStrLower = searchStr;
1242 searchStrLower.ToLower();
1244 array<WorkshopTag>
tags = {};
1249 element = i.GetName();
1251 if (element.Contains(searchStrLower))
1258 element = i.GetAuthorName();
1260 if (element.Contains(searchStrLower))
1267 element = i.GetDescription();
1269 if (element.Contains(searchStrLower))
1277 i.GetWorkshopItem().GetTags(
tags);
1281 element = tag.Name();
1283 if (element == searchStrLower)
1306 string searchStr =
m_Widgets.m_FilterPanelComponent.GetEditBoxSearch().GetValue();
1307 array<ref SCR_WorkshopItem> items =
SearchItems(itemsIn, searchStr);
1313 array<ref array<ref SCR_WorkshopItem>> arraysFromCategories = {};
1323 arraysFromCategories.Insert(items);
1335 array<WorkshopTag> selectedWorkshopTags = {};
1343 if (filterEntryTag && filterEntryTag.GetSelected())
1344 selectedWorkshopTags.Insert(filterEntryTag.GetWorkshopTag());
1351 if (filterEntryTag && filterEntryTag.GetSelected())
1352 selectedWorkshopTags.Insert(filterEntryTag.GetWorkshopTag());
1355 if (!selectedWorkshopTags.IsEmpty() && selectedWorkshopTags.Count() != catType.
GetFilters().Count())
1357 array<ref SCR_WorkshopItem> itemsFilteredByTags = {};
1360 if (item.GetWorkshopItem().HasAnyTag(selectedWorkshopTags))
1361 itemsFilteredByTags.Insert(item);
1363 arraysFromCategories.Insert(itemsFilteredByTags);
1373 arraysFromCategories.Insert(items);
1385 arraysFromCategories.Insert(queryResult);
1392 arraysFromCategories.Insert(items);
1407 arraysFromCategories.Insert(queryResult);
1418 array<ref SCR_WorkshopItem> result = {};
1421 if (arrays.IsEmpty())
1424 array<ref SCR_WorkshopItem> array0 = arrays[0];
1427 if (arrays.Count() == 1)
1429 result.Resize(array0.Count());
1445 for (
int arrayId = 1; arrayId < arrays.Count(); arrayId++)
1448 if (!arrays[arrayId].
Contains(item))
1456 result.Insert(item);
1472 string searchStr =
m_Widgets.m_FilterPanelComponent.GetWidgets().m_FilterSearchComponent.GetValue();
1473 if (!searchStr.IsEmpty() && !defaultValues)
1474 p.StoreString(
"search", searchStr);
1484 p.StoreBoolean(
"reported", reportedFilter.
GetSelected(defaultValues));
1485 p.StoreBoolean(
"hidden", reportedFilter.
GetSelected(defaultValues));
1493 string orderBy =
"name";
1494 string currentSortingItem =
m_Widgets.m_SortingHeaderComponent.GetSortElementName();
1495 bool sortAscending =
m_Widgets.m_SortingHeaderComponent.GetSortOrderAscending();
1497 const string orderAsc =
"asc";
1498 const string orderDesc =
"desc";
1500 switch (currentSortingItem)
1503 orderBy =
"popularity";
1506 orderBy =
"averageRating";
1508 case "recently_added":
1509 orderBy =
"createdAt";
1510 sortAscending = !sortAscending;
1516 orderBy =
"subscriberCount";
1520 string orderDirection = orderAsc;
1522 orderDirection = orderDesc;
1524 params.StoreString(
"orderBy", orderBy);
1525 params.StoreString(
"orderDirection", orderDirection);
1541 params.StoreBoolean(
"favorited",
true);
1546 params.StartObject(
"averageRating");
1547 params.StoreFloat(
"gt", 0.75);
1548 params.StoreFloat(
"lt", 1);
1560 array<ref array<string>> tagArraysInclude = {};
1561 array<string> tagsExclude = {};
1567 array<string> typeTags = {};
1570 if (filter.GetSelected(defaultValues))
1571 typeTags.Insert(filter.m_sInternalName);
1573 tagArraysInclude.Insert(typeTags);
1580 array<string> typeTags = {};
1583 if (filter.GetSelected(defaultValues))
1584 typeTags.Insert(filter.m_sInternalName);
1586 tagArraysInclude.Insert(typeTags);
1592 tagsExclude.Insert(testFilter.m_sInternalName);
1595 if (!tagArraysInclude.IsEmpty() || !tagsExclude.IsEmpty())
1597 params.StartObject(
"tags");
1599 if (!tagArraysInclude.IsEmpty())
1601 params.StartArray(
"include");
1603 foreach (array<string> tagArray : tagArraysInclude)
1606 foreach (
string tag : tagArray)
1616 if (!tagsExclude.IsEmpty())
1618 params.StartArray(
"exclude");
1619 foreach (
string tag : tagsExclude)
1645 SCR_ContentBrowser_AddonsSubMenu m_AddonsSubMenu;
1652 m_AddonsSubMenu = subMenu;
1662class SCR_CompareWorkshopItemName : SCR_SortCompare<SCR_WorkshopItem>
1664 override static int Compare(SCR_WorkshopItem left, SCR_WorkshopItem right)
1669 if (name1.Compare(name2) == -1)
1682 timeLeft = 0x7FFFFFFF;
1685 timeRight = 0x7FFFFFFF;
1687 return timeLeft < timeRight;
1691class SCR_CompareWorkshopItemTimeSinceFirstDownload : SCR_SortCompare<SCR_WorkshopItem>
1693 override static int Compare(SCR_WorkshopItem left, SCR_WorkshopItem right)
1697 timeLeft = 0x7FFFFFFF;
1700 timeRight = 0x7FFFFFFF;
1702 return timeLeft < timeRight;
1714 return leftSize < rightSize;
ArmaReforgerScripted GetGame()
InputManager GetInputManager()
void OnMenuUpdate(float tDelta)
void OnFilterChange(EEditableEntityState state, set< SCR_EditableEntityComponent > entitiesInsert, set< SCR_EditableEntityComponent > entitiesRemove)
SCR_DestructionSynchronizationComponentClass ScriptComponentClass int index
SCR_VONRadialDisplay Compare
EWeaponGroupFireMode m_eMode
SCR_WorkshopItem Register(WorkshopItem item)
Returns a SCR_WorkshopItem. If it's not registered, creates a new one and registers it.
ref ScriptInvoker m_OnAddonOfflineStateChanged
static array< ref SCR_WorkshopItem > SelectItemsBasic(array< ref SCR_WorkshopItem > items, EWorkshopItemQuery query)
ref ScriptInvoker m_OnAddonReportedStateChanged
static array< ref SCR_WorkshopItem > SelectItemsOr(array< ref SCR_WorkshopItem > items, EWorkshopItemQuery query)
static SCR_AddonManager GetInstance()
ref ScriptInvoker m_OnCancel
ref ScriptInvoker m_OnConfirm
void SCR_ContentBrowser_GetAssetListParams(SCR_ContentBrowser_AddonsSubMenu subMenu, bool defaultValues=false)
ScriptInvokerScriptedWidgetComponent GetOnFocusLost()
ScriptInvokerScriptedWidgetComponent GetOnFocus()
SCR_WorkshopItem GetWorkshopItem()
void SetWorkshopItem(SCR_WorkshopItem workshopItem)
If a null pointer is passed, tile becomes hidden.
ScriptInvokerScriptedWidgetComponent GetOnChange()
static SCR_ContentBrowserTileComponent FindComponent(notnull Widget w)
static int GetTileWidth()
array< ref SCR_FilterEntry > GetFilters()
Returns array with filter entries.
SCR_FilterEntry FindFilter(string internalName)
Finds a filter by internal name.
bool GetSelected(bool defaultValue=false)
Returns the selected flag.
SCR_FilterCategory FindFilterCategory(string internalName)
Finds a filter category by its internal name.
array< ref SCR_FilterCategory > GetFilterCategories()
static bool IsAuthenticated()
void LoadAddon(notnull SCR_WorkshopItem item)
int GetTimeSinceLastPlay()
void SetFavourite(bool favourite)
bool GetOffline()
True when we have the item on our local storage.
float GetTargetRevisionPatchSize()
bool GetRestricted()
Returns true when item is restricted for any reason (blocked or reported).
int GetTimeSinceFirstDownload()
static void OnEnableAddonButton(SCR_WorkshopItem item)
static string GetPrimaryActionName(SCR_WorkshopItem item)
Returns name of suggested primary action.
static void ExecutePrimaryAction(notnull SCR_WorkshopItem item, out SCR_WorkshopDownloadSequence dlRequest, Revision revision=null)
static SCR_EAddonPrimaryActionState GetPrimaryActionState(notnull SCR_WorkshopItem item)
static bool IsDownloadingAddonOrDependencies(SCR_WorkshopItem item)
SCR_FieldOfViewSettings Attribute
proto bool Contains(T value)