Hello @till-niese,
No, that is not possible for public API users. As I tried to indicate before, you are operating here on the data model of the graph with GraphModelInterface. There is also a GraphModelPresenterInterface which is the presenter and provides some GUI logic as selecting nodes and wires, but that interface is non-public.
The toggle state of a widget is buried deep in the presenter and not even exposed over the interface. There are also the non-public attributes about which I talked before. I went ahead and wrote some code trying to emulate access in the public API [1], but unsurprisingly, there is nothing to be found in the public graphs, the code will not print anything.
It is simply not possible to do what you want to do here, and it is quite common for our APIs to not expose GUI functionalities. In the case of the Node API, the complexities of the MVP application model are added on top of that. There can be multiple presenters coordinating multiple views on a singular model. Or in less fancy: One can have multiple node editors opened on the same graph.
The toggle state of a port bundle/group is shared between all editors at the moment. And aside from a principal stance of the feasibility of exposing GUIs, there might be substantial problems with exposing the toggle state despite the external perception that is just "this one thing"; I do not know for sure since I am not familiar with the implementation details here, but I would not be surprised.
In the Asset API we had a similar case with people wanting to know "the selected asset" and our answer then being "that is an ambiguous question because there can be more than one Asset Browser". In the Asset API the solution is to open your own Asset Browser where you can then get that state. There is AFAIK currently no alternative solution as such for your problem, e.g., a node command which would toggle the folding state of a port. We could think about adding such command, but I doubt that I will find many supporters for this idea.
Cheers,
Ferdinand
[1]
// graph is a maxon::NodesGraphModelRef/GraphModelRef instance
// rustTexNode is a RS Texture GraphNode in #graph.
maxon::GraphNode root = graph.GetRoot();
maxon::GraphNode portBundle = rustTexNode.GetInputs().FindChild(
maxon::Id("com.redshift3d.redshift4c4d.nodes.core.texturesampler.tex0")) iferr_return;
// Iterate over candidates where this widget data is internally to be found, a graph root, a true
// node, and a port (bundle).
for (const maxon::GraphNode& node : { root, rustTexNode, portBundle })
{
// Iterate over some attribute identifiers where GUI widget data is stored internally.
for (const maxon::String& attr : { "widgetDataBlackBox"_s, "widgetDataBlackBoxSM"_s,
"widgetDataBlackBoxOut"_s })
{
maxon::InternedId attrId;
attrId.Init("widgetDataBlackBoxOut") iferr_return;
// Get the widget data stored at the maxon attribute #attr and iterate over its entries, the
// data will always be empty/null.
const maxon::DataDictionary attrData = node.GetValue<maxon::DataDictionary>(
attrId).GetValueOrNull() iferr_return;
for (const auto& entry : attrData)
{
const maxon::Data key = entry.first.GetCopy() iferr_return;
const maxon::Data value = entry.second.GetCopy() iferr_return;
ApplicationOutput("node: @, attr: @, key: @, value: @, type: @",
node, attr, key, value, value.GetType());
}
}
}