summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--examples/media/tuner/main.qml16
-rw-r--r--src/ivicore/qivisearchandbrowsemodel.cpp65
-rw-r--r--src/ivicore/qivisearchandbrowsemodel.h4
-rw-r--r--src/ivicore/qivisearchandbrowsemodel_p.h2
-rw-r--r--src/ivicore/qivisearchandbrowsemodelinterface.cpp31
-rw-r--r--src/ivicore/qivisearchandbrowsemodelinterface.h2
-rw-r--r--src/plugins/ivimedia/media_simulator/searchandbrowsebackend.cpp9
-rw-r--r--src/plugins/ivimedia/media_simulator/searchandbrowsebackend.h1
-rw-r--r--src/plugins/ivimedia/media_simulator/usbbrowsebackend.cpp9
-rw-r--r--src/plugins/ivimedia/media_simulator/usbbrowsebackend.h1
-rw-r--r--src/plugins/ivimedia/tuner_simulator/searchandbrowsebackend.cpp22
-rw-r--r--src/plugins/ivimedia/tuner_simulator/searchandbrowsebackend.h1
12 files changed, 163 insertions, 0 deletions
diff --git a/examples/media/tuner/main.qml b/examples/media/tuner/main.qml
index fe5313f..bca4849 100644
--- a/examples/media/tuner/main.qml
+++ b/examples/media/tuner/main.qml
@@ -191,6 +191,7 @@ ApplicationWindow {
}
Button {
+ id: addButton
text: "+"
width: parent.width / 10
height: parent.height
@@ -198,6 +199,21 @@ ApplicationWindow {
onClicked: {
presetsModel.insert(0, model.item)
}
+
+ function checkExists() {
+ presetsModel.indexOf(model.item, function (index) {
+ addButton.enabled = (index == -1)
+ })
+ }
+
+ Component.onCompleted: {
+ checkExists()
+ }
+
+ Connections {
+ target: presetsModel
+ onCountChanged: addButton.checkExists()
+ }
}
}
}
diff --git a/src/ivicore/qivisearchandbrowsemodel.cpp b/src/ivicore/qivisearchandbrowsemodel.cpp
index fcf7c41..45c38b9 100644
--- a/src/ivicore/qivisearchandbrowsemodel.cpp
+++ b/src/ivicore/qivisearchandbrowsemodel.cpp
@@ -182,6 +182,16 @@ void QIviSearchAndBrowseModelPrivate::onDataChanged(const QUuid &identifier, con
}
}
+void QIviSearchAndBrowseModelPrivate::onIndexOfCallResult(const QUuid &identifier, int callID, int index)
+{
+ if (identifier != m_identifier || !m_indexOfFunctorHash.contains(callID))
+ return;
+
+ QJSValue functor = m_indexOfFunctorHash.take(callID);
+ QJSValueList list = { QJSValue(index) };
+ functor.call(list);
+}
+
void QIviSearchAndBrowseModelPrivate::onFetchMoreThresholdReached()
{
Q_Q(QIviSearchAndBrowseModel);
@@ -1036,6 +1046,58 @@ void QIviSearchAndBrowseModel::move(int cur_index, int new_index)
}
/*!
+ \qmlmethod SearchAndBrowseModel::indexOf(SearchAndBrowseModelItem item, object functor)
+
+ Determines the index of \a item in this model and calls the \a functor once the result is ready.
+ The result is passed as the first argument to the functor and is -1 if the item is not part of the list.
+
+ \code
+ model.indexOf(item, function (index) {
+ console.log("The index of item is: ", index)
+ })
+ \endcode
+*/
+
+/*!
+ \fn void QIviSearchAndBrowseModel::indexOf(const QVariant &variant, const QJSValue &functor)
+
+ Determines the index of \a variant in this model and calls the \a functor once the result is ready.
+ The result is passed as the first argument to the functor and is -1 if the item is not part of the list.
+
+ \code
+ model.indexOf(item, function (index) {
+ console.log("The index of item is: ", index)
+ })
+ \endcode
+*/
+void QIviSearchAndBrowseModel::indexOf(const QVariant &variant, const QJSValue &functor)
+{
+ Q_D(QIviSearchAndBrowseModel);
+ const QIviSearchAndBrowseModelItem *item = d->itemFromVariant(variant);
+ if (!item)
+ return;
+
+ if (!functor.isCallable()) {
+ qWarning("Provided functor is not callable");
+ return;
+ }
+
+ QIviSearchAndBrowseModelInterface *backend = d->searchBackend();
+ if (!backend) {
+ qWarning("Can't get the index without a connected backend");
+ return;
+ }
+
+ int callID = backend->indexOf(d->m_identifier, d->m_contentType, item);
+ if (callID == -1) {
+ qWarning("An error happened while calling the backend");
+ return;
+ }
+
+ d->m_indexOfFunctorHash.insert(callID, functor);
+}
+
+/*!
\reimp
*/
bool QIviSearchAndBrowseModel::canFetchMore(const QModelIndex &parent) const
@@ -1131,6 +1193,9 @@ void QIviSearchAndBrowseModel::connectToServiceObject(QIviServiceObject *service
d, &QIviSearchAndBrowseModelPrivate::onCountChanged);
QObjectPrivate::connect(backend, &QIviSearchAndBrowseModelInterface::dataChanged,
d, &QIviSearchAndBrowseModelPrivate::onDataChanged);
+ QObjectPrivate::connect(backend, &QIviSearchAndBrowseModelInterface::indexOfCallResult,
+ d, &QIviSearchAndBrowseModelPrivate::onIndexOfCallResult,
+ Qt::QueuedConnection);
d->setCanGoBack(backend->canGoBack(d->m_identifier, d->m_contentType));
diff --git a/src/ivicore/qivisearchandbrowsemodel.h b/src/ivicore/qivisearchandbrowsemodel.h
index dd7bb64..41a2069 100644
--- a/src/ivicore/qivisearchandbrowsemodel.h
+++ b/src/ivicore/qivisearchandbrowsemodel.h
@@ -44,6 +44,7 @@
#include <QtIviCore/QIviAbstractFeatureListModel>
#include <QtIviCore/QIviServiceObject>
+#include <QtQml/QJSValue>
QT_BEGIN_NAMESPACE
@@ -145,6 +146,8 @@ public:
Q_INVOKABLE void insert(int index, const QVariant &variant);
Q_INVOKABLE void remove(int index);
Q_INVOKABLE void move(int cur_index, int new_index);
+ //TODO add a C++ version for this, similar to QTimer::singleShot()
+ Q_INVOKABLE void indexOf(const QVariant &variant, const QJSValue &functor);
template <typename T> T at(int i) const {
return data(index(i,0), ItemRole).value<T>();
@@ -176,6 +179,7 @@ private:
Q_PRIVATE_SLOT(d_func(), void onDataFetched(const QUuid &identifer, const QList<QVariant> &items, int start, bool moreAvailable))
Q_PRIVATE_SLOT(d_func(), void onCountChanged(const QUuid &identifier, int new_length))
Q_PRIVATE_SLOT(d_func(), void onDataChanged(const QUuid &identifier, const QList<QVariant> &data, int start, int count))
+ Q_PRIVATE_SLOT(d_func(), void onIndexOfCallResult(const QUuid &identifier, int callID, int index))
Q_PRIVATE_SLOT(d_func(), void onFetchMoreThresholdReached())
};
diff --git a/src/ivicore/qivisearchandbrowsemodel_p.h b/src/ivicore/qivisearchandbrowsemodel_p.h
index 2ff7b01..b6ffa1f 100644
--- a/src/ivicore/qivisearchandbrowsemodel_p.h
+++ b/src/ivicore/qivisearchandbrowsemodel_p.h
@@ -75,6 +75,7 @@ public:
void onDataFetched(const QUuid &identifer, const QList<QVariant> &items, int start, bool moreAvailable);
void onCountChanged(const QUuid &identifier, int new_length);
void onDataChanged(const QUuid &identifier, const QList<QVariant> &data, int start, int count);
+ void onIndexOfCallResult(const QUuid &identifier, int callID, int index);
void onFetchMoreThresholdReached();
void resetModel();
void parseQuery();
@@ -106,6 +107,7 @@ public:
QStringList m_availableContentTypes;
bool m_canGoBack;
QIviSearchAndBrowseModel::LoadingType m_loadingType;
+ QHash<int, QJSValue> m_indexOfFunctorHash;
};
QT_END_NAMESPACE
diff --git a/src/ivicore/qivisearchandbrowsemodelinterface.cpp b/src/ivicore/qivisearchandbrowsemodelinterface.cpp
index 2ad3aa3..c991db1 100644
--- a/src/ivicore/qivisearchandbrowsemodelinterface.cpp
+++ b/src/ivicore/qivisearchandbrowsemodelinterface.cpp
@@ -206,6 +206,27 @@ void QIviSearchAndBrowseModelInterface::registerContentType(const QMetaObject &o
*/
/*!
+ \fn int QIviSearchAndBrowseModelInterface::indexOf(const QUuid &identifier, const QString &type, const QIviSearchAndBrowseModelItem *item)
+
+ Determines the index of \a item in the model identified by \a identifier and \a type.
+ An id will be returned which identifies this call (-1 for an error, or not supported). The result is sent by emitting the indexOfCallResult() signal
+
+ The following code shows and example usage:
+ \code
+ QVector<ExampleItem> list;
+
+ ExampleItem item = *static_cast<const ExampleItem*>(item);
+ static int callID = 0;
+
+ emit indexOfCallResult(identifier, callID, list.indexOf(item));
+
+ return callID++;
+ \endcode
+
+ \sa indexOfCallResult()
+*/
+
+/*!
\fn void QIviSearchAndBrowseModelInterface::supportedCapabilitiesChanged(const QUuid &identifier, QIviSearchAndBrowseModel::Capabilities capabilities)
Emitted when the \a capabilities of the model instance identified by \a identifier changed.
@@ -257,3 +278,13 @@ void QIviSearchAndBrowseModelInterface::registerContentType(const QMetaObject &o
\sa insert() remove() move()
*/
+
+/*!
+ \fn void QIviSearchAndBrowseModelInterface::indexOfCallResult(const QUuid &identifier, int callID, int index)
+
+ This signal is emitted as a result of a call to indexOf() and returns the \a index of the requested item.
+ If the item is not part of the list -1 should be returned. The \a identifier and \a callID arguments are used to map this result to the matching
+ model and the call.
+
+ \sa indexOf()
+*/
diff --git a/src/ivicore/qivisearchandbrowsemodelinterface.h b/src/ivicore/qivisearchandbrowsemodelinterface.h
index ff0dc53..7f99d93 100644
--- a/src/ivicore/qivisearchandbrowsemodelinterface.h
+++ b/src/ivicore/qivisearchandbrowsemodelinterface.h
@@ -76,12 +76,14 @@ public:
virtual void insert(const QUuid &identifier, const QString &type, int index, const QIviSearchAndBrowseModelItem *item) = 0;
virtual void remove(const QUuid &identifier, const QString &type, int index) = 0;
virtual void move(const QUuid &identifier, const QString &type, int currentIndex, int newIndex) = 0;
+ virtual int indexOf(const QUuid &identifier, const QString &type, const QIviSearchAndBrowseModelItem *item) = 0;
Q_SIGNALS:
void supportedCapabilitiesChanged(const QUuid &identifier, QIviSearchAndBrowseModel::Capabilities capabilities);
void countChanged(const QUuid &identifier, int newLength); // Emitted by the backend if it already knows the total count of items in the model (can be used by the dataChanged display method)
void dataFetched(const QUuid &identifier, const QList<QVariant> &data, int start, bool moreAvailable);
void dataChanged(const QUuid &identifier, const QList<QVariant> &data, int start, int count); //start and count defines which data gets replace by the new data content. If data is empty the rows will be removed, if count is 0, the data will be added.
+ void indexOfCallResult(const QUuid &identifier, int callID, int index);
protected:
template <typename T>
diff --git a/src/plugins/ivimedia/media_simulator/searchandbrowsebackend.cpp b/src/plugins/ivimedia/media_simulator/searchandbrowsebackend.cpp
index 4746f29..a7fb9d0 100644
--- a/src/plugins/ivimedia/media_simulator/searchandbrowsebackend.cpp
+++ b/src/plugins/ivimedia/media_simulator/searchandbrowsebackend.cpp
@@ -347,3 +347,12 @@ void SearchAndBrowseBackend::move(const QUuid &identifier, const QString &type,
Q_UNUSED(currentIndex)
Q_UNUSED(newIndex)
}
+
+int SearchAndBrowseBackend::indexOf(const QUuid &identifier, const QString &type, const QIviSearchAndBrowseModelItem *item)
+{
+ Q_UNUSED(identifier)
+ Q_UNUSED(type)
+ Q_UNUSED(item)
+
+ return -1;
+}
diff --git a/src/plugins/ivimedia/media_simulator/searchandbrowsebackend.h b/src/plugins/ivimedia/media_simulator/searchandbrowsebackend.h
index b4092f7..6cde384 100644
--- a/src/plugins/ivimedia/media_simulator/searchandbrowsebackend.h
+++ b/src/plugins/ivimedia/media_simulator/searchandbrowsebackend.h
@@ -80,6 +80,7 @@ public:
virtual void insert(const QUuid &identifier, const QString &type, int index, const QIviSearchAndBrowseModelItem *item) Q_DECL_OVERRIDE;
virtual void remove(const QUuid &identifier, const QString &type, int index) Q_DECL_OVERRIDE;
virtual void move(const QUuid &identifier, const QString &type, int currentIndex, int newIndex) Q_DECL_OVERRIDE;
+ virtual int indexOf(const QUuid &identifier, const QString &type, const QIviSearchAndBrowseModelItem *item) Q_DECL_OVERRIDE;
private slots:
void search(const QUuid &identifier, const QString &queryString, const QString &type, int start, int count);
diff --git a/src/plugins/ivimedia/media_simulator/usbbrowsebackend.cpp b/src/plugins/ivimedia/media_simulator/usbbrowsebackend.cpp
index c8e2137..21f996d 100644
--- a/src/plugins/ivimedia/media_simulator/usbbrowsebackend.cpp
+++ b/src/plugins/ivimedia/media_simulator/usbbrowsebackend.cpp
@@ -141,3 +141,12 @@ void UsbBrowseBackend::move(const QUuid &identifier, const QString &type, int cu
Q_UNUSED(currentIndex)
Q_UNUSED(newIndex)
}
+
+int UsbBrowseBackend::indexOf(const QUuid &identifier, const QString &type, const QIviSearchAndBrowseModelItem *item)
+{
+ Q_UNUSED(identifier)
+ Q_UNUSED(type)
+ Q_UNUSED(item)
+
+ return -1;
+}
diff --git a/src/plugins/ivimedia/media_simulator/usbbrowsebackend.h b/src/plugins/ivimedia/media_simulator/usbbrowsebackend.h
index f9d5a33..e55ee91 100644
--- a/src/plugins/ivimedia/media_simulator/usbbrowsebackend.h
+++ b/src/plugins/ivimedia/media_simulator/usbbrowsebackend.h
@@ -58,6 +58,7 @@ public:
virtual void insert(const QUuid &identifier, const QString &type, int index, const QIviSearchAndBrowseModelItem *item) Q_DECL_OVERRIDE;
virtual void remove(const QUuid &identifier, const QString &type, int index) Q_DECL_OVERRIDE;
virtual void move(const QUuid &identifier, const QString &type, int currentIndex, int newIndex) Q_DECL_OVERRIDE;
+ virtual int indexOf(const QUuid &identifier, const QString &type, const QIviSearchAndBrowseModelItem *item) Q_DECL_OVERRIDE;
private:
QString m_rootFolder;
diff --git a/src/plugins/ivimedia/tuner_simulator/searchandbrowsebackend.cpp b/src/plugins/ivimedia/tuner_simulator/searchandbrowsebackend.cpp
index 13cf0a6..2d1aace 100644
--- a/src/plugins/ivimedia/tuner_simulator/searchandbrowsebackend.cpp
+++ b/src/plugins/ivimedia/tuner_simulator/searchandbrowsebackend.cpp
@@ -149,3 +149,25 @@ void SearchAndBrowseBackend::move(const QUuid &identifier, const QString &type,
emit dataChanged(identifier, stations, min, max - min + 1);
}
+
+int SearchAndBrowseBackend::indexOf(const QUuid &identifier, const QString &type, const QIviSearchAndBrowseModelItem *item)
+{
+ if (item->type() != "amfmtunerstation")
+ return -1;
+
+ QVector<QIviAmFmTunerStation> stations;
+
+ if (type == "station")
+ stations = m_tunerBackend->m_bandHash[QIviAmFmTuner::AMBand].m_stations + m_tunerBackend->m_bandHash[QIviAmFmTuner::FMBand].m_stations;
+ else if (type == "presets")
+ stations = m_presets;
+ else
+ return -1;
+
+ QIviAmFmTunerStation station = *static_cast<const QIviAmFmTunerStation*>(item);
+ static int callID = 0;
+
+ emit indexOfCallResult(identifier, callID, stations.indexOf(station));
+
+ return callID++;
+}
diff --git a/src/plugins/ivimedia/tuner_simulator/searchandbrowsebackend.h b/src/plugins/ivimedia/tuner_simulator/searchandbrowsebackend.h
index 8a9db7b..a5a1b8a 100644
--- a/src/plugins/ivimedia/tuner_simulator/searchandbrowsebackend.h
+++ b/src/plugins/ivimedia/tuner_simulator/searchandbrowsebackend.h
@@ -63,6 +63,7 @@ public:
virtual void insert(const QUuid &identifier, const QString &type, int index, const QIviSearchAndBrowseModelItem *item) Q_DECL_OVERRIDE;
virtual void remove(const QUuid &identifier, const QString &type, int index) Q_DECL_OVERRIDE;
virtual void move(const QUuid &identifier, const QString &type, int currentIndex, int newIndex) Q_DECL_OVERRIDE;
+ virtual int indexOf(const QUuid &identifier, const QString &type, const QIviSearchAndBrowseModelItem *item) Q_DECL_OVERRIDE;
private:
AmFmTunerBackend *m_tunerBackend;