FileDialog - Optymalizacja rekurencyjnie wypisywanych lokacji plików
Ostatnio zmodyfikowano wczoraj o godz. 17:11
tBane Temat założony przez niniejszego użytkownika |
FileDialog - Optymalizacja rekurencyjnie wypisywanych lokacji plików » 2026-06-03 12:22:57 Cześć. Napisałem sobie File Dialog. tj okienko do listowania plików w katalogu. Lista dla plików jest optymalizowana w ten sposób, że wyświetlanych jest elementów wysokość_panelu/wysokość_itemu + 1. Dzięki temu wyświetlam stałą liczbę itemów dla plików i folderów. Chciałbym teraz optymalizować w podobny sposób lokacje po lewej stronie. Problematyczne jest to, że nie wiem jak to zrobić z rekurencyjnym przetwarzaniem katalogów (bo niektóre mogą być otwarte stąd ta rekurencja). Ma ktoś pomysł jak to optymalizować? :-) optymalizacja listowania plików i katalogów w prawym oknie (% basic_text_rect_height) for( int i = 0; i < _files.size(); i++ ) { std::filesystem::path path = _filesPaths[ i + scrollbarValue / basic_text_rect_height ]; _files[ i ]->setFile( path ); sf::Vector2i pos; pos.x = _rightRect->position.x; pos.y = _rightRect->position.y +( i * basic_text_rect_height ) - _rightScrollbar->getValue() % basic_text_rect_height; _files[ i ]->setPosition( pos ); }
rysowanie lewego panelu bez optymalizacji ale z przycinaniem obrazu do okienkafloat LocationRect::getTotalHeight() { float h =( float ) _rect.size.y; if( _isOpen ) { for( auto & child: _children ) { h += child->getTotalHeight(); } } return h; }
void FileDialog::drawLeftPanel() { sf::View view( sf::FloatRect( sf::Vector2f(( float ) _leftRect->position.x,( float ) _leftRect->position.y ), sf::Vector2f(( float ) _leftRect->size.x,( float ) _leftRect->size.y ) ) ); sf::FloatRect vp( sf::Vector2f(( float ) _leftRect->position.x / mainView.getSize().x,( float ) _leftRect->position.y / mainView.getSize().y ), sf::Vector2f(( float ) _leftRect->size.x / mainView.getSize().x,( float ) _leftRect->size.y / mainView.getSize().y ) ); view.setViewport( vp ); window->setView( view ); sf::Vector2i pos; pos.x = getContentPosition().x + dialog_padding; pos.y = getContentPosition().y - _leftScrollbar->getValue(); for( int i = 0; i < _locations.size(); i++ ) { _locations[ i ]->setPosition( pos ); pos.y +=( int ) _locations[ i ]->getTotalHeight(); } for( auto & fav: _locations ) fav->draw(); }
|
|
DejaVu |
» 2026-06-03 15:49:17 Ja nie zrozumiałem o co chodzi nawet - po lewej masz drzewko (które twierdzisz, że jest ogarniete), a po prawej lista (która nie ma zagnieżdżeń bo i dlaczego miałaby mieć). Gdzie jest problem i co chcesz optymalizować? :) Coś za wolno działa czy... co? |
|
tBane Temat założony przez niniejszego użytkownika |
» 2026-06-03 16:14:03 Nie drzewko po lewej stronie nie jest ogarnięte. Chodzi mi o to, że gdy odpalam folder z windosem to zawiesza (w dół 500 FPS ponad), bo jest dużo podkatalogów do wyświetlenia. próbuję zoptymalizować proces renderowania katalogów w tym lewym panelu :D |
|
DejaVu |
» 2026-06-03 17:00:40 to renderuj tylko to co widoczne - chyba wiesz które elementy na liście są widoczne? |
|
tBane Temat założony przez niniejszego użytkownika |
» 2026-06-03 17:07:03 Można by sprawdzać dla wszystkich lokacji po kolei intersection z panelem, ale to nie wydaje się optymalnym rozwiązaniem, bo trzeba przejrzeć je wszystkie...
Potrzebowałbym index pierwszego widocznego katalogu i jakoś wyznaczyć końcowy chyba |
|
| « 1 » |