18 std::span<const size_t> selected_indices) {
19 return std::any_of(selected_indices.begin(), selected_indices.end(),
21 return index < objects.size() &&
22 zelda3::IsRoomObjectResizable(objects[index].id_);
27 uint8_t* requested_size) {
28 if (!requested_size) {
31 uint8_t size =
object.size_;
34 for (
const bool horizontal : {
true,
false}) {
36 const int shift = horizontal ? 2 : 0;
37 const int current = (size >> shift) & 3;
38 const auto preview = absl::StrFormat(
41 ImGui::SetNextItemWidth(-1);
42 const bool open = ImGui::BeginCombo(
43 horizontal ?
"##SelObjWidth" :
"##SelObjHeight", preview.c_str());
45 for (
int value = 0; value < 4; ++value) {
46 const auto candidate =
47 static_cast<uint8_t
>((size & ~(3 << shift)) | (value << shift));
48 const auto label = absl::StrFormat(
50 object.id_, candidate, horizontal));
51 if (ImGui::Selectable(label.c_str(), value == current)) {
58 absl::StrFormat(
"object_%s_%d",
59 horizontal ?
"width" :
"height", value));
61 if (value == current) {
62 ImGui::SetItemDefaultFocus();
72 horizontal ?
"selected_object_width" :
"selected_object_height",
73 horizontal ?
"Selected object width in tiles"
74 :
"Selected object height in tiles");
81 ? std::min(manager.GetSubtypeCount(
object.id_), 16)
84 const auto variant_label = [&](
int subtype) {
89 const auto filename = manager.ResolveFilename(
object.id_, subtype);
90 return filename.empty()
91 ? absl::StrFormat(
"Variant %d (unmapped)", subtype)
92 : std::filesystem::path(filename).stem().string();
95 const auto preview = size < variants
97 : absl::StrFormat(
"Invalid variant %d", size);
98 ImGui::SetNextItemWidth(-1);
99 const bool open = ImGui::BeginCombo(
"##SelObjVariant", preview.c_str());
101 for (
int subtype = 0; subtype < variants; ++subtype) {
103 absl::StrFormat(
"%02X %s", subtype, variant_label(subtype));
105 !manager.ResolveFilename(
object.id_, subtype).empty();
106 ImGui::BeginDisabled(!mapped);
107 if (ImGui::Selectable(label.c_str(), size == subtype)) {
108 size =
static_cast<uint8_t
>(subtype);
113 "selectable", absl::StrFormat(
"object_variant_%d", subtype));
115 ImGui::EndDisabled();
122 "Selected custom object variant");
128 ImGui::TextDisabled(
"Fixed");
139 *requested_size = size;
140 return size !=
object.size_;
149 ImGuiStyleVar_FramePadding,
150 ImVec2(ImGui::GetStyle().FramePadding.x,
151 std::max(5.0f, ImGui::GetStyle().FramePadding.y + 1.0f)));
152 return ImGui::CollapsingHeader(
153 label, default_open ? ImGuiTreeNodeFlags_DefaultOpen : 0);