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;
//std::wcout << rightScrollbar->getValue() << " : " << pos.y << L"\n";
_files[i]->setPosition(pos);
}
rysowanie lewego panelu bez optymalizacji ale z przycinaniem obrazu do okienka
float LocationRect::getTotalHeight() {
float h = (float)_rect.size.y;
if (_isOpen) {
for (auto& child : _children) {
h += child->getTotalHeight();
}
}
return h;
}
void FileDialog::drawLeftPanel() {
// ograniczenie widoku do rozmiaru recta
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)
);
// ustawienie widoku
view.setViewport(vp);
window->setView(view);
/*
sf::RectangleShape leftRect(sf::Vector2f(_leftRect.size));
leftRect.setPosition(sf::Vector2f(_leftRect.position));
leftRect.setFillColor(sf::Color(255, 47, 47, 127));
window->draw(leftRect);
*/
// pozycjonowanie itemów folderów
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();
}
// desktop/documents/pictures etc.
for (auto& fav : _locations)
fav->draw();
}