From 8aadb4b8ce0faa24080c9c8de3ac1c6aeac6b646 Mon Sep 17 00:00:00 2001 From: Marco Martin Date: Fri, 13 Dec 2019 20:37:16 +0100 Subject: [PATCH] take the current skill from utterances --- import/abstractskillview.cpp | 34 +++++++++++++++++++++------------- import/activeskillsmodel.cpp | 26 ++++++++++++++++++++++++++ import/activeskillsmodel.h | 8 +++++++- import/mycroftcontroller.cpp | 14 +++++++++----- import/mycroftcontroller.h | 2 ++ import/qml/SkillView.qml | 2 ++ 6 files changed, 67 insertions(+), 19 deletions(-) diff --git a/import/abstractskillview.cpp b/import/abstractskillview.cpp index f578dfd..2b01ccc 100644 --- a/import/abstractskillview.cpp +++ b/import/abstractskillview.cpp @@ -51,7 +51,7 @@ AbstractSkillView::AbstractSkillView(QQuickItem *parent) connect(m_guiWebSocket, &QWebSocket::disconnected, this, &AbstractSkillView::closed); connect(m_guiWebSocket, &QWebSocket::disconnected, this, [this]() { - m_activeSkillsModel->removeRows(0, m_activeSkillsModel->rowCount()); + m_activeSkillsModel->removeRows(0, m_activeSkillsModel->skillsModel()->rowCount()); }); connect(m_guiWebSocket, &QWebSocket::stateChanged, this, @@ -103,6 +103,11 @@ AbstractSkillView::AbstractSkillView(QQuickItem *parent) engine->clearComponentCache(); } }); + + connect(m_controller, &MycroftController::utteranceManagedBySkill, this, + [this](const QString &skillId) { + m_activeSkillsModel->checkGuiActivation(skillId); + }); } AbstractSkillView::~AbstractSkillView() @@ -310,7 +315,7 @@ void AbstractSkillView::onGuiSocketMessageReceived(const QString &message) qWarning() << "Empty skill_id in mycroft.session.set"; return; } - if (!m_activeSkillsModel->skillIndex(skillId).isValid()) { + if (!m_activeSkillsModel->skillsModel()->skillIndex(skillId).isValid()) { qWarning() << "Invalid skill_id in mycroft.session.set:" << skillId; return; } @@ -321,6 +326,9 @@ void AbstractSkillView::onGuiSocketMessageReceived(const QString &message) //we already checked, assume *map is valid SessionDataMap *map = sessionDataForSkill(skillId); + if (!map) { + return; + } QVariantMap::const_iterator i; for (i = data.constBegin(); i != data.constEnd(); ++i) { //insert it as a model @@ -378,7 +386,7 @@ void AbstractSkillView::onGuiSocketMessageReceived(const QString &message) } else if (type == QLatin1String("mycroft.session.list.insert") && doc[QStringLiteral("namespace")].toString() == QLatin1String("mycroft.system.active_skills")) { const int position = doc[QStringLiteral("position")].toInt(); - if (position < 0 || position > m_activeSkillsModel->rowCount()) { + if (position < 0 || position > m_activeSkillsModel->skillsModel()->rowCount()) { qWarning() << "Error: Invalid position in mycroft.session.list.insert of mycroft.system.active_skills"; return; } @@ -390,7 +398,7 @@ void AbstractSkillView::onGuiSocketMessageReceived(const QString &message) return; } - m_activeSkillsModel->insertSkills(position, skillList); + m_activeSkillsModel->skillsModel()->insertSkills(position, skillList); // Active skill removed @@ -398,18 +406,18 @@ void AbstractSkillView::onGuiSocketMessageReceived(const QString &message) const int position = doc[QStringLiteral("position")].toInt(); const int itemsNumber = doc[QStringLiteral("items_number")].toInt(); - if (position < 0 || position > m_activeSkillsModel->rowCount() - 1) { + if (position < 0 || position > m_activeSkillsModel->skillsModel()->rowCount() - 1) { qWarning() << "Error: Invalid position in mycroft.session.list.remove of mycroft.system.active_skills"; return; } - if (itemsNumber < 0 || itemsNumber > m_activeSkillsModel->rowCount() - position) { + if (itemsNumber < 0 || itemsNumber > m_activeSkillsModel->skillsModel()->rowCount() - position) { qWarning() << "Error: Invalid items_number in mycroft.session.list.remove of mycroft.system.active_skills"; return; } for (int i = 0; i < itemsNumber; ++i) { - const QString skillId = m_activeSkillsModel->data(m_activeSkillsModel->index(position+i, 0)).toString(); + const QString skillId = m_activeSkillsModel->skillsModel()->data(m_activeSkillsModel->skillsModel()->index(position+i, 0)).toString(); //TODO: do this after an animation { @@ -420,7 +428,7 @@ void AbstractSkillView::onGuiSocketMessageReceived(const QString &message) } } } - m_activeSkillsModel->removeRows(position, itemsNumber); + m_activeSkillsModel->skillsModel()->removeRows(position, itemsNumber); // Active skill moved } else if (type == QLatin1String("mycroft.session.list.move") && doc[QStringLiteral("namespace")].toString() == QLatin1String("mycroft.system.active_skills")) { @@ -428,20 +436,20 @@ void AbstractSkillView::onGuiSocketMessageReceived(const QString &message) const int to = doc[QStringLiteral("to")].toInt(); const int itemsNumber = doc[QStringLiteral("items_number")].toInt(); - if (from < 0 || from > m_activeSkillsModel->rowCount() - 1) { + if (from < 0 || from > m_activeSkillsModel->skillsModel()->rowCount() - 1) { qWarning() << "Error: Invalid from position in mycroft.session.list.move of mycroft.system.active_skills"; return; } - if (to < 0 || to > m_activeSkillsModel->rowCount() - 1) { + if (to < 0 || to > m_activeSkillsModel->skillsModel()->rowCount() - 1) { qWarning() << "Error: Invalid to position in mycroft.session.list.move of mycroft.system.active_skills"; return; } - if (itemsNumber <= 0 || itemsNumber > m_activeSkillsModel->rowCount() - from) { + if (itemsNumber <= 0 || itemsNumber > m_activeSkillsModel->skillsModel()->rowCount() - from) { qWarning() << "Error: Invalid items_number in mycroft.session.list.move of mycroft.system.active_skills"; return; } - m_activeSkillsModel->moveRows(QModelIndex(), from, itemsNumber, QModelIndex(), to); + m_activeSkillsModel->skillsModel()->moveRows(QModelIndex(), from, itemsNumber, QModelIndex(), to); //END ACTIVESKILLS @@ -625,7 +633,7 @@ void AbstractSkillView::onGuiSocketMessageReceived(const QString &message) const int position = doc[QStringLiteral("position")].toInt(); - if (position < 0 || position > m_activeSkillsModel->rowCount()) { + if (position < 0 || position > m_activeSkillsModel->skillsModel()->rowCount()) { qWarning() << "Error: Invalid position in mycroft.session.list.update"; return; } diff --git a/import/activeskillsmodel.cpp b/import/activeskillsmodel.cpp index 65bc257..27f89a6 100644 --- a/import/activeskillsmodel.cpp +++ b/import/activeskillsmodel.cpp @@ -44,6 +44,7 @@ void ActiveSkillsFilterModel::setBlackList(const QStringList &list) m_blackList = list; + invalidate(); emit blackListChanged(); } @@ -60,9 +61,23 @@ void ActiveSkillsFilterModel::setWhiteList(const QStringList &list) m_whiteList = list; + invalidate(); emit whiteListChanged(); } +void ActiveSkillsFilterModel::checkGuiActivation(const QString &skillId) +{ + if (m_skillsModel->activeSkills().first() == skillId) { + if (skillAllowed(skillId)) { + emit skillActivated(skillId); + } else { + emit blacklistedSkillActivated(skillId); + } + } else if (data(index(0,0), ActiveSkillsModel::SkillId).toString() == skillId) { + emit skillActivated(skillId); + } +} + bool ActiveSkillsFilterModel::skillAllowed(const QString skillId) const { return !m_blackList.contains(skillId) && (m_whiteList.isEmpty() || m_whiteList.contains(skillId)); @@ -101,6 +116,11 @@ QList ActiveSkillsFilterModel::delegatesModels() const return list; } +ActiveSkillsModel *ActiveSkillsFilterModel::skillsModel() const +{ + return m_skillsModel; +} + bool ActiveSkillsFilterModel::filterAcceptsRow(int source_row, const QModelIndex &source_parent) const { QModelIndex sourceIndex = sourceModel()->index(source_row, 0, source_parent); @@ -149,6 +169,11 @@ void ActiveSkillsModel::insertSkills(int position, const QStringList &skillList) endInsertRows(); } +QStringList ActiveSkillsModel::activeSkills() const +{ + return m_skills; +} + QModelIndex ActiveSkillsModel::skillIndex(const QString &skillId) { const int row = m_skills.indexOf(skillId); @@ -229,6 +254,7 @@ bool ActiveSkillsModel::removeRows(int row, int count, const QModelIndex &parent } } m_skills.erase(m_skills.begin() + row, m_skills.begin() + row + count); + endRemoveRows(); return true; } diff --git a/import/activeskillsmodel.h b/import/activeskillsmodel.h index 32c3a6f..5158479 100644 --- a/import/activeskillsmodel.h +++ b/import/activeskillsmodel.h @@ -41,6 +41,7 @@ class ActiveSkillsFilterModel : public QSortFilterProxyModel QStringList whiteList() const; void setWhiteList(const QStringList &list); + void checkGuiActivation(const QString &skillId); bool skillAllowed(const QString skillId) const; /** @@ -56,13 +57,16 @@ class ActiveSkillsFilterModel : public QSortFilterProxyModel DelegatesModel *delegatesModelForSkill(const QString &skillId); QList delegatesModels() const; + ActiveSkillsModel *skillsModel() const; + protected: bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const override; Q_SIGNALS: void blackListChanged(); void whiteListChanged(); - void skillBlackListed(const QString &skillId); + void skillActivated(const QString &skillId); + void blacklistedSkillActivated(const QString &skillId); private: QList m_blackList; @@ -93,6 +97,8 @@ class ActiveSkillsModel : public QAbstractListModel */ QModelIndex skillIndex(const QString &skillId); + QStringList activeSkills() const; + DelegatesModel *delegatesModelForSkill(const QString &skillId); QHash delegatesModels() const; diff --git a/import/mycroftcontroller.cpp b/import/mycroftcontroller.cpp index 11a187d..d9ed5f6 100644 --- a/import/mycroftcontroller.cpp +++ b/import/mycroftcontroller.cpp @@ -232,11 +232,7 @@ void MycroftController::onMainSocketMessageReceived(const QString &message) return; } - if (type == QLatin1String("mycroft.skill.handler.start")) { - m_currentSkill = doc[QStringLiteral("data")][QStringLiteral("name")].toString(); - qDebug() << "Current skill:" << m_currentSkill; - emit currentSkillChanged(); - } else if (type == QLatin1String("mycroft.skill.handler.complete")) { + if (type == QLatin1String("mycroft.skill.handler.complete")) { m_currentSkill = QString(); emit currentSkillChanged(); } else if (type == QLatin1String("speak")) { @@ -262,6 +258,14 @@ void MycroftController::onMainSocketMessageReceived(const QString &message) m_views[guiId]->setUrl(url); m_reannounceGuiTimer.stop(); } + + // Check if it's an utterance recognized as an intent + if (type.contains(QLatin1Char(':')) && !doc[QStringLiteral("data")][QStringLiteral("utterance")].toString().isEmpty()) { + m_currentSkill = type.split(QLatin1Char(':')).first(); + qDebug() << "Current skill:" << m_currentSkill; + emit utteranceManagedBySkill(m_currentSkill); + emit currentSkillChanged(); + } } void MycroftController::sendRequest(const QString &type, const QVariantMap &data) diff --git a/import/mycroftcontroller.h b/import/mycroftcontroller.h index 6bd909e..71d05b0 100644 --- a/import/mycroftcontroller.h +++ b/import/mycroftcontroller.h @@ -83,6 +83,8 @@ class MycroftController : public QObject //TODO: remove? void fallbackTextRecieved(const QString &skill, const QVariantMap &data); + void utteranceManagedBySkill(const QString &skill); + public Q_SLOTS: void start(); void disconnectSocket(); diff --git a/import/qml/SkillView.qml b/import/qml/SkillView.qml index c473d68..fe152a2 100644 --- a/import/qml/SkillView.qml +++ b/import/qml/SkillView.qml @@ -52,6 +52,8 @@ Mycroft.AbstractSkillView { } } + activeSkills.onSkillActivated: open = true; + SequentialAnimation { id: openAnimation ScriptAction {