Some progress on the delete function.

This commit is contained in:
That-One-Nerd 2023-06-24 18:39:09 -04:00
parent 4016b89855
commit 5d2393dd66
2 changed files with 171 additions and 15 deletions

View File

@ -74,19 +74,23 @@ public static class VkvModule
} }
#region The VKV Modification System #region The VKV Modification System
private static void VkvModifyWhole(ref VkvNode parentNode, ref string parentNodeName) private static void VkvModifyWhole(ref VkvNode rootNode, ref string rootNodeName)
{ {
// Generate reference context for passing to the modification methods. // Generate reference context for passing to the modification methods.
VkvModifyContext context = new() VkvModifyContext context = new()
{ {
displayLines = VkvModifyGetLines(parentNode, parentNodeName, 0) displayLines = VkvModifyGetLines(rootNode, rootNodeName, 0),
rootNode = rootNode,
rootNodeName = rootNodeName
}; };
// Make an initial printing of the vkv node. // Make an initial printing of the vkv node.
VkvModifyPrintAll(ref context, false); VkvModifyPrintAll(ref context, false);
// Start modifying the parent node. // Start modifying the root node.
VkvModifyNode(ref parentNode, ref parentNodeName, ref context, true); VkvTreeNode? nullNode = null;
int nullInt = default;
VkvModifyNode(ref rootNode, ref rootNodeName, ref context, true, ref nullNode, ref nullInt);
// Done editing, let's reset the cursor position and exit the command. // Done editing, let's reset the cursor position and exit the command.
Console.ResetColor(); Console.ResetColor();
@ -94,7 +98,7 @@ 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, ref VkvTreeNode? parentNode, ref int parentSubIndex)
{ {
#if DEBUG #if DEBUG
string add = $" {nodeName}"; string add = $" {nodeName}";
@ -154,10 +158,10 @@ public static class VkvModule
string subNodeKey = subNode.Value.Key; string subNodeKey = subNode.Value.Key;
VkvNode subNodeValue = subNode.Value.Value; VkvNode subNodeValue = subNode.Value.Value;
VkvModifyOption status = VkvModifyOption status =
VkvModifyNode(ref subNodeValue, ref subNodeKey, ref context, false); VkvModifyNode(ref subNodeValue, ref subNodeKey, ref context, false, ref tree, ref subIndex);
// Update the parent node with our modified sub node. // Update the parent node with our modified sub node.
tree[subIndex] = new(subNodeKey, subNodeValue); tree![subIndex] = new(subNodeKey, subNodeValue);
// Set the next instruction. // Set the next instruction.
option = status; option = status;
@ -192,10 +196,10 @@ public static class VkvModule
VkvNode subNodeValue = subNode.Value.Value; VkvNode subNodeValue = subNode.Value.Value;
VkvModifyOption status = VkvModifyOption status =
VkvModifyNode(ref subNodeValue, ref subNodeKey, ref context, false); VkvModifyNode(ref subNodeValue, ref subNodeKey, ref context, false, ref tree, ref subIndex);
// Update the parent node with our modified sub node. // Update the parent node with our modified sub node.
tree[subIndex] = new(subNodeKey, subNodeValue); tree![subIndex] = new(subNodeKey, subNodeValue);
// Set the next instruction. // Set the next instruction.
option = status; option = status;
@ -248,7 +252,7 @@ public static class VkvModule
case VkvModifyOption.LShiftMode: case VkvModifyOption.LShiftMode:
selection = selection switch selection = selection switch
{ {
VkvModifySelection.Name => VkvModifySelection.Delete, VkvModifySelection.Name => isGlobal ? VkvModifySelection.Name : VkvModifySelection.Delete,
VkvModifySelection.Value => VkvModifySelection.Name, VkvModifySelection.Value => VkvModifySelection.Name,
_ => selection _ => selection
}; };
@ -259,7 +263,24 @@ public static class VkvModule
switch (selection) switch (selection)
{ {
case VkvModifySelection.Delete: case VkvModifySelection.Delete:
// TODO string unrefNodeName = nodeName;
VkvNode unrefNode = node;
parentNode![parentSubIndex - 1] = null;
// Inefficient, yeah, but again, this is intended to
// be used by humans, not robots. Feel free to improve
// it if you want, but I probably won't.
List<string> newLines = VkvModifyGetLines(context.rootNode, context.rootNodeName, 0);
int endBuffer = context.displayLines.Count - newLines.Count;
context.displayLines = newLines;
VkvModifyPrintAll(ref context, true, true);
// TODO: Kinda works, but it's quite buggy. Fix later.
Console.SetCursorPosition(0, context.startingCursor + context.displayLines.Count);
for (int i = 0; i < endBuffer; i++) Console.WriteLine(new string(' ', Console.WindowWidth));
break; break;
case VkvModifySelection.Name: case VkvModifySelection.Name:
@ -293,7 +314,7 @@ public static class VkvModule
private static void VkvModifyRefactorName(ref string nodeName, ref VkvModifyContext context) private static void VkvModifyRefactorName(ref string nodeName, ref VkvModifyContext context)
{ {
string originalName = new(nodeName); string originalName = nodeName;
string edit = context.displayLines[context.lineIndex]; string edit = context.displayLines[context.lineIndex];
int firstQuote = edit.IndexOf('\"'), int firstQuote = edit.IndexOf('\"'),
@ -390,17 +411,114 @@ public static class VkvModule
} }
private static void VkvModifyRefactorValue(ref VkvSingleNode node, ref VkvModifyContext context) private static void VkvModifyRefactorValue(ref VkvSingleNode node, ref VkvModifyContext context)
{ {
string value = node.value?.ToString() ?? string.Empty,
edit = context.displayLines[context.lineIndex];
int firstQuote = edit.IndexOf('\"'),
secondQuote = edit[(firstQuote + 1)..].IndexOf('\"') + firstQuote + 1,
thirdQuote = edit[(secondQuote + 1)..].IndexOf('\"') + secondQuote + 1,
fourthQuote = edit[(thirdQuote + 1)..].IndexOf('\"') + thirdQuote + 1;
int displayIndex = fourthQuote, valueIndex = value.Length;
int additionalAnsiTakeoff = 0;
{
// See my opinions of brackets while already
// inside a method in the `VkvModifyRefactorName`
// method.
bool tempActive = false;
for (int i = 0; i < displayIndex; i++)
{
if (edit[i] == '\x1b') tempActive = true;
if (tempActive) additionalAnsiTakeoff++;
if (tempActive && edit[i] == 'm') tempActive = false;
}
} }
private static void VkvModifyPrintAll(ref VkvModifyContext context, bool resetCursor) while (true)
{
Console.CursorLeft = 0;
Console.Write(Whitify(edit, VkvModifySelection.Value, true));
Console.CursorLeft = displayIndex - additionalAnsiTakeoff;
Console.CursorVisible = true;
ConsoleKeyInfo key = Console.ReadKey(true);
Console.CursorVisible = false;
if (char.IsControl(key.KeyChar))
{
// TODO: Adding clipboard support might be cool (but also a pain).
bool end = false;
switch (key.Key)
{
case ConsoleKey.Backspace:
if (valueIndex > 0)
{
value = value.Remove(valueIndex - 1, 1);
edit = edit.Remove(displayIndex - 1, 1) + ' ';
displayIndex--;
valueIndex--;
}
break;
case ConsoleKey.Delete:
if (valueIndex < value.Length)
{
value = value.Remove(valueIndex, 1);
edit = edit.Remove(displayIndex, 1) + ' ';
}
break;
case ConsoleKey.Escape:
edit = context.displayLines[context.lineIndex];
end = true;
break;
case ConsoleKey.Enter:
node.value = value;
end = true;
break;
case ConsoleKey.LeftArrow:
if (valueIndex > 0)
{
displayIndex--;
valueIndex--;
}
break;
case ConsoleKey.RightArrow:
if (valueIndex < value.Length)
{
displayIndex++;
valueIndex++;
}
break;
}
if (end) break;
}
else
{
value = value.Insert(valueIndex, key.KeyChar.ToString());
edit = edit.Insert(displayIndex, key.KeyChar.ToString()).TrimEnd();
displayIndex++;
valueIndex++;
}
}
context.displayLines[context.lineIndex] = edit.TrimEnd();
}
private static void VkvModifyPrintAll(ref VkvModifyContext context, bool resetCursor, bool flushLine = false)
{ {
Int2 cursorPos = (Console.CursorLeft, Console.CursorTop); Int2 cursorPos = (Console.CursorLeft, Console.CursorTop);
Console.SetCursorPosition(0, context.startingCursor); Console.SetCursorPosition(0, context.startingCursor);
foreach (string line in context.displayLines) foreach (string line in context.displayLines)
{ {
Console.WriteLine(line); Console.Write(line);
if (flushLine) Console.Write(new string(' ', Console.WindowWidth - line.Length));
Console.WriteLine();
Console.ResetColor(); Console.ResetColor();
} }
@ -515,6 +633,8 @@ public static class VkvModule
{ {
public required List<string> displayLines; public required List<string> displayLines;
public int lineIndex; public int lineIndex;
public required VkvNode rootNode;
public required string rootNodeName;
public readonly int startingCursor; public readonly int startingCursor;
public VkvModifyContext() public VkvModifyContext()

View File

@ -127,4 +127,40 @@ public class VkvTreeNode : VkvNode, IEnumerable<KeyValuePair<string, VkvNode>>
yield return new(p_subNodeKeys[i], p_subNodes[i]); yield return new(p_subNodeKeys[i], p_subNodes[i]);
} }
} }
public void Remove(string key)
{
int index = p_subNodeKeys.IndexOf(key);
if (index == -1) return;
p_subNodeKeys.RemoveAt(index);
p_subNodes.RemoveAt(index);
}
public void Remove(VkvNode value)
{
int index = p_subNodes.IndexOf(value);
if (index == -1) return;
p_subNodeKeys.RemoveAt(index);
p_subNodes.RemoveAt(index);
}
public void RemoveAll(string key)
{
int index;
while ((index = p_subNodeKeys.IndexOf(key)) != -1)
{
p_subNodeKeys.RemoveAt(index);
p_subNodes.RemoveAt(index);
}
}
public void RemoveAll(VkvNode value)
{
int index;
while ((index = p_subNodes.IndexOf(value)) != -1)
{
p_subNodeKeys.RemoveAt(index);
p_subNodes.RemoveAt(index);
}
}
} }