Bienvenue, Invité. Merci de vous connecter ou de vous inscrire.
Avez-vous perdu votre e-mail d'activation ?

Auteur Sujet: Appliquer des filtres à sf::String  (Lu 3264 fois)

0 Membres et 1 Invité sur ce sujet

  • Invité
Appliquer des filtres à sf::String
« le: Août 30, 2016, 05:26:24 pm »
Bonjour,

En travaillant sur une petite bibliothèque basée sur la SFML, j'ai créé un éditeur de texte et me suis dit que ce serait bien de pouvoir y appliquer des filtres, pour que l'utilisateur ne puisse taper que des chiffres par exemple.
Je me suis du coup rendu compte que sf::String ne permettait pas ce genre de chose.
Du coup j'ai codé un petit truc moi-même (voir plus bas), mais je me suis dit que ce serait pas mal de l'intégrer à la SFML.
Le code ci-dessous n'est qu'une suggestion, je pense que M.Gomilla (ou n'importe qui de plus expérimenté que moi) saura faire mieux.

typedef std::vector<sf::Uint32> CharFilter;

/**
 * \brief Applies the given filter to the string.
 *
 * The filter will remove every character from str that is not in the filter, unless you set the 'exclusive' paramter to true, then it will do the opposite (and remove every character that is in the filter).
 * An empty filter is considered as being "no filter", and thus do not have any effect.
 *
 * \param filter The filter to apply.
 * \param Set to true* if you want the filter to be exclusive, set to false* otherwise.
 */

void String::applyFilter(CharFilter filter, bool exclusive = false)
{
    if(!filter.empty())
    {
        for(std::size_t i = 0 ; i < m_string.getSize() ; i++)
            if( ( std::find(filter.begin(), filter.end(), m_string[i]) != filter.end() ) == exclusive )
                m_string.erase(i);
    }
}
« Modifié: Août 30, 2016, 05:44:40 pm par Glân de Brylan »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Appliquer des filtres à sf::String
« Réponse #1 le: Août 30, 2016, 05:55:17 pm »
Mes pensées concernant cette demande :

1. Je pense qu'un tel filtre devrait bloquer la saisie à la source (ie. dans l'évènement sf::TextEntered par exemple). Ca ne me paraît pas très naturel d'ajouter tout et n'importe quoi à la chaîne, puis de retirer ce qu'on ne veut pas dans un second temps. Bref, ce ne serait pas à sf::String de faire ça. D'autant plus que l'implémentation ne serait pas plus compliquée, bien au contraire :

case sf::Event::TextEntered:
    if (std::find(filter.begin(), filter.end(), event.text.unicode) == filter.end())
        str += event.text.unicode;
 

2. Retirer des éléments d'un conteneur non-associatif, ça se fait très bien avec les algorithmes standards (std::remove_if, std::find, ...), ce qui explique que tu ne trouves pas cette fonction dans sf::String, pas plus que dans std::vector d'ailleurs. Donc je ne vois aucune bonne raison pour que tes 3 lignes de code soient intégrées à SFML.
Laurent Gomila - SFML developer