66 auto* items = ow_editor->overworld().mutable_all_items();
68 ImGui::TextDisabled(
"No item list available.");
72 static char filter_buffer[64] =
"";
73 static bool current_world_only =
true;
74 static bool current_map_only =
false;
75 static int sort_mode = 0;
78 filter_buffer,
sizeof(filter_buffer));
80 ImGui::Checkbox(
"World", ¤t_world_only);
82 ImGui::Checkbox(
"Map", ¤t_map_only);
84 const char* sort_modes[] = {
"Map + Position",
"Item ID",
"Name"};
85 ImGui::SetNextItemWidth(180.0f);
86 ImGui::Combo(
"Sort", &sort_mode, sort_modes, IM_ARRAYSIZE(sort_modes));
88 const std::string lowered_filter = ToLower(std::string(filter_buffer));
89 std::vector<size_t> filtered_indices;
90 filtered_indices.reserve(items->size());
92 const int current_map = ow_editor->current_map_id();
93 const int current_world = ow_editor->current_world_id();
95 for (
size_t i = 0; i < items->size(); ++i) {
96 const auto& item = items->at(i);
100 if (current_world_only && (item.room_map_id_ / 0x40) != current_world) {
103 if (current_map_only && item.room_map_id_ != current_map) {
106 if (!MatchesItemFilter(item, lowered_filter)) {
109 filtered_indices.push_back(i);
112 auto sort_by_map_pos = [&](
size_t lhs,
size_t rhs) {
113 const auto& a = items->at(lhs);
114 const auto& b = items->at(rhs);
115 if (a.room_map_id_ != b.room_map_id_) {
116 return a.room_map_id_ < b.room_map_id_;
124 return a.id_ < b.id_;
126 auto sort_by_id = [&](
size_t lhs,
size_t rhs) {
127 const auto& a = items->at(lhs);
128 const auto& b = items->at(rhs);
129 if (a.id_ != b.id_) {
130 return a.id_ < b.id_;
132 return sort_by_map_pos(lhs, rhs);
134 auto sort_by_name = [&](
size_t lhs,
size_t rhs) {
135 const auto& a = items->at(lhs);
136 const auto& b = items->at(rhs);
137 const std::string name_a = ItemName(a);
138 const std::string name_b = ItemName(b);
139 if (name_a != name_b) {
140 return name_a < name_b;
142 return sort_by_map_pos(lhs, rhs);
147 std::sort(filtered_indices.begin(), filtered_indices.end(), sort_by_id);
150 std::sort(filtered_indices.begin(), filtered_indices.end(), sort_by_name);
154 std::sort(filtered_indices.begin(), filtered_indices.end(),
160 const bool has_selection = selected_item !=
nullptr;
162 if (!has_selection) {
163 ImGui::BeginDisabled();
166 ow_editor->DuplicateSelectedItem();
167 selected_item = ow_editor->GetSelectedItem();
170 if (ImGui::Button(
ICON_MD_DELETE " Delete", ImVec2(96.0f, 0.0f))) {
171 ow_editor->DeleteSelectedItem();
172 selected_item = ow_editor->GetSelectedItem();
174 if (!has_selection) {
175 ImGui::EndDisabled();
180 ImGui::TextDisabled(
"Selected: 0x%02X @ (%d,%d)",
181 static_cast<int>(selected_item->
id_), selected_item->
x_,
184 ImGui::TextDisabled(
"No item selected");
188 "Shortcuts: Ctrl+D duplicate, arrows nudge, Shift+arrows nudge by 16px");
189 ImGui::TextDisabled(
"Total: %zu | Visible: %zu", items->size(),
190 filtered_indices.size());
192 if (ImGui::BeginTable(
"##OverworldItemListTable", 6,
193 ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg |
194 ImGuiTableFlags_Resizable |
195 ImGuiTableFlags_SizingStretchProp |
196 ImGuiTableFlags_ScrollY,
197 ImVec2(0.0f, 0.0f))) {
198 ImGui::TableSetupColumn(
"", ImGuiTableColumnFlags_WidthFixed, 30.0f);
199 ImGui::TableSetupColumn(
"ID", ImGuiTableColumnFlags_WidthFixed, 42.0f);
200 ImGui::TableSetupColumn(
"Name", ImGuiTableColumnFlags_WidthStretch, 1.0f);
201 ImGui::TableSetupColumn(
"Map", ImGuiTableColumnFlags_WidthFixed, 54.0f);
202 ImGui::TableSetupColumn(
"World XY", ImGuiTableColumnFlags_WidthFixed,
204 ImGui::TableSetupColumn(
"Game XY", ImGuiTableColumnFlags_WidthFixed, 86.0f);
205 ImGui::TableHeadersRow();
207 for (
size_t visible_row = 0; visible_row < filtered_indices.size();
209 const size_t index = filtered_indices[visible_row];
210 const auto& item = items->at(index);
211 const bool is_selected =
212 selected_item && ItemIdentityMatches(item, *selected_item);
214 ImGui::TableNextRow();
216 ImGui::TableNextColumn();
217 if (ImGui::SmallButton(
218 absl::StrFormat(
"%s##select_item_%zu",
223 ow_editor->SelectItemByIdentity(item);
224 selected_item = ow_editor->GetSelectedItem();
227 ImGui::TableNextColumn();
228 ImGui::Text(
"0x%02X",
static_cast<int>(item.id_));
230 ImGui::TableNextColumn();
231 ImGui::TextUnformatted(ItemName(item).c_str());
233 ImGui::TableNextColumn();
234 if (item.room_map_id_ == current_map) {
235 ImGui::TextColored(ImVec4(0.45f, 0.85f, 0.50f, 1.0f),
"%02X",
236 static_cast<int>(item.room_map_id_));
238 ImGui::Text(
"%02X",
static_cast<int>(item.room_map_id_));
241 ImGui::TableNextColumn();
242 ImGui::Text(
"%4d, %4d", item.x_, item.y_);
244 ImGui::TableNextColumn();
245 ImGui::Text(
"%2d, %2d", item.game_x_, item.game_y_);