From e36d8dcfbff55530f9b993271739a3609a261712 Mon Sep 17 00:00:00 2001 From: Benjamin Popp Date: Wed, 30 Jan 2019 21:22:02 -0600 Subject: [PATCH 1/9] add ascii runs for header decoding --- src/Gen3Hex.Core/Gen3Hex.Core.csproj | 1 + src/Gen3Hex.Core/Models/AutoSearchModel.cs | 29 ++++++++++-- src/Gen3Hex.Core/Models/PokemonModel.cs | 22 +++++++-- src/Gen3Hex.Core/Models/Runs/AsciiRun.cs | 22 +++++++++ src/Gen3Hex.Core/ViewModels/DataFormats.cs | 16 +++++++ src/Gen3Hex.Core/ViewModels/ViewPort.cs | 33 +++++++++++-- src/Gen3Hex.Tests/AsciiRunTests.cs | 46 +++++++++++++++++++ src/Gen3Hex.Tests/Gen3Hex.Tests.csproj | 1 + .../Implementations/FormatDrawer.cs | 14 ++++++ 9 files changed, 170 insertions(+), 14 deletions(-) create mode 100644 src/Gen3Hex.Core/Models/Runs/AsciiRun.cs create mode 100644 src/Gen3Hex.Tests/AsciiRunTests.cs diff --git a/src/Gen3Hex.Core/Gen3Hex.Core.csproj b/src/Gen3Hex.Core/Gen3Hex.Core.csproj index 2c65069b..b8a79925 100644 --- a/src/Gen3Hex.Core/Gen3Hex.Core.csproj +++ b/src/Gen3Hex.Core/Gen3Hex.Core.csproj @@ -47,6 +47,7 @@ + diff --git a/src/Gen3Hex.Core/Models/AutoSearchModel.cs b/src/Gen3Hex.Core/Models/AutoSearchModel.cs index 1eb2988a..2e2e8bae 100644 --- a/src/Gen3Hex.Core/Models/AutoSearchModel.cs +++ b/src/Gen3Hex.Core/Models/AutoSearchModel.cs @@ -11,19 +11,38 @@ namespace HavenSoft.Gen3Hex.Core.Models { FireRed = "BPRE", LeafGreen = "BPGE"; + private readonly string gameCode; + private readonly ModelDelta noChangeDelta = new NoDataChangeDeltaModel(); + + public override int EarliestAllowedAnchor => 0x200; + public AutoSearchModel(byte[] data, StoredMetadata metadata = null) : base(data, metadata) { if (metadata != null) return; - var noChangeDelta = new NoDataChangeDeltaModel(); - - ClearFormat(noChangeDelta, -1, 0x101); // starting before the beginning to clear the anchor at the very start - - var gameCode = string.Concat(Enumerable.Range(0xAC, 4).Select(i => ((char)data[i]).ToString())); + gameCode = string.Concat(Enumerable.Range(0xAC, 4).Select(i => ((char)data[i]).ToString())); // in vanilla emerald, this pointer isn't four-byte aligned // it's at the very front of the ROM, so if there's no metadata we can be pretty sure that the pointer is still there if (gameCode == Emerald && data[0x1C3] == 0x08) ObserveRunWritten(noChangeDelta, new PointerRun(0x1C0)); + var gamesToDecode = new[] { Ruby, Sapphire, Emerald, FireRed, LeafGreen }; + if (gamesToDecode.Contains(gameCode)) { + DecodeHeader(); + DecodeNameArrays(); + } + } + + private void DecodeHeader() { + ObserveAnchorWritten(noChangeDelta, "GameTitle", new AsciiRun(0xA0, 12)); + ObserveAnchorWritten(noChangeDelta, "GameCode", new AsciiRun(0xAC, 4)); + ObserveAnchorWritten(noChangeDelta, "MakerCode", new AsciiRun(0xB0, 2)); + + if (gameCode != Ruby && gameCode != Sapphire) { + ObserveAnchorWritten(noChangeDelta, "RomName", new AsciiRun(0x108, 0x20)); + } + } + + private void DecodeNameArrays() { // pokenames if (TrySearch(this, "[name\"\"11]", out var pokenames)) { ObserveAnchorWritten(noChangeDelta, "pokenames", pokenames); diff --git a/src/Gen3Hex.Core/Models/PokemonModel.cs b/src/Gen3Hex.Core/Models/PokemonModel.cs index 3b0355ae..0ea952f7 100644 --- a/src/Gen3Hex.Core/Models/PokemonModel.cs +++ b/src/Gen3Hex.Core/Models/PokemonModel.cs @@ -6,6 +6,7 @@ using System.Diagnostics; using System.Linq; using System.Text; using static HavenSoft.Gen3Hex.Core.Models.Runs.ArrayRun; +using static HavenSoft.Gen3Hex.Core.Models.Runs.AsciiRun; using static HavenSoft.Gen3Hex.Core.Models.Runs.BaseRun; using static HavenSoft.Gen3Hex.Core.Models.Runs.PCSRun; @@ -24,6 +25,8 @@ namespace HavenSoft.Gen3Hex.Core.Models { private readonly Dictionary> unmappedNameToSources = new Dictionary>(); private readonly Dictionary sourceToUnmappedName = new Dictionary(); + public virtual int EarliestAllowedAnchor => 0; + #region Constructor public PokemonModel(byte[] data, StoredMetadata metadata = null) : base(data) { @@ -57,6 +60,7 @@ namespace HavenSoft.Gen3Hex.Core.Models { var source = i; var destination = ReadPointer(i); if (destination >= RawData.Length) continue; + if (destination < EarliestAllowedAnchor) continue; if (!pointersForDestination.ContainsKey(destination)) pointersForDestination[destination] = new List(); pointersForDestination[destination].Add(source); destinationForSource.Add(source, destination); @@ -585,13 +589,17 @@ namespace HavenSoft.Gen3Hex.Core.Models { private static (string, string) SplitNameAndFormat(string text) { var name = text.Substring(1).Trim(); string format = string.Empty; + int split = -1; if (name.Contains(ArrayStart)) { - var split = name.IndexOf(ArrayStart); - format = name.Substring(split); - name = name.Substring(0, split); + split = name.IndexOf(ArrayStart); } else if (name.Contains(StringDelimeter)) { - var split = name.IndexOf(StringDelimeter); + split = name.IndexOf(StringDelimeter); + } else if (name.Contains(StreamDelimeter)) { + split = name.IndexOf(StreamDelimeter); + } + + if (split != -1) { format = name.Substring(split); name = name.Substring(0, split); } @@ -610,6 +618,12 @@ namespace HavenSoft.Gen3Hex.Core.Models { return new ErrorInfo($"Format was specified as a string, but a string would overlap the next anchor."); } run = new PCSRun(dataIndex, length); + } else if (format.StartsWith(StreamDelimeter + "asc" + StreamDelimeter)) { + if (int.TryParse(format.Substring(5), out var length)) { + run = new AsciiRun(dataIndex, length); + } else { + return new ErrorInfo($"Ascii runs must include a length."); + } } else if (TryParse(model, format, dataIndex, null, out var arrayRun)) { run = arrayRun; } else if (format != string.Empty) { diff --git a/src/Gen3Hex.Core/Models/Runs/AsciiRun.cs b/src/Gen3Hex.Core/Models/Runs/AsciiRun.cs new file mode 100644 index 00000000..fad81063 --- /dev/null +++ b/src/Gen3Hex.Core/Models/Runs/AsciiRun.cs @@ -0,0 +1,22 @@ +using HavenSoft.Gen3Hex.Core.ViewModels.DataFormats; +using System.Collections.Generic; + +namespace HavenSoft.Gen3Hex.Core.Models.Runs { + public class AsciiRun : BaseRun { + public const char StreamDelimeter = '`'; + + public override int Length { get; } + + public override string FormatString => "`asc`" + Length; + + public AsciiRun(int start, int length, IReadOnlyList pointerSources = null) : base(start, pointerSources) => Length = length; + + public override IDataFormat CreateDataFormat(IDataModel data, int index) { + return new Ascii(Start, index - Start, (char)data[index]); + } + + protected override IFormattedRun Clone(IReadOnlyList newPointerSources) { + return new AsciiRun(Start, Length, newPointerSources); + } + } +} diff --git a/src/Gen3Hex.Core/ViewModels/DataFormats.cs b/src/Gen3Hex.Core/ViewModels/DataFormats.cs index 757c48d3..a66aadeb 100644 --- a/src/Gen3Hex.Core/ViewModels/DataFormats.cs +++ b/src/Gen3Hex.Core/ViewModels/DataFormats.cs @@ -19,6 +19,7 @@ namespace HavenSoft.Gen3Hex.Core.ViewModels.DataFormats { void Visit(PCS pcs, byte data); void Visit(EscapedPCS pcs, byte data); void Visit(ErrorPCS pcs, byte data); + void Visit(Ascii ascii, byte data); } /// @@ -154,4 +155,19 @@ namespace HavenSoft.Gen3Hex.Core.ViewModels.DataFormats { public void Visit(IDataFormatVisitor visitor, byte data) => visitor.Visit(this, data); } + + public class Ascii : IDataFormat { + public int Source { get; } + public int Position { get; } + public char ThisCharacter { get; } + + public Ascii(int source, int position, char value) => (Source, Position, ThisCharacter) = (source, position, value); + + public bool Equals(IDataFormat other) { + if (!(other is Ascii ascii)) return false; + return ascii.Source == Source && ascii.Position == Position && ascii.ThisCharacter == ThisCharacter; + } + + public void Visit(IDataFormatVisitor visitor, byte data) => visitor.Visit(this, data); + } } diff --git a/src/Gen3Hex.Core/ViewModels/ViewPort.cs b/src/Gen3Hex.Core/ViewModels/ViewPort.cs index 994dc09b..61f3e7bf 100644 --- a/src/Gen3Hex.Core/ViewModels/ViewPort.cs +++ b/src/Gen3Hex.Core/ViewModels/ViewPort.cs @@ -14,6 +14,7 @@ using System.Linq; using System.Windows.Input; using static HavenSoft.Gen3Hex.Core.ICommandExtensions; using static HavenSoft.Gen3Hex.Core.Models.Runs.ArrayRun; +using static HavenSoft.Gen3Hex.Core.Models.Runs.AsciiRun; using static HavenSoft.Gen3Hex.Core.Models.Runs.BaseRun; using static HavenSoft.Gen3Hex.Core.Models.Runs.PCSRun; using static HavenSoft.Gen3Hex.Core.Models.Runs.PointerRun; @@ -674,6 +675,10 @@ namespace HavenSoft.Gen3Hex.Core.ViewModels { return AllHexCharacters.Contains(input); } + if (innerFormat is Ascii) { + return true; + } + if (input == PointerStart) { // pointer edits are 4 bytes long if(!TryCoerceSelectionToStartOfPointer(ref point, ref element)) PrepareForMultiSpaceEdit(point, 4); @@ -682,7 +687,7 @@ namespace HavenSoft.Gen3Hex.Core.ViewModels { } else if (underEdit.CurrentText.StartsWith(PointerStart.ToString())) { return char.IsLetterOrDigit(input) || input == PointerEnd; } else if (underEdit.CurrentText.StartsWith(AnchorStart.ToString())) { - return char.IsLetterOrDigit(input) || char.IsWhiteSpace(input) || input == ArrayStart || input == ArrayEnd || input == StringDelimeter; + return char.IsLetterOrDigit(input) || char.IsWhiteSpace(input) || input == ArrayStart || input == ArrayEnd || input == StringDelimeter || input == StreamDelimeter; } else if (underEdit.OriginalFormat is Anchor anchorFormat && anchorFormat.OriginalFormat is PCS) { if (input == StringDelimeter) return true; // if this is the start of a string (as noted by the anchor), crop off the leading " before trying to convert to a byte @@ -764,10 +769,13 @@ namespace HavenSoft.Gen3Hex.Core.ViewModels { return true; } - PCS stringFormat = null; - if (underEdit.OriginalFormat is Anchor anchorFormat) stringFormat = anchorFormat.OriginalFormat as PCS; - stringFormat = stringFormat ?? underEdit.OriginalFormat as PCS; - if (stringFormat != null) { + var originalFormat = underEdit.OriginalFormat; + if (originalFormat is Anchor) originalFormat = ((Anchor)originalFormat).OriginalFormat; + if (originalFormat is Ascii) { + CompleteAsciiEdit(point, underEdit.CurrentText); + return true; + } + if (originalFormat is PCS stringFormat) { var currentText = underEdit.CurrentText; if (currentText.StartsWith(StringDelimeter.ToString())) currentText = currentText.Substring(1); if (stringFormat.Position != 0 && underEdit.CurrentText == StringDelimeter.ToString()) { @@ -790,6 +798,17 @@ namespace HavenSoft.Gen3Hex.Core.ViewModels { return true; } + private void CompleteAsciiEdit(Point point, string currentText) { + var memoryLocation = scroll.ViewPointToDataIndex(point); + var editFormat = (UnderEdit)currentView[point.X, point.Y].Format; + var asciiFormat = (Ascii)editFormat.OriginalFormat; + var content = (byte)currentText[0]; + + history.CurrentChange.ChangeData(Model, memoryLocation, content); + currentView[point.X, point.Y] = new HexElement(content, new Ascii(asciiFormat.Source, asciiFormat.Position, currentText[0])); + SilentScroll(memoryLocation + 1); + } + private void CompleteArrayExtension(ArrayRun arrayRun) { var newRun = (ArrayRun)Model.RelocateForExpansion(history.CurrentChange, arrayRun, arrayRun.Length + arrayRun.ElementLength); if (newRun != arrayRun) { @@ -1079,6 +1098,8 @@ namespace HavenSoft.Gen3Hex.Core.ViewModels { public void Visit(EscapedPCS pcs, byte data) => Visit((None)null, data); public void Visit(ErrorPCS pcs, byte data) => Visit((None)null, data); + + public void Visit(Ascii ascii, byte data) => Result = ((char)data).ToString(); } /// @@ -1115,6 +1136,8 @@ namespace HavenSoft.Gen3Hex.Core.ViewModels { public void Visit(EscapedPCS pcs, byte data) => currentChange.ChangeData(buffer, index, 0xFF); public void Visit(ErrorPCS pcs, byte data) => currentChange.ChangeData(buffer, index, 0xFF); + + public void Visit(Ascii ascii, byte data) => currentChange.ChangeData(buffer, index, 0xFF); } } } diff --git a/src/Gen3Hex.Tests/AsciiRunTests.cs b/src/Gen3Hex.Tests/AsciiRunTests.cs new file mode 100644 index 00000000..ea54dab1 --- /dev/null +++ b/src/Gen3Hex.Tests/AsciiRunTests.cs @@ -0,0 +1,46 @@ +using HavenSoft.Gen3Hex.Core.Models; +using HavenSoft.Gen3Hex.Core.Models.Runs; +using HavenSoft.Gen3Hex.Core.ViewModels; +using HavenSoft.Gen3Hex.Core.ViewModels.DataFormats; +using Xunit; + +namespace HavenSoft.Gen3Hex.Tests { + public class AsciiRunTests { + [Fact] + public void CanCreateAsciiRun() { + var buffer = new byte[0x200]; + var model = new PokemonModel(buffer); + model[0x10] = (byte)'a'; + model[0x11] = (byte)'b'; + model[0x12] = (byte)'c'; + model[0x13] = (byte)'d'; + + var viewPort = new ViewPort(new LoadedFile("file.txt", buffer), model) { Width = 0x10, Height = 0x10 }; + viewPort.SelectionStart = new Point(0, 1); + viewPort.Edit("^data`asc`4 "); + + var format = (Ascii)viewPort[1, 1].Format; + Assert.Equal('b', format.ThisCharacter); + } + + [Fact] + public void CanEditAsciiRun() { + var buffer = new byte[0x200]; + var model = new PokemonModel(buffer); + model[0x10] = (byte)'a'; + model[0x11] = (byte)'b'; + model[0x12] = (byte)'c'; + model[0x13] = (byte)'d'; + + model.ObserveRunWritten(new ModelDelta(), new AsciiRun(0x10, 4)); + + var viewPort = new ViewPort(new LoadedFile("file.txt", buffer), model) { Width = 0x10, Height = 0x10 }; + viewPort.SelectionStart = new Point(1, 1); + viewPort.Edit("3"); + + var format = (Ascii)viewPort[1, 1].Format; + Assert.Equal('3', format.ThisCharacter); + Assert.Equal(new Point(2, 1), viewPort.SelectionStart); + } + } +} diff --git a/src/Gen3Hex.Tests/Gen3Hex.Tests.csproj b/src/Gen3Hex.Tests/Gen3Hex.Tests.csproj index 5dfb03e6..5654e3d7 100644 --- a/src/Gen3Hex.Tests/Gen3Hex.Tests.csproj +++ b/src/Gen3Hex.Tests/Gen3Hex.Tests.csproj @@ -60,6 +60,7 @@ + diff --git a/src/Gen3Hex.WPF/Implementations/FormatDrawer.cs b/src/Gen3Hex.WPF/Implementations/FormatDrawer.cs index 10636818..8c7f775e 100644 --- a/src/Gen3Hex.WPF/Implementations/FormatDrawer.cs +++ b/src/Gen3Hex.WPF/Implementations/FormatDrawer.cs @@ -131,6 +131,20 @@ namespace HavenSoft.Gen3Hex.WPF.Implementations { context.DrawText(text, CellTextOffset); } + public void Visit(Ascii ascii, byte data) { + var typeface = new Typeface("Consolas"); + var text = new FormattedText( + ascii.ThisCharacter.ToString(), + CultureInfo.CurrentCulture, + FlowDirection.LeftToRight, + typeface, + FontSize, + Solarized.Brushes.Violet, + 1.0); + + context.DrawText(text, CellTextOffset); + } + private void Underline(Brush brush, bool isStart, bool isEnd) { int startPoint = isStart ? 5 : 0; int endPoint = (int)HexContent.CellWidth - (isEnd ? 5 : 0); From ae7798115ca11911c3291ca8deabc8925d7b0db8 Mon Sep 17 00:00:00 2001 From: Benjamin Popp Date: Wed, 30 Jan 2019 21:44:10 -0600 Subject: [PATCH 2/9] changing external name to "Hex Maniac Advance" updating icons to match --- src/Gen3Hex.WPF/Gen3Hex.WPF.csproj | 10 ++++++---- src/Gen3Hex.WPF/Resources/AppIcon.ico | Bin 0 -> 766 bytes src/Gen3Hex.WPF/Resources/AppImage.png | Bin 0 -> 17435 bytes src/Gen3Hex.WPF/Resources/Snorlax.ico | Bin 78758 -> 0 bytes src/Gen3Hex.WPF/Resources/snorlax.png | Bin 118538 -> 0 bytes src/Gen3Hex.WPF/Windows/AboutWindow.xaml | 8 ++++---- src/Gen3Hex.WPF/Windows/MainWindow.xaml | 4 ++-- 7 files changed, 12 insertions(+), 10 deletions(-) create mode 100644 src/Gen3Hex.WPF/Resources/AppIcon.ico create mode 100644 src/Gen3Hex.WPF/Resources/AppImage.png delete mode 100644 src/Gen3Hex.WPF/Resources/Snorlax.ico delete mode 100644 src/Gen3Hex.WPF/Resources/snorlax.png diff --git a/src/Gen3Hex.WPF/Gen3Hex.WPF.csproj b/src/Gen3Hex.WPF/Gen3Hex.WPF.csproj index 630b17b3..ebc12298 100644 --- a/src/Gen3Hex.WPF/Gen3Hex.WPF.csproj +++ b/src/Gen3Hex.WPF/Gen3Hex.WPF.csproj @@ -7,7 +7,7 @@ {386DC8E2-BABC-475C-94B6-37B3986F5F4C} WinExe HavenSoft.Gen3Hex.WPF - Gen3Hex + HexManiacAdvance v4.7.2 512 {60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} @@ -32,7 +32,7 @@ TRACE - Resources\Snorlax.ico + Resources\AppIcon.ico @@ -101,8 +101,10 @@ - - + + + + \ No newline at end of file diff --git a/src/Gen3Hex.WPF/Resources/AppIcon.ico b/src/Gen3Hex.WPF/Resources/AppIcon.ico new file mode 100644 index 0000000000000000000000000000000000000000..152a4a784ff5d712777e1e09effa143b97006132 GIT binary patch literal 766 zcmaKpF=*RB6o!B6k=I=gYI9=iF@*bO;CGKuFxVhb8yWRe2C#W!< zqQsd&dy|eQL-vIdYm;GELKcK2t*Dv}8)tHXzcGOC={{LPf!Wc8PPx6_dpwh>Ef1azH18{^@}rqKaj*dvrKEV~)zaXbzst`aLd)d^tqZ z>eojHhBSYcO=)YEpPJU_jA!ZDjV>;(tZ9dF2E_3rH~Reb%G!3P%jvL_Irr*1u{JC@ z=wwf=l+qrTn`Lp|THqi^skCZwl(qmeXtgcU48C0dFf{Z^F0omjuVWcD(L@#)F=J1H4{t js+^eoQ?q)AvlqO_YlrI_-+?zjfcNYhzGhN+X7TeE4N{9M literal 0 HcmV?d00001 diff --git a/src/Gen3Hex.WPF/Resources/AppImage.png b/src/Gen3Hex.WPF/Resources/AppImage.png new file mode 100644 index 0000000000000000000000000000000000000000..9a77d2e5852f67788ef87de58f69205663d9acb3 GIT binary patch literal 17435 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 diff --git a/src/Gen3Hex.WPF/Resources/snorlax.png b/src/Gen3Hex.WPF/Resources/snorlax.png deleted file mode 100644 index 3492d6ff97c0c96258abd5b5a0499713c0c156ae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 118538 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 B2Gall diff --git a/src/Gen3Hex.WPF/Windows/AboutWindow.xaml b/src/Gen3Hex.WPF/Windows/AboutWindow.xaml index c141a130..c70a2d79 100644 --- a/src/Gen3Hex.WPF/Windows/AboutWindow.xaml +++ b/src/Gen3Hex.WPF/Windows/AboutWindow.xaml @@ -4,16 +4,16 @@ xmlns:solarized="clr-namespace:Solarized" Background="{DynamicResource Background}" WindowStyle="ToolWindow" - Title="About Gen3Hex" Height="300" Width="400"> + Title="About Hex Maniac Advance" Height="300" Width="400"> - Gen3Hex is a non-profit open-source fan-made tool. + Hex Maniac Advance is a non-profit open-source fan-made tool. Only use it with legally purchased software. Pokemon is the property of Nintendo and GameFreak. Please support the official release. - - + + This is a prerelease debug version: please do not distribute! diff --git a/src/Gen3Hex.WPF/Windows/MainWindow.xaml b/src/Gen3Hex.WPF/Windows/MainWindow.xaml index fa70c63b..0f52746f 100644 --- a/src/Gen3Hex.WPF/Windows/MainWindow.xaml +++ b/src/Gen3Hex.WPF/Windows/MainWindow.xaml @@ -6,9 +6,9 @@ xmlns:hsv="clr-namespace:HavenSoft.Gen3Hex.WPF.Resources" xmlns:sys="clr-namespace:System;assembly=mscorlib" xmlns:solarized="clr-namespace:Solarized" - Icon="..\Resources\Snorlax.ico" + Icon="..\Resources\AppIcon.ico" PreviewMouseDown="RunDeferredActions" - Title="Gen3Hex" Height="450" Width="870" AllowDrop="True" Background="{DynamicResource Background}"> + Title="Hex Maniac Advance" Height="450" Width="870" AllowDrop="True" Background="{DynamicResource Background}"> From 88fc89378ccb67102ccbdcc75016d011adcd920f Mon Sep 17 00:00:00 2001 From: Benjamin Popp Date: Thu, 31 Jan 2019 06:33:30 -0600 Subject: [PATCH 3/9] performance fix: pointers should only draw via the clipping method if the pointer's position is GREATER than the X position, meaning that part of the pointer is clipped --- src/Gen3Hex.WPF/Implementations/FormatDrawer.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Gen3Hex.WPF/Implementations/FormatDrawer.cs b/src/Gen3Hex.WPF/Implementations/FormatDrawer.cs index 8c7f775e..a9de0b23 100644 --- a/src/Gen3Hex.WPF/Implementations/FormatDrawer.cs +++ b/src/Gen3Hex.WPF/Implementations/FormatDrawer.cs @@ -77,7 +77,7 @@ namespace HavenSoft.Gen3Hex.WPF.Implementations { brush, 1.0); - if (dataFormat.Position < Position.X || Position.X - dataFormat.Position > modelWidth - 4) { + if (dataFormat.Position > Position.X || Position.X - dataFormat.Position > modelWidth - 4) { context.PushClip(rectangleGeometry); context.DrawText(text, new Point(CellTextOffset.X + xOffset, CellTextOffset.Y)); context.Pop(); From 75a65ce5026077a37816b5bd9cef2600278ad88b Mon Sep 17 00:00:00 2001 From: Benjamin Popp Date: Thu, 31 Jan 2019 06:33:53 -0600 Subject: [PATCH 4/9] something is only a pointer if it points to useful data, no 0xFF --- src/Gen3Hex.Core/Models/PokemonModel.cs | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/Gen3Hex.Core/Models/PokemonModel.cs b/src/Gen3Hex.Core/Models/PokemonModel.cs index 0ea952f7..ac1092e5 100644 --- a/src/Gen3Hex.Core/Models/PokemonModel.cs +++ b/src/Gen3Hex.Core/Models/PokemonModel.cs @@ -53,14 +53,34 @@ namespace HavenSoft.Gen3Hex.Core.Models { } } + /// + /// Finds pointers based on Heuristics. + /// This is definitely wrong, but it's pretty good. + /// private void SearchForPointers(Dictionary> pointersForDestination, SortedList destinationForSource) { + // pointers must be 4-byte aligned for (int i = 0; i < RawData.Length - 3; i += 4) { + + // pointers must end in 08 or 09 if (RawData[i + 3] != 0x08 && RawData[i + 3] != 0x09) continue; + + // pointers must point to locations that are 4-byte aligned if (RawData[i] % 4 != 0) continue; var source = i; var destination = ReadPointer(i); + + // pointers must point into the data if (destination >= RawData.Length) continue; + + // pointers must not point at the header if (destination < EarliestAllowedAnchor) continue; + + // pointers must point at something useful, not just a bunch of FF + bool pointsToManyFF = true; + for (int j = 0; j < 4 && pointsToManyFF && destination + j < RawData.Length; j++) pointsToManyFF = RawData[destination + j] == 0xFF; + if (pointsToManyFF) continue; + + // we found a pointer! if (!pointersForDestination.ContainsKey(destination)) pointersForDestination[destination] = new List(); pointersForDestination[destination].Add(source); destinationForSource.Add(source, destination); From bc62a3bb7e50fe0ce1b2ee6ddcf3e525bf20646e Mon Sep 17 00:00:00 2001 From: Benjamin Popp Date: Thu, 31 Jan 2019 20:15:09 -0600 Subject: [PATCH 5/9] add a "clear format" right-click option when adding an anchor, search for pointers to that spot --- src/Gen3Hex.Core/Models/PokemonModel.cs | 31 ++++++++++++++++++++++++- src/Gen3Hex.Core/ViewModels/ViewPort.cs | 6 +++++ src/Gen3Hex.Tests/PointerModelTests.cs | 29 +++++++++++++++++++++++ src/Gen3Hex.WPF/Controls/HexContent.cs | 10 ++++++++ 4 files changed, 75 insertions(+), 1 deletion(-) diff --git a/src/Gen3Hex.Core/Models/PokemonModel.cs b/src/Gen3Hex.Core/Models/PokemonModel.cs index ac1092e5..dde10ccd 100644 --- a/src/Gen3Hex.Core/Models/PokemonModel.cs +++ b/src/Gen3Hex.Core/Models/PokemonModel.cs @@ -700,7 +700,12 @@ namespace HavenSoft.Gen3Hex.Core.Models { /// private IReadOnlyList GetSourcesPointingToNewAnchor(ModelDelta changeToken, string anchorName) { if (!addressForAnchor.TryGetValue(anchorName, out int location)) return new List(); // new anchor is unnamed, so nothing points to it yet - if (!unmappedNameToSources.TryGetValue(anchorName, out var sources)) return new List(); // no pointer was waiting for this anchor to be created + + if (!unmappedNameToSources.TryGetValue(anchorName, out var sources)) { + // no pointer was waiting for this anchor to be created + // but the user things there's something pointing here + return SearchForPointersToAnchor(changeToken, location); + } foreach (var source in sources) { var index = BinarySearch(source); @@ -715,6 +720,27 @@ namespace HavenSoft.Gen3Hex.Core.Models { return sources; } + private IReadOnlyList SearchForPointersToAnchor(ModelDelta changeToken, int address) { + var results = new List(); + + for (int i = 3; i < RawData.Length; i++) { + if (RawData[i] != 0x08 && RawData[i] != 0x09) continue; + int destination = ReadPointer(i - 3); + if (destination != address) continue; + var index = BinarySearch(i-3); + if (index > 0) continue; + index = ~index; + if (runs[index].Start <= i) continue; + if (index > 0 && runs[index - 1].Start + runs[index - 1].Length > i - 3) continue; + var newRun = new PointerRun(i - 3); + runs.Insert(index, newRun); + changeToken.AddRun(newRun); + results.Add(i - 3); + } + + return results; + } + private IFormattedRun MoveRun(ModelDelta changeToken, IFormattedRun run, int newStart) { // repoint foreach (var source in run.PointerSources) { @@ -774,6 +800,9 @@ namespace HavenSoft.Gen3Hex.Core.Models { return true; } + // if an existing run starts exactly at start, return that index + // otherwise, return a number such that ~index would be inserted into the list at the correct index + // so ~index - 1 is the previous run, and ~index is the next run private int BinarySearch(int start) { var index = runs.BinarySearch(new CompareFormattedRun(start), FormattedRunComparer.Instance); return index; diff --git a/src/Gen3Hex.Core/ViewModels/ViewPort.cs b/src/Gen3Hex.Core/ViewModels/ViewPort.cs index 61f3e7bf..f640c9ae 100644 --- a/src/Gen3Hex.Core/ViewModels/ViewPort.cs +++ b/src/Gen3Hex.Core/ViewModels/ViewPort.cs @@ -328,6 +328,12 @@ namespace HavenSoft.Gen3Hex.Core.ViewModels { public bool IsSelected(Point point) => selection.IsSelected(point); + public void ClearFormat(Point point) { + var dataIndex = scroll.ViewPointToDataIndex(point); + Model.ClearFormat(history.CurrentChange, dataIndex, 1); + RefreshBackingData(); + } + public void Edit(string input) { exitEditEarly = false; using (Tools.DeferUpdates) { diff --git a/src/Gen3Hex.Tests/PointerModelTests.cs b/src/Gen3Hex.Tests/PointerModelTests.cs index c4520076..084d5928 100644 --- a/src/Gen3Hex.Tests/PointerModelTests.cs +++ b/src/Gen3Hex.Tests/PointerModelTests.cs @@ -695,5 +695,34 @@ namespace HavenSoft.Gen3Hex.Tests { } } } + + [Fact] + public void AddingAnchorShouldSearchForPointersToThatLocation() { + var data = new byte[0x200]; + var model = new PokemonModel(data); + var change = new ModelDelta(); + model.WritePointer(change, 0x23, 0x050); // a pointer that isn't 4-byte aligned, pointing to data that is + model.WritePointer(change, 0x10, 0x087); // a pointer that is 4-byte aligned, but pointing to something that isn't + model.WritePointer(change, 2, 0xA2); // a pointer that isn't 4-byte aligned, pointing to something not 4-byte aligned + var viewPort = new ViewPort(new LoadedFile("test.txt", data), model) { Width = 0x10, Height = 0x10 }; + + // got to 50 and write an anchor + viewPort.SelectionStart = new Point(0x0, 0x5); + viewPort.Edit("^test1 "); + Assert.IsType(viewPort[0x3, 0x2].Format); + Assert.Single(((Anchor)viewPort[0x0, 0x5].Format).Sources); + + // go to 87 and write an anchor + viewPort.SelectionStart = new Point(0x7, 0x8); + viewPort.Edit("^test2 "); + Assert.IsType(viewPort[0x0, 0x1].Format); + Assert.Single(((Anchor)viewPort[0x7, 0x8].Format).Sources); + + // go to A2 and write an anchor + viewPort.SelectionStart = new Point(0x2, 0xA); + viewPort.Edit("^test3 "); + Assert.IsType(viewPort[0x2, 0x0].Format); + Assert.Single(((Anchor)viewPort[0x2, 0xA].Format).Sources); + } } } diff --git a/src/Gen3Hex.WPF/Controls/HexContent.cs b/src/Gen3Hex.WPF/Controls/HexContent.cs index 3a3ece4e..dbf74fe9 100644 --- a/src/Gen3Hex.WPF/Controls/HexContent.cs +++ b/src/Gen3Hex.WPF/Controls/HexContent.cs @@ -202,6 +202,7 @@ namespace HavenSoft.Gen3Hex.WPF.Controls { } if (format is PCS pcs) children.AddRange(GetStringChildren(p)); if (format is Pointer pointer) children.AddRange(GetPointerChildren(p)); + if (!(format is None || format is Undefined)) children.AddRange(GetClearFormattingChildren(p)); } else { children.AddRange(GetSearchChildren(p)); } @@ -354,6 +355,15 @@ namespace HavenSoft.Gen3Hex.WPF.Controls { yield return CreateFollowLinkButton("Open in main tab", p); } + private IEnumerable GetClearFormattingChildren(ModelPoint p) { + yield return new Button { + Content = new TextBlock { Text = "Clear Format" }, + }.SetEvent(ButtonBase.ClickEvent, (sender, e) => { + ((ViewPort)ViewPort).ClearFormat(p); + recentMenu.IsOpen = false; + }); + } + private Button CreateFollowLinkButton(string message, ModelPoint p) { return new Button { Content = new StackPanel { From 1bce1c8887b3cf92b61eafa5958a3bd4c8785736 Mon Sep 17 00:00:00 2001 From: Benjamin Popp Date: Thu, 31 Jan 2019 20:27:56 -0600 Subject: [PATCH 6/9] don't hang when goto asks to go outside the size of the data --- src/Gen3Hex.Core/ViewModels/Selection.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/Gen3Hex.Core/ViewModels/Selection.cs b/src/Gen3Hex.Core/ViewModels/Selection.cs index 7cec1042..87b7bf61 100644 --- a/src/Gen3Hex.Core/ViewModels/Selection.cs +++ b/src/Gen3Hex.Core/ViewModels/Selection.cs @@ -97,7 +97,11 @@ namespace HavenSoft.Gen3Hex.Core.ViewModels { if (anchor != Pointer.NULL) { GotoAddress(anchor); } else if (int.TryParse(address, NumberStyles.HexNumber, CultureInfo.CurrentCulture, out int result)) { - GotoAddress(result); + if (result > Scroll.DataLength || result < 0) { + OnError?.Invoke(this, $"Address {result:X2} is not within the size of the data."); + } else { + GotoAddress(result); + } } else { OnError?.Invoke(this, $"Unable to goto address '{address}'"); } From 44aca3cbd55aaa983bdd2d1eca8d039664497674 Mon Sep 17 00:00:00 2001 From: Benjamin Popp Date: Fri, 1 Feb 2019 23:33:54 -0600 Subject: [PATCH 7/9] - error when there are too many search results to display - add basic help information on the start screen so it doesn't look so empty --- .../ViewModels/EditorViewModel.cs | 5 + src/Gen3Hex.WPF/Controls/StartScreen.xaml | 51 +++ src/Gen3Hex.WPF/Controls/StartScreen.xaml.cs | 13 + src/Gen3Hex.WPF/Gen3Hex.WPF.csproj | 7 + src/Gen3Hex.WPF/Resources/Icons.xaml | 65 +++- src/Gen3Hex.WPF/Resources/MarkupExtensions.cs | 23 +- src/Gen3Hex.WPF/Windows/MainWindow.xaml | 290 +++++++++--------- 7 files changed, 309 insertions(+), 145 deletions(-) create mode 100644 src/Gen3Hex.WPF/Controls/StartScreen.xaml create mode 100644 src/Gen3Hex.WPF/Controls/StartScreen.xaml.cs diff --git a/src/Gen3Hex.Core/ViewModels/EditorViewModel.cs b/src/Gen3Hex.Core/ViewModels/EditorViewModel.cs index 75a4fab4..4dc36557 100644 --- a/src/Gen3Hex.Core/ViewModels/EditorViewModel.cs +++ b/src/Gen3Hex.Core/ViewModels/EditorViewModel.cs @@ -374,6 +374,11 @@ namespace HavenSoft.Gen3Hex.Core.ViewModels { return; } + if (results.Count > 200) { + ErrorMessage = $"Found {results.Count} results: please refine your search."; + return; + } + var newTab = new SearchResultsViewPort(search); foreach (var (tab, offset) in results) { newTab.Add(tab.CreateChildView(offset)); diff --git a/src/Gen3Hex.WPF/Controls/StartScreen.xaml b/src/Gen3Hex.WPF/Controls/StartScreen.xaml new file mode 100644 index 00000000..0b4540f2 --- /dev/null +++ b/src/Gen3Hex.WPF/Controls/StartScreen.xaml @@ -0,0 +1,51 @@ + + + + + + + Drag-n-Drop to open a file. + + + + + + + + + + <pointer> + ^Anchor + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Gen3Hex.WPF/Controls/StartScreen.xaml.cs b/src/Gen3Hex.WPF/Controls/StartScreen.xaml.cs new file mode 100644 index 00000000..6151a55e --- /dev/null +++ b/src/Gen3Hex.WPF/Controls/StartScreen.xaml.cs @@ -0,0 +1,13 @@ +using System.Diagnostics; +using System.Windows.Input; + +namespace HavenSoft.Gen3Hex.WPF.Controls { + public partial class StartScreen { + public StartScreen() => InitializeComponent(); + + private void PointerHelp(object sender, MouseButtonEventArgs e) { + Process.Start(new ProcessStartInfo("https://github.com/haven1433/gen3hex/wiki/Pointers-and-Anchors")); + e.Handled = true; + } + } +} diff --git a/src/Gen3Hex.WPF/Gen3Hex.WPF.csproj b/src/Gen3Hex.WPF/Gen3Hex.WPF.csproj index ebc12298..8179b61c 100644 --- a/src/Gen3Hex.WPF/Gen3Hex.WPF.csproj +++ b/src/Gen3Hex.WPF/Gen3Hex.WPF.csproj @@ -54,6 +54,10 @@ MSBuild:Compile Designer + + Designer + MSBuild:Compile + Designer MSBuild:Compile @@ -68,6 +72,9 @@ + + StartScreen.xaml + AboutWindow.xaml diff --git a/src/Gen3Hex.WPF/Resources/Icons.xaml b/src/Gen3Hex.WPF/Resources/Icons.xaml index 4609077b..eb005114 100644 --- a/src/Gen3Hex.WPF/Resources/Icons.xaml +++ b/src/Gen3Hex.WPF/Resources/Icons.xaml @@ -11,7 +11,7 @@ xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:hsv="clr-namespace:HavenSoft.Gen3Hex.WPF.Resources" mc:Ignorable="d" - d:DesignHeight="300" d:DesignWidth="300"> + d:DesignHeight="360" d:DesignWidth="360"> @@ -163,5 +163,68 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Gen3Hex.WPF/Resources/MarkupExtensions.cs b/src/Gen3Hex.WPF/Resources/MarkupExtensions.cs index c8761fef..68561a32 100644 --- a/src/Gen3Hex.WPF/Resources/MarkupExtensions.cs +++ b/src/Gen3Hex.WPF/Resources/MarkupExtensions.cs @@ -1,4 +1,5 @@ using System; +using System.Globalization; using System.Windows; using System.Windows.Markup; using System.Windows.Media; @@ -8,9 +9,9 @@ namespace HavenSoft.Gen3Hex.WPF.Resources { /// {hs:RotateTransform 60, 0, 0} /// public class RotateTransformExtension : MarkupExtension { - readonly double Angle; - readonly double CenterX; - readonly double CenterY; + public double Angle { get; } + public double CenterX { get; } + public double CenterY { get; } public RotateTransformExtension(double angle, double centerX, double centerY) { Angle = angle; @@ -27,7 +28,7 @@ namespace HavenSoft.Gen3Hex.WPF.Resources { /// {hs:Geometry 'M0,0 L0,1 1,1 1,0 Z'} /// public class GeometryExtension : MarkupExtension { - readonly string Figures; + public string Figures { get; } public GeometryExtension(string figures) { Figures = figures; } @@ -36,6 +37,18 @@ namespace HavenSoft.Gen3Hex.WPF.Resources { } } + public class TextGeometryExtension : MarkupExtension { + public string Text { get; set; } + public Point Location { get; set; } + public int Size { get; set; } + public TextGeometryExtension() { } + public TextGeometryExtension(string text, int x, int y, int size) => (Text, Location, Size) = (text, new Point(x, y), size); + public override object ProvideValue(IServiceProvider serviceProvider) { + var formattedText = new FormattedText(Text, CultureInfo.CurrentCulture, FlowDirection.LeftToRight, new Typeface("Calibri"), Size, Brushes.Black, 1); + return formattedText.BuildGeometry(Location); + } + } + /// /// Icons are taken from Icons.xaml /// Requires that there is an Icons instance stored at "Icons" in the app resources. @@ -45,7 +58,7 @@ namespace HavenSoft.Gen3Hex.WPF.Resources { /// {hs:Icons Save} /// public class IconExtension : MarkupExtension { - readonly string Name; + public string Name { get; } public IconExtension(string name) { Name = name; } diff --git a/src/Gen3Hex.WPF/Windows/MainWindow.xaml b/src/Gen3Hex.WPF/Windows/MainWindow.xaml index 0f52746f..241a3cd7 100644 --- a/src/Gen3Hex.WPF/Windows/MainWindow.xaml +++ b/src/Gen3Hex.WPF/Windows/MainWindow.xaml @@ -219,147 +219,159 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 33a784ba00f9f66c771407174c7c4268d59a2483 Mon Sep 17 00:00:00 2001 From: Benjamin Popp Date: Fri, 1 Feb 2019 23:39:06 -0600 Subject: [PATCH 8/9] fixing edge cases --- src/Gen3Hex.Core/Models/PokemonModel.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Gen3Hex.Core/Models/PokemonModel.cs b/src/Gen3Hex.Core/Models/PokemonModel.cs index dde10ccd..55fb919c 100644 --- a/src/Gen3Hex.Core/Models/PokemonModel.cs +++ b/src/Gen3Hex.Core/Models/PokemonModel.cs @@ -728,9 +728,9 @@ namespace HavenSoft.Gen3Hex.Core.Models { int destination = ReadPointer(i - 3); if (destination != address) continue; var index = BinarySearch(i-3); - if (index > 0) continue; + if (index >= 0) continue; index = ~index; - if (runs[index].Start <= i) continue; + if (index < runs.Count && runs[index].Start <= i) continue; if (index > 0 && runs[index - 1].Start + runs[index - 1].Length > i - 3) continue; var newRun = new PointerRun(i - 3); runs.Insert(index, newRun); From 0c8633da523c7226575a98153cb1fb55caee98b0 Mon Sep 17 00:00:00 2001 From: Benjamin Popp Date: Tue, 5 Feb 2019 20:58:49 -0600 Subject: [PATCH 9/9] rename folders / files / projects from Gen3Hex to HexManiac --- Gen3Hex.sln => HexManiacAdvance.sln | 6 ++-- src/Gen3Hex.Core/AssemblyInfo.cs | 3 -- src/HexManiac.Core/AssemblyInfo.cs | 3 ++ .../HexManiac.Core.csproj} | 4 +-- .../ICommandExtensions.cs | 2 +- .../Models/AutoSearchModel.cs | 12 ++++++-- .../Models/Enums.cs | 2 +- .../Models/ErrorInfo.cs | 2 +- .../Models/IDataModel.cs | 6 ++-- .../Models/IFileSystem.cs | 2 +- .../Models/LoadedFile.cs | 2 +- .../Models/ModelDelta.cs | 4 +-- .../Models/PCSString.cs | 2 +- .../Models/Point.cs | 2 +- .../Models/PokemonModel.cs | 28 ++++++++++-------- .../Models/Runs/ArrayRun.cs | 4 +-- .../Models/Runs/AsciiRun.cs | 4 +-- .../Models/Runs/IFormattedRun.cs | 4 +-- .../Models/Runs/PCSRun.cs | 4 +-- .../Models/Runs/PointerRun.cs | 4 +-- .../Models/SearchByte.cs | 2 +- .../Models/StoredMetadata.cs | 2 +- .../NumericExtensions.cs | 2 +- .../ViewModels/ChangeHistory.cs | 2 +- .../ViewModels/ChildViewPort.cs | 4 +-- .../ViewModels/DataFormats.cs | 2 +- .../ViewModels/EditorViewModel.cs | 10 +++---- .../ViewModels/GotoControlViewModel.cs | 4 +-- .../ViewModels/HexElement.cs | 4 +-- .../ViewModels/IChildViewPort.cs | 2 +- .../ViewModels/ITabContent.cs | 2 +- .../ViewModels/IViewPort.cs | 6 ++-- .../ViewModels/ScrollRegion.cs | 4 +-- .../ViewModels/SearchResultsViewPort.cs | 6 ++-- .../ViewModels/Selection.cs | 8 ++--- .../ViewModels/Tools/IToolTrayViewModel.cs | 4 +-- .../ViewModels/Tools/IToolViewModel.cs | 2 +- .../ViewModels/Tools/PCSTool.cs | 8 ++--- .../ViewModels/ViewModelCore.cs | 2 +- .../ViewModels/ViewPort.cs | 22 +++++++------- .../packages.config | 0 .../ArrayRunTests.cs | 12 ++++---- .../AsciiRunTests.cs | 10 +++---- .../ChangeHistoryTests.cs | 10 +++---- .../FindTests.cs | 6 ++-- .../GeneralAppTests.cs | 8 ++--- .../HexManiac.Tests.csproj} | 12 ++++---- .../NavigationTests.cs | 8 ++--- .../PointerModelTests.cs | 12 ++++---- .../StringModelTests.cs | 12 ++++---- .../ToolTests.cs | 14 ++++----- .../ViewPortCursorTests.cs | 6 ++-- .../ViewPortEditTests.cs | 10 +++---- .../ViewPortSaveTests.cs | 10 +++---- .../ViewPortScrollTests.cs | 6 ++-- .../packages.config | 0 .../Controls/HexContent.cs | 14 ++++----- .../IntegerToBooleanViaMatchConverter.cs | 2 +- .../Controls/IntegerToHexConverter.cs | 2 +- .../Controls/StartScreen.xaml | 4 +-- .../Controls/StartScreen.xaml.cs | 4 +-- .../HexManiac.WPF.csproj} | 6 ++-- .../Implementations/FormatDrawer.cs | 8 ++--- .../Implementations/WindowsFileSystem.cs | 4 +-- .../Resources/AppIcon.ico | Bin .../Resources/AppImage.png | Bin .../Resources/Icons.xaml | 4 +-- .../Resources/Icons.xaml.cs | 2 +- .../Resources/MarkupExtensions.cs | 2 +- .../Resources/Solarized.cs | 0 .../Windows/AboutWindow.xaml | 4 +-- .../Windows/AboutWindow.xaml.cs | 2 +- .../Windows/App.config | 0 .../Windows/App.xaml | 4 +-- .../Windows/App.xaml.cs | 10 +++---- .../Windows/MainWindow.xaml | 8 ++--- .../Windows/MainWindow.xaml.cs | 16 +++++----- src/{Gen3Hex.WPF => HexManiac.WPF}/app.config | 0 78 files changed, 220 insertions(+), 210 deletions(-) rename Gen3Hex.sln => HexManiacAdvance.sln (77%) delete mode 100644 src/Gen3Hex.Core/AssemblyInfo.cs create mode 100644 src/HexManiac.Core/AssemblyInfo.cs rename src/{Gen3Hex.Core/Gen3Hex.Core.csproj => HexManiac.Core/HexManiac.Core.csproj} (97%) rename src/{Gen3Hex.Core => HexManiac.Core}/ICommandExtensions.cs (92%) rename src/{Gen3Hex.Core => HexManiac.Core}/Models/AutoSearchModel.cs (83%) rename src/{Gen3Hex.Core => HexManiac.Core}/Models/Enums.cs (53%) rename src/{Gen3Hex.Core => HexManiac.Core}/Models/ErrorInfo.cs (93%) rename src/{Gen3Hex.Core => HexManiac.Core}/Models/IDataModel.cs (98%) rename src/{Gen3Hex.Core => HexManiac.Core}/Models/IFileSystem.cs (98%) rename src/{Gen3Hex.Core => HexManiac.Core}/Models/LoadedFile.cs (82%) rename src/{Gen3Hex.Core => HexManiac.Core}/Models/ModelDelta.cs (98%) rename src/{Gen3Hex.Core => HexManiac.Core}/Models/PCSString.cs (99%) rename src/{Gen3Hex.Core => HexManiac.Core}/Models/Point.cs (91%) rename src/{Gen3Hex.Core => HexManiac.Core}/Models/PokemonModel.cs (97%) rename src/{Gen3Hex.Core => HexManiac.Core}/Models/Runs/ArrayRun.cs (99%) rename src/{Gen3Hex.Core => HexManiac.Core}/Models/Runs/AsciiRun.cs (86%) rename src/{Gen3Hex.Core => HexManiac.Core}/Models/Runs/IFormattedRun.cs (96%) rename src/{Gen3Hex.Core => HexManiac.Core}/Models/Runs/PCSRun.cs (94%) rename src/{Gen3Hex.Core => HexManiac.Core}/Models/Runs/PointerRun.cs (88%) rename src/{Gen3Hex.Core => HexManiac.Core}/Models/SearchByte.cs (96%) rename src/{Gen3Hex.Core => HexManiac.Core}/Models/StoredMetadata.cs (98%) rename src/{Gen3Hex.Core => HexManiac.Core}/NumericExtensions.cs (92%) rename src/{Gen3Hex.Core => HexManiac.Core}/ViewModels/ChangeHistory.cs (99%) rename src/{Gen3Hex.Core => HexManiac.Core}/ViewModels/ChildViewPort.cs (82%) rename src/{Gen3Hex.Core => HexManiac.Core}/ViewModels/DataFormats.cs (99%) rename src/{Gen3Hex.Core => HexManiac.Core}/ViewModels/EditorViewModel.cs (98%) rename src/{Gen3Hex.Core => HexManiac.Core}/ViewModels/GotoControlViewModel.cs (97%) rename src/{Gen3Hex.Core => HexManiac.Core}/ViewModels/HexElement.cs (74%) rename src/{Gen3Hex.Core => HexManiac.Core}/ViewModels/IChildViewPort.cs (63%) rename src/{Gen3Hex.Core => HexManiac.Core}/ViewModels/ITabContent.cs (95%) rename src/{Gen3Hex.Core => HexManiac.Core}/ViewModels/IViewPort.cs (89%) rename src/{Gen3Hex.Core => HexManiac.Core}/ViewModels/ScrollRegion.cs (98%) rename src/{Gen3Hex.Core => HexManiac.Core}/ViewModels/SearchResultsViewPort.cs (98%) rename src/{Gen3Hex.Core => HexManiac.Core}/ViewModels/Selection.cs (97%) rename src/{Gen3Hex.Core => HexManiac.Core}/ViewModels/Tools/IToolTrayViewModel.cs (97%) rename src/{Gen3Hex.Core => HexManiac.Core}/ViewModels/Tools/IToolViewModel.cs (88%) rename src/{Gen3Hex.Core => HexManiac.Core}/ViewModels/Tools/PCSTool.cs (97%) rename src/{Gen3Hex.Core => HexManiac.Core}/ViewModels/ViewModelCore.cs (97%) rename src/{Gen3Hex.Core => HexManiac.Core}/ViewModels/ViewPort.cs (98%) rename src/{Gen3Hex.Core => HexManiac.Core}/packages.config (100%) rename src/{Gen3Hex.Tests => HexManiac.Tests}/ArrayRunTests.cs (98%) rename src/{Gen3Hex.Tests => HexManiac.Tests}/AsciiRunTests.cs (86%) rename src/{Gen3Hex.Tests => HexManiac.Tests}/ChangeHistoryTests.cs (97%) rename src/{Gen3Hex.Tests => HexManiac.Tests}/FindTests.cs (98%) rename src/{Gen3Hex.Tests => HexManiac.Tests}/GeneralAppTests.cs (98%) rename src/{Gen3Hex.Tests/Gen3Hex.Tests.csproj => HexManiac.Tests/HexManiac.Tests.csproj} (94%) rename src/{Gen3Hex.Tests => HexManiac.Tests}/NavigationTests.cs (98%) rename src/{Gen3Hex.Tests => HexManiac.Tests}/PointerModelTests.cs (99%) rename src/{Gen3Hex.Tests => HexManiac.Tests}/StringModelTests.cs (98%) rename src/{Gen3Hex.Tests => HexManiac.Tests}/ToolTests.cs (95%) rename src/{Gen3Hex.Tests => HexManiac.Tests}/ViewPortCursorTests.cs (98%) rename src/{Gen3Hex.Tests => HexManiac.Tests}/ViewPortEditTests.cs (98%) rename src/{Gen3Hex.Tests => HexManiac.Tests}/ViewPortSaveTests.cs (98%) rename src/{Gen3Hex.Tests => HexManiac.Tests}/ViewPortScrollTests.cs (98%) rename src/{Gen3Hex.Tests => HexManiac.Tests}/packages.config (100%) rename src/{Gen3Hex.WPF => HexManiac.WPF}/Controls/HexContent.cs (98%) rename src/{Gen3Hex.WPF => HexManiac.WPF}/Controls/IntegerToBooleanViaMatchConverter.cs (93%) rename src/{Gen3Hex.WPF => HexManiac.WPF}/Controls/IntegerToHexConverter.cs (93%) rename src/{Gen3Hex.WPF => HexManiac.WPF}/Controls/StartScreen.xaml (96%) rename src/{Gen3Hex.WPF => HexManiac.WPF}/Controls/StartScreen.xaml.cs (76%) rename src/{Gen3Hex.WPF/Gen3Hex.WPF.csproj => HexManiac.WPF/HexManiac.WPF.csproj} (96%) rename src/{Gen3Hex.WPF => HexManiac.WPF}/Implementations/FormatDrawer.cs (96%) rename src/{Gen3Hex.WPF => HexManiac.WPF}/Implementations/WindowsFileSystem.cs (97%) rename src/{Gen3Hex.WPF => HexManiac.WPF}/Resources/AppIcon.ico (100%) rename src/{Gen3Hex.WPF => HexManiac.WPF}/Resources/AppImage.png (100%) rename src/{Gen3Hex.WPF => HexManiac.WPF}/Resources/Icons.xaml (98%) rename src/{Gen3Hex.WPF => HexManiac.WPF}/Resources/Icons.xaml.cs (61%) rename src/{Gen3Hex.WPF => HexManiac.WPF}/Resources/MarkupExtensions.cs (98%) rename src/{Gen3Hex.WPF => HexManiac.WPF}/Resources/Solarized.cs (100%) rename src/{Gen3Hex.WPF => HexManiac.WPF}/Windows/AboutWindow.xaml (88%) rename src/{Gen3Hex.WPF => HexManiac.WPF}/Windows/AboutWindow.xaml.cs (93%) rename src/{Gen3Hex.WPF => HexManiac.WPF}/Windows/App.config (100%) rename src/{Gen3Hex.WPF => HexManiac.WPF}/Windows/App.xaml (99%) rename src/{Gen3Hex.WPF => HexManiac.WPF}/Windows/App.xaml.cs (88%) rename src/{Gen3Hex.WPF => HexManiac.WPF}/Windows/MainWindow.xaml (98%) rename src/{Gen3Hex.WPF => HexManiac.WPF}/Windows/MainWindow.xaml.cs (94%) rename src/{Gen3Hex.WPF => HexManiac.WPF}/app.config (100%) diff --git a/Gen3Hex.sln b/HexManiacAdvance.sln similarity index 77% rename from Gen3Hex.sln rename to HexManiacAdvance.sln index 4cb0c123..46fbf6d2 100644 --- a/Gen3Hex.sln +++ b/HexManiacAdvance.sln @@ -3,11 +3,11 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 15 VisualStudioVersion = 15.0.28010.2016 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Gen3Hex.WPF", "src\Gen3Hex.WPF\Gen3Hex.WPF.csproj", "{386DC8E2-BABC-475C-94B6-37B3986F5F4C}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HexManiac.WPF", "src\HexManiac.WPF\HexManiac.WPF.csproj", "{386DC8E2-BABC-475C-94B6-37B3986F5F4C}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Gen3Hex.Core", "src\Gen3Hex.Core\Gen3Hex.Core.csproj", "{B7B9D932-4271-493D-AADD-6CF147C91373}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HexManiac.Core", "src\HexManiac.Core\HexManiac.Core.csproj", "{B7B9D932-4271-493D-AADD-6CF147C91373}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Gen3Hex.Tests", "src\Gen3Hex.Tests\Gen3Hex.Tests.csproj", "{B6A52732-E0F8-466D-8E29-664C797A21FA}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HexManiac.Tests", "src\HexManiac.Tests\HexManiac.Tests.csproj", "{B6A52732-E0F8-466D-8E29-664C797A21FA}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution diff --git a/src/Gen3Hex.Core/AssemblyInfo.cs b/src/Gen3Hex.Core/AssemblyInfo.cs deleted file mode 100644 index a5702ca0..00000000 --- a/src/Gen3Hex.Core/AssemblyInfo.cs +++ /dev/null @@ -1,3 +0,0 @@ -using System.Reflection; - -[assembly: AssemblyTitle("Gen3Hex.Core")] diff --git a/src/HexManiac.Core/AssemblyInfo.cs b/src/HexManiac.Core/AssemblyInfo.cs new file mode 100644 index 00000000..60bfc7eb --- /dev/null +++ b/src/HexManiac.Core/AssemblyInfo.cs @@ -0,0 +1,3 @@ +using System.Reflection; + +[assembly: AssemblyTitle("HexManiac.Core")] diff --git a/src/Gen3Hex.Core/Gen3Hex.Core.csproj b/src/HexManiac.Core/HexManiac.Core.csproj similarity index 97% rename from src/Gen3Hex.Core/Gen3Hex.Core.csproj rename to src/HexManiac.Core/HexManiac.Core.csproj index b8a79925..db489d2d 100644 --- a/src/Gen3Hex.Core/Gen3Hex.Core.csproj +++ b/src/HexManiac.Core/HexManiac.Core.csproj @@ -6,8 +6,8 @@ AnyCPU {B7B9D932-4271-493D-AADD-6CF147C91373} Library - HavenSoft.Gen3Hex.Core - Gen3Hex.Core + HavenSoft.HexManiac.Core + HexManiac.Core v4.7.2 512 true diff --git a/src/Gen3Hex.Core/ICommandExtensions.cs b/src/HexManiac.Core/ICommandExtensions.cs similarity index 92% rename from src/Gen3Hex.Core/ICommandExtensions.cs rename to src/HexManiac.Core/ICommandExtensions.cs index 5e5281ce..c8595c0a 100644 --- a/src/Gen3Hex.Core/ICommandExtensions.cs +++ b/src/HexManiac.Core/ICommandExtensions.cs @@ -1,6 +1,6 @@ using System.Windows.Input; -namespace HavenSoft.Gen3Hex.Core { +namespace HavenSoft.HexManiac.Core { public static class ICommandExtensions { /// /// Runs execute on the command with a null parameter. diff --git a/src/Gen3Hex.Core/Models/AutoSearchModel.cs b/src/HexManiac.Core/Models/AutoSearchModel.cs similarity index 83% rename from src/Gen3Hex.Core/Models/AutoSearchModel.cs rename to src/HexManiac.Core/Models/AutoSearchModel.cs index 2e2e8bae..e4b18b44 100644 --- a/src/Gen3Hex.Core/Models/AutoSearchModel.cs +++ b/src/HexManiac.Core/Models/AutoSearchModel.cs @@ -1,8 +1,8 @@ -using HavenSoft.Gen3Hex.Core.Models.Runs; +using HavenSoft.HexManiac.Core.Models.Runs; using System.Linq; -using static HavenSoft.Gen3Hex.Core.Models.Runs.ArrayRun; +using static HavenSoft.HexManiac.Core.Models.Runs.ArrayRun; -namespace HavenSoft.Gen3Hex.Core.Models { +namespace HavenSoft.HexManiac.Core.Models { public class AutoSearchModel : PokemonModel { public const string Ruby = "AXVE", @@ -14,6 +14,12 @@ namespace HavenSoft.Gen3Hex.Core.Models { private readonly string gameCode; private readonly ModelDelta noChangeDelta = new NoDataChangeDeltaModel(); + /// + /// The first 0x100 bytes of the GBA rom is always the header. + /// The next 0x100 bytes contains some tables and some startup code, but nothing interesting to point to. + /// Choosing 0x200 might prevent us from seeing an actual anchor, but it will also remove a bunch + /// of false positives and keep us from getting conflicts with the RomName (see DecodeHeader). + /// public override int EarliestAllowedAnchor => 0x200; public AutoSearchModel(byte[] data, StoredMetadata metadata = null) : base(data, metadata) { diff --git a/src/Gen3Hex.Core/Models/Enums.cs b/src/HexManiac.Core/Models/Enums.cs similarity index 53% rename from src/Gen3Hex.Core/Models/Enums.cs rename to src/HexManiac.Core/Models/Enums.cs index 8e9a162d..cb830010 100644 --- a/src/Gen3Hex.Core/Models/Enums.cs +++ b/src/HexManiac.Core/Models/Enums.cs @@ -1,3 +1,3 @@ -namespace HavenSoft.Gen3Hex.Core.Models { +namespace HavenSoft.HexManiac.Core.Models { public enum Direction { Left, Right, Up, Down } } diff --git a/src/Gen3Hex.Core/Models/ErrorInfo.cs b/src/HexManiac.Core/Models/ErrorInfo.cs similarity index 93% rename from src/Gen3Hex.Core/Models/ErrorInfo.cs rename to src/HexManiac.Core/Models/ErrorInfo.cs index 2e80c0d0..3e4c56d0 100644 --- a/src/Gen3Hex.Core/Models/ErrorInfo.cs +++ b/src/HexManiac.Core/Models/ErrorInfo.cs @@ -1,6 +1,6 @@ using System; -namespace HavenSoft.Gen3Hex.Core.Models { +namespace HavenSoft.HexManiac.Core.Models { public class ErrorInfo : IEquatable { public static ErrorInfo NoError { get; } = new ErrorInfo(null); public bool HasError { get; } diff --git a/src/Gen3Hex.Core/Models/IDataModel.cs b/src/HexManiac.Core/Models/IDataModel.cs similarity index 98% rename from src/Gen3Hex.Core/Models/IDataModel.cs rename to src/HexManiac.Core/Models/IDataModel.cs index 24f10b1d..4d8cdf99 100644 --- a/src/Gen3Hex.Core/Models/IDataModel.cs +++ b/src/HexManiac.Core/Models/IDataModel.cs @@ -1,11 +1,11 @@ -using HavenSoft.Gen3Hex.Core.Models.Runs; -using HavenSoft.Gen3Hex.Core.ViewModels.DataFormats; +using HavenSoft.HexManiac.Core.Models.Runs; +using HavenSoft.HexManiac.Core.ViewModels.DataFormats; using System; using System.Collections; using System.Collections.Generic; using System.Linq; -namespace HavenSoft.Gen3Hex.Core.Models { +namespace HavenSoft.HexManiac.Core.Models { public interface IDataModel : IReadOnlyList { byte[] RawData { get; } new byte this[int index] { get; set; } diff --git a/src/Gen3Hex.Core/Models/IFileSystem.cs b/src/HexManiac.Core/Models/IFileSystem.cs similarity index 98% rename from src/Gen3Hex.Core/Models/IFileSystem.cs rename to src/HexManiac.Core/Models/IFileSystem.cs index 0a314859..4b6717ac 100644 --- a/src/Gen3Hex.Core/Models/IFileSystem.cs +++ b/src/HexManiac.Core/Models/IFileSystem.cs @@ -1,6 +1,6 @@ using System; -namespace HavenSoft.Gen3Hex.Core.Models { +namespace HavenSoft.HexManiac.Core.Models { public interface IFileSystem { string CopyText { get; set; } diff --git a/src/Gen3Hex.Core/Models/LoadedFile.cs b/src/HexManiac.Core/Models/LoadedFile.cs similarity index 82% rename from src/Gen3Hex.Core/Models/LoadedFile.cs rename to src/HexManiac.Core/Models/LoadedFile.cs index 89c221cf..3b7659b6 100644 --- a/src/Gen3Hex.Core/Models/LoadedFile.cs +++ b/src/HexManiac.Core/Models/LoadedFile.cs @@ -1,4 +1,4 @@ -namespace HavenSoft.Gen3Hex.Core.Models { +namespace HavenSoft.HexManiac.Core.Models { public class LoadedFile { public string Name { get; } diff --git a/src/Gen3Hex.Core/Models/ModelDelta.cs b/src/HexManiac.Core/Models/ModelDelta.cs similarity index 98% rename from src/Gen3Hex.Core/Models/ModelDelta.cs rename to src/HexManiac.Core/Models/ModelDelta.cs index 8463ae74..e8cd0e1e 100644 --- a/src/Gen3Hex.Core/Models/ModelDelta.cs +++ b/src/HexManiac.Core/Models/ModelDelta.cs @@ -1,8 +1,8 @@ -using HavenSoft.Gen3Hex.Core.Models.Runs; +using HavenSoft.HexManiac.Core.Models.Runs; using System.Collections.Generic; using System.Linq; -namespace HavenSoft.Gen3Hex.Core.Models { +namespace HavenSoft.HexManiac.Core.Models { /// /// Represents a single conceptual change in the loaded data, including /// editing data, adding / removing formats / format names, diff --git a/src/Gen3Hex.Core/Models/PCSString.cs b/src/HexManiac.Core/Models/PCSString.cs similarity index 99% rename from src/Gen3Hex.Core/Models/PCSString.cs rename to src/HexManiac.Core/Models/PCSString.cs index ee186ea7..d65ad04a 100644 --- a/src/Gen3Hex.Core/Models/PCSString.cs +++ b/src/HexManiac.Core/Models/PCSString.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; using System.Globalization; using System.Text; -namespace HavenSoft.Gen3Hex.Core.Models { +namespace HavenSoft.HexManiac.Core.Models { public class PCSString { public static IReadOnlyList PCS; public static IReadOnlyList Newlines; diff --git a/src/Gen3Hex.Core/Models/Point.cs b/src/HexManiac.Core/Models/Point.cs similarity index 91% rename from src/Gen3Hex.Core/Models/Point.cs rename to src/HexManiac.Core/Models/Point.cs index bf89dae9..a6d06379 100644 --- a/src/Gen3Hex.Core/Models/Point.cs +++ b/src/HexManiac.Core/Models/Point.cs @@ -1,6 +1,6 @@ using System; -namespace HavenSoft.Gen3Hex.Core.Models { +namespace HavenSoft.HexManiac.Core.Models { public struct Point : IEquatable { public int X { get; } public int Y { get; } diff --git a/src/Gen3Hex.Core/Models/PokemonModel.cs b/src/HexManiac.Core/Models/PokemonModel.cs similarity index 97% rename from src/Gen3Hex.Core/Models/PokemonModel.cs rename to src/HexManiac.Core/Models/PokemonModel.cs index 55fb919c..a5622344 100644 --- a/src/Gen3Hex.Core/Models/PokemonModel.cs +++ b/src/HexManiac.Core/Models/PokemonModel.cs @@ -1,16 +1,16 @@ -using HavenSoft.Gen3Hex.Core.Models.Runs; -using HavenSoft.Gen3Hex.Core.ViewModels.DataFormats; +using HavenSoft.HexManiac.Core.Models.Runs; +using HavenSoft.HexManiac.Core.ViewModels.DataFormats; using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Text; -using static HavenSoft.Gen3Hex.Core.Models.Runs.ArrayRun; -using static HavenSoft.Gen3Hex.Core.Models.Runs.AsciiRun; -using static HavenSoft.Gen3Hex.Core.Models.Runs.BaseRun; -using static HavenSoft.Gen3Hex.Core.Models.Runs.PCSRun; +using static HavenSoft.HexManiac.Core.Models.Runs.ArrayRun; +using static HavenSoft.HexManiac.Core.Models.Runs.AsciiRun; +using static HavenSoft.HexManiac.Core.Models.Runs.BaseRun; +using static HavenSoft.HexManiac.Core.Models.Runs.PCSRun; -namespace HavenSoft.Gen3Hex.Core.Models { +namespace HavenSoft.HexManiac.Core.Models { public class PokemonModel : BaseModel { // list of runs, in sorted address order. Includes no names private readonly List runs = new List(); @@ -303,6 +303,8 @@ namespace HavenSoft.Gen3Hex.Core.Models { ClearFormat(changeToken, run.Start, run.Length); } + var existingRun = (index >= 0 && index < runs.Count) ? runs[index] : null; + if (anchorForAddress.TryGetValue(location, out string oldAnchorName)) { anchorForAddress.Remove(location); addressForAnchor.Remove(oldAnchorName); @@ -320,7 +322,8 @@ namespace HavenSoft.Gen3Hex.Core.Models { changeToken.AddName(location, anchorName); } - var sources = GetSourcesPointingToNewAnchor(changeToken, anchorName); + var seakPointers = existingRun?.PointerSources == null || existingRun?.Start != location; + var sources = GetSourcesPointingToNewAnchor(changeToken, anchorName, seakPointers); var newRun = run.MergeAnchor(sources); ObserveRunWritten(changeToken, newRun); } @@ -655,7 +658,7 @@ namespace HavenSoft.Gen3Hex.Core.Models { private static ErrorInfo ValidateAnchorNameAndFormat(IDataModel model, IFormattedRun runToWrite, string name, string format, int dataIndex) { var existingRun = model.GetNextRun(dataIndex); - var nextRun = existingRun.Start > dataIndex ? existingRun : model.GetNextRun(existingRun.Start + existingRun.Length); + var nextRun = existingRun.Start > dataIndex ? existingRun : model.GetNextRun(existingRun.Start + Math.Max(existingRun.Length, 1)); if (name.ToLower() == "null") { return new ErrorInfo("'null' is a reserved word and cannot be used as an anchor name."); @@ -698,13 +701,14 @@ namespace HavenSoft.Gen3Hex.Core.Models { /// /// The list of sources that point at the new anchor /// - private IReadOnlyList GetSourcesPointingToNewAnchor(ModelDelta changeToken, string anchorName) { + private IReadOnlyList GetSourcesPointingToNewAnchor(ModelDelta changeToken, string anchorName, bool seakPointers) { if (!addressForAnchor.TryGetValue(anchorName, out int location)) return new List(); // new anchor is unnamed, so nothing points to it yet if (!unmappedNameToSources.TryGetValue(anchorName, out var sources)) { // no pointer was waiting for this anchor to be created - // but the user things there's something pointing here - return SearchForPointersToAnchor(changeToken, location); + // but the user thinks there's something pointing here + if (seakPointers) return SearchForPointersToAnchor(changeToken, location); + return new List(); } foreach (var source in sources) { diff --git a/src/Gen3Hex.Core/Models/Runs/ArrayRun.cs b/src/HexManiac.Core/Models/Runs/ArrayRun.cs similarity index 99% rename from src/Gen3Hex.Core/Models/Runs/ArrayRun.cs rename to src/HexManiac.Core/Models/Runs/ArrayRun.cs index a90fe03a..7592374d 100644 --- a/src/Gen3Hex.Core/Models/Runs/ArrayRun.cs +++ b/src/HexManiac.Core/Models/Runs/ArrayRun.cs @@ -1,10 +1,10 @@ -using HavenSoft.Gen3Hex.Core.ViewModels.DataFormats; +using HavenSoft.HexManiac.Core.ViewModels.DataFormats; using System; using System.Collections.Generic; using System.Linq; using System.Text; -namespace HavenSoft.Gen3Hex.Core.Models.Runs { +namespace HavenSoft.HexManiac.Core.Models.Runs { public enum ElementContentType { Unknown, PCS, diff --git a/src/Gen3Hex.Core/Models/Runs/AsciiRun.cs b/src/HexManiac.Core/Models/Runs/AsciiRun.cs similarity index 86% rename from src/Gen3Hex.Core/Models/Runs/AsciiRun.cs rename to src/HexManiac.Core/Models/Runs/AsciiRun.cs index fad81063..5de5782e 100644 --- a/src/Gen3Hex.Core/Models/Runs/AsciiRun.cs +++ b/src/HexManiac.Core/Models/Runs/AsciiRun.cs @@ -1,7 +1,7 @@ -using HavenSoft.Gen3Hex.Core.ViewModels.DataFormats; +using HavenSoft.HexManiac.Core.ViewModels.DataFormats; using System.Collections.Generic; -namespace HavenSoft.Gen3Hex.Core.Models.Runs { +namespace HavenSoft.HexManiac.Core.Models.Runs { public class AsciiRun : BaseRun { public const char StreamDelimeter = '`'; diff --git a/src/Gen3Hex.Core/Models/Runs/IFormattedRun.cs b/src/HexManiac.Core/Models/Runs/IFormattedRun.cs similarity index 96% rename from src/Gen3Hex.Core/Models/Runs/IFormattedRun.cs rename to src/HexManiac.Core/Models/Runs/IFormattedRun.cs index cfc66f3c..bc29cc00 100644 --- a/src/Gen3Hex.Core/Models/Runs/IFormattedRun.cs +++ b/src/HexManiac.Core/Models/Runs/IFormattedRun.cs @@ -1,9 +1,9 @@ -using HavenSoft.Gen3Hex.Core.ViewModels.DataFormats; +using HavenSoft.HexManiac.Core.ViewModels.DataFormats; using System; using System.Collections.Generic; using System.Linq; -namespace HavenSoft.Gen3Hex.Core.Models.Runs { +namespace HavenSoft.HexManiac.Core.Models.Runs { public interface IFormattedRun { int Start { get; } int Length { get; } diff --git a/src/Gen3Hex.Core/Models/Runs/PCSRun.cs b/src/HexManiac.Core/Models/Runs/PCSRun.cs similarity index 94% rename from src/Gen3Hex.Core/Models/Runs/PCSRun.cs rename to src/HexManiac.Core/Models/Runs/PCSRun.cs index 0e273409..04945521 100644 --- a/src/Gen3Hex.Core/Models/Runs/PCSRun.cs +++ b/src/HexManiac.Core/Models/Runs/PCSRun.cs @@ -1,7 +1,7 @@ -using HavenSoft.Gen3Hex.Core.ViewModels.DataFormats; +using HavenSoft.HexManiac.Core.ViewModels.DataFormats; using System.Collections.Generic; -namespace HavenSoft.Gen3Hex.Core.Models.Runs { +namespace HavenSoft.HexManiac.Core.Models.Runs { public class PCSRun : BaseRun { public const char StringDelimeter = '"'; diff --git a/src/Gen3Hex.Core/Models/Runs/PointerRun.cs b/src/HexManiac.Core/Models/Runs/PointerRun.cs similarity index 88% rename from src/Gen3Hex.Core/Models/Runs/PointerRun.cs rename to src/HexManiac.Core/Models/Runs/PointerRun.cs index 49dce8fb..7fcb89db 100644 --- a/src/Gen3Hex.Core/Models/Runs/PointerRun.cs +++ b/src/HexManiac.Core/Models/Runs/PointerRun.cs @@ -1,7 +1,7 @@ -using HavenSoft.Gen3Hex.Core.ViewModels.DataFormats; +using HavenSoft.HexManiac.Core.ViewModels.DataFormats; using System.Collections.Generic; -namespace HavenSoft.Gen3Hex.Core.Models.Runs { +namespace HavenSoft.HexManiac.Core.Models.Runs { public class PointerRun : BaseRun { public const char PointerStart = '<'; public const char PointerEnd = '>'; diff --git a/src/Gen3Hex.Core/Models/SearchByte.cs b/src/HexManiac.Core/Models/SearchByte.cs similarity index 96% rename from src/Gen3Hex.Core/Models/SearchByte.cs rename to src/HexManiac.Core/Models/SearchByte.cs index d91d0c13..bb6818e2 100644 --- a/src/Gen3Hex.Core/Models/SearchByte.cs +++ b/src/HexManiac.Core/Models/SearchByte.cs @@ -2,7 +2,7 @@ using System.Diagnostics; using System.Linq; -namespace HavenSoft.Gen3Hex.Core.Models { +namespace HavenSoft.HexManiac.Core.Models { public interface ISearchByte { bool Match(byte value); } diff --git a/src/Gen3Hex.Core/Models/StoredMetadata.cs b/src/HexManiac.Core/Models/StoredMetadata.cs similarity index 98% rename from src/Gen3Hex.Core/Models/StoredMetadata.cs rename to src/HexManiac.Core/Models/StoredMetadata.cs index 0081d4b5..7adb18d5 100644 --- a/src/Gen3Hex.Core/Models/StoredMetadata.cs +++ b/src/HexManiac.Core/Models/StoredMetadata.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; using System.Globalization; using System.Linq; -namespace HavenSoft.Gen3Hex.Core.Models { +namespace HavenSoft.HexManiac.Core.Models { public class StoredMetadata { public IReadOnlyList NamedAnchors { get; } public IReadOnlyList UnmappedPointers { get; } diff --git a/src/Gen3Hex.Core/NumericExtensions.cs b/src/HexManiac.Core/NumericExtensions.cs similarity index 92% rename from src/Gen3Hex.Core/NumericExtensions.cs rename to src/HexManiac.Core/NumericExtensions.cs index 416ea6e5..51613354 100644 --- a/src/Gen3Hex.Core/NumericExtensions.cs +++ b/src/HexManiac.Core/NumericExtensions.cs @@ -1,6 +1,6 @@ using System; -namespace HavenSoft.Gen3Hex.Core { +namespace HavenSoft.HexManiac.Core { public static class NumericExtensions { public static T LimitToRange(this T value, T lower, T upper) where T : IComparable { if (upper.CompareTo(lower) < 0) throw new ArgumentException($"upper value {upper} is less than lower value {lower}"); diff --git a/src/Gen3Hex.Core/ViewModels/ChangeHistory.cs b/src/HexManiac.Core/ViewModels/ChangeHistory.cs similarity index 99% rename from src/Gen3Hex.Core/ViewModels/ChangeHistory.cs rename to src/HexManiac.Core/ViewModels/ChangeHistory.cs index 6bdaf3da..3aa2ed73 100644 --- a/src/Gen3Hex.Core/ViewModels/ChangeHistory.cs +++ b/src/HexManiac.Core/ViewModels/ChangeHistory.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; using System.Runtime.CompilerServices; using System.Windows.Input; -namespace HavenSoft.Gen3Hex.Core.ViewModels { +namespace HavenSoft.HexManiac.Core.ViewModels { /// /// Represents a history of changes that can undo / redo. /// The change can be reperesented by any class with an empty constructor. diff --git a/src/Gen3Hex.Core/ViewModels/ChildViewPort.cs b/src/HexManiac.Core/ViewModels/ChildViewPort.cs similarity index 82% rename from src/Gen3Hex.Core/ViewModels/ChildViewPort.cs rename to src/HexManiac.Core/ViewModels/ChildViewPort.cs index ee516e46..e5a30903 100644 --- a/src/Gen3Hex.Core/ViewModels/ChildViewPort.cs +++ b/src/HexManiac.Core/ViewModels/ChildViewPort.cs @@ -1,6 +1,6 @@ -using HavenSoft.Gen3Hex.Core.Models; +using HavenSoft.HexManiac.Core.Models; -namespace HavenSoft.Gen3Hex.Core.ViewModels { +namespace HavenSoft.HexManiac.Core.ViewModels { /// /// exactly replaces a ViewPort, except that it also has a known parent view /// diff --git a/src/Gen3Hex.Core/ViewModels/DataFormats.cs b/src/HexManiac.Core/ViewModels/DataFormats.cs similarity index 99% rename from src/Gen3Hex.Core/ViewModels/DataFormats.cs rename to src/HexManiac.Core/ViewModels/DataFormats.cs index a66aadeb..46ca3281 100644 --- a/src/Gen3Hex.Core/ViewModels/DataFormats.cs +++ b/src/HexManiac.Core/ViewModels/DataFormats.cs @@ -5,7 +5,7 @@ using System; using System.Collections.Generic; using System.Linq; -namespace HavenSoft.Gen3Hex.Core.ViewModels.DataFormats { +namespace HavenSoft.HexManiac.Core.ViewModels.DataFormats { public interface IDataFormat : IEquatable { void Visit(IDataFormatVisitor visitor, byte data); } diff --git a/src/Gen3Hex.Core/ViewModels/EditorViewModel.cs b/src/HexManiac.Core/ViewModels/EditorViewModel.cs similarity index 98% rename from src/Gen3Hex.Core/ViewModels/EditorViewModel.cs rename to src/HexManiac.Core/ViewModels/EditorViewModel.cs index 4dc36557..26f43f62 100644 --- a/src/Gen3Hex.Core/ViewModels/EditorViewModel.cs +++ b/src/HexManiac.Core/ViewModels/EditorViewModel.cs @@ -1,4 +1,4 @@ -using HavenSoft.Gen3Hex.Core.Models; +using HavenSoft.HexManiac.Core.Models; using System; using System.Collections; using System.Collections.Generic; @@ -6,10 +6,11 @@ using System.Collections.Specialized; using System.ComponentModel; using System.Linq; using System.Windows.Input; -using static HavenSoft.Gen3Hex.Core.ICommandExtensions; +using static HavenSoft.HexManiac.Core.ICommandExtensions; -namespace HavenSoft.Gen3Hex.Core.ViewModels { +namespace HavenSoft.HexManiac.Core.ViewModels { public class EditorViewModel : ViewModelCore, IEnumerable, INotifyCollectionChanged { + private const int MaxReasonableResults = 200; // limit for performance reasons private readonly IFileSystem fileSystem; private readonly List tabs; @@ -43,7 +44,6 @@ namespace HavenSoft.Gen3Hex.Core.ViewModels { toggleMatrix = new StubCommand(); private readonly Dictionary, EventHandler> forwardExecuteChangeNotifications; - private (IViewPort tab, int)[] recentFindResults = new (IViewPort, int)[0]; private int currentFindResultIndex; @@ -374,7 +374,7 @@ namespace HavenSoft.Gen3Hex.Core.ViewModels { return; } - if (results.Count > 200) { + if (results.Count > MaxReasonableResults) { ErrorMessage = $"Found {results.Count} results: please refine your search."; return; } diff --git a/src/Gen3Hex.Core/ViewModels/GotoControlViewModel.cs b/src/HexManiac.Core/ViewModels/GotoControlViewModel.cs similarity index 97% rename from src/Gen3Hex.Core/ViewModels/GotoControlViewModel.cs rename to src/HexManiac.Core/ViewModels/GotoControlViewModel.cs index 42f04184..c49a21e2 100644 --- a/src/Gen3Hex.Core/ViewModels/GotoControlViewModel.cs +++ b/src/HexManiac.Core/ViewModels/GotoControlViewModel.cs @@ -2,9 +2,9 @@ using System.Collections.Generic; using System.Linq; using System.Windows.Input; -using static HavenSoft.Gen3Hex.Core.ICommandExtensions; +using static HavenSoft.HexManiac.Core.ICommandExtensions; -namespace HavenSoft.Gen3Hex.Core.ViewModels { +namespace HavenSoft.HexManiac.Core.ViewModels { public class GotoControlViewModel : ViewModelCore { private readonly IViewPort viewPort; diff --git a/src/Gen3Hex.Core/ViewModels/HexElement.cs b/src/HexManiac.Core/ViewModels/HexElement.cs similarity index 74% rename from src/Gen3Hex.Core/ViewModels/HexElement.cs rename to src/HexManiac.Core/ViewModels/HexElement.cs index 2f3303ff..23e60287 100644 --- a/src/Gen3Hex.Core/ViewModels/HexElement.cs +++ b/src/HexManiac.Core/ViewModels/HexElement.cs @@ -1,6 +1,6 @@ -using HavenSoft.Gen3Hex.Core.ViewModels.DataFormats; +using HavenSoft.HexManiac.Core.ViewModels.DataFormats; -namespace HavenSoft.Gen3Hex.Core.ViewModels { +namespace HavenSoft.HexManiac.Core.ViewModels { public class HexElement { public static readonly HexElement Undefined = new HexElement(0, DataFormats.Undefined.Instance); public byte Value { get; } diff --git a/src/Gen3Hex.Core/ViewModels/IChildViewPort.cs b/src/HexManiac.Core/ViewModels/IChildViewPort.cs similarity index 63% rename from src/Gen3Hex.Core/ViewModels/IChildViewPort.cs rename to src/HexManiac.Core/ViewModels/IChildViewPort.cs index 143bc694..bd52317e 100644 --- a/src/Gen3Hex.Core/ViewModels/IChildViewPort.cs +++ b/src/HexManiac.Core/ViewModels/IChildViewPort.cs @@ -1,4 +1,4 @@ -namespace HavenSoft.Gen3Hex.Core.ViewModels { +namespace HavenSoft.HexManiac.Core.ViewModels { public interface IChildViewPort : IViewPort { IViewPort Parent { get; } } diff --git a/src/Gen3Hex.Core/ViewModels/ITabContent.cs b/src/HexManiac.Core/ViewModels/ITabContent.cs similarity index 95% rename from src/Gen3Hex.Core/ViewModels/ITabContent.cs rename to src/HexManiac.Core/ViewModels/ITabContent.cs index 654cc25e..6d3d671a 100644 --- a/src/Gen3Hex.Core/ViewModels/ITabContent.cs +++ b/src/HexManiac.Core/ViewModels/ITabContent.cs @@ -2,7 +2,7 @@ using System.ComponentModel; using System.Windows.Input; -namespace HavenSoft.Gen3Hex.Core.ViewModels { +namespace HavenSoft.HexManiac.Core.ViewModels { /// /// Each command expects an IFileSystem as its Command Parameter. /// diff --git a/src/Gen3Hex.Core/ViewModels/IViewPort.cs b/src/HexManiac.Core/ViewModels/IViewPort.cs similarity index 89% rename from src/Gen3Hex.Core/ViewModels/IViewPort.cs rename to src/HexManiac.Core/ViewModels/IViewPort.cs index 4b750fe4..a9574363 100644 --- a/src/Gen3Hex.Core/ViewModels/IViewPort.cs +++ b/src/HexManiac.Core/ViewModels/IViewPort.cs @@ -1,11 +1,11 @@ -using HavenSoft.Gen3Hex.Core.Models; -using HavenSoft.Gen3Hex.Core.ViewModels.Tools; +using HavenSoft.HexManiac.Core.Models; +using HavenSoft.HexManiac.Core.ViewModels.Tools; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Collections.Specialized; using System.Windows.Input; -namespace HavenSoft.Gen3Hex.Core.ViewModels { +namespace HavenSoft.HexManiac.Core.ViewModels { public interface IViewPort : ITabContent, INotifyCollectionChanged { string FileName { get; } // Name is dispayed in a tab. FileName lets us know when to call 'ConsiderReload' diff --git a/src/Gen3Hex.Core/ViewModels/ScrollRegion.cs b/src/HexManiac.Core/ViewModels/ScrollRegion.cs similarity index 98% rename from src/Gen3Hex.Core/ViewModels/ScrollRegion.cs rename to src/HexManiac.Core/ViewModels/ScrollRegion.cs index 5f235d7c..ad4dbff5 100644 --- a/src/Gen3Hex.Core/ViewModels/ScrollRegion.cs +++ b/src/HexManiac.Core/ViewModels/ScrollRegion.cs @@ -1,10 +1,10 @@ -using HavenSoft.Gen3Hex.Core.Models; +using HavenSoft.HexManiac.Core.Models; using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Windows.Input; -namespace HavenSoft.Gen3Hex.Core.ViewModels { +namespace HavenSoft.HexManiac.Core.ViewModels { public class ScrollRegion : ViewModelCore { public static readonly IReadOnlyDictionary DirectionToDif = new Dictionary { { Direction.Up, new Point( 0,-1) }, diff --git a/src/Gen3Hex.Core/ViewModels/SearchResultsViewPort.cs b/src/HexManiac.Core/ViewModels/SearchResultsViewPort.cs similarity index 98% rename from src/Gen3Hex.Core/ViewModels/SearchResultsViewPort.cs rename to src/HexManiac.Core/ViewModels/SearchResultsViewPort.cs index 960e42b9..92888afe 100644 --- a/src/Gen3Hex.Core/ViewModels/SearchResultsViewPort.cs +++ b/src/HexManiac.Core/ViewModels/SearchResultsViewPort.cs @@ -1,5 +1,5 @@ -using HavenSoft.Gen3Hex.Core.Models; -using HavenSoft.Gen3Hex.Core.ViewModels.Tools; +using HavenSoft.HexManiac.Core.Models; +using HavenSoft.HexManiac.Core.ViewModels.Tools; using System; using System.Collections.Generic; using System.Collections.ObjectModel; @@ -7,7 +7,7 @@ using System.Collections.Specialized; using System.Linq; using System.Windows.Input; -namespace HavenSoft.Gen3Hex.Core.ViewModels { +namespace HavenSoft.HexManiac.Core.ViewModels { public class SearchResultsViewPort : ViewModelCore, IViewPort { private readonly StubCommand scroll, close; private readonly List children = new List(); diff --git a/src/Gen3Hex.Core/ViewModels/Selection.cs b/src/HexManiac.Core/ViewModels/Selection.cs similarity index 97% rename from src/Gen3Hex.Core/ViewModels/Selection.cs rename to src/HexManiac.Core/ViewModels/Selection.cs index 87b7bf61..0bf84a2c 100644 --- a/src/Gen3Hex.Core/ViewModels/Selection.cs +++ b/src/HexManiac.Core/ViewModels/Selection.cs @@ -1,13 +1,13 @@ -using HavenSoft.Gen3Hex.Core.Models; -using HavenSoft.Gen3Hex.Core.Models.Runs; -using HavenSoft.Gen3Hex.Core.ViewModels.DataFormats; +using HavenSoft.HexManiac.Core.Models; +using HavenSoft.HexManiac.Core.Models.Runs; +using HavenSoft.HexManiac.Core.ViewModels.DataFormats; using System; using System.Collections.Generic; using System.Globalization; using System.Linq; using System.Windows.Input; -namespace HavenSoft.Gen3Hex.Core.ViewModels { +namespace HavenSoft.HexManiac.Core.ViewModels { public class Selection : ViewModelCore { private readonly IDataModel model; diff --git a/src/Gen3Hex.Core/ViewModels/Tools/IToolTrayViewModel.cs b/src/HexManiac.Core/ViewModels/Tools/IToolTrayViewModel.cs similarity index 97% rename from src/Gen3Hex.Core/ViewModels/Tools/IToolTrayViewModel.cs rename to src/HexManiac.Core/ViewModels/Tools/IToolTrayViewModel.cs index 17d53253..7a8496e5 100644 --- a/src/Gen3Hex.Core/ViewModels/Tools/IToolTrayViewModel.cs +++ b/src/HexManiac.Core/ViewModels/Tools/IToolTrayViewModel.cs @@ -1,4 +1,4 @@ -using HavenSoft.Gen3Hex.Core.Models; +using HavenSoft.HexManiac.Core.Models; using System; using System.Collections; using System.Collections.Generic; @@ -6,7 +6,7 @@ using System.ComponentModel; using System.Diagnostics; using System.Windows.Input; -namespace HavenSoft.Gen3Hex.Core.ViewModels.Tools { +namespace HavenSoft.HexManiac.Core.ViewModels.Tools { public interface IToolTrayViewModel : IReadOnlyList, INotifyPropertyChanged { int SelectedIndex { get; set; } diff --git a/src/Gen3Hex.Core/ViewModels/Tools/IToolViewModel.cs b/src/HexManiac.Core/ViewModels/Tools/IToolViewModel.cs similarity index 88% rename from src/Gen3Hex.Core/ViewModels/Tools/IToolViewModel.cs rename to src/HexManiac.Core/ViewModels/Tools/IToolViewModel.cs index fbeac238..bc0c197d 100644 --- a/src/Gen3Hex.Core/ViewModels/Tools/IToolViewModel.cs +++ b/src/HexManiac.Core/ViewModels/Tools/IToolViewModel.cs @@ -1,6 +1,6 @@ using System.ComponentModel; -namespace HavenSoft.Gen3Hex.Core.ViewModels.Tools { +namespace HavenSoft.HexManiac.Core.ViewModels.Tools { public interface IToolViewModel : INotifyPropertyChanged { string Name { get; } } diff --git a/src/Gen3Hex.Core/ViewModels/Tools/PCSTool.cs b/src/HexManiac.Core/ViewModels/Tools/PCSTool.cs similarity index 97% rename from src/Gen3Hex.Core/ViewModels/Tools/PCSTool.cs rename to src/HexManiac.Core/ViewModels/Tools/PCSTool.cs index c1ae110b..49c94d38 100644 --- a/src/Gen3Hex.Core/ViewModels/Tools/PCSTool.cs +++ b/src/HexManiac.Core/ViewModels/Tools/PCSTool.cs @@ -1,10 +1,10 @@ -using HavenSoft.Gen3Hex.Core.Models; -using HavenSoft.Gen3Hex.Core.Models.Runs; -using HavenSoft.Gen3Hex.Core.ViewModels.DataFormats; +using HavenSoft.HexManiac.Core.Models; +using HavenSoft.HexManiac.Core.Models.Runs; +using HavenSoft.HexManiac.Core.ViewModels.DataFormats; using System; using System.Text; -namespace HavenSoft.Gen3Hex.Core.ViewModels.Tools { +namespace HavenSoft.HexManiac.Core.ViewModels.Tools { public class PCSTool : ViewModelCore, IToolViewModel { private readonly IDataModel model; private readonly Selection selection; diff --git a/src/Gen3Hex.Core/ViewModels/ViewModelCore.cs b/src/HexManiac.Core/ViewModels/ViewModelCore.cs similarity index 97% rename from src/Gen3Hex.Core/ViewModels/ViewModelCore.cs rename to src/HexManiac.Core/ViewModels/ViewModelCore.cs index b5116d17..208bfa24 100644 --- a/src/Gen3Hex.Core/ViewModels/ViewModelCore.cs +++ b/src/HexManiac.Core/ViewModels/ViewModelCore.cs @@ -2,7 +2,7 @@ using System.ComponentModel; using System.Runtime.CompilerServices; -namespace HavenSoft.Gen3Hex.Core.ViewModels { +namespace HavenSoft.HexManiac.Core.ViewModels { public class ViewModelCore : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; diff --git a/src/Gen3Hex.Core/ViewModels/ViewPort.cs b/src/HexManiac.Core/ViewModels/ViewPort.cs similarity index 98% rename from src/Gen3Hex.Core/ViewModels/ViewPort.cs rename to src/HexManiac.Core/ViewModels/ViewPort.cs index f640c9ae..daa99670 100644 --- a/src/Gen3Hex.Core/ViewModels/ViewPort.cs +++ b/src/HexManiac.Core/ViewModels/ViewPort.cs @@ -1,7 +1,7 @@ -using HavenSoft.Gen3Hex.Core.Models; -using HavenSoft.Gen3Hex.Core.Models.Runs; -using HavenSoft.Gen3Hex.Core.ViewModels.DataFormats; -using HavenSoft.Gen3Hex.Core.ViewModels.Tools; +using HavenSoft.HexManiac.Core.Models; +using HavenSoft.HexManiac.Core.Models.Runs; +using HavenSoft.HexManiac.Core.ViewModels.DataFormats; +using HavenSoft.HexManiac.Core.ViewModels.Tools; using System; using System.Collections.Generic; using System.Collections.ObjectModel; @@ -12,14 +12,14 @@ using System.Globalization; using System.IO; using System.Linq; using System.Windows.Input; -using static HavenSoft.Gen3Hex.Core.ICommandExtensions; -using static HavenSoft.Gen3Hex.Core.Models.Runs.ArrayRun; -using static HavenSoft.Gen3Hex.Core.Models.Runs.AsciiRun; -using static HavenSoft.Gen3Hex.Core.Models.Runs.BaseRun; -using static HavenSoft.Gen3Hex.Core.Models.Runs.PCSRun; -using static HavenSoft.Gen3Hex.Core.Models.Runs.PointerRun; +using static HavenSoft.HexManiac.Core.ICommandExtensions; +using static HavenSoft.HexManiac.Core.Models.Runs.ArrayRun; +using static HavenSoft.HexManiac.Core.Models.Runs.AsciiRun; +using static HavenSoft.HexManiac.Core.Models.Runs.BaseRun; +using static HavenSoft.HexManiac.Core.Models.Runs.PCSRun; +using static HavenSoft.HexManiac.Core.Models.Runs.PointerRun; -namespace HavenSoft.Gen3Hex.Core.ViewModels { +namespace HavenSoft.HexManiac.Core.ViewModels { /// /// A range of visible data that should be displayed. /// diff --git a/src/Gen3Hex.Core/packages.config b/src/HexManiac.Core/packages.config similarity index 100% rename from src/Gen3Hex.Core/packages.config rename to src/HexManiac.Core/packages.config diff --git a/src/Gen3Hex.Tests/ArrayRunTests.cs b/src/HexManiac.Tests/ArrayRunTests.cs similarity index 98% rename from src/Gen3Hex.Tests/ArrayRunTests.cs rename to src/HexManiac.Tests/ArrayRunTests.cs index a283e9a6..1045112d 100644 --- a/src/Gen3Hex.Tests/ArrayRunTests.cs +++ b/src/HexManiac.Tests/ArrayRunTests.cs @@ -1,15 +1,15 @@ -using HavenSoft.Gen3Hex.Core; -using HavenSoft.Gen3Hex.Core.Models; -using HavenSoft.Gen3Hex.Core.Models.Runs; -using HavenSoft.Gen3Hex.Core.ViewModels; -using HavenSoft.Gen3Hex.Core.ViewModels.DataFormats; +using HavenSoft.HexManiac.Core; +using HavenSoft.HexManiac.Core.Models; +using HavenSoft.HexManiac.Core.Models.Runs; +using HavenSoft.HexManiac.Core.ViewModels; +using HavenSoft.HexManiac.Core.ViewModels.DataFormats; using System; using System.Collections.Generic; using System.Linq; using System.Text; using Xunit; -namespace HavenSoft.Gen3Hex.Tests { +namespace HavenSoft.HexManiac.Tests { public class ArrayRunTests { [Fact] public void CanParseStringArrayRun() { diff --git a/src/Gen3Hex.Tests/AsciiRunTests.cs b/src/HexManiac.Tests/AsciiRunTests.cs similarity index 86% rename from src/Gen3Hex.Tests/AsciiRunTests.cs rename to src/HexManiac.Tests/AsciiRunTests.cs index ea54dab1..b70cd3bd 100644 --- a/src/Gen3Hex.Tests/AsciiRunTests.cs +++ b/src/HexManiac.Tests/AsciiRunTests.cs @@ -1,10 +1,10 @@ -using HavenSoft.Gen3Hex.Core.Models; -using HavenSoft.Gen3Hex.Core.Models.Runs; -using HavenSoft.Gen3Hex.Core.ViewModels; -using HavenSoft.Gen3Hex.Core.ViewModels.DataFormats; +using HavenSoft.HexManiac.Core.Models; +using HavenSoft.HexManiac.Core.Models.Runs; +using HavenSoft.HexManiac.Core.ViewModels; +using HavenSoft.HexManiac.Core.ViewModels.DataFormats; using Xunit; -namespace HavenSoft.Gen3Hex.Tests { +namespace HavenSoft.HexManiac.Tests { public class AsciiRunTests { [Fact] public void CanCreateAsciiRun() { diff --git a/src/Gen3Hex.Tests/ChangeHistoryTests.cs b/src/HexManiac.Tests/ChangeHistoryTests.cs similarity index 97% rename from src/Gen3Hex.Tests/ChangeHistoryTests.cs rename to src/HexManiac.Tests/ChangeHistoryTests.cs index 3e9fb4a4..f214e7d5 100644 --- a/src/Gen3Hex.Tests/ChangeHistoryTests.cs +++ b/src/HexManiac.Tests/ChangeHistoryTests.cs @@ -1,13 +1,13 @@ -using HavenSoft.Gen3Hex.Core; -using HavenSoft.Gen3Hex.Core.Models; -using HavenSoft.Gen3Hex.Core.ViewModels; -using HavenSoft.Gen3Hex.Core.ViewModels.DataFormats; +using HavenSoft.HexManiac.Core; +using HavenSoft.HexManiac.Core.Models; +using HavenSoft.HexManiac.Core.ViewModels; +using HavenSoft.HexManiac.Core.ViewModels.DataFormats; using System; using System.Collections.Generic; using System.Linq; using Xunit; -namespace HavenSoft.Gen3Hex.Tests { +namespace HavenSoft.HexManiac.Tests { public class ChangeHistoryTests { private readonly ChangeHistory> history; diff --git a/src/Gen3Hex.Tests/FindTests.cs b/src/HexManiac.Tests/FindTests.cs similarity index 98% rename from src/Gen3Hex.Tests/FindTests.cs rename to src/HexManiac.Tests/FindTests.cs index ed2336f4..f289c541 100644 --- a/src/Gen3Hex.Tests/FindTests.cs +++ b/src/HexManiac.Tests/FindTests.cs @@ -1,11 +1,11 @@ -using HavenSoft.Gen3Hex.Core.Models; -using HavenSoft.Gen3Hex.Core.ViewModels; +using HavenSoft.HexManiac.Core.Models; +using HavenSoft.HexManiac.Core.ViewModels; using System.Collections.ObjectModel; using System.Linq; using System.Windows.Input; using Xunit; -namespace HavenSoft.Gen3Hex.Tests { +namespace HavenSoft.HexManiac.Tests { public class FindTests { [Fact] public void FindCanFindSingle() { diff --git a/src/Gen3Hex.Tests/GeneralAppTests.cs b/src/HexManiac.Tests/GeneralAppTests.cs similarity index 98% rename from src/Gen3Hex.Tests/GeneralAppTests.cs rename to src/HexManiac.Tests/GeneralAppTests.cs index 1704d5cd..c0ece589 100644 --- a/src/Gen3Hex.Tests/GeneralAppTests.cs +++ b/src/HexManiac.Tests/GeneralAppTests.cs @@ -1,11 +1,11 @@ -using HavenSoft.Gen3Hex.Core; -using HavenSoft.Gen3Hex.Core.Models; -using HavenSoft.Gen3Hex.Core.ViewModels; +using HavenSoft.HexManiac.Core; +using HavenSoft.HexManiac.Core.Models; +using HavenSoft.HexManiac.Core.ViewModels; using System; using System.Windows.Input; using Xunit; -namespace HavenSoft.Gen3Hex.Tests { +namespace HavenSoft.HexManiac.Tests { public class GeneralAppTests { private readonly EditorViewModel editor; private readonly StubFileSystem fileSystem; diff --git a/src/Gen3Hex.Tests/Gen3Hex.Tests.csproj b/src/HexManiac.Tests/HexManiac.Tests.csproj similarity index 94% rename from src/Gen3Hex.Tests/Gen3Hex.Tests.csproj rename to src/HexManiac.Tests/HexManiac.Tests.csproj index 5654e3d7..8d3e6223 100644 --- a/src/Gen3Hex.Tests/Gen3Hex.Tests.csproj +++ b/src/HexManiac.Tests/HexManiac.Tests.csproj @@ -8,8 +8,8 @@ AnyCPU {B6A52732-E0F8-466D-8E29-664C797A21FA} Library - HavenSoft.Gen3Hex.Tests - Gen3Hex.Tests + HavenSoft.HexManiac.Tests + HexManiac.Tests v4.7.2 512 {3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} @@ -55,7 +55,7 @@ - + StubDataModel.cs @@ -83,9 +83,9 @@ - + {b7b9d932-4271-493d-aadd-6cf147c91373} - Gen3Hex.Core + HexManiac.Core @@ -103,7 +103,7 @@ if not exist $(SolutionDir)artifacts\$(AssemblyName)\codegen mkdir $(SolutionDir)artifacts\$(AssemblyName)\codegen -$(SolutionDir)packages\HavenSoft.AutoImplement.1.1.1\AutoImplement $(SolutionDir)artifacts\Gen3Hex.Core\bin\$(ConfigurationName)\Gen3Hex.Core.dll ITabContent IFileSystem IViewPort IDataModel +$(SolutionDir)packages\HavenSoft.AutoImplement.1.1.1\AutoImplement $(SolutionDir)artifacts\HexManiac.Core\bin\$(ConfigurationName)\HexManiac.Core.dll ITabContent IFileSystem IViewPort IDataModel move /Y StubTabContent.cs $(SolutionDir)artifacts\$(AssemblyName)\codegen move /Y StubFileSystem.cs $(SolutionDir)artifacts\$(AssemblyName)\codegen move /Y StubViewPort.cs $(SolutionDir)artifacts\$(AssemblyName)\codegen diff --git a/src/Gen3Hex.Tests/NavigationTests.cs b/src/HexManiac.Tests/NavigationTests.cs similarity index 98% rename from src/Gen3Hex.Tests/NavigationTests.cs rename to src/HexManiac.Tests/NavigationTests.cs index 89a5b427..bf0820bb 100644 --- a/src/Gen3Hex.Tests/NavigationTests.cs +++ b/src/HexManiac.Tests/NavigationTests.cs @@ -1,11 +1,11 @@ -using HavenSoft.Gen3Hex.Core; -using HavenSoft.Gen3Hex.Core.Models; -using HavenSoft.Gen3Hex.Core.ViewModels; +using HavenSoft.HexManiac.Core; +using HavenSoft.HexManiac.Core.Models; +using HavenSoft.HexManiac.Core.ViewModels; using System.Collections.Generic; using System.Windows.Input; using Xunit; -namespace HavenSoft.Gen3Hex.Tests { +namespace HavenSoft.HexManiac.Tests { public class NavigationTests { [Fact] public void AddressesAreCorrect() { diff --git a/src/Gen3Hex.Tests/PointerModelTests.cs b/src/HexManiac.Tests/PointerModelTests.cs similarity index 99% rename from src/Gen3Hex.Tests/PointerModelTests.cs rename to src/HexManiac.Tests/PointerModelTests.cs index 084d5928..2fb12737 100644 --- a/src/Gen3Hex.Tests/PointerModelTests.cs +++ b/src/HexManiac.Tests/PointerModelTests.cs @@ -1,14 +1,14 @@ -using HavenSoft.Gen3Hex.Core; -using HavenSoft.Gen3Hex.Core.Models; -using HavenSoft.Gen3Hex.Core.Models.Runs; -using HavenSoft.Gen3Hex.Core.ViewModels; -using HavenSoft.Gen3Hex.Core.ViewModels.DataFormats; +using HavenSoft.HexManiac.Core; +using HavenSoft.HexManiac.Core.Models; +using HavenSoft.HexManiac.Core.Models.Runs; +using HavenSoft.HexManiac.Core.ViewModels; +using HavenSoft.HexManiac.Core.ViewModels.DataFormats; using System; using System.Collections.Generic; using System.Linq; using Xunit; -namespace HavenSoft.Gen3Hex.Tests { +namespace HavenSoft.HexManiac.Tests { public class PointerModelTests { [Fact] public void PointerModelFindsNoPointersInRandomData() { diff --git a/src/Gen3Hex.Tests/StringModelTests.cs b/src/HexManiac.Tests/StringModelTests.cs similarity index 98% rename from src/Gen3Hex.Tests/StringModelTests.cs rename to src/HexManiac.Tests/StringModelTests.cs index 4d38d70d..8db5f276 100644 --- a/src/Gen3Hex.Tests/StringModelTests.cs +++ b/src/HexManiac.Tests/StringModelTests.cs @@ -1,14 +1,14 @@ -using HavenSoft.Gen3Hex.Core; -using HavenSoft.Gen3Hex.Core.Models; -using HavenSoft.Gen3Hex.Core.Models.Runs; -using HavenSoft.Gen3Hex.Core.ViewModels; -using HavenSoft.Gen3Hex.Core.ViewModels.DataFormats; +using HavenSoft.HexManiac.Core; +using HavenSoft.HexManiac.Core.Models; +using HavenSoft.HexManiac.Core.Models.Runs; +using HavenSoft.HexManiac.Core.ViewModels; +using HavenSoft.HexManiac.Core.ViewModels.DataFormats; using System; using System.Collections.Generic; using System.Linq; using Xunit; -namespace HavenSoft.Gen3Hex.Tests { +namespace HavenSoft.HexManiac.Tests { public class StringModelTests { [Fact] public void CanRecognizeString() { diff --git a/src/Gen3Hex.Tests/ToolTests.cs b/src/HexManiac.Tests/ToolTests.cs similarity index 95% rename from src/Gen3Hex.Tests/ToolTests.cs rename to src/HexManiac.Tests/ToolTests.cs index 8e4f9a6d..7b9c3ab1 100644 --- a/src/Gen3Hex.Tests/ToolTests.cs +++ b/src/HexManiac.Tests/ToolTests.cs @@ -1,15 +1,15 @@ -using HavenSoft.Gen3Hex.Core; -using HavenSoft.Gen3Hex.Core.Models; -using HavenSoft.Gen3Hex.Core.Models.Runs; -using HavenSoft.Gen3Hex.Core.ViewModels; -using HavenSoft.Gen3Hex.Core.ViewModels.DataFormats; -using HavenSoft.Gen3Hex.Core.ViewModels.Tools; +using HavenSoft.HexManiac.Core; +using HavenSoft.HexManiac.Core.Models; +using HavenSoft.HexManiac.Core.Models.Runs; +using HavenSoft.HexManiac.Core.ViewModels; +using HavenSoft.HexManiac.Core.ViewModels.DataFormats; +using HavenSoft.HexManiac.Core.ViewModels.Tools; using System.Collections.Generic; using System.Globalization; using System.Linq; using Xunit; -namespace HavenSoft.Gen3Hex.Tests { +namespace HavenSoft.HexManiac.Tests { public class ToolTests { [Fact] public void ViewPortHasTools() { diff --git a/src/Gen3Hex.Tests/ViewPortCursorTests.cs b/src/HexManiac.Tests/ViewPortCursorTests.cs similarity index 98% rename from src/Gen3Hex.Tests/ViewPortCursorTests.cs rename to src/HexManiac.Tests/ViewPortCursorTests.cs index 2cb1a088..f9c9734b 100644 --- a/src/Gen3Hex.Tests/ViewPortCursorTests.cs +++ b/src/HexManiac.Tests/ViewPortCursorTests.cs @@ -1,8 +1,8 @@ -using HavenSoft.Gen3Hex.Core.Models; -using HavenSoft.Gen3Hex.Core.ViewModels; +using HavenSoft.HexManiac.Core.Models; +using HavenSoft.HexManiac.Core.ViewModels; using Xunit; -namespace HavenSoft.Gen3Hex.Tests { +namespace HavenSoft.HexManiac.Tests { public class ViewPortCursorTests { [Fact] public void CursorCanMoveAllFourDirections() { diff --git a/src/Gen3Hex.Tests/ViewPortEditTests.cs b/src/HexManiac.Tests/ViewPortEditTests.cs similarity index 98% rename from src/Gen3Hex.Tests/ViewPortEditTests.cs rename to src/HexManiac.Tests/ViewPortEditTests.cs index 5218287e..9c837c8c 100644 --- a/src/Gen3Hex.Tests/ViewPortEditTests.cs +++ b/src/HexManiac.Tests/ViewPortEditTests.cs @@ -1,12 +1,12 @@ -using HavenSoft.Gen3Hex.Core; -using HavenSoft.Gen3Hex.Core.Models; -using HavenSoft.Gen3Hex.Core.ViewModels; -using HavenSoft.Gen3Hex.Core.ViewModels.DataFormats; +using HavenSoft.HexManiac.Core; +using HavenSoft.HexManiac.Core.Models; +using HavenSoft.HexManiac.Core.ViewModels; +using HavenSoft.HexManiac.Core.ViewModels.DataFormats; using System; using System.Linq; using Xunit; -namespace HavenSoft.Gen3Hex.Tests { +namespace HavenSoft.HexManiac.Tests { public class ViewPortEditTests { [Fact] public void CanEditData() { diff --git a/src/Gen3Hex.Tests/ViewPortSaveTests.cs b/src/HexManiac.Tests/ViewPortSaveTests.cs similarity index 98% rename from src/Gen3Hex.Tests/ViewPortSaveTests.cs rename to src/HexManiac.Tests/ViewPortSaveTests.cs index 1dd469de..827072c3 100644 --- a/src/Gen3Hex.Tests/ViewPortSaveTests.cs +++ b/src/HexManiac.Tests/ViewPortSaveTests.cs @@ -1,13 +1,13 @@ -using HavenSoft.Gen3Hex.Core; -using HavenSoft.Gen3Hex.Core.Models; -using HavenSoft.Gen3Hex.Core.ViewModels; -using HavenSoft.Gen3Hex.Core.ViewModels.DataFormats; +using HavenSoft.HexManiac.Core; +using HavenSoft.HexManiac.Core.Models; +using HavenSoft.HexManiac.Core.ViewModels; +using HavenSoft.HexManiac.Core.ViewModels.DataFormats; using System.Collections.Generic; using System.IO; using System.Linq; using Xunit; -namespace HavenSoft.Gen3Hex.Tests { +namespace HavenSoft.HexManiac.Tests { public class ViewPortSaveTests { private readonly StubFileSystem fileSystem; diff --git a/src/Gen3Hex.Tests/ViewPortScrollTests.cs b/src/HexManiac.Tests/ViewPortScrollTests.cs similarity index 98% rename from src/Gen3Hex.Tests/ViewPortScrollTests.cs rename to src/HexManiac.Tests/ViewPortScrollTests.cs index 42a4f938..b8b6f05b 100644 --- a/src/Gen3Hex.Tests/ViewPortScrollTests.cs +++ b/src/HexManiac.Tests/ViewPortScrollTests.cs @@ -1,11 +1,11 @@ -using HavenSoft.Gen3Hex.Core.Models; -using HavenSoft.Gen3Hex.Core.ViewModels; +using HavenSoft.HexManiac.Core.Models; +using HavenSoft.HexManiac.Core.ViewModels; using System.Collections.Generic; using Xunit; [assembly: System.Reflection.AssemblyTitle("HexTests")] -namespace HavenSoft.Gen3Hex.Tests { +namespace HavenSoft.HexManiac.Tests { public class ViewPortTests { [Fact] public void ViewPortNotifiesOnSizeChange() { diff --git a/src/Gen3Hex.Tests/packages.config b/src/HexManiac.Tests/packages.config similarity index 100% rename from src/Gen3Hex.Tests/packages.config rename to src/HexManiac.Tests/packages.config diff --git a/src/Gen3Hex.WPF/Controls/HexContent.cs b/src/HexManiac.WPF/Controls/HexContent.cs similarity index 98% rename from src/Gen3Hex.WPF/Controls/HexContent.cs rename to src/HexManiac.WPF/Controls/HexContent.cs index dbf74fe9..31075e2f 100644 --- a/src/Gen3Hex.WPF/Controls/HexContent.cs +++ b/src/HexManiac.WPF/Controls/HexContent.cs @@ -1,8 +1,8 @@ -using HavenSoft.Gen3Hex.Core; -using HavenSoft.Gen3Hex.Core.Models; -using HavenSoft.Gen3Hex.Core.ViewModels; -using HavenSoft.Gen3Hex.Core.ViewModels.DataFormats; -using HavenSoft.Gen3Hex.WPF.Implementations; +using HavenSoft.HexManiac.Core; +using HavenSoft.HexManiac.Core.Models; +using HavenSoft.HexManiac.Core.ViewModels; +using HavenSoft.HexManiac.Core.ViewModels.DataFormats; +using HavenSoft.HexManiac.WPF.Implementations; using System; using System.Collections.Generic; using System.Collections.Specialized; @@ -14,10 +14,10 @@ using System.Windows.Controls.Primitives; using System.Windows.Data; using System.Windows.Input; using System.Windows.Media; -using ModelPoint = HavenSoft.Gen3Hex.Core.Models.Point; +using ModelPoint = HavenSoft.HexManiac.Core.Models.Point; using ScreenPoint = System.Windows.Point; -namespace HavenSoft.Gen3Hex.WPF.Controls { +namespace HavenSoft.HexManiac.WPF.Controls { public class HexContent : FrameworkElement { public const double CellWidth = 30, CellHeight = 20; diff --git a/src/Gen3Hex.WPF/Controls/IntegerToBooleanViaMatchConverter.cs b/src/HexManiac.WPF/Controls/IntegerToBooleanViaMatchConverter.cs similarity index 93% rename from src/Gen3Hex.WPF/Controls/IntegerToBooleanViaMatchConverter.cs rename to src/HexManiac.WPF/Controls/IntegerToBooleanViaMatchConverter.cs index 881cdc4f..3be2ce12 100644 --- a/src/Gen3Hex.WPF/Controls/IntegerToBooleanViaMatchConverter.cs +++ b/src/HexManiac.WPF/Controls/IntegerToBooleanViaMatchConverter.cs @@ -2,7 +2,7 @@ using System.Globalization; using System.Windows.Data; -namespace HavenSoft.Gen3Hex.WPF.Controls { +namespace HavenSoft.HexManiac.WPF.Controls { public class IntegerToBooleanViaMatchConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { var a = value as int?; diff --git a/src/Gen3Hex.WPF/Controls/IntegerToHexConverter.cs b/src/HexManiac.WPF/Controls/IntegerToHexConverter.cs similarity index 93% rename from src/Gen3Hex.WPF/Controls/IntegerToHexConverter.cs rename to src/HexManiac.WPF/Controls/IntegerToHexConverter.cs index deb411a0..dc22cc74 100644 --- a/src/Gen3Hex.WPF/Controls/IntegerToHexConverter.cs +++ b/src/HexManiac.WPF/Controls/IntegerToHexConverter.cs @@ -2,7 +2,7 @@ using System.Globalization; using System.Windows.Data; -namespace HavenSoft.Gen3Hex.WPF.Controls { +namespace HavenSoft.HexManiac.WPF.Controls { public class IntegerToHexConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { if (value is int number) return number.ToString("X6"); diff --git a/src/Gen3Hex.WPF/Controls/StartScreen.xaml b/src/HexManiac.WPF/Controls/StartScreen.xaml similarity index 96% rename from src/Gen3Hex.WPF/Controls/StartScreen.xaml rename to src/HexManiac.WPF/Controls/StartScreen.xaml index 0b4540f2..d94f9f8b 100644 --- a/src/Gen3Hex.WPF/Controls/StartScreen.xaml +++ b/src/HexManiac.WPF/Controls/StartScreen.xaml @@ -1,10 +1,10 @@ - diff --git a/src/Gen3Hex.WPF/Controls/StartScreen.xaml.cs b/src/HexManiac.WPF/Controls/StartScreen.xaml.cs similarity index 76% rename from src/Gen3Hex.WPF/Controls/StartScreen.xaml.cs rename to src/HexManiac.WPF/Controls/StartScreen.xaml.cs index 6151a55e..88ba3465 100644 --- a/src/Gen3Hex.WPF/Controls/StartScreen.xaml.cs +++ b/src/HexManiac.WPF/Controls/StartScreen.xaml.cs @@ -1,12 +1,12 @@ using System.Diagnostics; using System.Windows.Input; -namespace HavenSoft.Gen3Hex.WPF.Controls { +namespace HavenSoft.HexManiac.WPF.Controls { public partial class StartScreen { public StartScreen() => InitializeComponent(); private void PointerHelp(object sender, MouseButtonEventArgs e) { - Process.Start(new ProcessStartInfo("https://github.com/haven1433/gen3hex/wiki/Pointers-and-Anchors")); + Process.Start(new ProcessStartInfo("https://github.com/haven1433/HexManiacAdvance/wiki/Pointers-and-Anchors")); e.Handled = true; } } diff --git a/src/Gen3Hex.WPF/Gen3Hex.WPF.csproj b/src/HexManiac.WPF/HexManiac.WPF.csproj similarity index 96% rename from src/Gen3Hex.WPF/Gen3Hex.WPF.csproj rename to src/HexManiac.WPF/HexManiac.WPF.csproj index 8179b61c..9fbc118f 100644 --- a/src/Gen3Hex.WPF/Gen3Hex.WPF.csproj +++ b/src/HexManiac.WPF/HexManiac.WPF.csproj @@ -6,7 +6,7 @@ AnyCPU {386DC8E2-BABC-475C-94B6-37B3986F5F4C} WinExe - HavenSoft.Gen3Hex.WPF + HavenSoft.HexManiac.WPF HexManiacAdvance v4.7.2 512 @@ -102,9 +102,9 @@ - + {b7b9d932-4271-493d-aadd-6cf147c91373} - Gen3Hex.Core + HexManiac.Core diff --git a/src/Gen3Hex.WPF/Implementations/FormatDrawer.cs b/src/HexManiac.WPF/Implementations/FormatDrawer.cs similarity index 96% rename from src/Gen3Hex.WPF/Implementations/FormatDrawer.cs rename to src/HexManiac.WPF/Implementations/FormatDrawer.cs index a9de0b23..be113c2a 100644 --- a/src/Gen3Hex.WPF/Implementations/FormatDrawer.cs +++ b/src/HexManiac.WPF/Implementations/FormatDrawer.cs @@ -1,12 +1,12 @@ -using HavenSoft.Gen3Hex.Core.ViewModels.DataFormats; -using HavenSoft.Gen3Hex.WPF.Controls; +using HavenSoft.HexManiac.Core.ViewModels.DataFormats; +using HavenSoft.HexManiac.WPF.Controls; using System.Collections.Generic; using System.Globalization; using System.Linq; using System.Windows; using System.Windows.Media; -namespace HavenSoft.Gen3Hex.WPF.Implementations { +namespace HavenSoft.HexManiac.WPF.Implementations { public class FormatDrawer : IDataFormatVisitor { public static int FontSize = 16; @@ -21,7 +21,7 @@ namespace HavenSoft.Gen3Hex.WPF.Implementations { public bool MouseIsOverCurrentFormat { get; set; } - public HavenSoft.Gen3Hex.Core.Models.Point Position { get; set; } + public HavenSoft.HexManiac.Core.Models.Point Position { get; set; } public FormatDrawer(DrawingContext drawingContext, int width, int height) => (context, modelWidth, modelHeight) = (drawingContext, width, height); diff --git a/src/Gen3Hex.WPF/Implementations/WindowsFileSystem.cs b/src/HexManiac.WPF/Implementations/WindowsFileSystem.cs similarity index 97% rename from src/Gen3Hex.WPF/Implementations/WindowsFileSystem.cs rename to src/HexManiac.WPF/Implementations/WindowsFileSystem.cs index 6e4a4718..3e965298 100644 --- a/src/Gen3Hex.WPF/Implementations/WindowsFileSystem.cs +++ b/src/HexManiac.WPF/Implementations/WindowsFileSystem.cs @@ -1,4 +1,4 @@ -using HavenSoft.Gen3Hex.Core.Models; +using HavenSoft.HexManiac.Core.Models; using Microsoft.Win32; using System; using System.Collections.Generic; @@ -7,7 +7,7 @@ using System.Linq; using System.Windows; using System.Windows.Threading; -namespace HavenSoft.Gen3Hex.WPF.Implementations { +namespace HavenSoft.HexManiac.WPF.Implementations { public class WindowsFileSystem : IFileSystem { private readonly Dictionary> watchers = new Dictionary>(); private readonly Dictionary>> listeners = new Dictionary>>(); diff --git a/src/Gen3Hex.WPF/Resources/AppIcon.ico b/src/HexManiac.WPF/Resources/AppIcon.ico similarity index 100% rename from src/Gen3Hex.WPF/Resources/AppIcon.ico rename to src/HexManiac.WPF/Resources/AppIcon.ico diff --git a/src/Gen3Hex.WPF/Resources/AppImage.png b/src/HexManiac.WPF/Resources/AppImage.png similarity index 100% rename from src/Gen3Hex.WPF/Resources/AppImage.png rename to src/HexManiac.WPF/Resources/AppImage.png diff --git a/src/Gen3Hex.WPF/Resources/Icons.xaml b/src/HexManiac.WPF/Resources/Icons.xaml similarity index 98% rename from src/Gen3Hex.WPF/Resources/Icons.xaml rename to src/HexManiac.WPF/Resources/Icons.xaml index eb005114..924c341d 100644 --- a/src/Gen3Hex.WPF/Resources/Icons.xaml +++ b/src/HexManiac.WPF/Resources/Icons.xaml @@ -4,12 +4,12 @@ This ItemsControl is meant to be used like a resource. Instead, access these icons using IconExtensions. --> - diff --git a/src/Gen3Hex.WPF/Resources/Icons.xaml.cs b/src/HexManiac.WPF/Resources/Icons.xaml.cs similarity index 61% rename from src/Gen3Hex.WPF/Resources/Icons.xaml.cs rename to src/HexManiac.WPF/Resources/Icons.xaml.cs index 808da7c3..a8084d7e 100644 --- a/src/Gen3Hex.WPF/Resources/Icons.xaml.cs +++ b/src/HexManiac.WPF/Resources/Icons.xaml.cs @@ -1,4 +1,4 @@ -namespace HavenSoft.Gen3Hex.WPF.Resources { +namespace HavenSoft.HexManiac.WPF.Resources { partial class Icons { public Icons() => InitializeComponent(); } diff --git a/src/Gen3Hex.WPF/Resources/MarkupExtensions.cs b/src/HexManiac.WPF/Resources/MarkupExtensions.cs similarity index 98% rename from src/Gen3Hex.WPF/Resources/MarkupExtensions.cs rename to src/HexManiac.WPF/Resources/MarkupExtensions.cs index 68561a32..fab0b6eb 100644 --- a/src/Gen3Hex.WPF/Resources/MarkupExtensions.cs +++ b/src/HexManiac.WPF/Resources/MarkupExtensions.cs @@ -4,7 +4,7 @@ using System.Windows; using System.Windows.Markup; using System.Windows.Media; -namespace HavenSoft.Gen3Hex.WPF.Resources { +namespace HavenSoft.HexManiac.WPF.Resources { /// /// {hs:RotateTransform 60, 0, 0} /// diff --git a/src/Gen3Hex.WPF/Resources/Solarized.cs b/src/HexManiac.WPF/Resources/Solarized.cs similarity index 100% rename from src/Gen3Hex.WPF/Resources/Solarized.cs rename to src/HexManiac.WPF/Resources/Solarized.cs diff --git a/src/Gen3Hex.WPF/Windows/AboutWindow.xaml b/src/HexManiac.WPF/Windows/AboutWindow.xaml similarity index 88% rename from src/Gen3Hex.WPF/Windows/AboutWindow.xaml rename to src/HexManiac.WPF/Windows/AboutWindow.xaml index c70a2d79..007a2be6 100644 --- a/src/Gen3Hex.WPF/Windows/AboutWindow.xaml +++ b/src/HexManiac.WPF/Windows/AboutWindow.xaml @@ -1,4 +1,4 @@ - This is a prerelease debug version: please do not distribute! - MIT License + MIT License Solarized diff --git a/src/Gen3Hex.WPF/Windows/AboutWindow.xaml.cs b/src/HexManiac.WPF/Windows/AboutWindow.xaml.cs similarity index 93% rename from src/Gen3Hex.WPF/Windows/AboutWindow.xaml.cs rename to src/HexManiac.WPF/Windows/AboutWindow.xaml.cs index 89678294..02c89661 100644 --- a/src/Gen3Hex.WPF/Windows/AboutWindow.xaml.cs +++ b/src/HexManiac.WPF/Windows/AboutWindow.xaml.cs @@ -2,7 +2,7 @@ using System.Reflection; using System.Windows.Navigation; -namespace HavenSoft.Gen3Hex.WPF.Windows { +namespace HavenSoft.HexManiac.WPF.Windows { partial class AboutWindow { public AboutWindow() { InitializeComponent(); diff --git a/src/Gen3Hex.WPF/Windows/App.config b/src/HexManiac.WPF/Windows/App.config similarity index 100% rename from src/Gen3Hex.WPF/Windows/App.config rename to src/HexManiac.WPF/Windows/App.config diff --git a/src/Gen3Hex.WPF/Windows/App.xaml b/src/HexManiac.WPF/Windows/App.xaml similarity index 99% rename from src/Gen3Hex.WPF/Windows/App.xaml rename to src/HexManiac.WPF/Windows/App.xaml index 2cb51912..287edde3 100644 --- a/src/Gen3Hex.WPF/Windows/App.xaml +++ b/src/HexManiac.WPF/Windows/App.xaml @@ -1,7 +1,7 @@ - diff --git a/src/Gen3Hex.WPF/Windows/App.xaml.cs b/src/HexManiac.WPF/Windows/App.xaml.cs similarity index 88% rename from src/Gen3Hex.WPF/Windows/App.xaml.cs rename to src/HexManiac.WPF/Windows/App.xaml.cs index 91cf97ba..0fd292b5 100644 --- a/src/Gen3Hex.WPF/Windows/App.xaml.cs +++ b/src/HexManiac.WPF/Windows/App.xaml.cs @@ -1,13 +1,13 @@ -using HavenSoft.Gen3Hex.Core.Models; -using HavenSoft.Gen3Hex.Core.ViewModels; -using HavenSoft.Gen3Hex.WPF.Implementations; +using HavenSoft.HexManiac.Core.Models; +using HavenSoft.HexManiac.Core.ViewModels; +using HavenSoft.HexManiac.WPF.Implementations; using System.IO; using System.Reflection; using System.Windows; -[assembly: AssemblyTitle("Gen3Hex")] +[assembly: AssemblyTitle("HexManiacAdvance")] -namespace HavenSoft.Gen3Hex.WPF.Windows { +namespace HavenSoft.HexManiac.WPF.Windows { partial class App { protected override void OnStartup(StartupEventArgs e) { base.OnStartup(e); diff --git a/src/Gen3Hex.WPF/Windows/MainWindow.xaml b/src/HexManiac.WPF/Windows/MainWindow.xaml similarity index 98% rename from src/Gen3Hex.WPF/Windows/MainWindow.xaml rename to src/HexManiac.WPF/Windows/MainWindow.xaml index 241a3cd7..abd6decf 100644 --- a/src/Gen3Hex.WPF/Windows/MainWindow.xaml +++ b/src/HexManiac.WPF/Windows/MainWindow.xaml @@ -1,9 +1,9 @@ - deferredActions = new List(); @@ -119,8 +119,8 @@ namespace HavenSoft.Gen3Hex.WPF.Windows { if (ViewModel.Count == 0) Close(); } - private void WikiClick(object sender, EventArgs e) => System.Diagnostics.Process.Start("https://github.com/haven1433/gen3hex/wiki"); - private void ReportIssueClick(object sender, EventArgs e) => System.Diagnostics.Process.Start("https://github.com/haven1433/gen3hex/issues"); + private void WikiClick(object sender, EventArgs e) => System.Diagnostics.Process.Start("https://github.com/haven1433/HexManiacAdvance/wiki"); + private void ReportIssueClick(object sender, EventArgs e) => System.Diagnostics.Process.Start("https://github.com/haven1433/HexManiacAdvance/issues"); private void AboutClick(object sender, EventArgs e) => new AboutWindow().ShowDialog(); private void EditBoxVisibilityChanged(object sender, DependencyPropertyChangedEventArgs e) { diff --git a/src/Gen3Hex.WPF/app.config b/src/HexManiac.WPF/app.config similarity index 100% rename from src/Gen3Hex.WPF/app.config rename to src/HexManiac.WPF/app.config