SquareDash/Library/PackageCache/com.unity.services.mediation@1.0.5/Editor/Settings/MediationAdUnitsWindow.cs
kingjuulian06 0efb85038a Arbeit 2
2023-11-21 22:03:49 +01:00

202 lines
8.0 KiB
C#

using System;
using System.Collections.Generic;
using Unity.Services.Mediation.Dashboard.Editor;
using Unity.Services.Mediation.Settings.Editor.Layout;
using UnityEditor;
using UnityEditor.UIElements;
using UnityEngine.UIElements;
namespace Unity.Services.Mediation.Settings.Editor
{
/// <summary>
/// Window listing the available Ad Units defined in the dashboard and their infos for the user's convenience
/// </summary>
class MediationAdUnitsWindow : EditorWindow
{
public static List<AdUnitData> AdUnitData => FilteredAdUnitData ?? AdUnitDataSource;
static List<AdUnitData> AdUnitDataSource = new List<AdUnitData>();
static List<AdUnitData> FilteredAdUnitData;
static SortMode[] SortModes = {SortMode.Ascending, SortMode.Ascending, SortMode.Ascending, SortMode.Ascending};
const string k_AdUnitsTemplate = @"Packages/com.unity.services.mediation/Editor/Settings/Layout/AdUnitsTemplate.uxml";
const string k_AdUnitsStyle = @"Packages/com.unity.services.mediation/Editor/Settings/Layout/AdUnitsStyle.uss";
const string k_AdUnitsWarningTemplate = @"Packages/com.unity.services.mediation/Editor/Settings/Layout/AdUnitsWarningTemplate.uxml";
const string k_AdUnitsErrorTemplate = @"Packages/com.unity.services.mediation/Editor/Settings/Layout/AdUnitsErrorTemplate.uxml";
[MenuItem("Services/" + MediationServiceIdentifier.k_PackageDisplayName + "/Ad Units", priority = 111)]
public static void ShowWindow()
{
EditorGameServiceAnalyticsSender.SendTopMenuAdUnitsEvent();
GetWindow<MediationAdUnitsWindow>($"{MediationServiceIdentifier.k_PackageDisplayName} - Ad Units", new Type[] { typeof(MediationCodeGeneratorWindow), typeof(SceneView), typeof(EditorWindow)});
}
void OnFocus()
{
if (rootVisualElement.Q(className: "list-view") != null)
{
RetrieveAdUnitInfo(rootVisualElement);
}
else
{
RefreshWindow();
}
}
void RefreshWindow()
{
rootVisualElement.Clear();
AdUnitVisualElement.Initialize();
VisualElement root = rootVisualElement;
AddStyleSheets(root);
VisualTreeAsset adUnitTemplateAsset = AssetDatabase.LoadAssetAtPath<VisualTreeAsset>(k_AdUnitsTemplate);
adUnitTemplateAsset.CloneTree(root);
RetrieveAdUnitInfo(root);
}
void RetrieveAdUnitInfo(VisualElement root)
{
DashboardClient.GetAdUnitsAsync(adUnits =>
{
// Remove Loading Element
root.Q<Label>("loading")?.RemoveFromHierarchy();
// Can't fetch ad unit data, display error message box
if (adUnits == null)
{
root.Q(className: "list-view")?.RemoveFromHierarchy();
VisualTreeAsset errorTemplate = AssetDatabase.LoadAssetAtPath<VisualTreeAsset>(k_AdUnitsErrorTemplate);
errorTemplate.CloneTree(root.Q(className: "table-box"));
}
else if (adUnits.Length == 0)
{
root.Q(className: "list-view")?.RemoveFromHierarchy();
VisualTreeAsset warningTemplate = AssetDatabase.LoadAssetAtPath<VisualTreeAsset>(k_AdUnitsWarningTemplate);
warningTemplate.CloneTree(root.Q(className: "table-box"));
}
else
{
// Received data construct ad units list.
List<AdUnitData> dashboardAdUnits = new List<AdUnitData>();
foreach (DashboardClient.AdUnitInfoJson adUnitInfo in adUnits)
{
if (!adUnitInfo.isArchived)
{
dashboardAdUnits.Add(new AdUnitData(adUnitInfo));
}
}
AdUnitDataSource = dashboardAdUnits;
ConstructListFromAdUnits(root);
}
});
}
static SortMode GetNextSortMode(SortMode sortMode)
{
return (SortMode)(((int)sortMode + 1) % 2);
}
static EventCallback<ChangeEvent<string>> FilterListBySearchField(ListView listView)
{
return evt =>
{
if (!string.IsNullOrEmpty(evt?.newValue))
{
FilteredAdUnitData =
AdUnitDataSource.FindAll(data => data.AdUnit.ToLower().Contains(evt.newValue.ToLower()));
listView.itemsSource = FilteredAdUnitData;
}
else
{
FilteredAdUnitData = null;
listView.itemsSource = AdUnitDataSource;
}
#if UNITY_2022_1_OR_NEWER
//Prior to 2022, refresh was automatic.
listView.RefreshItems();
#endif
};
}
static void SortColumn(ListView listView, int columnIndex, Comparison<AdUnitData> comparisonFunction)
{
EditorGameServiceAnalyticsSender.SendAdUnitsSortEvent();
SortModes[columnIndex] = GetNextSortMode(SortModes[columnIndex]);
switch (SortModes[0])
{
case SortMode.Descending:
FilteredAdUnitData = AdUnitData;
FilteredAdUnitData.Sort(comparisonFunction);
listView.itemsSource = FilteredAdUnitData;
break;
case SortMode.Ascending:
FilteredAdUnitData = AdUnitData;
FilteredAdUnitData.Sort(comparisonFunction);
listView.itemsSource = FilteredAdUnitData;
break;
}
#if UNITY_2022_1_OR_NEWER
//Prior to 2022, refresh was automatic.
listView.RefreshItems();
#endif
}
static void ConstructListFromAdUnits(VisualElement root)
{
ListView listView = root.Q<ListView>(className: "list-view");
ToolbarSearchField searchField = root.Q<ToolbarSearchField>(className: "search-field");
searchField.value = String.Empty;
searchField.RegisterValueChangedCallback(FilterListBySearchField(listView));
listView.makeItem = AdUnitVisualElement.CreateListItem;
listView.bindItem = AdUnitVisualElement.BindListItem;
listView.itemsSource = AdUnitDataSource;
root.Q<Label>("list-header-adunit").RegisterCallback<MouseDownEvent>(evt =>
{
SortColumn(listView, 0, (data, unitData) => Editor.AdUnitData.CompareByAdUnit(SortModes[0], data, unitData));
});
root.Q<Label>("list-header-platform").RegisterCallback<MouseDownEvent>(evt =>
{
SortColumn(listView, 1, (data, unitData) => Editor.AdUnitData.CompareByPlatform(SortModes[1], data, unitData));
});
root.Q<Label>("list-header-adformat").RegisterCallback<MouseDownEvent>(evt =>
{
SortColumn(listView, 2, (data, unitData) => Editor.AdUnitData.CompareByAdFormat(SortModes[2], data, unitData));
});
root.Q<Label>("list-header-id").RegisterCallback<MouseDownEvent>(evt =>
{
SortColumn(listView, 3, (data, unitData) => Editor.AdUnitData.CompareById(SortModes[3], data, unitData));
});
}
void AddStyleSheets(VisualElement root)
{
StyleSheet styleSheet = AssetDatabase.LoadAssetAtPath<StyleSheet>(k_AdUnitsStyle);
root.styleSheets.Add(styleSheet);
string k_SkinStyle = $@"Packages/com.unity.services.mediation/Editor/Settings/Layout/2019/SkinStyle{(EditorGUIUtility.isProSkin ? "Dark" : "Light")}.uss";
styleSheet = EditorGUIUtility.Load(k_SkinStyle) as StyleSheet;
root.styleSheets.Add(styleSheet);
}
}
}