1
0
Fork 0

Codechange: Make ContentType::State an enum class. (#14279)

pull/14281/head
Peter Nelson 2025-05-19 17:11:28 +01:00 committed by GitHub
parent ad3a34e9ef
commit 77d6f6c69f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 58 additions and 58 deletions

View File

@ -2220,7 +2220,7 @@ static void OutputContentState(const ContentInfo &ci)
static const std::string_view states[] = { "Not selected", "Selected", "Dep Selected", "Installed", "Unknown" };
static const TextColour state_to_colour[] = { CC_COMMAND, CC_INFO, CC_INFO, CC_WHITE, CC_ERROR };
IConsolePrint(state_to_colour[ci.state], "{}, {}, {}, {}, {:08X}, {}", ci.id, types[ci.type - 1], states[ci.state], ci.name, ci.unique_id, FormatArrayAsHex(ci.md5sum));
IConsolePrint(state_to_colour[to_underlying(ci.state)], "{}, {}, {}, {}, {:08X}, {}", ci.id, types[ci.type - 1], states[to_underlying(ci.state)], ci.name, ci.unique_id, FormatArrayAsHex(ci.md5sum));
}
static bool ConContent(std::span<std::string_view> argv)
@ -2257,7 +2257,7 @@ static bool ConContent(std::span<std::string_view> argv)
/* List selected content */
IConsolePrint(CC_WHITE, "id, type, state, name");
for (const ContentInfo &ci : _network_content_client.Info()) {
if (ci.state != ContentInfo::SELECTED && ci.state != ContentInfo::AUTOSELECTED) continue;
if (ci.state != ContentInfo::State::Selected && ci.state != ContentInfo::State::Autoselected) continue;
OutputContentState(ci);
}
} else if (StrEqualsIgnoreCase(argv[2], "all")) {

View File

@ -32,9 +32,9 @@
bool ContentInfo::IsSelected() const
{
switch (this->state) {
case ContentInfo::SELECTED:
case ContentInfo::AUTOSELECTED:
case ContentInfo::ALREADY_HERE:
case ContentInfo::State::Selected:
case ContentInfo::State::Autoselected:
case ContentInfo::State::AlreadyHere:
return true;
default:
@ -48,7 +48,7 @@ bool ContentInfo::IsSelected() const
*/
bool ContentInfo::IsValid() const
{
return this->state < ContentInfo::INVALID && this->type >= CONTENT_TYPE_BEGIN && this->type < CONTENT_TYPE_END;
return this->state < ContentInfo::State::Invalid && this->type >= CONTENT_TYPE_BEGIN && this->type < CONTENT_TYPE_END;
}
/**
@ -58,7 +58,7 @@ bool ContentInfo::IsValid() const
*/
std::optional<std::string> ContentInfo::GetTextfile(TextfileType type) const
{
if (this->state == INVALID) return std::nullopt;
if (this->state == ContentInfo::State::Invalid) return std::nullopt;
std::optional<std::string_view> tmp;
switch (this->type) {
default: NOT_REACHED();

View File

@ -55,13 +55,13 @@ static constexpr ContentID INVALID_CONTENT_ID = UINT32_MAX; ///< Sentinel for in
/** Container for all important information about a piece of content. */
struct ContentInfo {
/** The state the content can be in. */
enum State : uint8_t {
UNSELECTED, ///< The content has not been selected
SELECTED, ///< The content has been manually selected
AUTOSELECTED, ///< The content has been selected as dependency
ALREADY_HERE, ///< The content is already at the client side
DOES_NOT_EXIST, ///< The content does not exist in the content system
INVALID, ///< The content's invalid
enum class State : uint8_t {
Unselected, ///< The content has not been selected
Selected, ///< The content has been manually selected
Autoselected, ///< The content has been selected as dependency
AlreadyHere, ///< The content is already at the client side
DoesNotExist, ///< The content does not exist in the content system
Invalid, ///< The content's invalid
};
ContentType type = INVALID_CONTENT_TYPE; ///< Type of content
@ -76,7 +76,7 @@ struct ContentInfo {
MD5Hash md5sum; ///< The MD5 checksum
std::vector<ContentID> dependencies; ///< The dependencies (unique server side ids)
StringList tags; ///< Tags associated with the content
State state = State::UNSELECTED; ///< Whether the content info is selected (for download)
State state = State::Unselected; ///< Whether the content info is selected (for download)
bool upgrade = false; ///< This item is an upgrade
bool IsSelected() const;

View File

@ -118,17 +118,17 @@ bool ClientNetworkContentSocketHandler::Receive_SERVER_INFO(Packet &p)
HasContentProc *proc = GetHasContentProcforContentType(ci->type);
if (proc != nullptr) {
if (proc(*ci, true)) {
ci->state = ContentInfo::ALREADY_HERE;
ci->state = ContentInfo::State::AlreadyHere;
} else {
ci->state = ContentInfo::UNSELECTED;
ci->state = ContentInfo::State::Unselected;
if (proc(*ci, false)) ci->upgrade = true;
}
} else {
ci->state = ContentInfo::UNSELECTED;
ci->state = ContentInfo::State::Unselected;
}
/* Something we don't have and has filesize 0 does not exist in the system */
if (ci->state == ContentInfo::UNSELECTED && ci->filesize == 0) ci->state = ContentInfo::DOES_NOT_EXIST;
if (ci->state == ContentInfo::State::Unselected && ci->filesize == 0) ci->state = ContentInfo::State::DoesNotExist;
/* Do we already have a stub for this? */
for (const auto &ici : this->infos) {
@ -295,7 +295,7 @@ void ClientNetworkContentSocketHandler::DownloadSelectedContent(uint &files, uin
ContentIDList content;
for (const auto &ci : this->infos) {
if (!ci->IsSelected() || ci->state == ContentInfo::ALREADY_HERE) continue;
if (!ci->IsSelected() || ci->state == ContentInfo::State::AlreadyHere) continue;
content.push_back(ci->id);
bytes += ci->filesize;
@ -845,9 +845,9 @@ ContentInfo *ClientNetworkContentSocketHandler::GetContent(ContentID cid) const
void ClientNetworkContentSocketHandler::Select(ContentID cid)
{
ContentInfo *ci = this->GetContent(cid);
if (ci == nullptr || ci->state != ContentInfo::UNSELECTED) return;
if (ci == nullptr || ci->state != ContentInfo::State::Unselected) return;
ci->state = ContentInfo::SELECTED;
ci->state = ContentInfo::State::Selected;
this->CheckDependencyState(*ci);
}
@ -860,7 +860,7 @@ void ClientNetworkContentSocketHandler::Unselect(ContentID cid)
ContentInfo *ci = this->GetContent(cid);
if (ci == nullptr || !ci->IsSelected()) return;
ci->state = ContentInfo::UNSELECTED;
ci->state = ContentInfo::State::Unselected;
this->CheckDependencyState(*ci);
}
@ -868,8 +868,8 @@ void ClientNetworkContentSocketHandler::Unselect(ContentID cid)
void ClientNetworkContentSocketHandler::SelectAll()
{
for (const auto &ci : this->infos) {
if (ci->state == ContentInfo::UNSELECTED) {
ci->state = ContentInfo::SELECTED;
if (ci->state == ContentInfo::State::Unselected) {
ci->state = ContentInfo::State::Selected;
this->CheckDependencyState(*ci);
}
}
@ -879,8 +879,8 @@ void ClientNetworkContentSocketHandler::SelectAll()
void ClientNetworkContentSocketHandler::SelectUpgrade()
{
for (const auto &ci : this->infos) {
if (ci->state == ContentInfo::UNSELECTED && ci->upgrade) {
ci->state = ContentInfo::SELECTED;
if (ci->state == ContentInfo::State::Unselected && ci->upgrade) {
ci->state = ContentInfo::State::Selected;
this->CheckDependencyState(*ci);
}
}
@ -890,7 +890,7 @@ void ClientNetworkContentSocketHandler::SelectUpgrade()
void ClientNetworkContentSocketHandler::UnselectAll()
{
for (const auto &ci : this->infos) {
if (ci->IsSelected() && ci->state != ContentInfo::ALREADY_HERE) ci->state = ContentInfo::UNSELECTED;
if (ci->IsSelected() && ci->state != ContentInfo::State::AlreadyHere) ci->state = ContentInfo::State::Unselected;
}
}
@ -898,12 +898,12 @@ void ClientNetworkContentSocketHandler::UnselectAll()
void ClientNetworkContentSocketHandler::ToggleSelectedState(const ContentInfo &ci)
{
switch (ci.state) {
case ContentInfo::SELECTED:
case ContentInfo::AUTOSELECTED:
case ContentInfo::State::Selected:
case ContentInfo::State::Autoselected:
this->Unselect(ci.id);
break;
case ContentInfo::UNSELECTED:
case ContentInfo::State::Unselected:
this->Select(ci.id);
break;
@ -955,7 +955,7 @@ void ClientNetworkContentSocketHandler::ReverseLookupTreeDependency(ConstContent
*/
void ClientNetworkContentSocketHandler::CheckDependencyState(const ContentInfo &ci)
{
if (ci.IsSelected() || ci.state == ContentInfo::ALREADY_HERE) {
if (ci.IsSelected() || ci.state == ContentInfo::State::AlreadyHere) {
/* Selection is easy; just walk all children and set the
* autoselected state. That way we can see what we automatically
* selected and thus can unselect when a dependency is removed. */
@ -963,15 +963,15 @@ void ClientNetworkContentSocketHandler::CheckDependencyState(const ContentInfo &
ContentInfo *c = this->GetContent(dependency);
if (c == nullptr) {
this->DownloadContentInfo(dependency);
} else if (c->state == ContentInfo::UNSELECTED) {
c->state = ContentInfo::AUTOSELECTED;
} else if (c->state == ContentInfo::State::Unselected) {
c->state = ContentInfo::State::Autoselected;
this->CheckDependencyState(*c);
}
}
return;
}
if (ci.state != ContentInfo::UNSELECTED) return;
if (ci.state != ContentInfo::State::Unselected) return;
/* For unselection we need to find the parents of us. We need to
* unselect them. After that we unselect all children that we
@ -991,7 +991,7 @@ void ClientNetworkContentSocketHandler::CheckDependencyState(const ContentInfo &
DownloadContentInfo(dependency);
continue;
}
if (c->state != ContentInfo::AUTOSELECTED) continue;
if (c->state != ContentInfo::State::Autoselected) continue;
/* Only unselect when WE are the only parent. */
parents.clear();
@ -1002,7 +1002,7 @@ void ClientNetworkContentSocketHandler::CheckDependencyState(const ContentInfo &
bool force_selection = false;
for (const ContentInfo *parent_ci : parents) {
if (parent_ci->IsSelected()) sel_count++;
if (parent_ci->state == ContentInfo::SELECTED) force_selection = true;
if (parent_ci->state == ContentInfo::State::Selected) force_selection = true;
}
if (sel_count == 0) {
/* Nothing depends on us */
@ -1018,7 +1018,7 @@ void ClientNetworkContentSocketHandler::CheckDependencyState(const ContentInfo &
/* Is there anything that is "force" selected?, if so... we're done. */
for (const ContentInfo *parent_ci : parents) {
if (parent_ci->state != ContentInfo::SELECTED) continue;
if (parent_ci->state != ContentInfo::State::Selected) continue;
force_selection = true;
break;
@ -1032,7 +1032,7 @@ void ClientNetworkContentSocketHandler::CheckDependencyState(const ContentInfo &
* to unselect. Don't do it immediately because it'll do exactly what
* we're doing now. */
for (const ContentInfo *parent : parents) {
if (parent->state == ContentInfo::AUTOSELECTED) this->Unselect(parent->id);
if (parent->state == ContentInfo::State::Autoselected) this->Unselect(parent->id);
}
for (const ContentInfo *parent : parents) {
this->CheckDependencyState(*this->GetContent(parent->id));
@ -1093,7 +1093,7 @@ void ClientNetworkContentSocketHandler::OnDownloadComplete(ContentID cid)
{
ContentInfo *ci = this->GetContent(cid);
if (ci != nullptr) {
ci->state = ContentInfo::ALREADY_HERE;
ci->state = ContentInfo::State::AlreadyHere;
}
for (size_t i = 0; i < this->callbacks.size(); /* nothing */) {

View File

@ -357,7 +357,7 @@ class NetworkContentListWindow : public Window, ContentCallback {
bool first = true;
for (const ContentInfo *ci : this->content) {
if (ci->state != ContentInfo::DOES_NOT_EXIST) continue;
if (ci->state != ContentInfo::State::DoesNotExist) continue;
if (!first) url.push_back(',');
first = false;
@ -409,7 +409,7 @@ class NetworkContentListWindow : public Window, ContentCallback {
bool all_available = true;
for (const ContentInfo &ci : _network_content_client.Info()) {
if (ci.state == ContentInfo::DOES_NOT_EXIST) all_available = false;
if (ci.state == ContentInfo::State::DoesNotExist) all_available = false;
this->content.push_back(&ci);
}
@ -443,7 +443,7 @@ class NetworkContentListWindow : public Window, ContentCallback {
/** Sort content by state. */
static bool StateSorter(const ContentInfo * const &a, const ContentInfo * const &b)
{
int r = a->state - b->state;
int r = to_underlying(a->state) - to_underlying(b->state);
if (r == 0) return TypeSorter(a, b);
return r < 0;
}
@ -460,7 +460,7 @@ class NetworkContentListWindow : public Window, ContentCallback {
/** Filter content by tags/name */
static bool TagNameFilter(const ContentInfo * const *a, ContentListFilterData &filter)
{
if ((*a)->state == ContentInfo::SELECTED || (*a)->state == ContentInfo::AUTOSELECTED) return true;
if ((*a)->state == ContentInfo::State::Selected || (*a)->state == ContentInfo::State::Autoselected) return true;
filter.string_filter.ResetState();
for (auto &tag : (*a)->tags) filter.string_filter.AddLine(tag);
@ -474,7 +474,7 @@ class NetworkContentListWindow : public Window, ContentCallback {
{
if (filter.types.None()) return true;
if (filter.types.Test((*a)->type)) return true;
return ((*a)->state == ContentInfo::SELECTED || (*a)->state == ContentInfo::AUTOSELECTED);
return ((*a)->state == ContentInfo::State::Selected || (*a)->state == ContentInfo::State::Autoselected);
}
/** Filter the content list */
@ -655,11 +655,11 @@ public:
SpriteID sprite;
SpriteID pal = PAL_NONE;
switch (ci->state) {
case ContentInfo::UNSELECTED: sprite = SPR_BOX_EMPTY; break;
case ContentInfo::SELECTED: sprite = SPR_BOX_CHECKED; break;
case ContentInfo::AUTOSELECTED: sprite = SPR_BOX_CHECKED; break;
case ContentInfo::ALREADY_HERE: sprite = SPR_BLOT; pal = PALETTE_TO_GREEN; break;
case ContentInfo::DOES_NOT_EXIST: sprite = SPR_BLOT; pal = PALETTE_TO_RED; break;
case ContentInfo::State::Unselected: sprite = SPR_BOX_EMPTY; break;
case ContentInfo::State::Selected: sprite = SPR_BOX_CHECKED; break;
case ContentInfo::State::Autoselected: sprite = SPR_BOX_CHECKED; break;
case ContentInfo::State::AlreadyHere: sprite = SPR_BLOT; pal = PALETTE_TO_GREEN; break;
case ContentInfo::State::DoesNotExist: sprite = SPR_BLOT; pal = PALETTE_TO_RED; break;
default: NOT_REACHED();
}
DrawSpriteIgnorePadding(sprite, pal, {checkbox.left, mr.top, checkbox.right, mr.bottom}, SA_CENTER);
@ -695,7 +695,7 @@ public:
if (this->selected == nullptr) return;
/* And fill the rest of the details when there's information to place there */
DrawStringMultiLine(hr.left, hr.right, hr.top + GetCharacterHeight(FS_NORMAL), hr.bottom, STR_CONTENT_DETAIL_SUBTITLE_UNSELECTED + this->selected->state, TC_FROMSTRING, SA_CENTER);
DrawStringMultiLine(hr.left, hr.right, hr.top + GetCharacterHeight(FS_NORMAL), hr.bottom, STR_CONTENT_DETAIL_SUBTITLE_UNSELECTED + to_underlying(this->selected->state), TC_FROMSTRING, SA_CENTER);
/* Also show the total download size, so keep some space from the bottom */
tr.bottom -= GetCharacterHeight(FS_NORMAL) + WidgetDimensions::scaled.vsep_wide;
@ -758,7 +758,7 @@ public:
std::string buf;
for (const ContentInfo *ci : tree) {
if (ci == this->selected || ci->state != ContentInfo::SELECTED) continue;
if (ci == this->selected || ci->state != ContentInfo::State::Selected) continue;
if (!buf.empty()) buf += list_separator;
buf += ci->name;
@ -772,7 +772,7 @@ public:
void OnClick([[maybe_unused]] Point pt, WidgetID widget, [[maybe_unused]] int click_count) override
{
if (widget >= WID_NCL_TEXTFILE && widget < WID_NCL_TEXTFILE + TFT_CONTENT_END) {
if (this->selected == nullptr || this->selected->state != ContentInfo::ALREADY_HERE) return;
if (this->selected == nullptr || this->selected->state != ContentInfo::State::AlreadyHere) return;
ShowContentTextfileWindow(this, (TextfileType)(widget - WID_NCL_TEXTFILE), this->selected);
return;
@ -957,12 +957,12 @@ public:
bool show_select_upgrade = false;
for (const ContentInfo *ci : this->content) {
switch (ci->state) {
case ContentInfo::SELECTED:
case ContentInfo::AUTOSELECTED:
case ContentInfo::State::Selected:
case ContentInfo::State::Autoselected:
this->filesize_sum += ci->filesize;
break;
case ContentInfo::UNSELECTED:
case ContentInfo::State::Unselected:
show_select_all = true;
show_select_upgrade |= ci->upgrade;
break;
@ -979,7 +979,7 @@ public:
this->SetWidgetDisabledState(WID_NCL_SELECT_UPDATE, !show_select_upgrade || !this->filter_data.string_filter.IsEmpty());
this->SetWidgetDisabledState(WID_NCL_OPEN_URL, this->selected == nullptr || this->selected->url.empty());
for (TextfileType tft = TFT_CONTENT_BEGIN; tft < TFT_CONTENT_END; tft++) {
this->SetWidgetDisabledState(WID_NCL_TEXTFILE + tft, this->selected == nullptr || this->selected->state != ContentInfo::ALREADY_HERE || !this->selected->GetTextfile(tft).has_value());
this->SetWidgetDisabledState(WID_NCL_TEXTFILE + tft, this->selected == nullptr || this->selected->state != ContentInfo::State::AlreadyHere || !this->selected->GetTextfile(tft).has_value());
}
}
};

View File

@ -1506,7 +1506,7 @@ void ShowMissingContentWindow(const GRFConfigList &list)
auto ci = std::make_unique<ContentInfo>();
ci->type = CONTENT_TYPE_NEWGRF;
ci->state = ContentInfo::DOES_NOT_EXIST;
ci->state = ContentInfo::State::DoesNotExist;
ci->name = c->GetName();
ci->unique_id = std::byteswap(c->ident.grfid);
ci->md5sum = c->flags.Test(GRFConfigFlag::Compatible) ? c->original_md5sum : c->ident.md5sum;