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

[SFML 2.X] Notepad - aplikacja notatnik

Ostatnio zmodyfikowano wczoraj o godz. 23:40
Autor Wiadomość
tBane
Temat założony przez niniejszego użytkownika
[SFML 2.X] Notepad - aplikacja notatnik
» 2025-05-17 16:45:50
Witam. Chcę napisać aplikację notatnik w SFML 2.6.2.

Aplikacja powinna:
-stosować wybraną czcionkę o danym rozmiarze
-wrapować tekst z uwzględnieniem tabulatorów, spacji oraz enterów w dowolnej ilości
-obsługiwać kursor - (ustawienie kursora, zaznaczanie tekstu)
-zapisywać/wczytywać pliki

Jak na razie wiem jak zrobić pierwszy oraz ostatni punkt, ale nie mam pojęcia jak wrapować tekst, a także jak obsłużyć kursor

No więc zaczynam od tego prostego kodu.
C/C++
#include <SFML/Graphics.hpp>

int main()
{
   
sf::RenderWindow window( sf::VideoMode( { 640, 640 } ), "Easy Notepad!" );
   
   
sf::Font font;
   
font.loadFromFile( "arial.ttf" );
   
   
short characterSize = 17;
   
   
sf::Text content;
   
content.setFont( font );
   
content.setCharacterSize( characterSize );
   
content.setString( L"to jest przykładowy tekst, to jest przykładowy tekst, to jest przykładowy tekst,to jest przykładowy tekst, to jest przykładowy tekst, to jest przykładowy tekst,to jest przykładowy tekst, to jest przykładowy tekst, to jest przykładowy tekst," );
   
content.setFillColor( sf::Color::White );
   
   
while( window.isOpen() )
   
{
       
       
sf::Vector2i mousePosition = sf::Mouse::getPosition( window ); // get the mouse position about window
       
sf::Vector2f worldMousePosition = window.mapPixelToCoords( mousePosition ); // get global mouse position
       
       
sf::Event event;
       
while( window.pollEvent( event ) ) {
           
if( event.type == sf::Event::Closed ) {
               
window.close();
           
}
        }
       
       
window.clear();
       
window.draw( content );
       
window.display();
   
}
}
P-182345
DejaVu
» 2025-05-17 16:48:07
Najpierw zrób sobie komponent taki jak scrollbar poziomy i pionowy. Potem zaimplementuj wczytanie danych np. do std::vector<std::wstring>. Potem zrób renderowanie tekstu bez zawijania, ale z obsługą scrollowania. Potem zrób 'kursor', który umożliwia wprowadzanie tekstu w miejscu gdzie jest kursor. Na koniec dopiero pomyśl o zawijaniu, bo do tego czasu i tak się dużo nauczysz.
P-182346
tBane
Temat założony przez niniejszego użytkownika
» 2025-05-17 16:57:30
Scrollbar ostatnio pisałem, więc nie będzie z tym problemu. Nie wiem po co tylko poziomy ... Skoro tekst wczytać do std::vector<std::wstring> to chyba musi być zawijanie wierszy - czyli wraper wymagany. Co do kursora, który pozwala wprowadzać dane w miejscu gdzie jest kursor to czy dobrym rozwiązaniem będzie zastosowanie
content.findCharacterPos( index )
 ?
P-182347
tBane
Temat założony przez niniejszego użytkownika
» 2025-05-17 18:43:03
Dobra napisałem pozycjonowanie kursora. Teraz potrzebuję podzielić tekst na linie (jeszcze bez wrapowania) i mam pytanie - jak pozycjonować kolejne linie tekstu ? Wcześniej robiłem to za pomocą funkcji getLineHeight() ale chciałbym użyć rzeczywistej wysokości linii.

C/C++
float getLineHeight( short characterSize ) {
   
return float( characterSize ) * 1.3f;
}

C/C++
#include <SFML/Graphics.hpp>
#include <iostream>

sf::Font font;
short characterSize;
sf::Text content;
std::wstring text;

sf::Vector2i mousePosition;
sf::Vector2f worldMousePosition;
sf::RectangleShape cursor;

int getCursorPosition() {
   
sf::Text content = sf::Text( text, font, characterSize );
   
   
for( size_t i = 0; i < content.getString().getSize(); ++i ) {
       
sf::Vector2f charPos = content.findCharacterPos( i );
       
float nextX = content.findCharacterPos( i + 1 ).x;
       
       
sf::FloatRect charRect( charPos.x, charPos.y, nextX - charPos.x, characterSize );
       
       
if( charRect.contains( worldMousePosition ) ) {
           
           
if( worldMousePosition.x < charRect.left + charRect.width / 2 )
               
 return i - 1;
           
else
               
 return i;
           
       
}
    }
   
   
return - 1;
}

int main()
{
   
sf::RenderWindow window( sf::VideoMode( { 640, 640 } ), "Easy Notepad!" );
   
   
font.loadFromFile( "arial.ttf" );
   
characterSize = 17;
   
text = L"to jest przykładowy tekst, to jest przykładowy tekst, to jest przykładowy tekst,\n"
    L"to jest przykładowy tekst, to jest przykładowy tekst, to jest przykładowy tekst,\n"
    L"to jest przykładowy tekst, to jest przykładowy tekst, to jest przykładowy tekst\n"
;
   
   
content.setFont( font );
   
content.setCharacterSize( characterSize );
   
content.setString( text );
   
content.setFillColor( sf::Color::White );
   
   
cursor = sf::RectangleShape( sf::Vector2f( 2, characterSize ) );
   
cursor.setFillColor( sf::Color::Red );
   
   
while( window.isOpen() )
   
{
       
       
mousePosition = sf::Mouse::getPosition( window ); // get the mouse position about window
       
worldMousePosition = window.mapPixelToCoords( mousePosition ); // get global mouse position
       
       
int i = getCursorPosition();
       
       
cursor.setPosition( content.findCharacterPos( i + 1 ) );
       
       
sf::Event event;
       
while( window.pollEvent( event ) ) {
           
if( event.type == sf::Event::Closed ) {
               
window.close();
           
}
           
           
        }
       
       
window.clear();
       
window.draw( content );
       
window.draw( cursor );
       
window.display();
   
}
}
P-182348
pekfos
» 2025-05-17 21:25:26
P-182349
tBane
Temat założony przez niniejszego użytkownika
» 2025-05-17 21:34:49
Dzięki pekfos :-)

Mam jeszcze pytanie. Jak zrobić kolorowanie składni?

Dajmy na to mam napis "to jest kolorowy tekst" i chciałbym żeby tylko słowo "kolorowy" miało inny kolor niż reszta frazy. Czy muszę tworzyć trzy oddzielne teksty, żeby to zrealizować?
P-182350
« 1 »
  Strona 1 z 1