From 8c5e6bf3dc302b52d431b647417cf88fa9851310 Mon Sep 17 00:00:00 2001 From: Dominik Holland Date: Wed, 19 Aug 2020 12:58:16 +0200 Subject: Better handle input plugin switches in the KeyboardSelectionListModel If the current dataSource gets destroyed, make sure to update the rowCount accordingly, otherwise there might be a lot of QML warnings like these: .../style.qml:709:13: Unable to assign [undefined] to QString In addition also do a boundary check in the data() function to make sure the data requested from the plugin are really available. Change-Id: I5ea57b945bc33a309c3b3b18ec029296d5428950 Reviewed-by: Qt CI Bot Reviewed-by: Mitch Curtis --- .../qvirtualkeyboardselectionlistmodel.cpp | 21 ++++++++++++++++++++- .../qvirtualkeyboardselectionlistmodel.h | 1 + 2 files changed, 21 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/virtualkeyboard/qvirtualkeyboardselectionlistmodel.cpp b/src/virtualkeyboard/qvirtualkeyboardselectionlistmodel.cpp index d2cbc22e..90b1e7df 100644 --- a/src/virtualkeyboard/qvirtualkeyboardselectionlistmodel.cpp +++ b/src/virtualkeyboard/qvirtualkeyboardselectionlistmodel.cpp @@ -170,6 +170,7 @@ void QVirtualKeyboardSelectionListModel::setDataSource(QVirtualKeyboardAbstractI if (d->dataSource) { disconnect(this, SLOT(selectionListChanged(Type))); disconnect(this, SLOT(selectionListActiveItemChanged(Type, int))); + disconnect(this, SLOT(dataSourceDestroyed())); } d->type = type; if (d->dataSource) { @@ -181,6 +182,7 @@ void QVirtualKeyboardSelectionListModel::setDataSource(QVirtualKeyboardAbstractI if (d->dataSource) { QObject::connect(d->dataSource.data(), &QVirtualKeyboardAbstractInputMethod::selectionListChanged, this, &QVirtualKeyboardSelectionListModel::selectionListChanged); QObject::connect(d->dataSource.data(), &QVirtualKeyboardAbstractInputMethod::selectionListActiveItemChanged, this, &QVirtualKeyboardSelectionListModel::selectionListActiveItemChanged); + QObject::connect(d->dataSource.data(), &QObject::destroyed, this, &QVirtualKeyboardSelectionListModel::dataSourceDestroyed); } } @@ -209,7 +211,14 @@ int QVirtualKeyboardSelectionListModel::rowCount(const QModelIndex &parent) cons QVariant QVirtualKeyboardSelectionListModel::data(const QModelIndex &index, int role) const { Q_D(const QVirtualKeyboardSelectionListModel); - return d->dataSource ? d->dataSource->selectionListData(d->type, index.row(), static_cast(role)) : QVariant(); + + if (!d->dataSource) + return QVariant(); + + if (index.row() < 0 || index.row() >= d->rowCount) + return QVariant(); + + return d->dataSource->selectionListData(d->type, index.row(), static_cast(role)); } /*! @@ -331,6 +340,16 @@ void QVirtualKeyboardSelectionListModel::selectionListActiveItemChanged(QVirtual } } +/*! + \internal +*/ +void QVirtualKeyboardSelectionListModel::dataSourceDestroyed() +{ + Q_D(QVirtualKeyboardSelectionListModel); + selectionListChanged(d->type); + selectionListActiveItemChanged(d->type, -1); +} + /*! \qmlsignal void SelectionListModel::activeItemChanged(int index) diff --git a/src/virtualkeyboard/qvirtualkeyboardselectionlistmodel.h b/src/virtualkeyboard/qvirtualkeyboardselectionlistmodel.h index 40d07d7c..c19d9ed1 100644 --- a/src/virtualkeyboard/qvirtualkeyboardselectionlistmodel.h +++ b/src/virtualkeyboard/qvirtualkeyboardselectionlistmodel.h @@ -93,6 +93,7 @@ Q_SIGNALS: protected Q_SLOTS: void selectionListChanged(Type type); void selectionListActiveItemChanged(Type type, int index); + void dataSourceDestroyed(); private: friend class QVirtualKeyboardInputEngine; -- cgit v1.2.3