blob: b5b8608418b5496898c16ed827e523615b6d2e77 [file] [log] [blame]
/****************************************************************************
**
** 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