void WordRibbon::onWordCandidateReleased(const WordCandidate &candidate)
{
    if (candidate.source() == WordCandidate::SourcePrediction
        || candidate.source() == WordCandidate::SourceSpellChecking) {
        Q_EMIT wordCandidateSelected(candidate.word());
    } else if (candidate.source() == WordCandidate::SourceUser) {
        Q_EMIT userCandidateSelected(candidate.word());
        Q_EMIT wordCandidateSelected(candidate.word());
    }
}
void LayoutUpdater::onWordCandidateReleased(const WordCandidate &candidate)
{
    Q_D(LayoutUpdater);

    if (d->layout
        && isWordRibbonVisible()
        && updateWordRibbon(d->layout, candidate, d->activeStyleAttributes(), DeactivateElement)) {
        if (candidate.source() == WordCandidate::SourcePrediction
            || candidate.source() == WordCandidate::SourceSpellChecking) {
            Q_EMIT wordCandidateSelected(candidate.word());
        } else if (candidate.source() == WordCandidate::SourceUser) {
            Q_EMIT userCandidateSelected(candidate.word());
        }
    }
}