diff --git a/src/lang/english.txt b/src/lang/english.txt index 75d9675891..ef2b19d0b9 100644 --- a/src/lang/english.txt +++ b/src/lang/english.txt @@ -3779,4 +3779,6 @@ STR_CONTENT_ERROR_COULD_NOT_EXTRACT :{WHITE}Could no STR_CONTENT_INTRO_BUTTON :{BLACK}Check online content STR_CONTENT_INTRO_BUTTON_TIP :{BLACK}Check for new and updated content to download +STR_CONTENT_INTRO_MISSING_BUTTON :{BLACK}Find missing content online +STR_CONTENT_INTRO_MISSING_BUTTON_TIP :{BLACK}Check whether the missing content can be found online ######## diff --git a/src/network/network_content.cpp b/src/network/network_content.cpp index bdb3608ed8..fa7f836247 100644 --- a/src/network/network_content.cpp +++ b/src/network/network_content.cpp @@ -218,7 +218,7 @@ void ClientNetworkContentSocketHandler::RequestContentList(ContentVector *cv, bo ContentInfo *ci = *iter; bool found = false; for (ContentIterator iter2 = this->infos.Begin(); iter2 != this->infos.End(); iter2++) { - ContentInfo *ci2 = *iter; + ContentInfo *ci2 = *iter2; if (ci->type == ci2->type && ci->unique_id == ci2->unique_id && (!send_md5sum || memcmp(ci->md5sum, ci2->md5sum, sizeof(ci->md5sum)) == 0)) { found = true; @@ -746,6 +746,13 @@ void ClientNetworkContentSocketHandler::CheckDependencyState(ContentInfo *ci) } } +void ClientNetworkContentSocketHandler::Clear() +{ + for (ContentIterator iter = this->infos.Begin(); iter != this->infos.End(); iter++) delete *iter; + + this->infos.Clear(); +} + /*** CALLBACK ***/ void ClientNetworkContentSocketHandler::OnConnect(bool success) diff --git a/src/network/network_content.h b/src/network/network_content.h index ac169313f9..6e683dd7e5 100644 --- a/src/network/network_content.h +++ b/src/network/network_content.h @@ -117,6 +117,8 @@ public: ConstContentIterator Get(uint32 index) const { return this->infos.Get(index); } /** Get the end of the content inf iterator. */ ConstContentIterator End() const { return this->infos.End(); } + /** Clear all downloaded content information. */ + void Clear(); /** Add a callback to this class */ void AddCallback(ContentCallback *cb) { this->callbacks.Include(cb); } diff --git a/src/network/network_content_gui.cpp b/src/network/network_content_gui.cpp index 398f838da6..2497c5a38a 100644 --- a/src/network/network_content_gui.cpp +++ b/src/network/network_content_gui.cpp @@ -684,6 +684,7 @@ static const WindowDesc _network_content_list_desc = { void ShowNetworkContentListWindow(ContentVector *cv, ContentType type) { #if defined(WITH_ZLIB) + _network_content_client.Clear(); if (cv == NULL) { _network_content_client.RequestContentList(type); } else { diff --git a/src/newgrf_gui.cpp b/src/newgrf_gui.cpp index d18ef00b6b..3596f52ec9 100644 --- a/src/newgrf_gui.cpp +++ b/src/newgrf_gui.cpp @@ -399,6 +399,18 @@ struct NewGRFWindow : public Window { this->widget[SNGRFS_PRESET_LIST].data = STR_JUST_RAW_STRING; } + bool has_missing = false; + for (const GRFConfig *c = this->list; !has_missing && c != NULL; c = c->next) { + has_missing = c->status == GCS_NOT_FOUND || HasBit(c->flags, GCF_COMPATIBLE); + } + if (has_missing) { + this->widget[SNGRFS_CONTENT_DOWNLOAD].data = STR_CONTENT_INTRO_MISSING_BUTTON; + this->widget[SNGRFS_CONTENT_DOWNLOAD].tooltips = STR_CONTENT_INTRO_MISSING_BUTTON_TIP; + } else { + this->widget[SNGRFS_CONTENT_DOWNLOAD].data = STR_CONTENT_INTRO_BUTTON; + this->widget[SNGRFS_CONTENT_DOWNLOAD].tooltips = STR_CONTENT_INTRO_BUTTON_TIP; + } + this->DrawWidgets(); /* Draw NewGRF list */ @@ -597,6 +609,8 @@ struct NewGRFWindow : public Window { /* Only show the things in the current list, or everything when nothing's selected */ ContentVector cv; for (const GRFConfig *c = this->list; c != NULL; c = c->next) { + if (c->status != GCS_NOT_FOUND && !HasBit(c->flags, GCF_COMPATIBLE)) continue; + ContentInfo *ci = new ContentInfo(); ci->type = CONTENT_TYPE_NEWGRF; ci->state = ContentInfo::DOES_NOT_EXIST;