| 53 | } |
| 54 | |
| 55 | QDomElement saveChildNodesState(QDomDocument& doc, QWidget* widget) { |
| 56 | if (widget == nullptr) { |
| 57 | return {}; |
| 58 | } |
| 59 | |
| 60 | if (auto* splitter = qobject_cast<QSplitter*>(widget)) { |
| 61 | QDomElement splitter_element = doc.createElement(QStringLiteral("DockSplitter")); |
| 62 | splitter_element.setAttribute( |
| 63 | QStringLiteral("orientation"), |
| 64 | splitter->orientation() == Qt::Horizontal ? QStringLiteral("|") : QStringLiteral("-")); |
| 65 | splitter_element.setAttribute(QStringLiteral("count"), QString::number(splitter->count())); |
| 66 | |
| 67 | QStringList normalized_sizes; |
| 68 | int total_size = 0; |
| 69 | for (int size : splitter->sizes()) { |
| 70 | total_size += size; |
| 71 | } |
| 72 | for (int index = 0; index < splitter->count(); ++index) { |
| 73 | const int size = splitter->sizes().value(index, 0); |
| 74 | const double normalized = total_size > 0 ? static_cast<double>(size) / static_cast<double>(total_size) |
| 75 | : 1.0 / static_cast<double>(std::max(1, splitter->count())); |
| 76 | normalized_sizes.push_back(QString::number(normalized, 'f', 8)); |
| 77 | } |
| 78 | splitter_element.setAttribute(QStringLiteral("sizes"), normalized_sizes.join(QStringLiteral(";"))); |
| 79 | |
| 80 | for (int index = 0; index < splitter->count(); ++index) { |
| 81 | QDomElement child = saveChildNodesState(doc, splitter->widget(index)); |
| 82 | if (!child.isNull()) { |
| 83 | splitter_element.appendChild(child); |
| 84 | } |
| 85 | } |
| 86 | return splitter_element; |
| 87 | } |
| 88 | |
| 89 | auto* dock_area = qobject_cast<ads::CDockAreaWidget*>(widget); |
| 90 | if (dock_area == nullptr) { |
| 91 | return {}; |
| 92 | } |
| 93 | |
| 94 | QDomElement area_element = doc.createElement(QStringLiteral("DockArea")); |
| 95 | for (int index = 0; index < dock_area->dockWidgetsCount(); ++index) { |
| 96 | auto* dock_widget = dynamic_cast<DockWidget*>(dock_area->dockWidget(index)); |
| 97 | if (dock_widget == nullptr) { |
| 98 | continue; |
| 99 | } |
| 100 | // Plot widgets emit <plot>; object widgets (Scene3DDockWidget, …) |
| 101 | // emit whatever their xmlSaveState returns (e.g. <scene3d>). A null |
| 102 | // QDomElement from an object widget means "I don't persist state yet", |
| 103 | // so we skip it honestly rather than writing an empty stub. |
| 104 | QDomElement payload; |
| 105 | if (auto* plot = dock_widget->plotWidget()) { |
| 106 | payload = plot->xmlSaveState(doc); |
| 107 | } else if (auto* obj = dock_widget->objectWidget()) { |
| 108 | payload = obj->xmlSaveState(doc); |
| 109 | if (payload.isNull()) { |
| 110 | continue; |
| 111 | } |
| 112 | } else { |
no test coverage detected