Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[SFML 2.0] ograniczony rozmiarami text input, rozmiar konkretnych znaków

Ostatnio zmodyfikowano 2013-06-28 17:43
Autor Wiadomość
sajmon
Temat założony przez niniejszego użytkownika
[SFML 2.0] ograniczony rozmiarami text input, rozmiar konkretnych znaków
» 2013-04-15 17:48:32
Siemka.
Robię sobie takie prymitywne gui i zastanawiam się na textinputem.
Mam zrobione już, że po wprowadzeniu tekstu dłuższego niż szerokość kontrolki tekst się przycina itp. tylko głowię się nad dokładną szerokością tekstu.
sf::Text::getLocalBounds() dla czcionki o rozmiarze 15 zwraca średnio 2 razy większe wartości.
I np po podzieleniu przez 2 szerokość niektórych znaków się zgadza, ale niektóre są mniejsze nawet o 4 piksele a niektóre troszkę większe od wyniku dzielenia :C
To powoduje, że zależnie od tego jakie znaki się wprowadzi albo widoczny string jest krótszy albo dłuższy od kontrolki :/
I teraz mam pytanie czy jest jakiś lepszy sposób na sprawdzenie szerokości konkretnego znaku :( ?
Bo jedyne rozwiązanie jakie mi przychodzi do głowy to zdeklarować jakąś mapę szerokości dla każdego znaku, ale to rozwiązanie zdaje się dosyć toporne oraz czasochłonne będzie taką mapę zbudować bo bd musiał każdy znak z osobna "mierzyć" w gimpie :C

Ktoś ma jakieś lepsze pomysły :) ?
P-80596
pekfos
» 2013-04-15 17:59:08
Tymczasem kilka linii niżej w dokumentacji..
C/C++
sf::Text::getGlobalBounds()
P-80597
sajmon
Temat założony przez niniejszego użytkownika
» 2013-04-15 18:04:32
no pewnie że to sprawdzałem zanim napisałem xd
zwraca to samo co sf::Text::getLocalBounds() przynajmniej w moim przypadku :C
P-80598
pekfos
» 2013-04-15 18:07:02
Kod?
P-80599
sajmon
Temat założony przez niniejszego użytkownika
» 2013-04-15 18:13:19
tak na dziko pisane narazie :P
w addletter jest dodawany tylko 1 znak na raz
C/C++
class pTextEdit
    : public pWidget
{
public:
    pTextEdit();
    pTextEdit( float, float, float, float );
    bool isActive;
    void updateShape();
    void addLetter( sf::String & );
    void removeLetter();
    sf::Text textEditText;
    sf::Text prepareText();
    sf::String textEditString;
    sf::String textEditCutString;
    float textWidth;
private:
    virtual void draw( sf::RenderTarget & target, sf::RenderStates states ) const;
};

/////////////////////////////////

void pTextEdit::addLetter( sf::String & s )
{
    sf::Text t( s );
    std::cout << "Dodanie literki, " << t.getLocalBounds().width << "(" << t.getGlobalBounds().width << ") :" <<( float )( int )( t.getLocalBounds().width / 2.f ) + 1 << std::endl;
    this->textWidth +=(( float )( int )( t.getLocalBounds().width / 2.f ) + 1 );
    this->textEditString += s;
    this->textEditCutString += s;
    this->prepareText();
}

void pTextEdit::removeLetter()
{
    if( this->textEditCutString.getSize() > 0 )
    {
        sf::String tmp = this->textEditCutString;
        sf::String tmpforsize = this->textEditCutString;
       
        if( this->textEditString.getSize() > this->textEditCutString.getSize() )
        {
            size_t lnumber = tmp.getSize();
            tmp.erase( tmp.getSize() - 1, 1 );
           
           
            tmpforsize.erase( 0, tmpforsize.getSize() - 1 );
            sf::Text tmpT( tmpforsize );
            this->textWidth -=(( float )( int )( tmpT.getLocalBounds().width / 2.f ) + 1 );
           
            sf::String tmp2 = this->textEditString;
            tmp2.erase( tmp2.getSize() - lnumber, lnumber );
            tmp2.erase( 0, tmp2.getSize() - 1 );
            //std::cout << tmp2.toAnsiString() << std::endl;
            sf::Text tmpT2( tmp2 );
            this->textWidth +=(( float )( int )( tmpT2.getLocalBounds().width / 2.f ) + 1 );
           
            //std::cout << tmp.toAnsiString() << " / " << tmpforsize.toAnsiString() << " / " << tmp2.toAnsiString() << std::endl;
            tmp.insert( 0, tmp2 );
        }
        else
        {
            tmp.erase( tmp.getSize() - 1, 1 );
            tmpforsize.erase( 0, tmpforsize.getSize() - 1 );
            sf::Text tmpT( tmpforsize );
            this->textWidth -=(( float )( int )( tmpT.getLocalBounds().width / 2.f ) + 1 );
        }
       
        this->textEditString.erase( this->textEditString.getSize() - 1, 1 );
        this->textEditCutString = tmp;
        this->prepareText();
    }
}

sf::Text pTextEdit::prepareText()
{
    while(( this->textWidth ) >( this->widgetSize.x - 10 ) )
    {
        //std::cout << this->textEditCutString.toAnsiString() << std::endl;
        sf::String tmp = this->textEditCutString;
        tmp.erase( 1, tmp.getSize() - 1 );
        //std::cout << tmp.toAnsiString() << std::endl;
        sf::Text tmpT( tmp );
        this->textEditCutString.erase( 0, 1 );
        this->textWidth -=(( float )( int )( tmpT.getLocalBounds().width / 2.f ) + 1 );
        //std::cout << this->textWidth << ":" << this->widgetSize.x << std::endl;
    }
   
    this->textEditText.setString( this->textEditCutString );
   
    this->textEditText.setPosition( this->widgetPosition.x + 5, this->widgetPosition.y +( this->widgetSize.y - this->textEditText.getLocalBounds().height ) / 2 );
   
    std::cout << "Wielkość tekstu: " << this->textWidth << std::endl;
    return this->textEditText;
}
P-80600
pekfos
» 2013-04-15 18:21:30
C/C++
sf::Text t( s );
std::cout << "Dodanie literki, " << t.getLocalBounds().width << "(" << t.getGlobalBounds().width << ") :" <<( float )( int )( t.getLocalBounds().width / 2.f ) + 1 << std::endl;
getGlobalBounds
 uwzględnia przekształcenia. Są tu przekształcenia? Jeśli skalujesz tekst tylko przed wyświetleniem, to się nie dziw, że wszędzie indziej tekst ma domyślny rozmiar.
P-80602
sajmon
Temat założony przez niniejszego użytkownika
» 2013-04-15 22:43:38
o jaaa no racja ale nie ogarnąłem :P
dodałem to tych tymczasowych obiektów tekstowych zmianę czcionki zmieniłem tę metodę z local na global, ale i tak wartości są identyczne jak wtedy jak dzieliłem je na 2 (czcionke ustawiam 15)
i na przykład "A" mierzone w gimpie ma 9 pikseli szerokości a metoda getGlobalBounds() wyrzuca 13 px, a taka kropka ma 4px a ta metoda daje 3 px. I te różnice właśnie tworzą te przesunięcia :/
Jest na to jakiś sposób ?
P-80637
DejaVu
» 2013-06-28 17:43:57
Musisz poświęcić trochę czasu na zapoznanie się z przekształceniami współrzędnych pomiędzy sceną, a ekraniem bądź oknem aplikacji. Metody do ustalania rozmiaru tekstu już zostały podane, tj. sf::Text::getLocalBounds() oraz sf::Text::getGlobalBounds(). Temat można więc uznać za rozwiązany i zakończony. Jeeżeli masz potrzebę wznowienia dyskusji na temat przekształceń to załóż osobny temat :) Ten temat zamykam.
P-86484
« 1 »
  Strona 1 z 1