From 6216195368990d09160d29056632c2c6cbec3a13 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Ricardo=20Prado=20de=20Almeida?= Date: Mon, 23 Jan 2023 10:39:58 -0300 Subject: [PATCH] Binding all view controls to models --- Cpu.Form/Cpu.Forms.csproj | 4 ++++ Cpu.Form/CpuView.cs | 25 +++++++++++++++++-------- Cpu.Form/Utils/ControlExtensions.cs | 10 ++++++++++ Cpu.MVVM/RunningProgramModel.cs | 10 +++++++++- 4 files changed, 40 insertions(+), 9 deletions(-) diff --git a/Cpu.Form/Cpu.Forms.csproj b/Cpu.Form/Cpu.Forms.csproj index c5d1731..78b0e28 100644 --- a/Cpu.Form/Cpu.Forms.csproj +++ b/Cpu.Form/Cpu.Forms.csproj @@ -16,6 +16,10 @@ 6502 CPU Emulator View + + true + + diff --git a/Cpu.Form/CpuView.cs b/Cpu.Form/CpuView.cs index b525282..6c9be06 100644 --- a/Cpu.Form/CpuView.cs +++ b/Cpu.Form/CpuView.cs @@ -14,8 +14,6 @@ public partial class CpuView : Form private IMachine Machine { get; } - private string CurrentProgram { get; set; } - private MachineModel MachineView { get; } private RunningProgramModel ProgramView { get; } @@ -42,7 +40,7 @@ public CpuView( } #endregion - #region Updates + #region Bindings private void BindProgram() { this.programText.BindTo( @@ -52,6 +50,22 @@ private void BindProgram() this.executionContent.BindTo( this.ProgramView, nameof(RunningProgramModel.Execution)); + + this.clockButton.BindTo( + this.ProgramView, + nameof(RunningProgramModel.ProgramLoaded)); + + this.resetButton.BindTo( + this.ProgramView, + nameof(RunningProgramModel.ProgramLoaded)); + + this.instructionButton.BindTo( + this.ProgramView, + nameof(RunningProgramModel.ProgramLoaded)); + + this.saveStateToolStripMenuItem.BindTo( + this.ProgramView, + nameof(RunningProgramModel.ProgramLoaded)); } private void BindState() @@ -308,10 +322,5 @@ private void EnableProgramExecution(ReadOnlyMemory bytes, string programNa this.MachineView.LoadProgramCommand.Execute(bytes); this.ProgramView.LoadProgramCommand.Execute(bytes); - - this.clockButton.Enabled = true; - this.resetButton.Enabled = true; - this.instructionButton.Enabled = true; - this.saveStateToolStripMenuItem.Enabled = true; } } \ No newline at end of file diff --git a/Cpu.Form/Utils/ControlExtensions.cs b/Cpu.Form/Utils/ControlExtensions.cs index f3927d3..565e478 100644 --- a/Cpu.Form/Utils/ControlExtensions.cs +++ b/Cpu.Form/Utils/ControlExtensions.cs @@ -28,4 +28,14 @@ public static void BindTo(this Button control, object source, string sourcePropN { control.BindTo(nameof(Button.Enabled), source, sourcePropName); } + + public static void BindTo(this ToolStripMenuItem control, object source, string sourcePropName) + { + _ = control.DataBindings.Add( + nameof(Button.Enabled), + source, + sourcePropName, + false, + DataSourceUpdateMode.OnPropertyChanged); + } } diff --git a/Cpu.MVVM/RunningProgramModel.cs b/Cpu.MVVM/RunningProgramModel.cs index 5348e8d..5586c9a 100644 --- a/Cpu.MVVM/RunningProgramModel.cs +++ b/Cpu.MVVM/RunningProgramModel.cs @@ -34,6 +34,12 @@ public partial class RunningProgramModel : ObservableObject /// [ObservableProperty] private string _execution = string.Empty; + + /// + /// Checks if the program is loaded and ready to use + /// + [ObservableProperty] + private bool _programLoaded = false; #endregion /// @@ -61,7 +67,7 @@ protected void ClearExecution() [RelayCommand] protected void LoadProgram(ReadOnlyMemory program) { - var builder = new StringBuilder(program.Length * CharsPer8Bit); + var builder = new StringBuilder(1 + (program.Length * CharsPer8Bit)); var data = program.Span; foreach (var value in data[ICpuState.MemoryStateOffset..]) @@ -70,6 +76,7 @@ protected void LoadProgram(ReadOnlyMemory program) } this.Bytes = builder.ToString(); + this.ProgramLoaded = true; } /// @@ -79,6 +86,7 @@ protected void LoadProgram(ReadOnlyMemory program) protected void ClearProgram() { this.Bytes = string.Empty; + this.ProgramLoaded = false; } ///