Allow left/right for collapse, more hotkeys

* Use 'b' to toggle fold icon before/after key
* Use 'g' to toggle indentation guide lines
* Cosmetic fixes
This commit is contained in:
2024-10-03 15:29:56 +02:00
parent f023de0198
commit ddfefa124b
4 changed files with 77 additions and 9 deletions

View File

@ -5,6 +5,7 @@ namespace NoccyLabs\JsonEdit\List;
use Countable;
use NoccyLabs\JsonEdit\Settings;
use NoccyLabs\JsonEdit\Tree\ArrayNode;
use NoccyLabs\JsonEdit\Tree\CollapsibleNode;
use NoccyLabs\JsonEdit\Tree\Tree;
use NoccyLabs\JsonEdit\Tree\Node;
use NoccyLabs\JsonEdit\Tree\ObjectNode;
@ -15,6 +16,11 @@ class TreeList implements Countable
/** @var array<string,Entry> */
public array $list = [];
private const TREE_FOLD_OPEN = "\u{f0fe}";
private const TREE_FOLD_CLOSE = "\u{f146}";
private const TREE_INDENT_GUIDE = "\u{258f} ";
private const TREE_INDENT = " ";
public function __construct(private Tree $tree)
{
}
@ -151,7 +157,10 @@ class TreeList implements Countable
}
echo "\e[{$screenRow};1H\e[0m";
echo ($selected?"\e[44;97m":"\e[0;37m")."\e[K";
echo "\e[90m".str_repeat("\u{258f} ",$entry->depth)."\e[37m";
echo "\e[90m".str_repeat(
Settings::$indentationGuides ? self::TREE_INDENT_GUIDE : self::TREE_INDENT,
$entry->depth
)."\e[37m";
if ($entry->closer) {
if (!Settings::$compactGroups) {
@ -164,6 +173,18 @@ class TreeList implements Countable
return;
}
if (Settings::$collapseBefore) {
if ($entry->node instanceof CollapsibleNode) {
if ($entry->node->isCollapsed()) {
//echo "\e[90m\u{25ba} \e[37m";
echo "\e[90m".self::TREE_FOLD_OPEN." \e[37m";
} else {
//echo "\e[90m\u{25bc} \e[37m";
echo "\e[90m".self::TREE_FOLD_CLOSE." \e[37m";
}
}
}
if (!is_null($entry->key)) {
echo (is_int($entry->key)
?"\e[36;2m\u{e0b6}\e[7m#{$entry->key}\e[27m\u{e0b4}\e[22;37m "
@ -175,16 +196,20 @@ class TreeList implements Countable
if ($entry->node instanceof ArrayNode) {
echo "[" . (Settings::$compactGroups ? "…]":"");
if ($entry->node->isCollapsed()) {
echo " \e[90m\u{25ba} \e[2m[".count($entry->node->items)."]\e[22m";
if (!Settings::$collapseBefore) echo " \e[90m\u{25ba}";
echo " \e[90;2m[".count($entry->node->items)."]\e[22m";
if (!Settings::$compactGroups) echo "\e[37m ]";
} else {
echo " \e[90m\u{25bc}";
if (!Settings::$collapseBefore) echo " \e[90m\u{25bc}";
}
} elseif ($entry->node instanceof ObjectNode) {
echo "{" . (Settings::$compactGroups ? "…}":"");
if ($entry->node->isCollapsed()) {
echo " \e[90m\u{25ba} \e[2m".join(", ",array_keys($entry->node->properties))."\e[22m";
if (!Settings::$collapseBefore) echo " \e[90m\u{25ba}";
echo " \e[90;2;3m".join(", ",array_keys($entry->node->properties))."\e[22;23m";
if (!Settings::$compactGroups) echo "\e[37m }";
} else {
echo " \e[90m\u{25bc}";
if (!Settings::$collapseBefore) echo " \e[90m\u{25bc}";
}
} elseif ($entry->node instanceof ValueNode) {
$value = $entry->node->value;