65 auto* ow_editor = ctx.editor;
67 auto* items = ow_editor->overworld().mutable_all_items();
69 ImGui::TextDisabled(
"No item list available.");
73 static char filter_buffer[64] =
"";
74 static bool current_world_only =
true;
75 static bool current_map_only =
false;
76 static int sort_mode = 0;
79 filter_buffer,
sizeof(filter_buffer));
81 ImGui::Checkbox(
"World", ¤t_world_only);
83 ImGui::Checkbox(
"Map", ¤t_map_only);
85 const char* sort_modes[] = {
"Map + Position",
"Item ID",
"Name"};
86 ImGui::SetNextItemWidth(180.0f);
87 ImGui::Combo(
"Sort", &sort_mode, sort_modes, IM_ARRAYSIZE(sort_modes));
89 const std::string lowered_filter = ToLower(std::string(filter_buffer));
90 std::vector<size_t> filtered_indices;
91 filtered_indices.reserve(items->size());
93 const int current_map = ow_editor->current_map_id();
94 const int current_world = ow_editor->current_world_id();
96 for (
size_t i = 0; i < items->size(); ++i) {
97 const auto& item = items->at(i);
101 if (current_world_only && (item.room_map_id_ / 0x40) != current_world) {
104 if (current_map_only && item.room_map_id_ != current_map) {
107 if (!MatchesItemFilter(item, lowered_filter)) {
110 filtered_indices.push_back(i);
113 auto sort_by_map_pos = [&](
size_t lhs,
size_t rhs) {
114 const auto& a = items->at(lhs);
115 const auto& b = items->at(rhs);
116 if (a.room_map_id_ != b.room_map_id_) {
117 return a.room_map_id_ < b.room_map_id_;
125 return a.id_ < b.id_;
127 auto sort_by_id = [&](
size_t lhs,
size_t rhs) {
128 const auto& a = items->at(lhs);
129 const auto& b = items->at(rhs);
130 if (a.id_ != b.id_) {
131 return a.id_ < b.id_;
133 return sort_by_map_pos(lhs, rhs);
135 auto sort_by_name = [&](
size_t lhs,
size_t rhs) {
136 const auto& a = items->at(lhs);
137 const auto& b = items->at(rhs);
138 const std::string name_a = ItemName(a);
139 const std::string name_b = ItemName(b);
140 if (name_a != name_b) {
141 return name_a < name_b;
143 return sort_by_map_pos(lhs, rhs);
148 std::sort(filtered_indices.begin(), filtered_indices.end(), sort_by_id);
151 std::sort(filtered_indices.begin(), filtered_indices.end(), sort_by_name);
155 std::sort(filtered_indices.begin(), filtered_indices.end(),
161 const bool has_selection = selected_item !=
nullptr;
163 if (!has_selection) {
164 ImGui::BeginDisabled();
167 ow_editor->DuplicateSelectedItem();
168 selected_item = ow_editor->GetSelectedItem();
171 if (ImGui::Button(
ICON_MD_DELETE " Delete", ImVec2(96.0f, 0.0f))) {
172 ow_editor->DeleteSelectedItem();
173 selected_item = ow_editor->GetSelectedItem();
175 if (!has_selection) {
176 ImGui::EndDisabled();
181 ImGui::TextDisabled(
"Selected: 0x%02X @ (%d,%d)",
182 static_cast<int>(selected_item->
id_), selected_item->
x_,
185 ImGui::TextDisabled(
"No item selected");
189 "Shortcuts: Ctrl+D duplicate, arrows nudge, Shift+arrows nudge by 16px");
190 ImGui::TextDisabled(
"Total: %zu | Visible: %zu", items->size(),
191 filtered_indices.size());
193 if (ImGui::BeginTable(
"##OverworldItemListTable", 6,
194 ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg |
195 ImGuiTableFlags_Resizable |
196 ImGuiTableFlags_SizingStretchProp |
197 ImGuiTableFlags_ScrollY,
198 ImVec2(0.0f, 0.0f))) {
199 ImGui::TableSetupColumn(
"", ImGuiTableColumnFlags_WidthFixed, 30.0f);
200 ImGui::TableSetupColumn(
"ID", ImGuiTableColumnFlags_WidthFixed, 42.0f);
201 ImGui::TableSetupColumn(
"Name", ImGuiTableColumnFlags_WidthStretch, 1.0f);
202 ImGui::TableSetupColumn(
"Map", ImGuiTableColumnFlags_WidthFixed, 54.0f);
203 ImGui::TableSetupColumn(
"World XY", ImGuiTableColumnFlags_WidthFixed,
205 ImGui::TableSetupColumn(
"Game XY", ImGuiTableColumnFlags_WidthFixed, 86.0f);
206 ImGui::TableHeadersRow();
208 for (
size_t visible_row = 0; visible_row < filtered_indices.size();
210 const size_t index = filtered_indices[visible_row];
211 const auto& item = items->at(index);
212 const bool is_selected =
213 selected_item && ItemIdentityMatches(item, *selected_item);
215 ImGui::TableNextRow();
217 ImGui::TableNextColumn();
218 if (ImGui::SmallButton(
219 absl::StrFormat(
"%s##select_item_%zu",
224 ow_editor->SelectItemByIdentity(item);
225 selected_item = ow_editor->GetSelectedItem();
228 ImGui::TableNextColumn();
229 ImGui::Text(
"0x%02X",
static_cast<int>(item.id_));
231 ImGui::TableNextColumn();
232 ImGui::TextUnformatted(ItemName(item).c_str());
234 ImGui::TableNextColumn();
235 if (item.room_map_id_ == current_map) {
236 ImGui::TextColored(ImVec4(0.45f, 0.85f, 0.50f, 1.0f),
"%02X",
237 static_cast<int>(item.room_map_id_));
239 ImGui::Text(
"%02X",
static_cast<int>(item.room_map_id_));
242 ImGui::TableNextColumn();
243 ImGui::Text(
"%4d, %4d", item.x_, item.y_);
245 ImGui::TableNextColumn();
246 ImGui::Text(
"%2d, %2d", item.game_x_, item.game_y_);