/**************************************************************************** ** ** Copyright (C) 2015 Klaralvdalens Datakonsult AB (KDAB). ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the Qt3D module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:COMM$ ** ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms ** and conditions see https://www.qt.io/terms-conditions. For further ** information use the contact form at https://www.qt.io/contact-us. ** ** $QT_END_LICENSE$ ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ****************************************************************************/ #include "inputsequence_p.h" #include #include #include #include #include QT_BEGIN_NAMESPACE namespace Qt3DInput { namespace Input { InputSequence::InputSequence() : AbstractActionInput() , m_sequences() , m_inputsToTrigger() , m_timeout(0) , m_buttonInterval(0) , m_startTime(0) , m_lastInputTime(0) { } void InputSequence::cleanup() { setEnabled(false); m_timeout = 0; m_buttonInterval = 0; m_startTime = 0; m_lastInputTime = 0; m_lastInputId = Qt3DCore::QNodeId(); m_sequences.clear(); m_inputsToTrigger.clear(); } void InputSequence::setStartTime(qint64 time) { m_startTime = time; } void InputSequence::reset() { m_startTime = 0; m_lastInputTime = 0; m_inputsToTrigger = m_sequences; m_lastInputId = Qt3DCore::QNodeId(); } bool InputSequence::actionTriggered(Qt3DCore::QNodeId input, const qint64 currentTime) { if (input != m_inputsToTrigger.first()) return false; // Save the last input m_lastInputId = input; // Return false if we've spent too much time in between two sequences if ((m_lastInputTime != 0) && ((currentTime - m_lastInputTime) > m_buttonInterval)) { reset(); return false; } // Update lastInputTime and remove the inputs to trigger from the sequence m_lastInputTime = currentTime; m_inputsToTrigger.removeOne(input); // If we have no more remaining inputs in the sequences of inputs if (m_inputsToTrigger.isEmpty()) { // All Triggered reset(); return true; } return false; } void InputSequence::syncFromFrontEnd(const Qt3DCore::QNode *frontEnd, bool firstTime) { AbstractActionInput::syncFromFrontEnd(frontEnd, firstTime); const QInputSequence *node = qobject_cast(frontEnd); if (!node) return; m_timeout = milliToNano(node->timeout()); m_buttonInterval = milliToNano(node->buttonInterval()); m_sequences = Qt3DCore::qIdsForNodes(node->sequences()); m_inputsToTrigger = m_sequences; } bool InputSequence::process(InputHandler *inputHandler, qint64 currentTime) { if (!isEnabled()) return false; if (m_startTime != 0) { // Check if we are still inside the time limit for the sequence if ((currentTime - m_startTime) > m_timeout) { reset(); return false; } } bool triggered = false; for (const Qt3DCore::QNodeId &actionInputId : qAsConst(m_sequences)) { AbstractActionInput *actionInput = inputHandler->lookupActionInput(actionInputId); if (actionInput && actionInput->process(inputHandler, currentTime)) { triggered |= actionTriggered(actionInputId, currentTime); if (m_startTime == 0) m_startTime = currentTime; } } return triggered; } } // namespace Input } // namespace Qt3DInput QT_END_NAMESPACE