/****************************************************************************
**
** Copyright (C) 2016 Jeremy Katz
** Contact: https://www.qt.io/licensing/
**
** This file is part of the documentation of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:FDL$
** 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.
**
** GNU Free Documentation License Usage
** Alternatively, this file may be used under the terms of the GNU Free
** Documentation License version 1.3 as published by the Free Software
** Foundation and appearing in the file included in the packaging of
** this file. Please review the following information to ensure
** the GNU Free Documentation License version 1.3 requirements
** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
** $QT_END_LICENSE$
**
****************************************************************************/

/*!
    \qmltype TouchEventSequence
    \inqmlmodule QtTest
    \ingroup qtquicktest
    \brief TouchEventSequence is used to build and dispatch touch events
    for testing.

    \since 5.9

    A TouchEventSequence is created by calling \l [QML] {TestCase::touchEvent()}{TestCase.touchEvent()}.
    The type can not be directly instantiated. Each method provided by the type returns
    the same object, allowing chained calls.

    For example:
    \code
        touchEvent(item).press(0).commit();
    \endcode
    is equivalent to:
    \code
        var sequence = touchEvent(item);
        sequence.press(0);
        sequence.commit();
    \endcode

    Events are delivered to the window which contains the item specified in touchEvent.

    \sa TestCase::touchEvent()
*/

/*!
    \qmlmethod TouchEventSequence TouchEventSequence::press(int touchId, object item, real x = item.width / 2, real y = item.height / 2)

    Creates a new point identified as \a touchId, at the point indicated by \e x and \e y relative to \a item.
    Further use of the same touch point should maintain the same touchId.

    Item defaults to the value provided via touchEvent().
    X and y default to the midpoint of the item.
*/

/*!
    \qmlmethod TouchEventSequence TouchEventSequence::move(int touchId, object item, real x = item.width / 2, real y = item.height / 2)

    Moves \a touchId to the point indicated by \e x and \e y relative to \a item.

    Item defaults to the value provided via touchEvent().
    X and y default to the midpoint of the item.
*/

/*!
    \qmlmethod TouchEventSequence TouchEventSequence::release(int touchId, object item, real x = item.width / 2, real y = item.height / 2)

    Removes \a touchId at the point indicated by \e x and \e y relative to \a item.

    Item defaults to the value provided via touchEvent().
    X and y default to the midpoint of the item.
*/

/*!
    \qmlmethod TouchEventSequence TouchEventSequence::stationary(int touchId)

    Indicates that \a touchId is present but otherwise unchanged from prior events.
*/

/*!
    \qmlmethod TouchEventSequence TouchEventSequence::commit()

    Sends the touch event composed by prior use of press(), move(), release(), and stationary().
    Following commit's return, the TouchEventSequence can be used to compose a new event.

    \code
        var sequence = touchEvent(target);
        // Touch the middle of target with 1 point
        sequence.press(1);
        sequence.commit();

        // Begin a new event
        // Move the point to target's upper left corner
        sequence.move(1, target, 0, 0);
        sequence.commit();
    \endcode

    Commit is automatically invoked when the TouchEventSequence object is destroyed.
*/
