Skip to content

Commit 25b9b0e

Browse files
authored
Merge branch 'develop' into NEW
2 parents fd5e56c + 8a35f2a commit 25b9b0e

File tree

8 files changed

+22
-25
lines changed

8 files changed

+22
-25
lines changed

docs/reference/changelog-r2025.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,5 +47,6 @@ Released on December **th, 2023.
4747
- Fixed bug where the rotation axis of the omni wheel rollers were incorrect ([6710](https://github.com/cyberbotics/webots/pull/6710)).
4848
- Fixed a bug where Webots would crash if a geometry was inserted into a `Shape` node used a bounding box ([#6691](https://github.com/cyberbotics/webots/pull/6691)).
4949
- Removed the old `wb_supervisor_field_import_sf_node` and `wb_supervisor_field_import_mf_node` functions from the list of editor autocomplete suggestions ([#6701](https://github.com/cyberbotics/webots/pull/6701)).
50+
- Fixed a bug preventing nodes from being inserted into unconnected proto fields ([#6735](https://github.com/cyberbotics/webots/pull/6735)).
5051
- Fixed handling of remote assets from unofficial sources ([#6585](https://github.com/cyberbotics/webots/pull/6585)).
5152
- Fixed the QtToolTip bug, where the text in the text box is not being displayed ([#6711](https://github.com/cyberbotics/webots/pull/6711)).

src/webots/launcher/webots-linux.sh

100644100755
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,9 @@ export WEBOTS_TMPDIR=$WEBOTS_TMPDIR
7272
export WEBOTS_ORIGINAL_LD_LIBRARY_PATH="$LD_LIBRARY_PATH"
7373
export LD_LIBRARY_PATH="$webots_home/lib/webots":$LD_LIBRARY_PATH
7474

75+
# set the QT platform to use the X11 server for compatibility with Wayland
76+
export QT_QPA_PLATFORM="xcb"
77+
7578
# Fix for i3 window manager not working with Qt6
7679
if [ "$XDG_CURRENT_DESKTOP" == "i3" ]; then
7780
DPI=`xrdb -query -all | grep Xft.dpi | awk '{print $2}'`

src/webots/nodes/utils/WbTemplateManager.cpp

Lines changed: 8 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -131,10 +131,9 @@ bool WbTemplateManager::nodeNeedsToSubscribe(WbNode *node) {
131131
void WbTemplateManager::recursiveFieldSubscribeToRegenerateNode(WbNode *node, bool subscribedNode, bool subscribedDescendant) {
132132
if (subscribedNode || subscribedDescendant) {
133133
if (node->isProtoInstance())
134-
connect(node, &WbNode::parameterChanged, this, &WbTemplateManager::regenerateNodeFromParameterChange,
135-
Qt::UniqueConnection);
134+
connect(node, &WbNode::parameterChanged, this, &WbTemplateManager::regenerateNodeFromField, Qt::UniqueConnection);
136135
else
137-
connect(node, &WbNode::fieldChanged, this, &WbTemplateManager::regenerateNodeFromFieldChange, Qt::UniqueConnection);
136+
connect(node, &WbNode::fieldChanged, this, &WbTemplateManager::regenerateNodeFromField, Qt::UniqueConnection);
138137
}
139138

140139
// if PROTO node:
@@ -177,33 +176,23 @@ void WbTemplateManager::recursiveFieldSubscribeToRegenerateNode(WbNode *node, bo
177176
}
178177
}
179178

180-
void WbTemplateManager::regenerateNodeFromFieldChange(WbField *field) {
181-
// retrieve the right node
182-
WbNode *templateNode = dynamic_cast<WbNode *>(sender());
183-
assert(templateNode);
184-
if (templateNode)
185-
regenerateNodeFromField(templateNode, field, false);
186-
}
187-
188-
void WbTemplateManager::regenerateNodeFromParameterChange(WbField *field) {
179+
// intermediate function to determine which node should be updated
180+
// Note: The security is probably overkill there, but its also safer for the first versions of the template mechanism
181+
void WbTemplateManager::regenerateNodeFromField(WbField *field) {
189182
// retrieve the right node
190183
WbNode *templateNode = dynamic_cast<WbNode *>(sender());
191184
assert(templateNode);
192-
if (templateNode)
193-
regenerateNodeFromField(templateNode, field, true);
194-
}
185+
if (!templateNode)
186+
return;
195187

196-
// intermediate function to determine which node should be updated
197-
// Note: The security is probably overkill there, but its also safer for the first versions of the template mechanism
198-
void WbTemplateManager::regenerateNodeFromField(WbNode *templateNode, WbField *field, bool isParameter) {
199188
// 1. retrieve upper template node where the modification appeared in a template regenerator field
200189
WbNode *upperTemplateNode = WbVrmlNodeUtilities::findUpperTemplateNeedingRegenerationFromField(field, templateNode);
201190

202191
if (!upperTemplateNode)
203192
return;
204193

205194
// 2. check it's not a parameter managed by ODE
206-
if (!isParameter && dynamic_cast<const WbSolid *>(templateNode) &&
195+
if (!field->isParameter() && dynamic_cast<const WbSolid *>(templateNode) &&
207196
((field->name() == "translation" && field->type() == WB_SF_VEC3F) ||
208197
(field->name() == "rotation" && field->type() == WB_SF_ROTATION) ||
209198
(field->name() == "position" && field->type() == WB_SF_FLOAT)))

src/webots/nodes/utils/WbTemplateManager.hpp

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,7 @@ class WbTemplateManager : public QObject {
5252

5353
private slots:
5454
void unsubscribe(QObject *node);
55-
void regenerateNodeFromFieldChange(WbField *field);
56-
void regenerateNodeFromParameterChange(WbField *field);
55+
void regenerateNodeFromField(WbField *field);
5756
void regenerateNode(WbNode *node, bool restarted = false);
5857
void nodeNeedRegeneration();
5958

@@ -67,7 +66,6 @@ private slots:
6766

6867
bool nodeNeedsToSubscribe(WbNode *node);
6968
void recursiveFieldSubscribeToRegenerateNode(WbNode *node, bool subscribedNode, bool subscribedDescendant);
70-
void regenerateNodeFromField(WbNode *templateNode, WbField *field, bool isParameter);
7169

7270
QList<WbNode *> mTemplates;
7371
QSet<const WbNode *> mNodesSubscribedForRegeneration;

src/webots/scene_tree/WbAddNodeDialog.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -448,7 +448,7 @@ void WbAddNodeDialog::buildTree() {
448448
static const QString INVALID_FOR_INSERTION_IN_BOUNDING_OBJECT("N");
449449

450450
const WbField *const actualField =
451-
(mField->isParameter() && !mField->alias().isEmpty()) ? mField->internalFields().at(0) : mField;
451+
(!mField->internalFields().isEmpty() && !mField->alias().isEmpty()) ? mField->internalFields().at(0) : mField;
452452
bool boInfo = actualField->name() == "boundingObject";
453453
if (!boInfo)
454454
boInfo = nodeUse & WbNode::BOUNDING_OBJECT_USE;

src/webots/scene_tree/WbExtendedStringEditor.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -453,7 +453,7 @@ void WbExtendedStringEditor::edit(bool copyOriginalValue) {
453453

454454
if (copyOriginalValue) {
455455
const WbField *effectiveField = field();
456-
if (effectiveField->isParameter())
456+
if (!effectiveField->internalFields().isEmpty())
457457
effectiveField = effectiveField->internalFields().at(0);
458458

459459
mStringType = fieldNameToStringType(effectiveField->name(), effectiveField->parentNode());

src/webots/vrml/WbField.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,12 @@ bool WbField::isDeprecated() const {
104104
return mModel->isDeprecated();
105105
}
106106

107+
// Because of unconnected fields, the only way to definitively check if a field is a parameter is to check its parent node
108+
// If that is not possible, fallback to the old behavior (See #6604 and #6735)
109+
bool WbField::isParameter() const {
110+
return parentNode() ? parentNode()->isProtoInstance() : !mInternalFields.isEmpty();
111+
}
112+
107113
void WbField::readValue(WbTokenizer *tokenizer, const QString &worldPath) {
108114
if (mWasRead)
109115
tokenizer->reportError(tr("Duplicate field value: '%1'").arg(name()));

src/webots/vrml/WbField.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ class WbField : public QObject {
6969
void redirectTo(WbField *parameter, bool skipCopy = false);
7070
WbField *parameter() const { return mParameter; }
7171
const QList<WbField *> &internalFields() const { return mInternalFields; }
72-
bool isParameter() const { return mInternalFields.size() != 0; }
72+
bool isParameter() const;
7373

7474
void clearInternalFields() { mInternalFields.clear(); }
7575

0 commit comments

Comments
 (0)