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

[SFML 2.X] Open Dialog Box - okno wyboru pliku

Ostatnio zmodyfikowano 2024-10-17 09:37
Autor Wiadomość
tBane
Temat założony przez niniejszego użytkownika
[SFML 2.X] Open Dialog Box - okno wyboru pliku
» 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 ?
P-181647
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".
P-181648
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.
P-181649
tBane
Temat założony przez niniejszego użytkownika
» 2024-09-29 16:14:54
Mam już coś takiego. Jak się listuje katalogi ?


C/C++
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();
           
       
}
       
       
       
// UPDATE
       
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 );
       
}
       
       
       
// RENDER
       
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.

C/C++
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() );
   
}
}

P-181650
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?

C/C++
#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() )
   
{
       
// Handle screen resizes
       
sf::Event event;
       
while( window->pollEvent( event ) )
       
{
           
        }
       
scrollbar.scrollValue += 1;
       
scrollbar.update();
       
       
window->clear();
       
scrollbar.draw();
       
window->display();
       
   
}
   
return 0;
}
P-181651
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:
C/C++
sf::Vector2f size = sf::Vector2f( 16, 512 );
zamiast
C/C++
sf::Vector2f size( 16, 512 );
// albo
auto size = sf::Vector2f( 16, 512 );
P-181652
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?

C/C++
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 );
}
P-181653
pekfos
» 2024-09-29 19:40:47
C/C++
scrollPosition.y = position.y +( scrollValue - minValue ) /( maxValue - minValue ) * size.y;
?
P-181654
« 1 » 2 3 4 5
  Strona 1 z 5 Następna strona