// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only

/*!
    \example widgets/spinboxes
    \title Spin Boxes Example
    \examplecategory {User Interface Components}
    \ingroup examples-widgets
    \brief The Spin Boxes example shows how to use the many different types of
    spin boxes available in Qt, from a simple QSpinBox widget to more complex
    editors like the QDateTimeEdit widget.

    \image spinboxes-example.png {Gallery of different types of spin boxes}

    The example consists of a single \c Window class that is used to display the
    different spin box-based widgets available with Qt.

    \section1 Window Class Definition

    The \c Window class inherits QWidget and contains two slots that are used
    to provide interactive features:

    \snippet widgets/spinboxes/window.h 0

    The private functions are used to set up each type of spin box in the window.
    We use member variables to keep track of various widgets so that they can
    be reconfigured when required.

    \section1 Window Class Implementation

    The constructor simply calls private functions to set up the different types
    of spin box used in the example, and places each group in a layout:

    \snippet widgets/spinboxes/window.cpp 0

    We use the layout to manage the arrangement of the window's child widgets,
    and change the window title.

    The \c createSpinBoxes() function constructs a QGroupBox and places three
    QSpinBox widgets inside it with descriptive labels to indicate the types of
    input they expect.

    \snippet widgets/spinboxes/window.cpp 1

    The first spin box shows the simplest way to use QSpinBox. It accepts values
    from -20 to 20, the current value can be increased or decreased by 1 with
    either the arrow buttons or \uicontrol{Up} and \uicontrol{Down} keys, and the default
    value is 0.

    The second spin box uses a larger step size and displays a suffix to
    provide more information about the type of data the number represents:

    \snippet widgets/spinboxes/window.cpp 2

    This spin box also displays a
    \l{QAbstractSpinBox::specialValueText}{special value} instead of the minimum
    value defined for it. This means that it will never show \uicontrol{0%}, but will
    display \uicontrol{Automatic} when the minimum value is selected.

    The third spin box shows how a prefix can be used:

    \snippet widgets/spinboxes/window.cpp 4

    For simplicity, we show a spin box with a prefix and no suffix. It is also
    possible to use both at the same time.

    \snippet widgets/spinboxes/window.cpp 5

    The rest of the function sets up a layout for the group box and places each
    of the widgets inside it.

    The \c createDateTimeEdits() function constructs another group box with a
    selection of spin boxes used for editing dates and times.

    \snippet widgets/spinboxes/window.cpp 6

    The first spin box is a QDateEdit widget that is able to accept dates
    within a given range specified using QDate values. The arrow buttons and
    \uicontrol{Up} and \uicontrol{Down} keys can be used to increase and decrease the
    values for year, month, and day when the cursor is in the relevant section.

    The second spin box is a QTimeEdit widget:

    \snippet widgets/spinboxes/window.cpp 7

    Acceptable values for the time are defined using QTime values.

    The third spin box is a QDateTimeEdit widget that can display both date and
    time values, and we place a label above it to indicate the range of allowed
    times for a meeting. These widgets will be updated when the user changes a
    format string.

    \snippet widgets/spinboxes/window.cpp 8

    The format string used for the date time editor, which is also shown in the
    string displayed by the label, is chosen from a set of strings in a combobox:

    \snippet widgets/spinboxes/window.cpp 9
    \codeline
    \snippet widgets/spinboxes/window.cpp 10

    A signal from this combobox is connected to a slot in the \c Window class
    (shown later).

    \snippet widgets/spinboxes/window.cpp 11

    Each child widget of the group box in placed in a layout.

    The \c setFormatString() slot is called whenever the user selects a new
    format string in the combobox. The display format for the QDateTimeEdit
    widget is set using the raw string passed by the signal:

    \snippet widgets/spinboxes/window.cpp 12

    Depending on the visible sections in the widget, we set a new date or time
    range, and update the associated label to provide relevant information for
    the user:

    \snippet widgets/spinboxes/window.cpp 13

    When the format string is changed, there will be an appropriate label and
    entry widget for dates, times, or both types of input.

    The \c createDoubleSpinBoxes() function constructs three spin boxes that are
    used to input double-precision floating point numbers:

    \snippet widgets/spinboxes/window.cpp 14

    Before the QDoubleSpinBox widgets are constructed, we create a spin box to
    control how many decimal places they show. By default, only two decimal places
    are shown in the following spin boxes, each of which is the equivalent of a
    spin box in the group created by the \c createSpinBoxes() function.

    The first double spin box shows a basic double-precision spin box with the
    same range, step size, and default value as the first spin box in the
    \c createSpinBoxes() function:

    \snippet widgets/spinboxes/window.cpp 15

    However, this spin box also allows non-integer values to be entered.

    The second spin box displays a suffix and shows a special value instead
    of the minimum value:

    \snippet widgets/spinboxes/window.cpp 16

    The third spin box displays a prefix instead of a suffix:

    \snippet widgets/spinboxes/window.cpp 17

    We connect the QSpinBox widget that specifies the precision to a slot in
    the \c Window class.

    \snippet widgets/spinboxes/window.cpp 18

    The rest of the function places each of the widgets into a layout for the
    group box.

    The \c changePrecision() slot is called when the user changes the value in
    the precision spin box:

    \snippet widgets/spinboxes/window.cpp 19

    This function simply uses the integer supplied by the signal to specify the
    number of decimal places in each of the QDoubleSpinBox widgets. Each one
    of these will be updated automatically when their
    \l{QDoubleSpinBox::decimals}{decimals} property is changed.
*/
