#c #algorithm #xpath #tree #unreal-engine4
#c #алгоритм #xpath #дерево #unreal-engineer4
Вопрос:
Обновить:
Оказывается, я напрасно все усложнял. Для целей контекстного меню вам действительно нужно только произвольное дерево (с
Parent
,FirstChild
иNextSibling
). Лучший способ визуализировать дерево для контекстного меню — это точно так же, как любое другое дерево, но с разветвлением по горизонтали, а не по вертикали. На самом деле никогда не нужно иметь возможность перемещаться по дереву в 4 разных направлениях (Up
,Down
,Left
иRight
), потому что вся необходимая вам информация уже есть с помощьюParent
,FirstChild
иNextSibling
(все это довольно легко определить, если у вас уже есть список строк путей).Этот поток можно безопасно закрыть.
Я не использую XPath или какие-либо библиотеки, связанные с web или DOM, но я хотел бы использовать средства в стиле XPath для заполнения содержимого виджета контекстного меню:
struct ContextMenuNode
{
ContextMenuNode* Left; // Parent Menu
ContextMenuNode* Right; // Sub Menu
ContextMenuNode* Up; // Previous Sibling
ContextMenuNode* Down; // Next Sibling
FString Path; // An XPath-like string
FString Caption; // Display text of this menu item
}
То, что я хотел бы сделать, это что-то вроде этого:
// Defined in a class declaration:
TArray<ContextMenuNode*> MenuNodes;
// ...
/* This should create 2 unique nodes ("/File" doesn't exist yet within MenuNodes),
establish Left amp; Right relationships between them, and
return the newly created "/File/Open" node,
adding both nodes into MenuNodes
*/
auto openFileNode = AddNode("/File/Open");
/* Much like the previous line, this should
create 1 unique node (since "/File" should already exist from the previous call),
Left should be "/File", Up should be "/File/Open".
But also, we need to update THOSE nodes in relation to this node now...
Both "/File/Open" and "/File/Save" are Up/Down siblings with the same Left ("/File")
*/
auto saveFileNode = AddNode("/File/Save");
Как этого можно достичь, или есть просто лучший способ сделать это?
Полезные ссылки для тех, кто не знаком с UE4:
Комментарии:
1. Вы можете достичь этого, взяв то, что вы записали на английском языке, и вместо этого записать это в коде …?
2. @immibis Вау, никогда не думал попробовать это. Спасибо! Это почти так, как если бы мне никогда не нужно было приходить сюда в первую очередь! </сарказм>
3. Что ж, похоже, у вас есть представление о том, что вам может понадобиться сделать. Вы пробовали это делать? С какими проблемами вы столкнулись?
4. Я немного запутался, с чего вообще начать, если рекурсия вообще необходима, или что именно я должен отслеживать при попытке обхода. С помощью
FString::ParseIntoArray
я могу разбить строку пути на массив, чтобы подсчитать его глубину, но тогда как мне узнать, что обновлять (в том, что касается отношений)?5. Итак, в целом, я предполагаю, что это сводится к правильным алгоритмам разбора дерева… Но она недвоичная, четырехнаправленная и использует строку для определения ее взаимосвязей, что делает ее еще более запутанной