Skip to content

Commit

Permalink
take the current skill from utterances
Browse files Browse the repository at this point in the history
  • Loading branch information
notmart committed Dec 13, 2019
1 parent 496d541 commit 8aadb4b
Show file tree
Hide file tree
Showing 6 changed files with 67 additions and 19 deletions.
34 changes: 21 additions & 13 deletions import/abstractskillview.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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()
Expand Down Expand Up @@ -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;
}
Expand All @@ -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
Expand Down Expand Up @@ -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;
}
Expand All @@ -390,26 +398,26 @@ void AbstractSkillView::onGuiSocketMessageReceived(const QString &message)
return;
}

m_activeSkillsModel->insertSkills(position, skillList);
m_activeSkillsModel->skillsModel()->insertSkills(position, skillList);


// Active skill removed
} else if (type == QLatin1String("mycroft.session.list.remove") && doc[QStringLiteral("namespace")].toString() == QLatin1String("mycroft.system.active_skills")) {
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
{
Expand All @@ -420,28 +428,28 @@ 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")) {
const int from = doc[QStringLiteral("from")].toInt();
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


Expand Down Expand Up @@ -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;
}
Expand Down
26 changes: 26 additions & 0 deletions import/activeskillsmodel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ void ActiveSkillsFilterModel::setBlackList(const QStringList &list)

m_blackList = list;

invalidate();
emit blackListChanged();
}

Expand All @@ -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));
Expand Down Expand Up @@ -101,6 +116,11 @@ QList<DelegatesModel *> 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);
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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;
}
Expand Down
8 changes: 7 additions & 1 deletion import/activeskillsmodel.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;

/**
Expand All @@ -56,13 +57,16 @@ class ActiveSkillsFilterModel : public QSortFilterProxyModel
DelegatesModel *delegatesModelForSkill(const QString &skillId);
QList<DelegatesModel *> 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<QString> m_blackList;
Expand Down Expand Up @@ -93,6 +97,8 @@ class ActiveSkillsModel : public QAbstractListModel
*/
QModelIndex skillIndex(const QString &skillId);

QStringList activeSkills() const;

DelegatesModel *delegatesModelForSkill(const QString &skillId);
QHash<QString, DelegatesModel*> delegatesModels() const;

Expand Down
14 changes: 9 additions & 5 deletions import/mycroftcontroller.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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")) {
Expand All @@ -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)
Expand Down
2 changes: 2 additions & 0 deletions import/mycroftcontroller.h
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down
2 changes: 2 additions & 0 deletions import/qml/SkillView.qml
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,8 @@ Mycroft.AbstractSkillView {
}
}

activeSkills.onSkillActivated: open = true;

SequentialAnimation {
id: openAnimation
ScriptAction {
Expand Down

0 comments on commit 8aadb4b

Please sign in to comment.