Skip to content

Commit ce209a0

Browse files
author
hpcdgrie
committed
Fixed VrmlNodeToggleButton sharedState not syncing both state and choice exposed fields
1 parent bab4820 commit ce209a0

2 files changed

Lines changed: 29 additions & 40 deletions

File tree

src/OpenCOVER/plugins/general/Vrml97/VrmlNodeTUI.cpp

Lines changed: 28 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -481,23 +481,25 @@ void VrmlNodeTUIButton::render(Viewer *viewer)
481481
void VrmlNodeTUIToggleButton::initFields(VrmlNodeTUIToggleButton *node, vrml::VrmlNodeType *t)
482482
{
483483
VrmlNodeTUIElement::initFields(node, t);
484-
initFieldsHelper(node, t,
485-
exposedField("choice", node->d_choice, [node](auto f){
486-
if(node->d_TUIElement != NULL)
487-
{
488-
coTUIToggleButton *tb = (coTUIToggleButton *)node->d_TUIElement;
489-
node->d_state.set(node->d_choice.get() >= 0);
490-
tb->setState(node->d_choice.get() >= 0);
491-
}
492-
}),
493-
exposedField("state", node->d_state, [node](auto f){
484+
485+
auto updateFunc = [](VrmlNodeTUIToggleButton *node,bool state){
494486
if(node->d_TUIElement != NULL)
495487
{
488+
node->d_choice.set(state ? 0 : -1);
489+
node->d_state.set(state);
496490
coTUIToggleButton *tb = (coTUIToggleButton *)node->d_TUIElement;
497491
tb->setState(node->d_state.get());
498492
if (node->sharedState && node->d_shared.get())
499-
*node->sharedState = node->d_state.get();
493+
*node->sharedState = state;
500494
}
495+
};
496+
497+
initFieldsHelper(node, t,
498+
exposedField("choice", node->d_choice, [updateFunc, node](auto f){
499+
updateFunc(node, node->d_choice.get() >= 0);
500+
}),
501+
exposedField("state", node->d_state, [updateFunc, node](auto f){
502+
updateFunc(node, node->d_state.get());
501503
}));
502504
}
503505

@@ -532,23 +534,25 @@ VrmlNodeTUIToggleButton::VrmlNodeTUIToggleButton(const VrmlNodeTUIToggleButton&
532534
{
533535
}
534536

535-
void VrmlNodeTUIToggleButton::tabletEvent(coTUIElement *)
537+
void VrmlNodeTUIToggleButton::sendStateToVrml(bool state)
536538
{
539+
d_state.set(state);
540+
d_choice.set(state ? 0 : -1);
541+
537542
double timeStamp = System::the->time();
538-
coTUIToggleButton *tb = (coTUIToggleButton *)d_TUIElement;
539-
d_state.set(tb->getState());
540543
eventOut(timeStamp, "state", d_state);
544+
eventOut(timeStamp, "choice", d_choice);
545+
}
541546

547+
548+
void VrmlNodeTUIToggleButton::tabletEvent(coTUIElement *)
549+
{
550+
coTUIToggleButton *tb = (coTUIToggleButton *)d_TUIElement;
542551

543552
if (sharedState)
544-
{
545-
*sharedState = tb->getState();
546-
}
547-
if (tb->getState())
548-
d_choice.set(0);
549-
else
550-
d_choice.set(-1);
551-
eventOut(timeStamp, "choice", d_choice);
553+
*sharedState = tb->getState();
554+
555+
sendStateToVrml(tb->getState());
552556
}
553557

554558
void VrmlNodeTUIToggleButton::render(Viewer *viewer)
@@ -572,31 +576,15 @@ void VrmlNodeTUIToggleButton::render(Viewer *viewer)
572576
{
573577
coTUIToggleButton* tb = (coTUIToggleButton*)d_TUIElement;
574578
tb->setState(*sharedState);
575-
d_state.set(tb->getState());
576-
double timeStamp = System::the->time();
577-
eventOut(timeStamp, "state", d_state);
578-
if (tb->getState())
579-
d_choice.set(0);
580-
else
581-
d_choice.set(-1);
582-
eventOut(timeStamp, "choice", d_choice);
579+
sendStateToVrml(tb->getState());
583580
}
584581
});
585582
}
586583
}
587584
VrmlNodeTUIElement::render(viewer);
588585
coTUIToggleButton *tb = (coTUIToggleButton *)d_TUIElement;
589586
tb->setState(d_state.get());
590-
591-
double timeStamp = System::the->time();
592-
// create eventOuts for default values
593-
d_state.set(tb->getState());
594-
eventOut(timeStamp, "state", d_state);
595-
if (tb->getState())
596-
d_choice.set(0);
597-
else
598-
d_choice.set(-1);
599-
eventOut(timeStamp, "choice", d_choice);
587+
sendStateToVrml(tb->getState());
600588
clearModified();
601589
}
602590
// the elements are created in subclasses

src/OpenCOVER/plugins/general/Vrml97/VrmlNodeTUI.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,7 @@ class VRML97COVEREXPORT VrmlNodeTUIToggleButton : public VrmlNodeTUIElement
173173
VrmlSFBool d_state;
174174
VrmlSFInt d_choice;
175175
std::unique_ptr<vrb::SharedState<bool>> sharedState;
176+
void sendStateToVrml(bool state);
176177
};
177178

178179
class VRML97COVEREXPORT VrmlNodeTUIFrame : public VrmlNodeTUIElement

0 commit comments

Comments
 (0)