mirror of
https://github.com/antopilo/Nuake.git
synced 2026-09-21 20:08:40 +03:00
Started editor .Net context for undo/redo system
This commit is contained in:
261
EditorNet/src/Editor.cs
Normal file
261
EditorNet/src/Editor.cs
Normal file
@@ -0,0 +1,261 @@
|
||||
using Nuake.Commands;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
|
||||
namespace Nuake
|
||||
{
|
||||
class Editor
|
||||
{
|
||||
internal static unsafe delegate*<int, void> SetSelectedEntityIcall;
|
||||
internal static unsafe delegate*<int> GetSelectedEntityIcall;
|
||||
|
||||
static int STACK_CAPACITY = 32;
|
||||
private static Stack<ICommand> CommandStack = new(STACK_CAPACITY);
|
||||
|
||||
|
||||
public static int SelectedEntity
|
||||
{
|
||||
get
|
||||
{
|
||||
unsafe
|
||||
{
|
||||
return GetSelectedEntityIcall();
|
||||
}
|
||||
}
|
||||
|
||||
set
|
||||
{
|
||||
unsafe
|
||||
{
|
||||
SetSelectedEntityIcall(value);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void Initialize()
|
||||
{
|
||||
RegisterCommand();
|
||||
}
|
||||
|
||||
static void RegisterCommand()
|
||||
{
|
||||
SelectEntity testCommand = new SelectEntity(10);
|
||||
testCommand.Do();
|
||||
testCommand.Undo();
|
||||
|
||||
SetEntityFieldProperty test = new SetEntityFieldProperty(1, "LightComponent.Intensity", "10");
|
||||
test.Do();
|
||||
test.Undo();
|
||||
test.Do();
|
||||
}
|
||||
|
||||
public static void PushCommand(String command, String value)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public static void PushCommand(ICommand command)
|
||||
{
|
||||
CommandStack.Push(command);
|
||||
command.Do();
|
||||
}
|
||||
|
||||
static void Undo()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
static void Redo()
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
namespace Commands
|
||||
{
|
||||
interface ICommand
|
||||
{
|
||||
abstract string GetName();
|
||||
public abstract void Do();
|
||||
public virtual bool Undo() { return false; }
|
||||
}
|
||||
|
||||
class SetEntityFieldProperty : ICommand
|
||||
{
|
||||
private object Instance;
|
||||
private object PropertyValue;
|
||||
private object PropertyOldValue;
|
||||
private PropertyInfo PropertyInfo;
|
||||
|
||||
public SetEntityFieldProperty(int id, string name, string value)
|
||||
{
|
||||
// Parse the input string into component name and field name
|
||||
string[] parts = name.Split('.');
|
||||
if (parts.Length != 2)
|
||||
{
|
||||
throw new ArgumentException("The input format should be 'ComponentName.FieldName'");
|
||||
}
|
||||
|
||||
string componentName = parts[0];
|
||||
string fieldName = parts[1];
|
||||
|
||||
// Load the Nuake.Net assembly
|
||||
Assembly nuakeAssembly = AppDomain.CurrentDomain.GetAssemblies()
|
||||
.FirstOrDefault(a => a.GetName().Name == "NuakeNet");
|
||||
|
||||
if (nuakeAssembly == null)
|
||||
{
|
||||
throw new InvalidOperationException("Nuake.Net assembly not found.");
|
||||
}
|
||||
|
||||
// Find the component class within the specified namespace that matches the component name
|
||||
var componentType = nuakeAssembly.GetTypes()
|
||||
.FirstOrDefault(t => t.Name.Equals(componentName, StringComparison.OrdinalIgnoreCase) && t.IsClass);
|
||||
|
||||
if (componentType == null)
|
||||
{
|
||||
Nuake.Net.Engine.Log($"Component '{componentName}' not found in the Nuake.Net assembly.");
|
||||
}
|
||||
|
||||
// Find the field within the component class
|
||||
PropertyInfo = componentType.GetProperty(fieldName, BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase);
|
||||
if (PropertyInfo == null)
|
||||
{
|
||||
Nuake.Net.Engine.Log(($"Field '{fieldName}' not found in component '{componentName}'."));
|
||||
}
|
||||
|
||||
// Assume we have an instance of the component (you would need to pass the correct instance here)
|
||||
Instance = Activator.CreateInstance(componentType, id); // Example: creating an instance for demonstration
|
||||
|
||||
// Convert the value to the correct type and set the property
|
||||
object convertedValue = Convert.ChangeType(value, PropertyInfo.PropertyType);
|
||||
|
||||
PropertyOldValue = PropertyInfo.GetValue(Instance);
|
||||
PropertyValue = convertedValue;
|
||||
|
||||
Nuake.Net.Engine.Log($"Set '{fieldName}' of '{componentName}' to '{value}' in Nuake.Net.");
|
||||
}
|
||||
|
||||
public virtual void Do()
|
||||
{
|
||||
Nuake.Net.Engine.Log($"'{PropertyValue}' in Nuake.Net.");
|
||||
PropertyInfo.SetValue(Instance, PropertyValue);
|
||||
|
||||
}
|
||||
|
||||
public string GetName()
|
||||
{
|
||||
return "SetFieldProperty";
|
||||
}
|
||||
|
||||
public virtual bool Undo()
|
||||
{
|
||||
PropertyInfo.SetValue(Instance, PropertyOldValue);
|
||||
|
||||
Nuake.Net.Engine.Log($"'{PropertyOldValue}' in Nuake.Net.");
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
class SetStaticFieldProperty : ICommand
|
||||
{
|
||||
private object PropertyValue;
|
||||
private object PropertyOldValue;
|
||||
private PropertyInfo PropertyInfo;
|
||||
|
||||
public SetStaticFieldProperty(string name, string value)
|
||||
{
|
||||
// Parse the input string into component name and field name
|
||||
string[] parts = name.Split('.');
|
||||
if (parts.Length != 2)
|
||||
{
|
||||
throw new ArgumentException("The input format should be 'ComponentName.FieldName'");
|
||||
}
|
||||
|
||||
string componentName = parts[0];
|
||||
string fieldName = parts[1];
|
||||
|
||||
// Load the Nuake.Net assembly
|
||||
Assembly nuakeAssembly = AppDomain.CurrentDomain.GetAssemblies()
|
||||
.FirstOrDefault(a => a.GetName().Name == "NuakeNet");
|
||||
|
||||
if (nuakeAssembly == null)
|
||||
{
|
||||
throw new InvalidOperationException("Nuake.Net assembly not found.");
|
||||
}
|
||||
|
||||
// Find the component class within the specified namespace that matches the component name
|
||||
var componentType = nuakeAssembly.GetTypes()
|
||||
.FirstOrDefault(t => t.Name.Equals(componentName, StringComparison.OrdinalIgnoreCase) && t.IsClass);
|
||||
|
||||
if (componentType == null)
|
||||
{
|
||||
Nuake.Net.Engine.Log($"Component '{componentName}' not found in the Nuake.Net assembly.");
|
||||
}
|
||||
|
||||
// Find the field within the component class
|
||||
PropertyInfo = componentType.GetProperty(fieldName, BindingFlags.Static | BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase);
|
||||
if (PropertyInfo == null)
|
||||
{
|
||||
Nuake.Net.Engine.Log(($"Static Field '{fieldName}' not found in component '{componentName}'."));
|
||||
}
|
||||
|
||||
// Convert the value to the correct type and set the property
|
||||
object convertedValue = Convert.ChangeType(value, PropertyInfo.PropertyType);
|
||||
|
||||
PropertyOldValue = PropertyInfo.GetValue(null);
|
||||
PropertyValue = convertedValue;
|
||||
|
||||
Nuake.Net.Engine.Log($"Set '{fieldName}' of '{componentName}' to '{value}' in Nuake.Net.");
|
||||
}
|
||||
|
||||
public virtual void Do()
|
||||
{
|
||||
PropertyInfo.SetValue(null, PropertyValue);
|
||||
|
||||
Nuake.Net.Engine.Log($"'{PropertyValue}' in Nuake.Net.");
|
||||
}
|
||||
|
||||
public string GetName()
|
||||
{
|
||||
return "SetFieldProperty";
|
||||
}
|
||||
|
||||
public virtual bool Undo()
|
||||
{
|
||||
PropertyInfo.SetValue(null, PropertyOldValue);
|
||||
|
||||
Nuake.Net.Engine.Log($"'{PropertyOldValue}' in Nuake.Net.");
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
class SelectEntity(int entityID) : ICommand
|
||||
{
|
||||
private readonly int EntityID = entityID;
|
||||
private readonly int PreviousEntityID = Editor.SelectedEntity;
|
||||
|
||||
public void Do()
|
||||
{
|
||||
Editor.SelectedEntity = EntityID;
|
||||
}
|
||||
|
||||
public bool Undo()
|
||||
{
|
||||
Editor.SelectedEntity = PreviousEntityID;
|
||||
return true;
|
||||
}
|
||||
|
||||
public string GetName()
|
||||
{
|
||||
return "SelectEntity";
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user