Forum de la communauté SFML

Aide => Graphique => Discussion démarrée par: Samuel Proulx le Août 31, 2012, 12:37:09 am

Titre: sf::Text saut de ligne
Posté par: Samuel Proulx le Août 31, 2012, 12:37:09 am
Bonjour à tous et à toutes :)

La classe sf::Text ne semble pas posséder de méthode afin de créer un retour à la ligne automatique dès que le GlobalBounds dépasse une certaine taille.

Existe-t-il une solution à se problème ou je dois mesurer la taille de X caractères et mettre un \n quand ça excède la taille désiré ?

Merci et bonne journée :)
Titre: Re : sf::Text saut de ligne
Posté par: Laurent le Août 31, 2012, 12:43:57 am
Citer
Existe-t-il une solution à se problème ou je dois mesurer la taille de X caractères et mettre un \n quand ça excède la taille désiré ?
2ème option, désolé :(
Titre: Re : sf::Text saut de ligne
Posté par: Samuel Proulx le Août 31, 2012, 12:59:31 am
Bof, c'est pas si grave puisque ma GUI a déjà une classe Label qui est une simple couche par dessus un sf::Text pour être capable de dessiner comme n'importe quel Widget (label.draw() au lieu de app.draw(label)). Je dois juste ajouter une GlobalBounds définie par l'utilisateur afin de mettre les \n dans le texte en fonction de cette boîte. Pas si compliqué que ça quand même :)

En plus, ma classe abstraite Widget contient déjà les GlobalBounds puisque tout widget a forcément une taille. Suffit d'arranger un peu Label pour ça :)

je crois que ça serait une bonne option à ajouter directement dans sf::Text pour une prochaine version :)
Titre: Re : sf::Text saut de ligne
Posté par: Laurent le Août 31, 2012, 10:57:50 am
Oui, c'est prévu.
Titre: Re : sf::Text saut de ligne
Posté par: Samuel Proulx le Septembre 01, 2012, 06:24:14 pm
Voilà pour ceux que ça intéresse un petit code de base pour effectuer des retour à la ligne dans un sf::Text :

//on fait le tour des caractères du sf::Text
for(int i=0;i<m_text.getString().getSize();i++)
    {
        //Si le caractère dépasse la boundingbox définit et que le caractère n'est pas égal à un retour à la ligne
        if(findCharacterPos(i).x > m_globalBounds.left+m_globalBounds.width && m_text.getString()[i] != 10)
        {
            //On va chercher le dernier caractère espace afin de faire des retour à la ligne par mot et non par caractère
            while(m_text.getString()[i] != 32)--i;
            //On ajoute le caractère de retour à la ligne en remplacent l'espace entre les deux mots par \n
            String str1 = m_text.getString().toWideString().substr(0,i);
            str1 += "\n";
            str1 += m_text.getString().toWideString().substr(i+1);
            m_text.setString(str1);
        }
    }
 

J'ignore s'il s'agit de la façon la plus optimisé de faire, mais elle fonctionne très bien :)
Titre: Re : sf::Text saut de ligne
Posté par: Laurent le Septembre 01, 2012, 08:14:48 pm
Deux choses :
- ' ' et '\n', c'est plus sympa que 32 et 10
- utilise la fonction sf::String::insert au lieu de faire plein de découpages et de réassemblages

Sinon pour la logique, c'est effectivement exactement ce qu'il faut faire (pour le moment) ;)
Titre: Re: sf::Text saut de ligne
Posté par: Sipige le Décembre 16, 2017, 04:28:57 pm
Et maintenant ?
Titre: Re: sf::Text saut de ligne
Posté par: Guillaume__ le Décembre 16, 2017, 09:09:55 pm
Bonsoir,

Aujourd'hui encore on procède de cette manière.

Cordialement G