From 117835b5033f4f517e2fd5545b01a6a26cda05e0 Mon Sep 17 00:00:00 2001 From: hzhang Date: Sat, 29 Jun 2024 06:35:23 +0800 Subject: [PATCH] Split project --- Boards/BaseBoard.cs | 196 ++++++++++++++++++ Boards/IBaseBoard.cs | 6 - Cables/BaseCable.cs | 24 +++ Enigmos.csproj | 6 + Exceptions/ModuleExecutionTimeout.cs | 6 + Manual/CommunicatorPairTab.cs | 45 ++++ Manual/ErrorHandlerTab.cs | 27 +++ Manual/ModuleBoolValueParameterSetter.cs | 38 ++++ Manual/ModuleCharValueParameterSetter.cs | 42 ++++ Manual/ModuleKeyValueParameterSetter.cs | 46 ++++ Manual/ModuleManual.cs | 113 ++++++++++ Manual/ModuleParameterSetter.cs | 19 ++ Manual/ModuleParameterTab.cs | 73 +++++++ Manual/ModulePolymorphismTab.cs | 40 ++++ Manual/ModuleRealValueParameterSetter.cs | 94 +++++++++ Manual/PortFixer.cs | 48 +++++ Manual/PortMaintenanceTab.cs | 72 +++++++ Manual/PortTypeSelector.cs | 41 ++++ Manual/ProgrammableModuleSettingTab.cs | 32 +++ Modules/BaseModule.cs | 162 +++++++++++++++ .../BinaryComputationalModule.cs | 25 +++ .../ComputationalModule.cs | 31 +++ .../NullaryComputationalModule.cs | 8 + .../QuaternaryComputationalModule.cs | 29 +++ .../TernaryComputationalModule.cs | 26 +++ .../UnaryComputationalModule.cs | 20 ++ .../ActionModules/ActionModule.cs | 12 ++ .../ActionModules/AttackActionModule.cs | 34 +++ .../ActionModules/MoveActionModule.cs | 41 ++++ .../ControllingModules/ControllingModule.cs | 30 +++ Modules/ControllingModules/RootModule.cs | 34 +++ .../SinglePoleDoubleThrowSwitchModule.cs | 47 +++++ .../SinglePoleSingleThrowSwitchModule.cs | 35 ++++ .../Extensions/CommunicateModuleExtension.cs | 64 ++++++ Modules/IBaseModule.cs | 9 - .../ProgrammableModules/ProgrammableModule.cs | 34 +++ Modules/TerminalModules/TerminalModule.cs | 36 ++++ Ports/BasePort.cs | 107 ++++++++++ Ports/DataPorts/DataInPort.cs | 37 ++++ Ports/DataPorts/DataOutPort.cs | 46 ++++ Ports/DataPorts/DataPort.cs | 54 +++++ Ports/IBasePort.cs | 11 - Ports/SignalPorts/SignalInPort.cs | 29 +++ Ports/SignalPorts/SignalOutPort.cs | 31 +++ Ports/SignalPorts/SignalPort.cs | 38 ++++ 45 files changed, 1972 insertions(+), 26 deletions(-) create mode 100644 Boards/BaseBoard.cs delete mode 100644 Boards/IBaseBoard.cs create mode 100644 Cables/BaseCable.cs create mode 100644 Exceptions/ModuleExecutionTimeout.cs create mode 100644 Manual/CommunicatorPairTab.cs create mode 100644 Manual/ErrorHandlerTab.cs create mode 100644 Manual/ModuleBoolValueParameterSetter.cs create mode 100644 Manual/ModuleCharValueParameterSetter.cs create mode 100644 Manual/ModuleKeyValueParameterSetter.cs create mode 100644 Manual/ModuleManual.cs create mode 100644 Manual/ModuleParameterSetter.cs create mode 100644 Manual/ModuleParameterTab.cs create mode 100644 Manual/ModulePolymorphismTab.cs create mode 100644 Manual/ModuleRealValueParameterSetter.cs create mode 100644 Manual/PortFixer.cs create mode 100644 Manual/PortMaintenanceTab.cs create mode 100644 Manual/PortTypeSelector.cs create mode 100644 Manual/ProgrammableModuleSettingTab.cs create mode 100644 Modules/BaseModule.cs create mode 100644 Modules/ComputationalModules/BinaryComputationalModule.cs create mode 100644 Modules/ComputationalModules/ComputationalModule.cs create mode 100644 Modules/ComputationalModules/NullaryComputationalModule.cs create mode 100644 Modules/ComputationalModules/QuaternaryComputationalModule.cs create mode 100644 Modules/ComputationalModules/TernaryComputationalModule.cs create mode 100644 Modules/ComputationalModules/UnaryComputationalModule.cs create mode 100644 Modules/ControllingModules/ActionModules/ActionModule.cs create mode 100644 Modules/ControllingModules/ActionModules/AttackActionModule.cs create mode 100644 Modules/ControllingModules/ActionModules/MoveActionModule.cs create mode 100644 Modules/ControllingModules/ControllingModule.cs create mode 100644 Modules/ControllingModules/RootModule.cs create mode 100644 Modules/ControllingModules/SinglePoleDoubleThrowSwitchModule.cs create mode 100644 Modules/ControllingModules/SinglePoleSingleThrowSwitchModule.cs create mode 100644 Modules/Extensions/CommunicateModuleExtension.cs delete mode 100644 Modules/IBaseModule.cs create mode 100644 Modules/ProgrammableModules/ProgrammableModule.cs create mode 100644 Modules/TerminalModules/TerminalModule.cs create mode 100644 Ports/BasePort.cs create mode 100644 Ports/DataPorts/DataInPort.cs create mode 100644 Ports/DataPorts/DataOutPort.cs create mode 100644 Ports/DataPorts/DataPort.cs delete mode 100644 Ports/IBasePort.cs create mode 100644 Ports/SignalPorts/SignalInPort.cs create mode 100644 Ports/SignalPorts/SignalOutPort.cs create mode 100644 Ports/SignalPorts/SignalPort.cs diff --git a/Boards/BaseBoard.cs b/Boards/BaseBoard.cs new file mode 100644 index 0000000..efb4a37 --- /dev/null +++ b/Boards/BaseBoard.cs @@ -0,0 +1,196 @@ +using Enigmos.Cables; +using Enigmos.Modules; +using Enigmos.Modules.ControllingModules; +using Enigmos.Modules.ProgrammableModules; +using Enigmos.Modules.TerminalModules; +using Enigmos.Ports.DataPorts; +using Godot; +using Nocturnis.DataStructures; +using Nocturnis.Enigmos.Boards; +using Nocturnis.Enigmos.Cables; +using Nocturnis.Enigmos.Modules; +using Nocturnis.Enigmos.Ports; +using Nocturnis.Inventories.Items; +using Nocturnis.Inventories.Items.Items; +using Nocturnis.UIElements; +using Nocturnis.UIElements.Layers; +using TabulaSmaragdina; +using TabulaSmaragdina.Controls; + +namespace Enigmos.Boards; + +public abstract partial class BaseBoard : Panel, IBaseBoard +{ + public bool CableVisualMode { get; set; } + public bool LabelVisualMode { get; set; } + + + public HashSet FocusedCables { get; set; } = new(); + + public void SetCableVisualMode(bool mode) + { + CableVisualMode = mode; + foreach (BaseCable cable in GetChildren().OfType()) + cable.Modulate = Color.Color8(255, 255, 255, (Byte)(mode ? 20 : 255)); + } + + public void SetLabelVisualMode(bool mode) + { + LabelVisualMode = mode; + foreach (BaseModule module in GetChildren().OfType()) + if(module.HasLabel()) + module.Label!.Visible = !mode; + + } + + public void AddCable(IBaseCable cable) + { + AddChild(cable.AsNode); + cable.Modulate = Color.Color8(255, 255, 255, (Byte)(CableVisualMode ? 20 : 255)); + } + + public IModuleManualLayer? ModuleManualLayer { get; set; } + public bool ManualOpened { get; set; } + protected HashSet Modules { get; set; } = new(); + + protected IEnumerable ProgrammableModules() => + Modules + .OfType(); + + public IEnumerable TerminalModules() => + Modules + .OfType() + .Union(ProgrammableModules().SelectMany(module => module.UnderlyingBoard.TerminalModules())); + + protected HashSet Ports => Modules.SelectMany(module => module.Ports).ToHashSet(); + public IPanelViewer? PanelViewer { get; set; } + public Dictionary CablePairing { get; set; } = new(); + public IBasePort? ConnectPending { get; set; } + public IBoardControlLayer? CircuitBoardControlLayer { get; set; } + public IModuleMovingLayer? ModuleMovingLayer { get; set; } + + public virtual void Init() + { + CablePairing = new Dictionary(); + Modules = new HashSet(); + FocusedCables = new HashSet(); + ConnectPending = null; + } + + public override void _Ready() + { + base._Ready(); + ModuleManualLayer = GetNode("ModuleManualLayer"); + ModuleMovingLayer = GetNode("ModuleMovingLayer"); + ModuleMovingLayer.Board = this; + PanelViewer = GetNode("PanelViewer"); + CircuitBoardControlLayer = GetNode("CircuitBoardControlLayer"); + CircuitBoardControlLayer.Board = this; + + } + + protected virtual void AddModule(IBaseModule module, Vector2 pos) + { + module.Board = this; + AddChild(module.AsNode); + if (module is ICompositeModule compositeModule) + foreach (IBaseModule subModule in compositeModule.SubModules()) + subModule.Board = this; + + module.Position = pos; + Modules.Add(module); + } + + public virtual void Reset() + { + foreach (IBaseModule module in Modules) + { + if (module is RootModule rootModule) + rootModule.ActionFinished = false; + if (module is ICompositeModule compositeModule) + { + foreach (IBaseModule subModule in compositeModule.SubModules()) + { + foreach (DataOutPort port in subModule.Ports.OfType()) + { + port.DataUpdated = false; + } + } + } + + if (module is ProgrammableModule programmableModule) + { + programmableModule.UnderlyingBoard.Reset(); + foreach (DataOutPort outPort in programmableModule.ExplicitPorts().OfType()) + outPort.DataUpdated = false; + foreach (DataOutPort outPort in programmableModule.ImplicitPorts().OfType()) + outPort.DataUpdated = false; + } + if (module is ControllingModule controllingModule) + controllingModule.Visited = false; + if (module is TerminalModule terminalModule) + terminalModule.Finished = false; + + foreach (DataOutPort port in module.Ports.OfType()) + port.DataUpdated = false; + + } + } + + public override bool _CanDropData(Vector2 atPosition, Variant data) + { + IVariantWithType vData = data.As(); + if (vData.TypeHint != "Module") + { + if(vData.TypeHint != "Item") + return false; + IBaseItem item = vData.UnderlyingData.As(); + if (item is IBaseModuleItem moduleItem) + { + foreach (IBaseModule module in Modules) + if (GlobalProvider.UIProvider.Overlap(atPosition, moduleItem.ContentModule.Size, module.Position, module.Size)) + return false; + return true; + } + return false; + } + BaseModule? moduleData = vData.UnderlyingData.As(); + if (moduleData == null) + return false; + Vector2 pos = atPosition - moduleData.PivotOffset; + foreach (IBaseModule module in Modules) + { + if(module == moduleData) + continue; + if (GlobalProvider.UIProvider.Overlap(pos, moduleData.Size, module.Position, module.Size)) + return false; + } + return true; + + } + public override void _DropData(Vector2 atPosition, Variant data) + { + IVariantWithType vData = data.As(); + if(vData.TypeHint == "Module") + { + BaseModule vModule = vData.UnderlyingData.As(); + vModule.Position = atPosition - vModule.PivotOffset; + vModule.UpdateCables(); + } + else + { + IBaseModuleItem moduleItem = vData.UnderlyingData.As(); + AddModule(moduleItem.ContentModule, atPosition); + ItemDraggingControl.Instance.DraggingFrom!.Item = null; + } + } + + protected T GetModule(NodePath path) where T : BaseModule + { + T res = GetNode(path); + res.Init(); + Modules.Add(res); + res.Board = this; + return res; + } +} diff --git a/Boards/IBaseBoard.cs b/Boards/IBaseBoard.cs deleted file mode 100644 index 08ab2d9..0000000 --- a/Boards/IBaseBoard.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace Enigmos.Boards; - -public interface IBaseBoard -{ - -} \ No newline at end of file diff --git a/Cables/BaseCable.cs b/Cables/BaseCable.cs new file mode 100644 index 0000000..7e03939 --- /dev/null +++ b/Cables/BaseCable.cs @@ -0,0 +1,24 @@ +using Godot; +using Nocturnis.Enigmos.Cables; +using Nocturnis.Enigmos.Ports; + +namespace Enigmos.Cables; + +public abstract partial class BaseCable : Line2D, IBaseCable +{ + protected Line2D InFill { get; set; } + public IBasePort PortFrom { get; set; } + public IBasePort PortTo { get; set; } + + public void Init() + { + InFill = GetNode("InFill"); + } + + /// + /// Update points of line + /// + public abstract void LineUpdate(); + + public Node AsNode => this; +} \ No newline at end of file diff --git a/Enigmos.csproj b/Enigmos.csproj index 52f4be3..ff303e8 100644 --- a/Enigmos.csproj +++ b/Enigmos.csproj @@ -10,4 +10,10 @@ + + + + + + diff --git a/Exceptions/ModuleExecutionTimeout.cs b/Exceptions/ModuleExecutionTimeout.cs new file mode 100644 index 0000000..993b886 --- /dev/null +++ b/Exceptions/ModuleExecutionTimeout.cs @@ -0,0 +1,6 @@ +namespace Enigmos.Exceptions; + +public class ModuleExecutionTimeout : Exception +{ + public static readonly ModuleExecutionTimeout Exception = new ModuleExecutionTimeout(); +} \ No newline at end of file diff --git a/Manual/CommunicatorPairTab.cs b/Manual/CommunicatorPairTab.cs new file mode 100644 index 0000000..23afe8d --- /dev/null +++ b/Manual/CommunicatorPairTab.cs @@ -0,0 +1,45 @@ +using Enigmos.Modules.Extensions; +using Godot; +using Nocturnis.Communicators; +using Nocturnis.Enigmos.ModuleManuals; +using Nocturnis.Enigmos.Modules; + +namespace Enigmos.Manual; +public partial class CommunicatorPairTab : Panel, IModuleManualTab +{ + private bool InitFlag { get; set; } + public string FullName() => "Pair"; + + public void Init(ICommunicateModule module) + { + Module = module; + InitFlag = true; + } + + public ICommunicateModule Module { get; set; } + private OptionButton CommunicatorOptions { get; set; } + public override void _Ready() + { + if (!InitFlag) + throw new Exception("TODO - NEED INIT FIRST"); + CommunicatorOptions = GetNode("CommunicatorOptions"); + IBaseCommunicator[] options = Module.CompatibleCommunicators(); + for(int idx = 0; idx < options.Length; idx ++ ) + { + CommunicatorOptions.AddIconItem + ( + options[idx].IconTexture, + $"{options[idx].CustomName} " + (options[idx].Paired ? "(Already Paired)" : ""), + idx + ); + } + + Name = "Pair"; + base._Ready(); + } + + private void SelectHandler(int idx) + { + Module.Pair(Module.CompatibleCommunicators()[idx]); + } +} diff --git a/Manual/ErrorHandlerTab.cs b/Manual/ErrorHandlerTab.cs new file mode 100644 index 0000000..1485b3d --- /dev/null +++ b/Manual/ErrorHandlerTab.cs @@ -0,0 +1,27 @@ +using Godot; +using Nocturnis.Enigmos.ModuleManuals; +using Nocturnis.Enigmos.Modules; + +namespace Enigmos.Manual; + +public partial class ErrorHandlerTab : Panel, IModuleManualTab +{ + public string FullName() => "Error Handling"; + private bool InitFlag { get; set; } + private OptionButton Options { get; set; } + + public void Init(IErrorHandlerModule module) + { + Module = module; + Options = GetNode("Options"); + Options.Clear(); + for (int i = 0; i < module.HandlingOptions().Length; i++) + Options.AddItem(module.HandlingOptions()[i], i); + InitFlag = true; + + } + + private IErrorHandlerModule Module { get; set; } + + private void SelectHandle(int idx) => Module.SelectedOption = idx; +} \ No newline at end of file diff --git a/Manual/ModuleBoolValueParameterSetter.cs b/Manual/ModuleBoolValueParameterSetter.cs new file mode 100644 index 0000000..eb0c641 --- /dev/null +++ b/Manual/ModuleBoolValueParameterSetter.cs @@ -0,0 +1,38 @@ +using Godot; +using Nocturnis.DataStructures.ConfigurableParameters; + +namespace Enigmos.Manual; + +public partial class ModuleBoolValueParameterSetter : ModuleParameterSetter +{ + private CheckButton ToggleSetter { get; set; } + private Label TrueLabel { get; set; } + private Label FalseLabel { get; set; } + + public void Init(IBoolParameter parameter) + { + UnderlyingParameter = parameter; + InitFlag = true; + } + + public new IBoolParameter UnderlyingParameter + { + get => (base.UnderlyingParameter as IBoolParameter)!; + set => base.UnderlyingParameter = value; + } + + public override void _Ready() + { + if (!InitFlag) + throw new Exception("TODO - INIT NEED"); + ToggleSetter = GetNode("ToggleSetter"); + TrueLabel = GetNode