mirror of
https://github.com/Artemis-RGB/Artemis
synced 2025-12-13 05:48:35 +00:00
88 lines
2.4 KiB
C#
88 lines
2.4 KiB
C#
using Artemis.Core;
|
|
using Artemis.Storage.Entities.Profile;
|
|
using Artemis.VisualScripting.Nodes.DataModel.Screens;
|
|
|
|
namespace Artemis.VisualScripting.Nodes.DataModel;
|
|
|
|
[Node("Data Model-Value", "Outputs a selectable data model value.", "Data Model", OutputType = typeof(object))]
|
|
public class DataModelNode : Node<DataModelPathEntity, DataModelNodeCustomViewModel>, IDisposable
|
|
{
|
|
private DataModelPath? _dataModelPath;
|
|
|
|
public DataModelNode()
|
|
{
|
|
Output = CreateOutputPin(typeof(object));
|
|
StorageModified += (_, _) => UpdateDataModelPath();
|
|
}
|
|
|
|
public INodeScript? Script { get; private set; }
|
|
public OutputPin Output { get; }
|
|
|
|
public override void Initialize(INodeScript script)
|
|
{
|
|
Script = script;
|
|
|
|
if (Storage == null)
|
|
return;
|
|
|
|
UpdateDataModelPath();
|
|
}
|
|
|
|
public override void Evaluate()
|
|
{
|
|
if (_dataModelPath == null || !_dataModelPath.IsValid)
|
|
return;
|
|
|
|
object? pathValue = _dataModelPath.GetValue();
|
|
if (pathValue == null)
|
|
{
|
|
if (!Output.Type.IsValueType)
|
|
Output.Value = null;
|
|
}
|
|
else
|
|
{
|
|
Output.Value = Output.IsNumeric ? new Numeric(pathValue) : pathValue;
|
|
}
|
|
}
|
|
|
|
public void UpdateOutputPin()
|
|
{
|
|
Type? type = _dataModelPath?.GetPropertyType();
|
|
if (type == null)
|
|
type = typeof(object);
|
|
else if (Numeric.IsTypeCompatible(type))
|
|
type = typeof(Numeric);
|
|
|
|
if (Output.Type != type)
|
|
Output.ChangeType(type);
|
|
}
|
|
|
|
private void UpdateDataModelPath()
|
|
{
|
|
DataModelPath? old = _dataModelPath;
|
|
_dataModelPath = Storage != null ? new DataModelPath(Storage) : null;
|
|
if (_dataModelPath != null)
|
|
_dataModelPath.PathValidated += DataModelPathOnPathValidated;
|
|
|
|
if (old != null)
|
|
{
|
|
old.PathValidated -= DataModelPathOnPathValidated;
|
|
old.Dispose();
|
|
}
|
|
|
|
UpdateOutputPin();
|
|
}
|
|
|
|
private void DataModelPathOnPathValidated(object? sender, EventArgs e)
|
|
{
|
|
// Update the output pin now that the type is known and attempt to restore the connection that was likely missing
|
|
UpdateOutputPin();
|
|
Script?.LoadConnections();
|
|
}
|
|
|
|
/// <inheritdoc />
|
|
public void Dispose()
|
|
{
|
|
_dataModelPath?.Dispose();
|
|
}
|
|
} |