Ostatnio zmodyfikowano wczoraj o godz. 23:22
tBane Temat założony przez niniejszego użytkownika |
[SFML 2.X] Open Dialog Box » 2024-09-28 17:55:01 Witam. Chciałbym zaprogramować Open Dialog Box w moim programie. Mniej więcej wiem jak się za to zabrać, ale mam parę pytań.
Ogólnie to podzieliłem proces na kilka etapów: -stworzenie głównego okna (z kontrolką close) -lista plików i folderów -text field z zaznaczonym plikiem -przycisk submit
Na początek mam pytanie, bo nie chciałbym sprawdzać długości w znakach. Jak w SFML ograniczyć napis sf::Text? Tak żeby miał np. max 200px ? Poza tym nie korzystam z machine states. Czy w tym wypadku warto z nich korzystać czy dalej pracować ze zwykłymi if'ami ? |
|
pekfos |
» 2024-09-28 18:15:54 Rozważ czy nie lepiej skorzystać z Windowsowego dialogu wyboru pliku ( https://learn.microsoft.com/en-us/windows/win32/api/commdlg/nf-commdlg-getopenfilenamew) Na początek mam pytanie, bo nie chciałbym sprawdzać długości w znakach. Jak w SFML ograniczyć napis sf::Text? Tak żeby miał np. max 200px ? Co to znaczy ograniczyć? Chcesz mieć maksymalnie N znaków tak by tekst nie przekraczał 200px, czy chcesz przyciąć renderowany tekst do 200px, potencjalnie mając na końcu częściowo narysowaną literę? Poza tym nie korzystam z machine states. Czy w tym wypadku warto z nich korzystać czy dalej pracować ze zwykłymi if'ami ? A co to takiego? Nie chodziło o state machine? Wydaje mi się że to dalej są "zwykłe ify". |
|
tBane Temat założony przez niniejszego użytkownika |
» 2024-09-28 18:38:44 Rozważ czy nie lepiej skorzystać z Windowsowego dialogu wyboru pliku (https://learn.microsoft.com/en-us/windows/win32/api/commdlg/nf-commdlg-getopenfilenamew) Nie wiem czy będzie to wizualnie pasować do mojej aplikacji. Co to znaczy ograniczyć? Chcesz mieć maksymalnie N znaków tak by tekst nie przekraczał 200px, czy chcesz przyciąć renderowany tekst do 200px, potencjalnie mając na końcu częściowo narysowaną literę? W sumie masz rację, nie pomyślałem o tym. A co to takiego? Nie chodziło o state machine? Wydaje mi się że to dalej są "zwykłe ify". No bo to są if'y. Ale jest taki standard pisania, by się nie pogubić w kodzie. A ja już jestem na tym etapie, że powoli gubię się w tych wszystkich if'ach. |
|
tBane Temat założony przez niniejszego użytkownika |
» 2024-09-29 16:14:54 Mam już coś takiego. Jak się listuje katalogi ? void testOpenDialogBox() { sf::RenderWindow window( sf::VideoMode( 600, 600 ), "test Open Dialog Box" ); sf::RectangleShape rect; sf::RectangleShape bar; sf::RectangleShape textField[ 8 ]; sf::Text texts[ 8 ]; while( window.isOpen() ) { sf::Event event; while( window.pollEvent( event ) ) { if( event.type == sf::Event::Closed ) window.close(); } sf::Vector2f position = sf::Vector2f( 300, 300 ); rect = sf::RectangleShape( sf::Vector2f( 512, 256 + 32 ) ); rect.setPosition( position.x - 256, position.y - 128 - 32 ); rect.setFillColor( sf::Color( 128, 128, 128 ) ); bar = sf::RectangleShape( sf::Vector2f( 512, 32 ) ); bar.setPosition( position.x - 256, position.y - 128 - 32 ); bar.setFillColor( sf::Color( 48, 48, 48 ) ); for( int i = 0; i < 8; i++ ) { textField[ i ] = sf::RectangleShape( sf::Vector2f( 512, 32 ) ); textField[ i ].setPosition( position.x - 256, position.y - 128 + i * 32 ); textField[ i ].setFillColor( sf::Color::Transparent ); texts[ i ] = sf::Text(); texts[ i ].setFont( basicFont ); texts[ i ].setCharacterSize( 24 ); texts[ i ].setFillColor( textColor ); texts[ i ].setString( "to/jest/lokalizacja/jakiegos/pliku.txt" ); texts[ i ].setPosition( position.x - 256 + 8, position.y - 128 + i * 32 ); } window.clear(); window.draw( rect ); window.draw( bar ); for( int i = 0; i < 8; i++ ) { window.draw( textField[ i ] ); window.draw( texts[ i ] ); } window.display(); } }
//Edit Już mam. std::vector < std::string > paths;
if( filesystem::exists( folderPath ) && filesystem::is_directory( folderPath ) ) { for( auto & entry: filesystem::directory_iterator( folderPath ) ) { paths.push_back( entry.path().string() ); } }
|
|
tBane Temat założony przez niniejszego użytkownika |
» 2024-09-29 19:04:54 Chciałbym do tego okna dodać pionowy scroll bar po prawej stronie. Napisałem już kod ale nie jestem pewien czy jest dobry. Jak myślisz? #include <SFML/System.hpp> #include <SFML/Graphics.hpp>
sf::RenderWindow * window;
class Scrollbar { public: sf::Vector2f size; sf::Vector2f position; float minValue; float maxValue; float scrollValue; sf::RectangleShape bar; sf::RectangleShape scroll; Scrollbar( sf::Vector2f size, sf::Vector2f position, float minValue, float maxValue, float scrollValue ) { this->size = size; this->position = position; this->minValue = minValue; this->maxValue = maxValue; this->scrollValue = scrollValue; } void update() { bar = sf::RectangleShape( size ); bar.setFillColor( sf::Color::Blue ); bar.setPosition( position ); scroll = sf::RectangleShape( sf::Vector2f( size.x * 2, size.x * 2 ) ); scroll.setOrigin( size.x, size.x ); scroll.setFillColor( sf::Color::Red ); sf::Vector2f scrollPosition; scrollPosition.x = position.x; scrollPosition.y = position.y +( scrollValue - minValue ) / maxValue * size.y; scroll.setPosition( scrollPosition ); } void draw() { window->draw( bar ); window->draw( scroll ); } };
int main() { window = new sf::RenderWindow( sf::VideoMode::getDesktopMode(), "scroll" ); window->setFramerateLimit( 60 ); sf::Vector2f size = sf::Vector2f( 16, 512 ); sf::Vector2f position = sf::Vector2f( 200, 400 ); Scrollbar scrollbar = Scrollbar( size, position, 16, 32, 16 ); while( window->isOpen() ) { sf::Event event; while( window->pollEvent( event ) ) { } scrollbar.scrollValue += 1; scrollbar.update(); window->clear(); scrollbar.draw(); window->display(); } return 0; }
|
|
pekfos |
» 2024-09-29 19:29:38 Za wiele to tu nie ma. Nie ma sensu mieć bar i scroll jako pola w klasie, bo te obiekty są potrzebne tylko do renderowania i możesz je dopiero tam utworzyć. Przechowywanie ich na stałe tylko zwiększa rozmiar obiektu klasy. W tym kodzie jedyne sensowne zadanie dla update() to zapewnienie że bieżąca wartość jest między minimum i maksimum, a tego akurat nie robisz i scroll wylatuje za ekran sekundę po uruchomieniu programu. Nie wiem też czemu używasz tej długiej składni: sf::Vector2f size = sf::Vector2f( 16, 512 );
zamiast sf::Vector2f size( 16, 512 ); auto size = sf::Vector2f( 16, 512 ); |
|
tBane Temat założony przez niniejszego użytkownika |
» 2024-09-29 19:37:07 Dobra. Ogarnąłem to i wyszło, że zrobiłem błąd w obliczaniu pozycji y scrolla. Wiesz może jak ją obliczyć poprawnie? void update() { if( scrollValue > maxValue ) scrollValue = maxValue; if( scrollValue < minValue ) scrollValue = minValue; bar = sf::RectangleShape( size ); bar.setFillColor( sf::Color::Blue ); bar.setPosition( position ); scroll = sf::RectangleShape( sf::Vector2f( size.x * 2, size.x * 2 ) ); scroll.setOrigin( size.x, size.x ); scroll.setFillColor( sf::Color::Red ); sf::Vector2f scrollPosition; scrollPosition.x = position.x; scrollPosition.y = position.y +( scrollValue - minValue ) / maxValue * size.y; scroll.setPosition( scrollPosition ); }
|
|
pekfos |
» 2024-09-29 19:40:47 scrollPosition.y = position.y +( scrollValue - minValue ) /( maxValue - minValue ) * size.y;
? |
|
« 1 » 2 3 4 |