4programmers.net

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ć? :-)

FileDialog.png

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


Zobacz post

Z poważaniem,
4programmers.net

Jeżeli masz problemy z kliknięciem na przycisk "Zobacz post", skopiuj i wklej poniższy link w przeglądarce:

http://4programmers.net/Notification?path=%252FForum%252FC_i_C%252B%252B%252F377883-filedialog_optymalizacja_rekurencyjnie_wypisywanych_lokacji_plikow%253Fp%253D2018093%2523id2018093