Разработка контекста / как изменить результат контекста внутри execute_action
Я стал немного потерян с тем, как установить атрибут результата или вызвать поиск области (обновить) внутри Scope::perform_action
метод или в методах ActivationQuery
объект. Идея состоит в том, чтобы изменить данные в источнике, а затем либо обновить ответ новым запросом, либо просто изменить предыдущий результат так же, как изменился источник. Типичным примером может быть статус "был прочитан".
Не могли бы вы немного помочь с приведенным ниже примером?
sc::ActivationQueryBase::UPtr Scope::perform_action(const sc::Result &result,
sc::ActionMetadata const &metadata,
std::string const &widget_id, std::string const &action_id) {
//update current Result/reply or trigger new search by scope
return sc::ActivationQueryBase::UPtr(new ActivationQuery(result, metadata, widget_id, action_id, config_));
}
1 ответ
Вы не можете изменить сам Результат, он получен только для чтения, вам нужно применить любые обновления к вашим внутренним данным, а затем повторно выполнить поиск. Для этого переопределите метод activ () вашего ActivationQueryBase в вашем классе ActivationQuery; сделайте все, что вам нужно, чтобы обновить данные бэкэнда в activ (), а затем верните экземпляр ActivationResponse, созданный с этим ctor:
ActivationResponse (CannedQuery const & query);
Аргумент запроса должен указывать на вашу область действия.
Альтернативный подход для повторного выполнения поиска при нажатии кнопки в предварительном просмотре состоит в том, чтобы установить атрибут uri кнопки со значением CannedQuery::to_uri(), но в этом случае ваш обработчик активации не выполняется.
Обратите внимание, что при первом подходе вы, вероятно, испытаете https://bugs.launchpad.net/ubuntu/+source/unity8/+bug/1335761
Надеюсь, это поможет.