# HG changeset patch # Parent bf4e87c3f8724e5c6b4f184557dfd2840d23cc13 diff --git a/src/fios.cpp b/src/fios.cpp --- a/src/fios.cpp +++ b/src/fios.cpp @@ -648,7 +648,6 @@ const char *FindScenario(const ContentInfo *ci, bool md5sum) { _scanner.Scan(false); - for (ScenarioIdentifier *id = _scanner.Begin(); id != _scanner.End(); id++) { if (md5sum ? (memcmp(id->md5sum, ci->md5sum, sizeof(id->md5sum)) == 0) : (id->scenid == ci->unique_id)) { diff --git a/src/network/core/tcp_content.cpp b/src/network/core/tcp_content.cpp --- a/src/network/core/tcp_content.cpp +++ b/src/network/core/tcp_content.cpp @@ -14,6 +14,13 @@ #ifdef ENABLE_NETWORK #include "../../stdafx.h" +#include "../../textfile_gui.h" +#include "../../fileio_func.h" +#include "../../newgrf_config.h" +#include "../../base_media_base.h" +#include "../../ai/ai.hpp" +#include "../../game/game.hpp" +#include "../../fios.h" #include "tcp_content.h" /** Clear everything in the struct */ @@ -86,6 +93,52 @@ return this->state < ContentInfo::INVALID && this->type >= CONTENT_TYPE_BEGIN && this->type < CONTENT_TYPE_END; } +/** + * Search a textfile file next to this file in the content list. + * @param type The type of the textfile to search for. + * @return The filename for the textfile, \c NULL otherwise. + */ +const char *ContentInfo::GetTextfile(TextfileType type) const +{ + if (this->state == INVALID) return NULL; + char filepath[MAX_PATH]; + const char *tmp; + switch (this->type) { + default: NOT_REACHED(); + case CONTENT_TYPE_AI: + tmp = AI::GetScannerInfo()->FindMainScript(this, (this->md5sum != NULL)); + break; + case CONTENT_TYPE_AI_LIBRARY: + tmp = AI::GetScannerLibrary()->FindMainScript(this, (this->md5sum != NULL)); + break; + case CONTENT_TYPE_GAME: + tmp = Game::GetScannerInfo()->FindMainScript(this, (this->md5sum != NULL)); + break; + case CONTENT_TYPE_GAME_LIBRARY: + tmp = Game::GetScannerLibrary()->FindMainScript(this, (this->md5sum != NULL)); + break; + case CONTENT_TYPE_NEWGRF: + tmp = FindGRFConfig(BSWAP32(this->unique_id), this->md5sum != NULL ? FGCM_EXACT : FGCM_ANY, this->md5sum != NULL ? this->md5sum : NULL)->filename; + break; + case CONTENT_TYPE_BASE_GRAPHICS: + tmp = TryGetBaseSetFile(this, (this->md5sum != NULL), BaseGraphics::GetAvailableSets()); + break; + case CONTENT_TYPE_BASE_SOUNDS: + tmp = TryGetBaseSetFile(this, (this->md5sum != NULL), BaseSounds::GetAvailableSets()); + break; + case CONTENT_TYPE_BASE_MUSIC: + tmp = TryGetBaseSetFile(this, (this->md5sum != NULL), BaseMusic::GetAvailableSets()); + break; + case CONTENT_TYPE_SCENARIO: + case CONTENT_TYPE_HEIGHTMAP: + tmp = FindScenario(this, (this->md5sum != NULL)); + break; + } + if (tmp == NULL) return NULL; + strecpy(filepath, tmp, lastof(filepath)); + return ::GetTextfile(type, GetContentInfoSubDir(this->type), filepath); +} + void NetworkContentSocketHandler::Close() { CloseConnection(); diff --git a/src/network/core/tcp_content.h b/src/network/core/tcp_content.h --- a/src/network/core/tcp_content.h +++ b/src/network/core/tcp_content.h @@ -91,6 +91,7 @@ size_t Size() const; bool IsSelected() const; bool IsValid() const; + const char *GetTextfile(TextfileType type) const; }; /** Base socket handler for all Content TCP sockets */ diff --git a/src/network/network_content_gui.cpp b/src/network/network_content_gui.cpp --- a/src/network/network_content_gui.cpp +++ b/src/network/network_content_gui.cpp @@ -22,12 +22,55 @@ #include "../stringfilter_type.h" #include "../querystring_gui.h" #include "../core/geometry_func.hpp" +#include "../textfile_gui.h" #include "network_content_gui.h" #include "table/strings.h" #include "../table/sprites.h" +/** Window for displaying the textfile of an item in the content list. */ +struct ContentTextfileWindow : public TextfileWindow { + const ContentInfo *ci; ///< View the textfile of this ContentInfo. + + ContentTextfileWindow(TextfileType file_type, const ContentInfo *ci) : TextfileWindow(file_type), ci(ci) + { + const char *textfile = this->ci->GetTextfile(file_type); + this->LoadTextfile(textfile, GetContentInfoSubDir(this->ci->type)); + } + + StringID GetTypeString() const + { + switch (this->ci->type) { + case CONTENT_TYPE_NEWGRF: return STR_CONTENT_TYPE_NEWGRF; + case CONTENT_TYPE_BASE_GRAPHICS: return STR_CONTENT_TYPE_BASE_GRAPHICS; + case CONTENT_TYPE_BASE_SOUNDS: return STR_CONTENT_TYPE_BASE_SOUNDS; + case CONTENT_TYPE_BASE_MUSIC: return STR_CONTENT_TYPE_BASE_MUSIC; + case CONTENT_TYPE_AI: return STR_CONTENT_TYPE_AI; + case CONTENT_TYPE_AI_LIBRARY: return STR_CONTENT_TYPE_AI_LIBRARY; + case CONTENT_TYPE_GAME: return STR_CONTENT_TYPE_GAME_SCRIPT; + case CONTENT_TYPE_GAME_LIBRARY: return STR_CONTENT_TYPE_GS_LIBRARY; + case CONTENT_TYPE_SCENARIO: return STR_CONTENT_TYPE_SCENARIO; + case CONTENT_TYPE_HEIGHTMAP: return STR_CONTENT_TYPE_HEIGHTMAP; + default: NOT_REACHED(); + } + } + + /* virtual */ void SetStringParameters(int widget) const + { + if (widget == WID_TF_CAPTION) { + SetDParam(0, this->GetTypeString()); + SetDParamStr(1, this->ci->name); + } + } +}; + +void ShowContentTextfileWindow(TextfileType file_type, const ContentInfo *ci) +{ + DeleteWindowByClass(WC_TEXTFILE); + new ContentTextfileWindow(file_type, ci); +} + /** Nested widgets for the download window. */ static const NWidgetPart _nested_network_content_download_status_window_widgets[] = { NWidget(WWT_CAPTION, COLOUR_GREY), SetDataTip(STR_CONTENT_DOWNLOAD_TITLE, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), @@ -611,6 +654,13 @@ virtual void OnClick(Point pt, int widget, int click_count) { + if (widget >= WID_NCL_TEXTFILE && widget < WID_NCL_TEXTFILE + TFT_END) { + if (this->selected == NULL || this->selected->state != ContentInfo::ALREADY_HERE) return; + + ShowContentTextfileWindow((TextfileType)(widget - WID_NCL_TEXTFILE), this->selected); + return; + } + switch (widget) { case WID_NCL_MATRIX: { uint id_v = this->vscroll->GetScrolledRowFromWidget(pt.y, this, WID_NCL_MATRIX); @@ -820,6 +870,9 @@ this->SetWidgetDisabledState(WID_NCL_SELECT_ALL, !show_select_all); this->SetWidgetDisabledState(WID_NCL_SELECT_UPDATE, !show_select_upgrade); this->SetWidgetDisabledState(WID_NCL_OPEN_URL, this->selected == NULL || StrEmpty(this->selected->url)); + for (TextfileType tft = TFT_BEGIN; tft < TFT_END; tft++) { + this->SetWidgetDisabledState(WID_NCL_TEXTFILE + tft, this->selected == NULL || this->selected->state != ContentInfo::ALREADY_HERE || this->selected->GetTextfile(tft) == NULL); + } this->GetWidget(WID_NCL_CANCEL)->widget_data = this->filesize_sum == 0 ? STR_AI_SETTINGS_CLOSE : STR_AI_LIST_CANCEL; } @@ -873,6 +926,11 @@ /* Right side. */ NWidget(NWID_VERTICAL), NWidget(WWT_PANEL, COLOUR_LIGHT_BLUE, WID_NCL_DETAILS), SetResize(1, 1), SetFill(1, 1), EndContainer(), + NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), SetPIP(7, 0, 7), + NWidget(WWT_PUSHTXTBTN, COLOUR_WHITE, WID_NCL_TEXTFILE + TFT_README), SetFill(1, 0), SetResize(1, 0), SetDataTip(STR_TEXTFILE_VIEW_README, STR_NULL), + NWidget(WWT_PUSHTXTBTN, COLOUR_WHITE, WID_NCL_TEXTFILE + TFT_CHANGELOG), SetFill(1, 0), SetResize(1, 0), SetDataTip(STR_TEXTFILE_VIEW_CHANGELOG, STR_NULL), + NWidget(WWT_PUSHTXTBTN, COLOUR_WHITE, WID_NCL_TEXTFILE + TFT_LICENSE), SetFill(1, 0), SetResize(1, 0), SetDataTip(STR_TEXTFILE_VIEW_LICENCE, STR_NULL), + EndContainer(), EndContainer(), EndContainer(), NWidget(NWID_SPACER), SetMinimalSize(0, 7), SetResize(1, 0), diff --git a/src/script/api/script_window.hpp b/src/script/api/script_window.hpp --- a/src/script/api/script_window.hpp +++ b/src/script/api/script_window.hpp @@ -1523,6 +1523,7 @@ WID_NCL_SELECT_ALL = ::WID_NCL_SELECT_ALL, ///< 'Select all' button. WID_NCL_SELECT_UPDATE = ::WID_NCL_SELECT_UPDATE, ///< 'Select updates' button. WID_NCL_UNSELECT = ::WID_NCL_UNSELECT, ///< 'Unselect all' button. + WID_NCL_TEXTFILE = ::WID_NCL_TEXTFILE, ///< Open textfile (readme, changelog (+1) or license (+2)) of some content. WID_NCL_OPEN_URL = ::WID_NCL_OPEN_URL, ///< 'Open url' button. WID_NCL_CANCEL = ::WID_NCL_CANCEL, ///< 'Cancel' button. WID_NCL_DOWNLOAD = ::WID_NCL_DOWNLOAD, ///< 'Download' button. diff --git a/src/widgets/network_content_widget.h b/src/widgets/network_content_widget.h --- a/src/widgets/network_content_widget.h +++ b/src/widgets/network_content_widget.h @@ -12,6 +12,8 @@ #ifndef WIDGETS_NETWORK_CONTENT_WIDGET_H #define WIDGETS_NETWORK_CONTENT_WIDGET_H +#include "../textfile_type.h" + /** Widgets of the #NetworkContentDownloadStatusWindow class. */ enum NetworkContentDownloadStatusWidgets { WID_NCDS_BACKGROUND, ///< Background of the window. @@ -33,8 +35,9 @@ WID_NCL_SCROLLBAR, ///< Scrollbar of matrix. WID_NCL_DETAILS, ///< Panel with content details. + WID_NCL_TEXTFILE, ///< Open readme, changelog (+1) or license (+2) of a file in the content window. - WID_NCL_SELECT_ALL, ///< 'Select all' button. + WID_NCL_SELECT_ALL = WID_NCL_TEXTFILE + TFT_END, ///< 'Select all' button. WID_NCL_SELECT_UPDATE, ///< 'Select updates' button. WID_NCL_UNSELECT, ///< 'Unselect all' button. WID_NCL_OPEN_URL, ///< 'Open url' button.