Como eu suspeitava, há uma boa maneira de fazer isso.
1: na classe de escopo você deve sobrescrever o método activate
unity::scopes::ActivationQueryBase::UPtr NewsScope::activate(const sc::Result &result,
const unity::scopes::ActionMetadata &metadata) {
return unity::scopes::ActivationQueryBase::UPtr(new NewsAction(result, metadata));
}
2: Na classe unity :: scopes :: ActivationQueryBase (aqui NewsAction) você define o método activate, por exemplo, assim:
sc::ActivationResponse NewsAction::activate()
{
initScope();
if (openWithoutPreview) {
return sc::ActivationResponse(sc::ActivationResponse::Status::NotHandled);
}
return sc::ActivationResponse(sc::ActivationResponse::Status::ShowPreview);
}
(observe a resposta de ativação: NotHandled diz ao osciloscópio para enviá-lo ao distribuidor externo).
3: Finalmente, se criar as cartas (CategorisedResult) na classe de pesquisa, você tem que dizer-lhes para interceptar a ativação. (Result.set_intercept_activation ()) Por exemplo, assim:
for (const Result &result : results) {
sc::CategorisedResult card(category);
fillCard(card, result);
card.set_intercept_activation();
// Push the result
if (!reply->push(card)) {
// If we fail to push, it means the query has been cancelled.
// So don't continue;
return;
}
}
Encontrei a solução (oculta) neste manual: link