435 lines
12 KiB
C++
435 lines
12 KiB
C++
/****************************************************************************
|
|
**
|
|
** Copyright (C) 2016 The Qt Company Ltd.
|
|
** Contact: https://www.qt.io/licensing/
|
|
**
|
|
** This file is part of the plugins of the Qt Toolkit.
|
|
**
|
|
** $QT_BEGIN_LICENSE:LGPL$
|
|
** 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 Lesser General Public License Usage
|
|
** Alternatively, this file may be used under the terms of the GNU Lesser
|
|
** General Public License version 3 as published by the Free Software
|
|
** Foundation and appearing in the file LICENSE.LGPL3 included in the
|
|
** packaging of this file. Please review the following information to
|
|
** ensure the GNU Lesser General Public License version 3 requirements
|
|
** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
|
|
**
|
|
** GNU General Public License Usage
|
|
** Alternatively, this file may be used under the terms of the GNU
|
|
** General Public License version 2.0 or (at your option) the GNU General
|
|
** Public license version 3 or any later version approved by the KDE Free
|
|
** Qt Foundation. The licenses are as published by the Free Software
|
|
** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
|
|
** included in the packaging of this file. Please review the following
|
|
** information to ensure the GNU General Public License requirements will
|
|
** be met: https://www.gnu.org/licenses/gpl-2.0.html and
|
|
** https://www.gnu.org/licenses/gpl-3.0.html.
|
|
**
|
|
** $QT_END_LICENSE$
|
|
**
|
|
****************************************************************************/
|
|
|
|
#include "rangecontrols_p.h"
|
|
|
|
#if QT_CONFIG(slider)
|
|
#include <qslider.h>
|
|
#endif
|
|
#if QT_CONFIG(dial)
|
|
#include <qdial.h>
|
|
#endif
|
|
#if QT_CONFIG(spinbox)
|
|
#include <qspinbox.h>
|
|
#endif
|
|
#if QT_CONFIG(scrollbar)
|
|
#include <qscrollbar.h>
|
|
#endif
|
|
#include <qstyle.h>
|
|
#include <qstyleoption.h>
|
|
#include <qdebug.h>
|
|
#include <qglobal.h>
|
|
#if QT_CONFIG(lineedit)
|
|
#include <QtWidgets/qlineedit.h>
|
|
#endif
|
|
#include <qmath.h>
|
|
#include <private/qmath_p.h>
|
|
|
|
#include "simplewidgets_p.h" // let spinbox use line edit's interface
|
|
|
|
QT_BEGIN_NAMESPACE
|
|
|
|
#ifndef QT_NO_ACCESSIBILITY
|
|
|
|
#if QT_CONFIG(spinbox)
|
|
QAccessibleAbstractSpinBox::QAccessibleAbstractSpinBox(QWidget *w)
|
|
: QAccessibleWidget(w, QAccessible::SpinBox), lineEdit(nullptr)
|
|
{
|
|
Q_ASSERT(abstractSpinBox());
|
|
}
|
|
|
|
QAccessibleAbstractSpinBox::~QAccessibleAbstractSpinBox()
|
|
{
|
|
delete lineEdit;
|
|
}
|
|
|
|
/*!
|
|
Returns the underlying QAbstractSpinBox.
|
|
*/
|
|
QAbstractSpinBox *QAccessibleAbstractSpinBox::abstractSpinBox() const
|
|
{
|
|
return qobject_cast<QAbstractSpinBox*>(object());
|
|
}
|
|
|
|
QAccessibleInterface *QAccessibleAbstractSpinBox::lineEditIface() const
|
|
{
|
|
#if QT_CONFIG(lineedit)
|
|
// QAccessibleLineEdit is only used to forward the text functions
|
|
if (!lineEdit)
|
|
lineEdit = new QAccessibleLineEdit(abstractSpinBox()->lineEdit());
|
|
return lineEdit;
|
|
#else
|
|
return nullptr;
|
|
#endif
|
|
}
|
|
|
|
QString QAccessibleAbstractSpinBox::text(QAccessible::Text t) const
|
|
{
|
|
if (t == QAccessible::Value)
|
|
return abstractSpinBox()->text();
|
|
return QAccessibleWidget::text(t);
|
|
}
|
|
|
|
void *QAccessibleAbstractSpinBox::interface_cast(QAccessible::InterfaceType t)
|
|
{
|
|
if (t == QAccessible::ValueInterface)
|
|
return static_cast<QAccessibleValueInterface*>(this);
|
|
if (t == QAccessible::TextInterface)
|
|
return static_cast<QAccessibleTextInterface*>(this);
|
|
if (t == QAccessible::EditableTextInterface)
|
|
return static_cast<QAccessibleEditableTextInterface*>(this);
|
|
return QAccessibleWidget::interface_cast(t);
|
|
}
|
|
|
|
QVariant QAccessibleAbstractSpinBox::currentValue() const
|
|
{
|
|
return abstractSpinBox()->property("value");
|
|
}
|
|
|
|
void QAccessibleAbstractSpinBox::setCurrentValue(const QVariant &value)
|
|
{
|
|
abstractSpinBox()->setProperty("value", value);
|
|
}
|
|
|
|
QVariant QAccessibleAbstractSpinBox::maximumValue() const
|
|
{
|
|
return abstractSpinBox()->property("maximum");
|
|
}
|
|
|
|
QVariant QAccessibleAbstractSpinBox::minimumValue() const
|
|
{
|
|
return abstractSpinBox()->property("minimum");
|
|
}
|
|
|
|
QVariant QAccessibleAbstractSpinBox::minimumStepSize() const
|
|
{
|
|
return abstractSpinBox()->property("stepSize");
|
|
}
|
|
|
|
void QAccessibleAbstractSpinBox::addSelection(int startOffset, int endOffset)
|
|
{
|
|
lineEditIface()->textInterface()->addSelection(startOffset, endOffset);
|
|
}
|
|
|
|
QString QAccessibleAbstractSpinBox::attributes(int offset, int *startOffset, int *endOffset) const
|
|
{
|
|
return lineEditIface()->textInterface()->attributes(offset, startOffset, endOffset);
|
|
}
|
|
|
|
int QAccessibleAbstractSpinBox::cursorPosition() const
|
|
{
|
|
return lineEditIface()->textInterface()->cursorPosition();
|
|
}
|
|
|
|
QRect QAccessibleAbstractSpinBox::characterRect(int offset) const
|
|
{
|
|
return lineEditIface()->textInterface()->characterRect(offset);
|
|
}
|
|
|
|
int QAccessibleAbstractSpinBox::selectionCount() const
|
|
{
|
|
return lineEditIface()->textInterface()->selectionCount();
|
|
}
|
|
|
|
int QAccessibleAbstractSpinBox::offsetAtPoint(const QPoint &point) const
|
|
{
|
|
return lineEditIface()->textInterface()->offsetAtPoint(point);
|
|
}
|
|
|
|
void QAccessibleAbstractSpinBox::selection(int selectionIndex, int *startOffset, int *endOffset) const
|
|
{
|
|
lineEditIface()->textInterface()->selection(selectionIndex, startOffset, endOffset);
|
|
}
|
|
|
|
QString QAccessibleAbstractSpinBox::text(int startOffset, int endOffset) const
|
|
{
|
|
return lineEditIface()->textInterface()->text(startOffset, endOffset);
|
|
}
|
|
|
|
QString QAccessibleAbstractSpinBox::textBeforeOffset(int offset, QAccessible::TextBoundaryType boundaryType, int *startOffset, int *endOffset) const
|
|
{
|
|
return lineEditIface()->textInterface()->textBeforeOffset(offset, boundaryType, startOffset, endOffset);
|
|
}
|
|
|
|
QString QAccessibleAbstractSpinBox::textAfterOffset(int offset, QAccessible::TextBoundaryType boundaryType, int *startOffset, int *endOffset) const
|
|
{
|
|
return lineEditIface()->textInterface()->textAfterOffset(offset, boundaryType, startOffset, endOffset);
|
|
}
|
|
|
|
QString QAccessibleAbstractSpinBox::textAtOffset(int offset, QAccessible::TextBoundaryType boundaryType, int *startOffset, int *endOffset) const
|
|
{
|
|
return lineEditIface()->textInterface()->textAtOffset(offset, boundaryType, startOffset, endOffset);
|
|
}
|
|
|
|
void QAccessibleAbstractSpinBox::removeSelection(int selectionIndex)
|
|
{
|
|
lineEditIface()->textInterface()->removeSelection(selectionIndex);
|
|
}
|
|
|
|
void QAccessibleAbstractSpinBox::setCursorPosition(int position)
|
|
{
|
|
lineEditIface()->textInterface()->setCursorPosition(position);
|
|
}
|
|
|
|
void QAccessibleAbstractSpinBox::setSelection(int selectionIndex, int startOffset, int endOffset)
|
|
{
|
|
lineEditIface()->textInterface()->setSelection(selectionIndex, startOffset, endOffset);
|
|
}
|
|
|
|
int QAccessibleAbstractSpinBox::characterCount() const
|
|
{
|
|
return lineEditIface()->textInterface()->characterCount();
|
|
}
|
|
|
|
void QAccessibleAbstractSpinBox::scrollToSubstring(int startIndex, int endIndex)
|
|
{
|
|
lineEditIface()->textInterface()->scrollToSubstring(startIndex, endIndex);
|
|
}
|
|
|
|
void QAccessibleAbstractSpinBox::deleteText(int startOffset, int endOffset)
|
|
{
|
|
lineEditIface()->editableTextInterface()->deleteText(startOffset, endOffset);
|
|
}
|
|
|
|
void QAccessibleAbstractSpinBox::insertText(int offset, const QString &text)
|
|
{
|
|
lineEditIface()->editableTextInterface()->insertText(offset, text);
|
|
}
|
|
|
|
void QAccessibleAbstractSpinBox::replaceText(int startOffset, int endOffset, const QString &text)
|
|
{
|
|
lineEditIface()->editableTextInterface()->replaceText(startOffset, endOffset, text);
|
|
}
|
|
|
|
|
|
/*!
|
|
\class QAccessibleSpinBox
|
|
\brief The QAccessibleSpinBox class implements the QAccessibleInterface for spinbox widgets.
|
|
\internal
|
|
|
|
\ingroup accessibility
|
|
*/
|
|
|
|
/*!
|
|
Constructs a QAccessibleSpinWidget object for \a w.
|
|
*/
|
|
QAccessibleSpinBox::QAccessibleSpinBox(QWidget *w)
|
|
: QAccessibleAbstractSpinBox(w)
|
|
{
|
|
Q_ASSERT(spinBox());
|
|
addControllingSignal(QLatin1String("valueChanged(int)"));
|
|
addControllingSignal(QLatin1String("valueChanged(QString)"));
|
|
}
|
|
|
|
/*!
|
|
Returns the underlying QSpinBox.
|
|
*/
|
|
QSpinBox *QAccessibleSpinBox::spinBox() const
|
|
{
|
|
return qobject_cast<QSpinBox*>(object());
|
|
}
|
|
|
|
|
|
// ================================== QAccessibleDoubleSpinBox ==================================
|
|
QAccessibleDoubleSpinBox::QAccessibleDoubleSpinBox(QWidget *widget)
|
|
: QAccessibleAbstractSpinBox(widget)
|
|
{
|
|
Q_ASSERT(qobject_cast<QDoubleSpinBox *>(widget));
|
|
addControllingSignal(QLatin1String("valueChanged(double)"));
|
|
addControllingSignal(QLatin1String("valueChanged(QString)"));
|
|
}
|
|
|
|
/*!
|
|
Returns the underlying QDoubleSpinBox.
|
|
*/
|
|
QDoubleSpinBox *QAccessibleDoubleSpinBox::doubleSpinBox() const
|
|
{
|
|
return static_cast<QDoubleSpinBox*>(object());
|
|
}
|
|
|
|
QString QAccessibleDoubleSpinBox::text(QAccessible::Text textType) const
|
|
{
|
|
if (textType == QAccessible::Value)
|
|
return doubleSpinBox()->textFromValue(doubleSpinBox()->value());
|
|
return QAccessibleWidget::text(textType);
|
|
}
|
|
|
|
#endif // QT_CONFIG(spinbox)
|
|
|
|
#if QT_CONFIG(scrollbar)
|
|
/*!
|
|
\class QAccessibleScrollBar
|
|
\brief The QAccessibleScrollBar class implements the QAccessibleInterface for scroll bars.
|
|
\internal
|
|
|
|
\ingroup accessibility
|
|
*/
|
|
|
|
/*!
|
|
Constructs a QAccessibleScrollBar object for \a w.
|
|
\a name is propagated to the QAccessibleWidget constructor.
|
|
*/
|
|
QAccessibleScrollBar::QAccessibleScrollBar(QWidget *w)
|
|
: QAccessibleAbstractSlider(w, QAccessible::ScrollBar)
|
|
{
|
|
Q_ASSERT(scrollBar());
|
|
addControllingSignal(QLatin1String("valueChanged(int)"));
|
|
}
|
|
|
|
/*! Returns the scroll bar. */
|
|
QScrollBar *QAccessibleScrollBar::scrollBar() const
|
|
{
|
|
return qobject_cast<QScrollBar*>(object());
|
|
}
|
|
|
|
QString QAccessibleScrollBar::text(QAccessible::Text t) const
|
|
{
|
|
if (t == QAccessible::Value)
|
|
return QString::number(scrollBar()->value());
|
|
return QAccessibleAbstractSlider::text(t);
|
|
}
|
|
|
|
#endif // QT_CONFIG(scrollbar)
|
|
|
|
#if QT_CONFIG(slider)
|
|
/*!
|
|
\class QAccessibleSlider
|
|
\brief The QAccessibleSlider class implements the QAccessibleInterface for sliders.
|
|
\internal
|
|
|
|
\ingroup accessibility
|
|
*/
|
|
|
|
/*!
|
|
Constructs a QAccessibleScrollBar object for \a w.
|
|
\a name is propagated to the QAccessibleWidget constructor.
|
|
*/
|
|
QAccessibleSlider::QAccessibleSlider(QWidget *w)
|
|
: QAccessibleAbstractSlider(w)
|
|
{
|
|
Q_ASSERT(slider());
|
|
addControllingSignal(QLatin1String("valueChanged(int)"));
|
|
}
|
|
|
|
/*! Returns the slider. */
|
|
QSlider *QAccessibleSlider::slider() const
|
|
{
|
|
return qobject_cast<QSlider*>(object());
|
|
}
|
|
|
|
QString QAccessibleSlider::text(QAccessible::Text t) const
|
|
{
|
|
if (t == QAccessible::Value)
|
|
return QString::number(slider()->value());
|
|
|
|
return QAccessibleAbstractSlider::text(t);
|
|
}
|
|
|
|
QAccessibleAbstractSlider::QAccessibleAbstractSlider(QWidget *w, QAccessible::Role r)
|
|
: QAccessibleWidget(w, r)
|
|
{
|
|
Q_ASSERT(qobject_cast<QAbstractSlider *>(w));
|
|
}
|
|
|
|
void *QAccessibleAbstractSlider::interface_cast(QAccessible::InterfaceType t)
|
|
{
|
|
if (t == QAccessible::ValueInterface)
|
|
return static_cast<QAccessibleValueInterface*>(this);
|
|
return QAccessibleWidget::interface_cast(t);
|
|
}
|
|
|
|
QVariant QAccessibleAbstractSlider::currentValue() const
|
|
{
|
|
return abstractSlider()->value();
|
|
}
|
|
|
|
void QAccessibleAbstractSlider::setCurrentValue(const QVariant &value)
|
|
{
|
|
abstractSlider()->setValue(value.toInt());
|
|
}
|
|
|
|
QVariant QAccessibleAbstractSlider::maximumValue() const
|
|
{
|
|
return abstractSlider()->maximum();
|
|
}
|
|
|
|
QVariant QAccessibleAbstractSlider::minimumValue() const
|
|
{
|
|
return abstractSlider()->minimum();
|
|
}
|
|
|
|
QVariant QAccessibleAbstractSlider::minimumStepSize() const
|
|
{
|
|
return abstractSlider()->singleStep();
|
|
}
|
|
|
|
QAbstractSlider *QAccessibleAbstractSlider::abstractSlider() const
|
|
{
|
|
return static_cast<QAbstractSlider *>(object());
|
|
}
|
|
|
|
#endif // QT_CONFIG(slider)
|
|
|
|
#if QT_CONFIG(dial)
|
|
// ======================================= QAccessibleDial ======================================
|
|
QAccessibleDial::QAccessibleDial(QWidget *widget)
|
|
: QAccessibleAbstractSlider(widget, QAccessible::Dial)
|
|
{
|
|
Q_ASSERT(qobject_cast<QDial *>(widget));
|
|
addControllingSignal(QLatin1String("valueChanged(int)"));
|
|
}
|
|
|
|
QString QAccessibleDial::text(QAccessible::Text textType) const
|
|
{
|
|
if (textType == QAccessible::Value)
|
|
return QString::number(dial()->value());
|
|
|
|
return QAccessibleAbstractSlider::text(textType);
|
|
}
|
|
|
|
QDial *QAccessibleDial::dial() const
|
|
{
|
|
return static_cast<QDial*>(object());
|
|
}
|
|
#endif // QT_CONFIG(dial)
|
|
|
|
#endif // QT_NO_ACCESSIBILITY
|
|
|
|
QT_END_NAMESPACE
|