88 ImGui::Text(tr(
"ROM not loaded"));
92 if (show_room_id_input) {
112 room_filter_.Draw(
"Filter", ImGui::GetContentRegionAvail().x);
122 if (ImGui::IsItemHovered()) {
124 tr(
"Toggle between flat list and dungeon-grouped view"));
126 ImGui::SameLine(0, 12);
129 const char* labels[] = {
"All",
"Sprites",
"Items",
"Objects"};
132 for (
int idx = 0; idx < 4; ++idx) {
137 ImGui::PushStyleColor(ImGuiCol_Button,
138 ImGui::GetStyleColorVec4(ImGuiCol_ButtonActive));
140 if (ImGui::SmallButton(labels[idx])) {
144 ImGui::PopStyleColor();
158 std::optional<gui::StyleVarGuard> touch_pad_guard;
160 float touch_pad = std::max(
163 touch_pad_guard.emplace(ImGuiStyleVar_CellPadding,
164 ImVec2(ImGui::GetStyle().CellPadding.x, touch_pad));
174 if (ImGui::BeginTable(
"RoomList", 2,
175 ImGuiTableFlags_ScrollY | ImGuiTableFlags_Borders |
176 ImGuiTableFlags_RowBg |
177 ImGuiTableFlags_Resizable)) {
178 ImGui::TableSetupColumn(
"ID", ImGuiTableColumnFlags_WidthFixed, 40.0f);
179 ImGui::TableSetupColumn(
"Name");
180 ImGui::TableHeadersRow();
183 ImGuiListClipper clipper;
186 while (clipper.Step()) {
187 for (
int row = clipper.DisplayStart; row < clipper.DisplayEnd; ++row) {
189 std::string display_name =
192 ImGui::TableNextRow();
193 ImGui::TableNextColumn();
196 snprintf(label,
sizeof(label),
"%03X", room_id);
198 ImGuiSelectableFlags_SpanAllColumns |
199 ImGuiSelectableFlags_AllowDoubleClick)) {
208 if (ImGui::IsMouseDoubleClicked(ImGuiMouseButton_Left)) {
225 if (ImGui::BeginPopupContextItem()) {
226 if (ImGui::MenuItem(tr(
"Open in Workbench"))) {
235 if (ImGui::MenuItem(tr(
"Open as Panel"))) {
246 snprintf(id_buf,
sizeof(id_buf),
"0x%03X", room_id);
247 if (ImGui::MenuItem(tr(
"Copy Room ID"))) {
248 ImGui::SetClipboardText(id_buf);
254 if (ImGui::IsItemHovered()) {
255 ImGui::BeginTooltip();
256 ImGui::Text(
"%s", display_name.c_str());
259 if (loaded_room !=
nullptr) {
260 ImGui::TextDisabled(tr(
"Blockset: %d | Palette: %d"),
261 loaded_room->blockset(),
262 loaded_room->palette());
267 if (bmp.is_active() && bmp.texture() != 0) {
268 ImGui::Image((ImTextureID)(intptr_t)bmp.texture(),
276 ImGui::TableNextColumn();
277 ImGui::TextUnformatted(display_name.c_str());
334 ImGui::Text(tr(
"ROM not loaded"));
339 ImGui::Text(tr(
"Entrances not loaded"));
343 if (show_properties) {
349 const bool properties_editable =
351 bool changed =
false;
354 if (!properties_editable) {
357 ImGui::BeginDisabled(!properties_editable);
358 if (ImGui::BeginTable(
"EntranceProps", 4, ImGuiTableFlags_Borders)) {
359 ImGui::TableSetupColumn(
"Core", ImGuiTableColumnFlags_WidthStretch);
360 ImGui::TableSetupColumn(
"Position", ImGuiTableColumnFlags_WidthStretch);
361 ImGui::TableSetupColumn(
"Camera", ImGuiTableColumnFlags_WidthStretch);
362 ImGui::TableSetupColumn(
"Scroll", ImGuiTableColumnFlags_WidthStretch);
363 ImGui::TableHeadersRow();
365 ImGui::TableNextRow();
366 ImGui::TableNextColumn();
367 ImGui::Text(tr(
"Entr ID: %04X"), current_entrance.entrance_id_);
372 ImGui::TableNextColumn();
378 ImGui::TableNextColumn();
385 ImGui::TableNextColumn();
391 ImGui::EndDisabled();
394 if (ImGui::CollapsingHeader(tr(
"Camera Boundaries"))) {
395 ImGui::Text(tr(
" North East South West"));
396 ImGui::BeginDisabled(!properties_editable);
397 ImGui::Text(tr(
"Quadrant "));
400 ¤t_entrance.camera_boundary_qn_, 40.f);
403 ¤t_entrance.camera_boundary_qe_, 40.f);
406 ¤t_entrance.camera_boundary_qs_, 40.f);
409 ¤t_entrance.camera_boundary_qw_, 40.f);
411 ImGui::Text(tr(
"Full Room "));
414 ¤t_entrance.camera_boundary_fn_, 40.f);
417 ¤t_entrance.camera_boundary_fe_, 40.f);
420 ¤t_entrance.camera_boundary_fs_, 40.f);
423 ¤t_entrance.camera_boundary_fw_, 40.f);
424 ImGui::EndDisabled();
443 if (ImGui::BeginTable(
"EntranceList", 3,
444 ImGuiTableFlags_ScrollY | ImGuiTableFlags_Borders |
445 ImGuiTableFlags_RowBg |
446 ImGuiTableFlags_Resizable)) {
447 ImGui::TableSetupColumn(
"ID", ImGuiTableColumnFlags_WidthFixed, 40.0f);
448 ImGui::TableSetupColumn(
"Room", ImGuiTableColumnFlags_WidthFixed, 50.0f);
449 ImGui::TableSetupColumn(
"Name");
450 ImGui::TableHeadersRow();
453 ImGuiListClipper clipper;
456 while (clipper.Step()) {
457 for (
int row = clipper.DisplayStart; row < clipper.DisplayEnd; ++row) {
459 std::string display_name;
461 if (i < kNumSpawnPoints) {
462 display_name = absl::StrFormat(
"Spawn Point %d", i);
464 int entrance_id = i - kNumSpawnPoints;
470 room_id = (*spawn_points_)[i].room_id;
471 }
else if (i <
static_cast<int>(
entrances_->size())) {
472 room_id = (*entrances_)[i].room_;
475 ImGui::TableNextRow();
476 ImGui::TableNextColumn();
479 snprintf(label,
sizeof(label),
"%02X", i);
481 ImGuiSelectableFlags_SpanAllColumns)) {
483 if (i <
static_cast<int>(
entrances_->size())) {
499 ImGui::TableNextColumn();
500 ImGui::Text(
"%03X", room_id);
502 ImGui::TableNextColumn();
503 ImGui::TextUnformatted(display_name.c_str());
583 std::vector<int> room_ids;
585 std::map<int, GroupInfo> groups;
589 std::string group_name =
"Unloaded";
591 size_t dungeon_index = 0;
593 project_, room_id, &dungeon_index)) {
594 key = -
static_cast<int>(dungeon_index) - 1;
597 key = loaded_room->blockset();
601 auto& g = groups[key];
603 g.room_ids.push_back(room_id);
607 if (ImGui::BeginChild(
"##GroupedRoomList", ImVec2(0, 0),
false,
608 ImGuiWindowFlags_None)) {
609 for (
auto& [key, group] : groups) {
611 snprintf(header,
sizeof(header),
"%s (%zu rooms)##grp%d",
612 group.name.c_str(), group.room_ids.size(), key);
616 std::find(group.room_ids.begin(), group.room_ids.end(),
619 ImGui::SetNextItemOpen(
625 if (ImGui::CollapsingHeader(header)) {
626 for (
int room_id : group.room_ids) {
627 std::string display_name =
630 snprintf(label,
sizeof(label),
"%03X %s##r%d", room_id,
631 display_name.c_str(), room_id);
634 if (ImGui::Selectable(label, is_current,
635 ImGuiSelectableFlags_AllowDoubleClick)) {
643 if (ImGui::IsMouseDoubleClicked(ImGuiMouseButton_Left)) {
659 ImGui::SetScrollHereY(0.5f);
664 if (ImGui::IsItemHovered() &&
rooms_) {
666 if (loaded_room !=
nullptr) {
667 ImGui::BeginTooltip();
668 ImGui::Text(
"%s", display_name.c_str());
669 ImGui::TextDisabled(tr(
"Blockset: %d | Palette: %d"),
670 loaded_room->blockset(),
671 loaded_room->palette());
676 if (bmp.is_active() && bmp.texture() != 0) {
677 ImGui::Image((ImTextureID)(intptr_t)bmp.texture(),
::yaze::EventBus * event_bus()
Get the current EventBus instance.