У меня есть график компонентов и отношений между ними. Пользователь начинает навигацию с корневым компонентом. Он нажимает кнопку расширения на компоненте, чтобы показать новый компонент, связанный с текущим компонентом.
Проблема в том, когда пользователь решает свернуть узел. Я должен выбрать поддерево, чтобы скрыть и в то же время оставить график в согласованном состоянии, чтобы не было расширенного узла с отсутствующим отношением к другому узлу в графе.
Теперь в случае циклического цикла между компонентами мне сложно выбрать поддерево. Для простоты я выбираю порядок, в котором они были расширены. Таким образом, если A расширяется до B, а C, свернувшись, A скрывает созданные им узлы и ребра. Теперь рассмотрим следующий сценарий.
[-] означает расширенное состояние, а [+] означает еще не расширенное. A расширяется, чтобы показать B и C. А затем B расширяется, чтобы показать D. C расширяется, что создает связь между C и выходящим узлом D, а также создает узел E. Теперь пользователь решает свернуть B. Поскольку по порядку расширения D является потомком B, он свернется и скроет D. Это оставит граф в несогласованном состоянии, так как C имеет ребро к D, но D больше не будет, если я удалю край CD, он все равно будет несовместимым. Если я сверну C. И E снова является циклической связью, например, с A, возникнет та же проблема.
/-----B[-]-----\
A[-] D[+]
\-----C[-]-----/
\
E[+]
Так, ребята, есть идеи, как я могу решить эту проблему. Пользователь должен перемещаться по графу и должен иметь возможность свернуться, но я застрял с проблемой циклических узлов, и в этом случае любой из узлов в цикле, если свернуть, оставит граф в несогласованном состоянии.