Some more progress on the editor.
This commit is contained in:
parent
d2aa72e4f5
commit
fe4eb7c74c
@ -33,12 +33,12 @@ public static class VkvModule
|
|||||||
|
|
||||||
if (parentNode is null) throw new("Deserialized VKV node is null.");
|
if (parentNode is null) throw new("Deserialized VKV node is null.");
|
||||||
}
|
}
|
||||||
catch
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
#if DEBUG
|
#if DEBUG
|
||||||
throw;
|
throw;
|
||||||
#else
|
#else
|
||||||
throw new($"Error parsing file to Valve KeyValues format: {e.Message}");
|
throw new($"Error parsing file to Valve KeyValues format: {ex.Message}");
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -68,10 +68,10 @@ public static class VkvModule
|
|||||||
private static VkvModifyOption VkvModifyNode(ref VkvNode node, ref string nodeName,
|
private static VkvModifyOption VkvModifyNode(ref VkvNode node, ref string nodeName,
|
||||||
ref VkvModifyContext context, bool isGlobal)
|
ref VkvModifyContext context, bool isGlobal)
|
||||||
{
|
{
|
||||||
|
#if DEBUG
|
||||||
string add = $" {nodeName}";
|
string add = $" {nodeName}";
|
||||||
Console.Title += add;
|
Console.Title += add;
|
||||||
|
#endif
|
||||||
VkvModifyMode mode = VkvModifyMode.Default;
|
|
||||||
|
|
||||||
int subIndex = -1; // Represents the index of the sub node currently being modified.
|
int subIndex = -1; // Represents the index of the sub node currently being modified.
|
||||||
// If the variable is set to -1, it represents the title.
|
// If the variable is set to -1, it represents the title.
|
||||||
@ -80,24 +80,26 @@ public static class VkvModule
|
|||||||
VkvTreeNode? tree = node as VkvTreeNode;
|
VkvTreeNode? tree = node as VkvTreeNode;
|
||||||
|
|
||||||
VkvModifyOption? option = null;
|
VkvModifyOption? option = null;
|
||||||
|
VkvModifySelection selection = VkvModifySelection.Name;
|
||||||
while (true)
|
while (true)
|
||||||
{
|
{
|
||||||
// Color the display white, wait for a key, then reset and handle the key press.
|
// Color the display white, wait for a key, then reset and handle the key press.
|
||||||
|
string line = context.displayLines[context.lineIndex];
|
||||||
|
|
||||||
Console.SetCursorPosition(0, context.startingCursor + context.lineIndex);
|
Console.SetCursorPosition(0, context.startingCursor + context.lineIndex);
|
||||||
Console.ForegroundColor = ConsoleColor.Black;
|
Console.Write(Whitify(line, selection));
|
||||||
Console.BackgroundColor = ConsoleColor.White;
|
|
||||||
Console.Write(context.displayLines[context.lineIndex]);
|
|
||||||
Console.ResetColor();
|
Console.ResetColor();
|
||||||
|
|
||||||
if (!option.HasValue) option = Console.ReadKey(true).Key switch
|
if (!option.HasValue) option = Console.ReadKey(true).Key switch
|
||||||
{
|
{
|
||||||
ConsoleKey.DownArrow => VkvModifyOption.IncSubIndex,
|
ConsoleKey.DownArrow => VkvModifyOption.IncSubIndex,
|
||||||
ConsoleKey.UpArrow => VkvModifyOption.DecSubIndex,
|
ConsoleKey.UpArrow => VkvModifyOption.DecSubIndex,
|
||||||
|
ConsoleKey.Escape => VkvModifyOption.ExitAll,
|
||||||
_ => VkvModifyOption.Nothing
|
_ => VkvModifyOption.Nothing
|
||||||
};
|
};
|
||||||
|
|
||||||
Console.CursorLeft = 0; // This is assuming the cursor hasn't moved, which it shouldn't.
|
Console.CursorLeft = 0; // This is assuming the cursor hasn't moved, which it shouldn't.
|
||||||
Console.Write(context.displayLines[context.lineIndex]);
|
Console.Write(line + new string(' ', Console.WindowWidth - line.Length));
|
||||||
|
|
||||||
// Now we handle the key press.
|
// Now we handle the key press.
|
||||||
switch (option)
|
switch (option)
|
||||||
@ -134,8 +136,12 @@ public static class VkvModule
|
|||||||
{
|
{
|
||||||
// We're outside the maximum sub nodes. Let's increment the parent
|
// We're outside the maximum sub nodes. Let's increment the parent
|
||||||
// sub index and end this method.
|
// sub index and end this method.
|
||||||
|
// Incrementing the line index to overlook the next line, '}'
|
||||||
|
|
||||||
|
#if DEBUG
|
||||||
Console.Title = Console.Title[..^add.Length];
|
Console.Title = Console.Title[..^add.Length];
|
||||||
|
#endif
|
||||||
|
context.lineIndex++;
|
||||||
return VkvModifyOption.IncSubIndex;
|
return VkvModifyOption.IncSubIndex;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -167,6 +173,14 @@ public static class VkvModule
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
// TODO: This is where we can decide to add sub nodes.
|
// TODO: This is where we can decide to add sub nodes.
|
||||||
|
option = null;
|
||||||
|
selection = VkvModifySelection.CreateNew;
|
||||||
|
|
||||||
|
#if DEBUG
|
||||||
|
string secondAdd = " [CREATE NEW]";
|
||||||
|
add += secondAdd;
|
||||||
|
Console.Title += secondAdd;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -175,47 +189,27 @@ public static class VkvModule
|
|||||||
// We aren't in a tree. We just change the parent sub index and
|
// We aren't in a tree. We just change the parent sub index and
|
||||||
// end this method (and increment the line).
|
// end this method (and increment the line).
|
||||||
|
|
||||||
|
#if DEBUG
|
||||||
Console.Title = Console.Title[..^add.Length];
|
Console.Title = Console.Title[..^add.Length];
|
||||||
|
#endif
|
||||||
return VkvModifyOption.IncSubIndex;
|
return VkvModifyOption.IncSubIndex;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case VkvModifyOption.DecSubIndex:
|
case VkvModifyOption.DecSubIndex:
|
||||||
if (tree is not null)
|
// TODO: Implement when moving downward is complete.
|
||||||
{
|
// It's a little weird to not be able to move back up,
|
||||||
subIndex--;
|
// I know, but it's gonna be weirder to implement, and
|
||||||
|
// I only want to do it once.
|
||||||
if (subIndex == -2)
|
option = null;
|
||||||
{
|
|
||||||
// We're outside the maximum sub nodes. Let's decrement the parent
|
|
||||||
// sub index and end this method (and decrement the line).
|
|
||||||
|
|
||||||
Console.Title = Console.Title[..^add.Length];
|
|
||||||
return VkvModifyOption.DecSubIndex;
|
|
||||||
}
|
|
||||||
else if (subIndex == -1)
|
|
||||||
{
|
|
||||||
// We just shifted down from the title to the first sub node.
|
|
||||||
// We need to overlook the next line, '{'.
|
|
||||||
|
|
||||||
context.lineIndex -= 2;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// We're in a valid range. Let's just change the sub node we're
|
|
||||||
// focused on.
|
|
||||||
context.lineIndex--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// We aren't in a tree. We just change the parent sub index and
|
|
||||||
// end this method (and decrement the line).
|
|
||||||
|
|
||||||
Console.Title = Console.Title[..^add.Length];
|
|
||||||
return VkvModifyOption.DecSubIndex;
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case VkvModifyOption.ExitAll:
|
||||||
|
return VkvModifyOption.ExitAll;
|
||||||
|
|
||||||
|
default:
|
||||||
|
option = null;
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -259,6 +253,65 @@ public static class VkvModule
|
|||||||
return lines;
|
return lines;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static string Whitify(string content, VkvModifySelection selection)
|
||||||
|
{
|
||||||
|
StringBuilder result = new();
|
||||||
|
|
||||||
|
// This is definitely optimizable, but I don't feel like doing that yet.
|
||||||
|
// Maybe in the future.
|
||||||
|
int firstQuote = content.IndexOf('\"'),
|
||||||
|
secondQuote = content[(firstQuote + 1)..].IndexOf('\"') + firstQuote + 1,
|
||||||
|
thirdQuote = content[(secondQuote + 1)..].IndexOf('\"') + secondQuote + 1,
|
||||||
|
fourthQuote = content[(thirdQuote + 1)..].IndexOf('\"') + thirdQuote + 1;
|
||||||
|
|
||||||
|
int startChar = 0;
|
||||||
|
while (char.IsWhiteSpace(content[startChar])) startChar++;
|
||||||
|
|
||||||
|
int endChar = content.Length - 1;
|
||||||
|
while (char.IsWhiteSpace(content[endChar])) endChar--;
|
||||||
|
|
||||||
|
switch (selection)
|
||||||
|
{
|
||||||
|
case VkvModifySelection.Name:
|
||||||
|
if (firstQuote < 0 || secondQuote < 0) return content;
|
||||||
|
|
||||||
|
result.Append(content[..firstQuote]);
|
||||||
|
result.Append("\x1b[107m");
|
||||||
|
result.Append(content[firstQuote..(secondQuote + 1)]);
|
||||||
|
result.Append("\x1b[0m");
|
||||||
|
result.Append(content[(secondQuote + 1)..]);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case VkvModifySelection.Value:
|
||||||
|
if (thirdQuote < 0 || fourthQuote < 0) return content;
|
||||||
|
|
||||||
|
result.Append(content[..thirdQuote]);
|
||||||
|
result.Append("\x1b[107m");
|
||||||
|
result.Append(content[thirdQuote..(fourthQuote + 1)]);
|
||||||
|
result.Append("\x1b[0m");
|
||||||
|
result.Append(content[(fourthQuote + 1)..]);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case VkvModifySelection.Delete:
|
||||||
|
const string addDelete = "[Delete]";
|
||||||
|
|
||||||
|
result.Append($"\x1b[107m\x1b[31m{addDelete}\x1b[0m ");
|
||||||
|
if (addDelete.Length + 1 > startChar) result.Append(content[startChar..]);
|
||||||
|
else result.Append(content[(addDelete.Length + 1)..]);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case VkvModifySelection.CreateNew:
|
||||||
|
result.Append(content[..startChar]);
|
||||||
|
result.Append("\x1b[107m");
|
||||||
|
result.Append(content[startChar..(endChar + 1)]);
|
||||||
|
result.Append("\x1b[0m");
|
||||||
|
result.Append(content[(endChar + 1)..]);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return result.ToString();
|
||||||
|
}
|
||||||
|
|
||||||
private class VkvModifyContext
|
private class VkvModifyContext
|
||||||
{
|
{
|
||||||
public required List<string> displayLines;
|
public required List<string> displayLines;
|
||||||
@ -272,15 +325,19 @@ public static class VkvModule
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private enum VkvModifyMode
|
|
||||||
{
|
|
||||||
Default
|
|
||||||
}
|
|
||||||
private enum VkvModifyOption
|
private enum VkvModifyOption
|
||||||
{
|
{
|
||||||
Nothing,
|
Nothing,
|
||||||
IncSubIndex,
|
IncSubIndex,
|
||||||
DecSubIndex
|
DecSubIndex,
|
||||||
|
ExitAll
|
||||||
}
|
}
|
||||||
#endregion
|
private enum VkvModifySelection
|
||||||
|
{
|
||||||
|
Name,
|
||||||
|
Value,
|
||||||
|
Delete,
|
||||||
|
CreateNew
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user