Add support for NOT conditional in the route json

This commit is contained in:
samcake 2015-10-30 17:32:26 -07:00
parent 710b51fe14
commit 00be6b3e3a
2 changed files with 26 additions and 1 deletions

View file

@ -825,12 +825,29 @@ Conditional::Pointer UserInputMapper::parseConditional(const QJsonValue& value)
return std::make_shared<AndConditional>(children);
} else if (value.isString()) {
// Support "when" : "GamePad.RB"
auto input = findDeviceInput(value.toString());
auto conditionalToken = value.toString();
// Detect for modifier case (Not...)
QString conditionalModifier;
const QString JSON_CONDITIONAL_MODIFIER_NOT("!");
if (conditionalToken.startsWith(JSON_CONDITIONAL_MODIFIER_NOT)) {
conditionalModifier = JSON_CONDITIONAL_MODIFIER_NOT;
conditionalToken = conditionalToken.right(conditionalToken.size() - conditionalModifier.size());
}
auto input = findDeviceInput(conditionalToken);
auto endpoint = endpointFor(input);
if (!endpoint) {
return Conditional::Pointer();
}
if (!conditionalModifier.isEmpty()) {
if (conditionalModifier == JSON_CONDITIONAL_MODIFIER_NOT) {
return std::make_shared<NotEndpointConditional>(endpoint);
}
}
// Default and conditional behavior
return std::make_shared<EndpointConditional>(endpoint);
}

View file

@ -23,5 +23,13 @@ private:
Endpoint::Pointer _endpoint;
};
class NotEndpointConditional : public Conditional {
public:
NotEndpointConditional(Endpoint::Pointer endpoint) : _endpoint(endpoint) {}
virtual bool satisfied() override { return _endpoint && _endpoint->value() == 0.0; }
private:
Endpoint::Pointer _endpoint;
};
}
#endif