Witaj!
tBane dodał nowy post w wątku: FileDialog - Optymalizacja rekurencyjnie wypisywanych lokacji plików
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)
Kopiuj
for (int i = 0; i < _files.size(); i++) { sf::Vector2i pos; pos.x = _separator->getPosition().x + _separator->getSize().x + dialog_padding; pos.x = _rightRect->position.x; pos.y = getContentPosition().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
Kopiuj
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(); } for (auto& fav : _locations) fav->draw(); }
Z poważaniem, 4programmers.net
|