mirror of https://github.com/OpenTTD/OpenTTD
Codechange: Use EnumBitSet for EngineDisplayFlags.
parent
6d1f56ce6b
commit
3c2706f859
|
@ -152,7 +152,7 @@ class ReplaceVehicleWindow : public Window {
|
||||||
if (!CheckAutoreplaceValidity(this->sel_engine[0], eid, _local_company)) continue;
|
if (!CheckAutoreplaceValidity(this->sel_engine[0], eid, _local_company)) continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
list.emplace_back(eid, e->info.variant_id, (side == 0) ? EngineDisplayFlags::None : e->display_flags, 0);
|
list.emplace_back(eid, e->info.variant_id, (side == 0) ? EngineDisplayFlags{} : e->display_flags, 0);
|
||||||
|
|
||||||
if (side == 1) {
|
if (side == 1) {
|
||||||
EngineID parent = e->info.variant_id;
|
EngineID parent = e->info.variant_id;
|
||||||
|
@ -169,7 +169,7 @@ class ReplaceVehicleWindow : public Window {
|
||||||
for (const auto &variant : variants) {
|
for (const auto &variant : variants) {
|
||||||
if (std::ranges::find(list, variant, &GUIEngineListItem::engine_id) == list.end()) {
|
if (std::ranges::find(list, variant, &GUIEngineListItem::engine_id) == list.end()) {
|
||||||
const Engine *e = Engine::Get(variant);
|
const Engine *e = Engine::Get(variant);
|
||||||
list.emplace_back(variant, e->info.variant_id, e->display_flags | EngineDisplayFlags::Shaded, 0);
|
list.emplace_back(variant, e->info.variant_id, e->display_flags | EngineDisplayFlag::Shaded, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -593,17 +593,17 @@ public:
|
||||||
if (it != this->engines[click_side].end()) {
|
if (it != this->engines[click_side].end()) {
|
||||||
const auto &item = *it;
|
const auto &item = *it;
|
||||||
const Rect r = this->GetWidget<NWidgetBase>(widget)->GetCurrentRect().Shrink(WidgetDimensions::scaled.matrix).WithWidth(WidgetDimensions::scaled.hsep_indent * (item.indent + 1), _current_text_dir == TD_RTL);
|
const Rect r = this->GetWidget<NWidgetBase>(widget)->GetCurrentRect().Shrink(WidgetDimensions::scaled.matrix).WithWidth(WidgetDimensions::scaled.hsep_indent * (item.indent + 1), _current_text_dir == TD_RTL);
|
||||||
if (HasFlag(item.flags, EngineDisplayFlags::HasVariants) && IsInsideMM(r.left, r.right, pt.x)) {
|
if (item.flags.Test(EngineDisplayFlag::HasVariants) && IsInsideMM(r.left, r.right, pt.x)) {
|
||||||
/* toggle folded flag on engine */
|
/* toggle folded flag on engine */
|
||||||
assert(item.variant_id != INVALID_ENGINE);
|
assert(item.variant_id != INVALID_ENGINE);
|
||||||
Engine *engine = Engine::Get(item.variant_id);
|
Engine *engine = Engine::Get(item.variant_id);
|
||||||
engine->display_flags ^= EngineDisplayFlags::IsFolded;
|
engine->display_flags.Flip(EngineDisplayFlag::IsFolded);
|
||||||
|
|
||||||
InvalidateWindowData(WC_REPLACE_VEHICLE, (VehicleType)this->window_number, 0); // Update the autoreplace window
|
InvalidateWindowData(WC_REPLACE_VEHICLE, (VehicleType)this->window_number, 0); // Update the autoreplace window
|
||||||
InvalidateWindowClassesData(WC_BUILD_VEHICLE); // The build windows needs updating as well
|
InvalidateWindowClassesData(WC_BUILD_VEHICLE); // The build windows needs updating as well
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (!HasFlag(item.flags, EngineDisplayFlags::Shaded)) e = item.engine_id;
|
if (!item.flags.Test(EngineDisplayFlag::Shaded)) e = item.engine_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If Ctrl is pressed on the left side and we don't have any engines of the selected type, stop autoreplacing.
|
/* If Ctrl is pressed on the left side and we don't have any engines of the selected type, stop autoreplacing.
|
||||||
|
|
|
@ -1048,9 +1048,9 @@ void DrawEngineList(VehicleType type, const Rect &r, const GUIEngineList &eng_li
|
||||||
for (auto it = first; it != last; ++it) {
|
for (auto it = first; it != last; ++it) {
|
||||||
const auto &item = *it;
|
const auto &item = *it;
|
||||||
uint indent = item.indent * WidgetDimensions::scaled.hsep_indent;
|
uint indent = item.indent * WidgetDimensions::scaled.hsep_indent;
|
||||||
bool has_variants = HasFlag(item.flags, EngineDisplayFlags::HasVariants);
|
bool has_variants = item.flags.Test(EngineDisplayFlag::HasVariants);
|
||||||
bool is_folded = HasFlag(item.flags, EngineDisplayFlags::IsFolded);
|
bool is_folded = item.flags.Test(EngineDisplayFlag::IsFolded);
|
||||||
bool shaded = HasFlag(item.flags, EngineDisplayFlags::Shaded);
|
bool shaded = item.flags.Test(EngineDisplayFlag::Shaded);
|
||||||
|
|
||||||
if (item.indent > 0) {
|
if (item.indent > 0) {
|
||||||
/* Draw tree continuation lines. */
|
/* Draw tree continuation lines. */
|
||||||
|
@ -1134,14 +1134,14 @@ void GUIEngineListAddChildren(GUIEngineList &dst, const GUIEngineList &src, Engi
|
||||||
|
|
||||||
const Engine *e = Engine::Get(item.engine_id);
|
const Engine *e = Engine::Get(item.engine_id);
|
||||||
EngineDisplayFlags flags = item.flags;
|
EngineDisplayFlags flags = item.flags;
|
||||||
if (e->display_last_variant != INVALID_ENGINE) flags &= ~EngineDisplayFlags::Shaded;
|
if (e->display_last_variant != INVALID_ENGINE) flags.Reset(EngineDisplayFlag::Shaded);
|
||||||
dst.emplace_back(e->display_last_variant == INVALID_ENGINE ? item.engine_id : e->display_last_variant, item.engine_id, flags, indent);
|
dst.emplace_back(e->display_last_variant == INVALID_ENGINE ? item.engine_id : e->display_last_variant, item.engine_id, flags, indent);
|
||||||
|
|
||||||
/* Add variants if not folded */
|
/* Add variants if not folded */
|
||||||
if (HasFlag(item.flags, EngineDisplayFlags::HasVariants) && !HasFlag(item.flags, EngineDisplayFlags::IsFolded)) {
|
if (item.flags.Test(EngineDisplayFlag::HasVariants) && !item.flags.Test(EngineDisplayFlag::IsFolded)) {
|
||||||
/* Add this engine again as a child */
|
/* Add this engine again as a child */
|
||||||
if (!HasFlag(item.flags, EngineDisplayFlags::Shaded)) {
|
if (!item.flags.Test(EngineDisplayFlag::Shaded)) {
|
||||||
dst.emplace_back(item.engine_id, item.engine_id, EngineDisplayFlags::None, indent + 1);
|
dst.emplace_back(item.engine_id, item.engine_id, EngineDisplayFlags{}, indent + 1);
|
||||||
}
|
}
|
||||||
GUIEngineListAddChildren(dst, src, item.engine_id, indent + 1);
|
GUIEngineListAddChildren(dst, src, item.engine_id, indent + 1);
|
||||||
}
|
}
|
||||||
|
@ -1252,7 +1252,7 @@ struct BuildVehicleWindow : Window {
|
||||||
|
|
||||||
/* Select the first unshaded engine in the list as default when opening the window */
|
/* Select the first unshaded engine in the list as default when opening the window */
|
||||||
EngineID engine = INVALID_ENGINE;
|
EngineID engine = INVALID_ENGINE;
|
||||||
auto it = std::ranges::find_if(this->eng_list, [&](GUIEngineListItem &item) { return !HasFlag(item.flags, EngineDisplayFlags::Shaded); });
|
auto it = std::ranges::find_if(this->eng_list, [](const GUIEngineListItem &item) { return !item.flags.Test(EngineDisplayFlag::Shaded); });
|
||||||
if (it != this->eng_list.end()) engine = it->engine_id;
|
if (it != this->eng_list.end()) engine = it->engine_id;
|
||||||
this->SelectEngine(engine);
|
this->SelectEngine(engine);
|
||||||
}
|
}
|
||||||
|
@ -1357,7 +1357,7 @@ struct BuildVehicleWindow : Window {
|
||||||
/** Filter a single engine */
|
/** Filter a single engine */
|
||||||
bool FilterSingleEngine(EngineID eid)
|
bool FilterSingleEngine(EngineID eid)
|
||||||
{
|
{
|
||||||
GUIEngineListItem item = {eid, eid, EngineDisplayFlags::None, 0};
|
GUIEngineListItem item = {eid, eid, EngineDisplayFlags{}, 0};
|
||||||
return CargoAndEngineFilter(&item, this->cargo_filter_criteria);
|
return CargoAndEngineFilter(&item, this->cargo_filter_criteria);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1424,7 +1424,7 @@ struct BuildVehicleWindow : Window {
|
||||||
for (const auto &variant : variants) {
|
for (const auto &variant : variants) {
|
||||||
if (std::ranges::find(list, variant, &GUIEngineListItem::engine_id) == list.end()) {
|
if (std::ranges::find(list, variant, &GUIEngineListItem::engine_id) == list.end()) {
|
||||||
const Engine *e = Engine::Get(variant);
|
const Engine *e = Engine::Get(variant);
|
||||||
list.emplace_back(variant, e->info.variant_id, e->display_flags | EngineDisplayFlags::Shaded, 0);
|
list.emplace_back(variant, e->info.variant_id, e->display_flags | EngineDisplayFlag::Shaded, 0);
|
||||||
if (e->u.rail.railveh_type != RAILVEH_WAGON) num_engines++;
|
if (e->u.rail.railveh_type != RAILVEH_WAGON) num_engines++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1566,7 +1566,7 @@ struct BuildVehicleWindow : Window {
|
||||||
for (const auto &variant : variants) {
|
for (const auto &variant : variants) {
|
||||||
if (std::ranges::find(this->eng_list, variant, &GUIEngineListItem::engine_id) == this->eng_list.end()) {
|
if (std::ranges::find(this->eng_list, variant, &GUIEngineListItem::engine_id) == this->eng_list.end()) {
|
||||||
const Engine *e = Engine::Get(variant);
|
const Engine *e = Engine::Get(variant);
|
||||||
this->eng_list.emplace_back(variant, e->info.variant_id, e->display_flags | EngineDisplayFlags::Shaded, 0);
|
this->eng_list.emplace_back(variant, e->info.variant_id, e->display_flags | EngineDisplayFlag::Shaded, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1655,17 +1655,17 @@ struct BuildVehicleWindow : Window {
|
||||||
if (it != this->eng_list.end()) {
|
if (it != this->eng_list.end()) {
|
||||||
const auto &item = *it;
|
const auto &item = *it;
|
||||||
const Rect r = this->GetWidget<NWidgetBase>(widget)->GetCurrentRect().Shrink(WidgetDimensions::scaled.matrix).WithWidth(WidgetDimensions::scaled.hsep_indent * (item.indent + 1), _current_text_dir == TD_RTL);
|
const Rect r = this->GetWidget<NWidgetBase>(widget)->GetCurrentRect().Shrink(WidgetDimensions::scaled.matrix).WithWidth(WidgetDimensions::scaled.hsep_indent * (item.indent + 1), _current_text_dir == TD_RTL);
|
||||||
if (HasFlag(item.flags, EngineDisplayFlags::HasVariants) && IsInsideMM(r.left, r.right, pt.x)) {
|
if (item.flags.Test(EngineDisplayFlag::HasVariants) && IsInsideMM(r.left, r.right, pt.x)) {
|
||||||
/* toggle folded flag on engine */
|
/* toggle folded flag on engine */
|
||||||
assert(item.variant_id != INVALID_ENGINE);
|
assert(item.variant_id != INVALID_ENGINE);
|
||||||
Engine *engine = Engine::Get(item.variant_id);
|
Engine *engine = Engine::Get(item.variant_id);
|
||||||
engine->display_flags ^= EngineDisplayFlags::IsFolded;
|
engine->display_flags.Flip(EngineDisplayFlag::IsFolded);
|
||||||
|
|
||||||
InvalidateWindowData(WC_REPLACE_VEHICLE, this->vehicle_type, 0); // Update the autoreplace window
|
InvalidateWindowData(WC_REPLACE_VEHICLE, this->vehicle_type, 0); // Update the autoreplace window
|
||||||
InvalidateWindowClassesData(WC_BUILD_VEHICLE); // The build windows needs updating as well
|
InvalidateWindowClassesData(WC_BUILD_VEHICLE); // The build windows needs updating as well
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (!HasFlag(item.flags, EngineDisplayFlags::Shaded)) e = item.engine_id;
|
if (!item.flags.Test(EngineDisplayFlag::Shaded)) e = item.engine_id;
|
||||||
}
|
}
|
||||||
this->SelectEngine(e);
|
this->SelectEngine(e);
|
||||||
this->SetDirty();
|
this->SetDirty();
|
||||||
|
|
|
@ -12,6 +12,7 @@
|
||||||
|
|
||||||
#include "engine_type.h"
|
#include "engine_type.h"
|
||||||
#include "vehicle_type.h"
|
#include "vehicle_type.h"
|
||||||
|
#include "core/enum_type.hpp"
|
||||||
#include "core/pool_type.hpp"
|
#include "core/pool_type.hpp"
|
||||||
#include "newgrf_commons.h"
|
#include "newgrf_commons.h"
|
||||||
#include "timer/timer_game_calendar.h"
|
#include "timer/timer_game_calendar.h"
|
||||||
|
@ -23,13 +24,13 @@ struct WagonOverride {
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Flags used client-side in the purchase/autorenew engine list. */
|
/** Flags used client-side in the purchase/autorenew engine list. */
|
||||||
enum class EngineDisplayFlags : uint8_t {
|
enum class EngineDisplayFlag : uint8_t {
|
||||||
None = 0, ///< No flag set.
|
HasVariants, ///< Set if engine has variants.
|
||||||
HasVariants = (1U << 0), ///< Set if engine has variants.
|
IsFolded, ///< Set if display of variants should be folded (hidden).
|
||||||
IsFolded = (1U << 1), ///< Set if display of variants should be folded (hidden).
|
Shaded, ///< Set if engine should be masked.
|
||||||
Shaded = (1U << 2), ///< Set if engine should be masked.
|
|
||||||
};
|
};
|
||||||
DECLARE_ENUM_AS_BIT_SET(EngineDisplayFlags)
|
|
||||||
|
using EngineDisplayFlags = EnumBitSet<EngineDisplayFlag, uint8_t>;
|
||||||
|
|
||||||
typedef Pool<Engine, EngineID, 64, 64000> EnginePool;
|
typedef Pool<Engine, EngineID, 64, 64000> EnginePool;
|
||||||
extern EnginePool _engine_pool;
|
extern EnginePool _engine_pool;
|
||||||
|
|
|
@ -9263,7 +9263,7 @@ static void FinaliseEngineArray()
|
||||||
}
|
}
|
||||||
|
|
||||||
if (e->info.variant_id != INVALID_ENGINE) {
|
if (e->info.variant_id != INVALID_ENGINE) {
|
||||||
Engine::Get(e->info.variant_id)->display_flags |= EngineDisplayFlags::HasVariants | EngineDisplayFlags::IsFolded;
|
Engine::Get(e->info.variant_id)->display_flags.Set(EngineDisplayFlag::HasVariants).Set(EngineDisplayFlag::IsFolded);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue