1
0
KF2-Dev-Scripts/Engine/Classes/UIDataStore.uc

183 lines
7.6 KiB
Ucode
Raw Normal View History

2020-12-13 15:01:13 +00:00
/**
* Base for classes which provide data to the UI subsystem.
* A data store is how the UI references data in the game. Data stores allow the UI to reference game data in a safe
* manner, since they encapsulate lifetime management. A data store can be either persistent, in which case it is
* attached directly to the UIInteraction object and is available to all widgets, or it can be temporary, in which case
* it is attached to the current scene and is only accessible to the widgets contained by that scene.
*
* Persistent data stores might track information such as UI data for all gametypes or characters. Temporary data
* stores might track stuff like the name that was entered into some UI value widget. Data stores can provide static
* information, such as the names of all gametypes, or dynamic information, such as the name of the current gametype.
*
* Copyright 1998-2013 Epic Games, Inc. All Rights Reserved.
*/
class UIDataStore extends UIDataProvider
native(inherit)
abstract;
cpptext
{
/**
* Allows each data store the chance to load any dependent classes
*/
virtual void LoadDependentClasses(void)
{
}
/**
* Hook for performing any initialization required for this data store
*/
virtual void InitializeDataStore();
/**
* Called when this data store is added to the data store manager's list of active data stores.
*
* @param PlayerOwner the player that will be associated with this DataStore. Only relevant if this data store is
* associated with a particular player; NULL if this is a global data store.
*/
virtual void OnRegister( class ULocalPlayer* PlayerOwner );
/**
* Called when this data store is removed from the data store manager's list of active data stores.
*
* @param PlayerOwner the player that will be associated with this DataStore. Only relevant if this data store is
* associated with a particular player; NULL if this is a global data store.
*/
virtual void OnUnregister( class ULocalPlayer* PlayerOwner );
/**
* Retrieves the tag used for referencing this data store. Normally corresponds to Tag, but may be different for some special
* data stores.
*/
virtual FName GetDataStoreID() const { return Tag; }
}
/** The name used to access this datastore */
var name Tag;
/** the list of delegates to call when data exposed by this data store has been updated */
var array<delegate<OnDataStoreValueUpdated> > RefreshSubscriberNotifies;
/**
* This delegate is called whenever the values exposed by this data store have been updated. Provides data stores with a way to
* notify subscribers when they should refresh their values from this data store.
*
* @param SourceDataStore the data store that generated the refresh notification
* @param bValuesInvalidated TRUE if the data values were completely invalidated; suggest a full refresh rather than an update (i.e. in lists)
* @param PropertyTag the tag associated with the data field that was updated.
* @param SourceProvider for data stores which contain nested providers, the provider that contains the data which changed.
* @param ArrayIndex for collection fields, indicates which element was changed. value of INDEX_NONE indicates not an array
* or that the entire array was updated.
*/
delegate OnDataStoreValueUpdated( UIDataStore SourceDataStore, bool bValuesInvalidated, name PropertyTag, UIDataProvider SourceProvider, int ArrayIndex );
/**
* Called when this data store is added to the data store manager's list of active data stores.
*
* @param PlayerOwner the player that will be associated with this DataStore. Only relevant if this data store is
* associated with a particular player; NULL if this is a global data store.
*/
event Registered( LocalPlayer PlayerOwner );
/**
* Called when this data store is removed from the data store manager's list of active data stores.
*
* @param PlayerOwner the player that will be associated with this DataStore. Only relevant if this data store is
* associated with a particular player; NULL if this is a global data store.
*/
event Unregistered( LocalPlayer PlayerOwner );
/**
* Notification that a subscriber is using a value from this data store. Adds the subscriber's RefreshSubscriberValue method
* to this data store's list of refresh notifies so that the subscriber can refresh its value when the data store's value changes.
*
* @param Subscriber the subscriber that attached to the data store.
*/
event SubscriberAttached( UIDataStoreSubscriber Subscriber )
{
local int SubscriberNotifyIndex;
if ( Subscriber != None )
{
SubscriberNotifyIndex = RefreshSubscriberNotifies.Find(Subscriber.NotifyDataStoreValueUpdated);
if ( SubscriberNotifyIndex == INDEX_NONE )
{
SubscriberNotifyIndex = RefreshSubscriberNotifies.Length;
RefreshSubscriberNotifies[SubscriberNotifyIndex] = Subscriber.NotifyDataStoreValueUpdated;
}
}
}
/**
* Notification that a subscriber is no longer using any values from this data store. Removes the subscriber's RefreshSubscriberValue method
* from this data store's list of refresh notifies so that the subscriber no longer refreshes its value when the data store's value changes.
*
* @param Subscriber the subscriber that detached from the data store.
*/
event SubscriberDetached( UIDataStoreSubscriber Subscriber )
{
local int SubscriberNotifyIndex;
if ( Subscriber != None )
{
SubscriberNotifyIndex = RefreshSubscriberNotifies.Find(Subscriber.NotifyDataStoreValueUpdated);
if ( SubscriberNotifyIndex != INDEX_NONE )
{
RefreshSubscriberNotifies.Remove(SubscriberNotifyIndex,1);
}
}
}
/**
* Called when the current map is being unloaded. Cleans up any references which would prevent garbage collection.
*
* @return TRUE indicates that this data store should be automatically unregistered when this game session ends.
*/
function bool NotifyGameSessionEnded();
/**
* Loops through the subscriber notify list and calls the delegate letting the subscriber know to refresh their value.
*
* @param PropertyTag the tag associated with the data field that was updated.
* @param SourceProvider for data stores which contain nested providers, the provider that contains the data which changed.
* @param ArrayIndex for collection fields, indicates which element was changed. value of INDEX_NONE indicates not an array
* or that the entire array was updated.
*/
final event RefreshSubscribers( optional name PropertyTag, optional bool bInvalidateValues=true, optional UIDataProvider SourceProvider, optional int ArrayIndex=INDEX_NONE )
{
local int Idx;
local delegate<OnDataStoreValueUpdated> Subscriber;
//@todo: Right now we make a copy of the array because the refresh notify for datastore subscribers is unregistering the notify
// when resolving markup.
local array<delegate<OnDataStoreValueUpdated> > SubscriberArrayCopy;
SubscriberArrayCopy.Length = RefreshSubscriberNotifies.Length;
for(Idx = 0; Idx < SubscriberArrayCopy.Length; Idx++)
{
SubscriberArrayCopy[Idx] = RefreshSubscriberNotifies[Idx];
}
for (Idx = 0; Idx < SubscriberArrayCopy.Length; Idx++)
{
Subscriber = SubscriberArrayCopy[Idx];
Subscriber(Self, bInvalidateValues, PropertyTag, SourceProvider, ArrayIndex);
}
}
/**
* Returns a reference to the global data store client, if it exists.
*
* @return the global data store client for the game.
*/
final function DataStoreClient GetDataStoreClient()
{
return class'UIInteraction'.static.GetDataStoreClient();
}
DefaultProperties
{
}