diff --git a/gui/widget.cpp b/gui/widget.cpp index 06b5b7d5f6f..8e3fd7be611 100644 --- a/gui/widget.cpp +++ b/gui/widget.cpp @@ -1046,7 +1046,10 @@ void GridItemWidget::setActiveEntry(LauncherEntry &entry) { void GridItemWidget::update() { if ((!_activeEntry) && (!_attachedEntries.empty())) { - _activeEntry = _attachedEntries.begin(); + _activeEntry = _attachedEntries.begin(); + } + + if (isVisible()) { // warning("%s, %s - Entry", _activeEntry->key.c_str(), _activeEntry->description.c_str()); Common::String gameid = _activeEntry->domain->getVal("gameid"); Common::String engineid = _activeEntry->domain->getVal("engineid"); @@ -1192,46 +1195,64 @@ void GridWidget::loadPlatformIcons() { } } -Common::Array<Common::String> GridWidget::visibleEntries() { - Common::Array<Common::String> thumbList; - Common::String pathPrefix("./icons/"); - int startingEntry = 0; - int totalVisibleEntries = 0; - for (auto iter = _allEntries.begin(); iter != _allEntries.end(); ++iter) { - Common::String gameid = iter->domain->getVal("gameid"); - Common::String engineid = iter->domain->getVal("engineid"); - thumbList.push_back(pathPrefix + Common::String::format("%s-%s.png", engineid.c_str(), gameid.c_str())); +bool GridWidget::calcVisibleEntries() { + warning("calcingVisible entries"); + bool needsReload = false; + + int nFirstVisibleItem = 0; + int nItemsOnScreen = 0; + + nFirstVisibleItem = _itemsPerRow * (-_scrollPos / _gridItemHeight); + nItemsOnScreen = ((_scrollWindowHeight / _gridItemHeight) + 1) * (_itemsPerRow); + + if ((nFirstVisibleItem != _firstVisibleItem) || (nItemsOnScreen != _itemsOnScreen)) { + needsReload = true; + _firstVisibleItem = nFirstVisibleItem; + _itemsOnScreen = nItemsOnScreen; + + _visibleEntries.clear(); + for (int ind = _firstVisibleItem; ind < _firstVisibleItem + _itemsOnScreen; ++ind) { + LauncherEntry *iter = _allEntries.begin() + ind; + _visibleEntries.push_back(*iter); + } } - return thumbList; + + // warning("Visible entries : %d to %d", _firstVisibleItem, _itemsOnScreen); + return needsReload; } void GridWidget::reloadThumbnails() { Graphics::ManagedSurface *surf = nullptr; _loadedSurfaces.clear(true); - Common::Array<Common::String> titleList = visibleEntries(); - for (Common::Array<Common::String>::iterator iter = titleList.begin(); iter != titleList.end(); ++iter) { - if (_loadedSurfaces.contains(*iter)) { + for (Common::Array<LauncherEntry>::iterator iter = _visibleEntries.begin(); iter != _visibleEntries.end(); ++iter) { + Common::String gameid = iter->domain->getVal("gameid"); + Common::String engineid = iter->domain->getVal("engineid"); + Common::String path = Common::String("./icons/")+Common::String::format("%s-%s.png", engineid.c_str(), gameid.c_str()); + if (_loadedSurfaces.contains(path)) { warning("Thumbnail already loaded, skipping..."); } else { - surf = loadSurfaceFromFile(*iter); - _loadedSurfaces[*iter] = surf; + surf = loadSurfaceFromFile(path); + _loadedSurfaces[path] = surf; } } } -Graphics::ManagedSurface * GridWidget::filenameToSurface(Common::String &name) { +Graphics::ManagedSurface *GridWidget::filenameToSurface(Common::String &name) { Common::String path = Common::String("./icons/")+name; - auto list = visibleEntries(); - for (auto l = list.begin(); l!=list.end(); ++l) { - if (*l == path) { + for (auto l = _visibleEntries.begin(); l!=_visibleEntries.end(); ++l) { + Common::String gameid = l->domain->getVal("gameid"); + Common::String engineid = l->domain->getVal("engineid"); + Common::String lPath = Common::String("./icons/")+Common::String::format("%s-%s.png", engineid.c_str(), gameid.c_str()); + if (lPath == path) { return _loadedSurfaces[path]; } } + // warning("This image is not visible"); return nullptr; } -Graphics::ManagedSurface * GridWidget::platformToSurface(Platform platformCode) { +Graphics::ManagedSurface *GridWidget::platformToSurface(Platform platformCode) { if ((platformCode == kPlatformUnknown) || (platformCode < 0 || platformCode >= _platformIcons.size())) { warning("Unknown Platform"); return nullptr; @@ -1248,6 +1269,7 @@ void GridWidget::handleMouseWheel(int x, int y, int direction) { _scrollPos = -(_innerHeight - _scrollWindowHeight); int row = 0, col = 0; int k = 0; + for (Common::Array<GridItemWidget *>::iterator iter = _gridItems.begin(); iter != _gridItems.end(); ++iter) { k = row * _itemsPerRow + col; (*iter)->setPos(50 + col * (kThumbnailWidth + 50), _scrollPos + 50 + row * (kThumbnailHeight + 80)); @@ -1264,6 +1286,12 @@ void GridWidget::handleMouseWheel(int x, int y, int direction) { } ++k; } + + if (calcVisibleEntries()) { + reloadThumbnails(); + updateGrid(); + } + markAsDirty(); } @@ -1285,6 +1313,10 @@ void GridWidget::reflowLayout() { int row = 0; int col = 0; + if (calcVisibleEntries()) { + reloadThumbnails(); + } + Common::HashMap<Common::String, GridItemWidget *> entryById; for (Common::Array<LauncherEntry>::iterator i = _allEntries.begin(); i != _allEntries.end(); ++i) { @@ -1318,6 +1350,13 @@ void GridWidget::reflowLayout() { markAsDirty(); } +void GridWidget::updateGrid() { + for (auto i = _gridItems.begin(); i != _gridItems.end(); ++i) { + (*i)->update(); + } +} + + #pragma mark - OptionsContainerWidget::OptionsContainerWidget(GuiObject *boss, const Common::String &name, const Common::String &dialogLayout, diff --git a/gui/widget.h b/gui/widget.h index c9737c1a767..a0ec15a6eeb 100644 --- a/gui/widget.h +++ b/gui/widget.h @@ -502,9 +502,12 @@ private: int _scrollPos; int _itemsPerRow; + int _firstVisibleItem; int _itemsOnScreen; + bool _titlesVisible; + public: enum Platform { @@ -520,8 +523,8 @@ public: Graphics::ManagedSurface * filenameToSurface(Common::String &name); Graphics::ManagedSurface * platformToSurface(Platform platformCode); - Common::Array<Common::String> visibleEntries(void); + bool calcVisibleEntries(void); void setEntryList(Common::Array<LauncherEntry> *list); void destroyItems(); void loadPlatformIcons();