From 766085cf250e03fcf7fbfa335d9a0ffe2d078eff Mon Sep 17 00:00:00 2001 From: chreden <4263940+chreden@users.noreply.github.com> Date: Sun, 15 Oct 2023 01:57:20 +0100 Subject: [PATCH] Make a single search window (#1193) Replaces the `Item` and `Room` versions of the 'go to' windows with a single 'Find' window which also includes `Trigger` searching. Shortcut is changed to Ctrl + F, docs are updated. Closes #1189 --- README.md | 18 ++----- doc/find.png | Bin 0 -> 27315 bytes doc/go_to_item.png | Bin 1532 -> 0 bytes doc/go_to_room.png | Bin 1632 -> 0 bytes trview.app.tests/UI/GoToTests.cpp | 47 ++--------------- trview.app.tests/Windows/ViewerTests.cpp | 22 ++------ trview.app/UI/GoTo.cpp | 33 +++++++----- trview.app/UI/GoTo.h | 17 +++--- trview.app/UI/IViewerUI.h | 8 +-- trview.app/UI/ViewerUI.cpp | 64 ++++++++++++----------- trview.app/Windows/Viewer.cpp | 13 ++--- trview.sln | 2 - 12 files changed, 87 insertions(+), 137 deletions(-) create mode 100644 doc/find.png delete mode 100644 doc/go_to_item.png delete mode 100644 doc/go_to_room.png diff --git a/README.md b/README.md index 4a8d6387a..cab83adef 100644 --- a/README.md +++ b/README.md @@ -39,8 +39,7 @@ a level file using the File menu or drag and drop a level file onto the window. Key|Action ---|------ CTRL + O | Open file -CTRL + G | Show 'go to room' box -CTRL + E | Show 'go to item' box +CTRL + F | Show find window CTRL + R | Open Route window CTRL + T | New Triggers window CTRL + I | New Items window @@ -177,19 +176,12 @@ Orthographic mode can be useful when paired with the compass selector to choose ### Reset Reset the orbit camera to default rotation. -## Go To Room -_Shortcut: Ctrl+G_ +## Find +_Shortcut: Ctrl+F_ -Enter a room number and press enter to go to that room. +Enter the number or name to search through all available items, triggers or rooms. The results will be presented below and selecting them with the arrow keys or clicking them will select them in the viewer. -![Go To Room](doc/go_to_room.png) - -## Go To Item -_Shortcut: Ctrl+E_ - -Enter an item number and press enter to go to that item. - -![Go To Item](doc/go_to_item.png) +![Find](doc/find.png) ## Minimap diff --git a/doc/find.png b/doc/find.png new file mode 100644 index 0000000000000000000000000000000000000000..bfaea95b809262b9d1f038ac1fc20c75f39d50fd GIT binary patch literal 27315 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 MALyu-D!+LBKevpC^Z)<= literal 0 HcmV?d00001 diff --git a/doc/go_to_item.png b/doc/go_to_item.png deleted file mode 100644 index f7110793771df3e8fd3c9852c85f26eac0839c4a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1532 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 raised; - auto token = window.on_selected += [&](auto value) - { - raised = value; - }; - - TestImgui imgui([&]() { window.render(); }); - imgui.click_element( - imgui.popup_id("Go To Item").push("##gotoentry").id("-"), - false, - imgui.popup_id("Go To Item").id("##gotoentry")); - - ASSERT_FALSE(raised.has_value()); -} - TEST(GoTo, OnSelectedRaisedNumber) { GoTo window; window.toggle_visible(); - window.set_name("Item"); window.set_items({ { .number = 10, .name = "Room Ten" } }); - std::optional raised; + std::optional raised; auto token = window.on_selected += [&](auto value) { raised = value; @@ -59,7 +24,7 @@ TEST(GoTo, OnSelectedRaisedNumber) imgui.render(); ASSERT_TRUE(raised.has_value()); - ASSERT_EQ(raised.value(), 10u); + ASSERT_EQ(raised.value().number, 10u); ASSERT_FALSE(window.visible()); } @@ -67,9 +32,8 @@ TEST(GoTo, OnSelectedRaisedText) { GoTo window; window.toggle_visible(); - window.set_name("Item"); window.set_items({ {.number = 10, .name = "Room Ten" } }); - std::optional raised; + std::optional raised; auto token = window.on_selected += [&](auto value) { raised = value; @@ -84,7 +48,7 @@ TEST(GoTo, OnSelectedRaisedText) imgui.render(); ASSERT_TRUE(raised.has_value()); - ASSERT_EQ(raised.value(), 10u); + ASSERT_EQ(raised.value().number, 10u); ASSERT_FALSE(window.visible()); } @@ -92,9 +56,8 @@ TEST(GoTo, OnSelectedNotRaisedWhenCancelled) { GoTo window; window.toggle_visible(); - window.set_name("Item"); - std::optional raised; + std::optional raised; auto token = window.on_selected += [&](auto value) { raised = value; diff --git a/trview.app.tests/Windows/ViewerTests.cpp b/trview.app.tests/Windows/ViewerTests.cpp index 27649ae23..774f951c9 100644 --- a/trview.app.tests/Windows/ViewerTests.cpp +++ b/trview.app.tests/Windows/ViewerTests.cpp @@ -119,7 +119,6 @@ TEST(Viewer, SelectItemRaisedForValidItem) auto item = mock_shared(); auto level = mock_shared(); - EXPECT_CALL(*level, item(123)).WillRepeatedly(Return(item)); auto viewer = register_test_module().with_ui(std::move(ui_ptr)).build(); viewer->open(level, ILevel::OpenMode::Full); @@ -127,26 +126,12 @@ TEST(Viewer, SelectItemRaisedForValidItem) std::shared_ptr raised_item; auto token = viewer->on_item_selected += [&raised_item](const auto& item) { raised_item = item.lock(); }; - ui.on_select_item(123); + ui.on_select_item(item); ASSERT_TRUE(raised_item); ASSERT_EQ(raised_item, item); } -/// Tests that the on_hide event from the UI is observed but not forwarded when the item is invalid. -TEST(Viewer, SelectItemNotRaisedForInvalidItem) -{ - auto [ui_ptr, ui] = create_mock(); - auto viewer = register_test_module().with_ui(std::move(ui_ptr)).build(); - - std::shared_ptr raised_item; - auto token = viewer->on_item_selected += [&raised_item](const auto& item) { raised_item = item.lock(); }; - - ui.on_select_item(0); - - ASSERT_FALSE(raised_item); -} - /// Tests that the on_hide event from the UI is observed and forwarded when the item is valid. TEST(Viewer, ItemVisibilityRaisedForValidItem) { @@ -198,13 +183,14 @@ TEST(Viewer, SelectRoomRaised) auto [ui_ptr, ui] = create_mock(); auto viewer = register_test_module().with_ui(std::move(ui_ptr)).build(); + auto room = mock_shared()->with_number(100); std::optional raised_room; auto token = viewer->on_room_selected += [&raised_room](const auto& room) { raised_room = room; }; - ui.on_select_room(0); + ui.on_select_room(room); ASSERT_TRUE(raised_room.has_value()); - ASSERT_EQ(raised_room.value(), 0u); + ASSERT_EQ(raised_room.value(), 100u); } /// Tests that the trigger selected event is raised when the user clicks on a trigger. diff --git a/trview.app/UI/GoTo.cpp b/trview.app/UI/GoTo.cpp index b989aabe7..5f63c9d7d 100644 --- a/trview.app/UI/GoTo.cpp +++ b/trview.app/UI/GoTo.cpp @@ -3,6 +3,23 @@ namespace trview { + std::string GoTo::GoToItem::type() const + { + if (std::holds_alternative>(item)) + { + return "Item"; + } + else if (std::holds_alternative>(item)) + { + return "Trigger"; + } + else if (std::holds_alternative>(item)) + { + return "Room"; + } + return "?"; + } + bool GoTo::visible() const { return _visible; @@ -15,16 +32,6 @@ namespace trview _current_input.clear(); } - std::string GoTo::name() const - { - return _name; - } - - void GoTo::set_name(const std::string& name) - { - _name = name; - } - void GoTo::set_items(const std::vector& items) { _items = items; @@ -37,7 +44,7 @@ namespace trview const auto viewport = ImGui::GetMainViewport(); ImGui::SetNextWindowPos(viewport->Pos + ImVec2(viewport->Size.x * 0.5f, viewport->Size.y * 0.25f), 0, ImVec2(0.5f, 0.5f)); - const std::string id = std::format("Go To {}", _name); + const std::string id = "Find"; if (!_shown) { ImGui::OpenPopup(id.c_str()); @@ -107,7 +114,7 @@ namespace trview list_focused = true; } - const auto item_id = std::format("{} - {}", item.number, item.name); + const auto item_id = std::format("{} {} - {}", item.type(), item.number, item.name); if (first_item && ImGui::GetCurrentContext()->NavId == ImGui::GetCurrentWindow()->GetID(item_id.c_str()) && ImGui::IsKeyPressed(ImGuiKey_UpArrow)) @@ -118,7 +125,7 @@ namespace trview if (ImGui::Selectable(item_id.c_str(), false, ImGuiSelectableFlags_DontClosePopups | static_cast(ImGuiSelectableFlags_SelectOnNav))) { - on_selected(item.number); + on_selected(item); } any_selected |= ImGui::GetCurrentContext()->NavId == ImGui::GetCurrentWindow()->GetID(item_id.c_str()); diff --git a/trview.app/UI/GoTo.h b/trview.app/UI/GoTo.h index a3c7c2c2c..0889b5c68 100644 --- a/trview.app/UI/GoTo.h +++ b/trview.app/UI/GoTo.h @@ -7,11 +7,16 @@ #pragma once #include +#include #include #include namespace trview { + struct IItem; + struct IRoom; + struct ITrigger; + /// This window presents the user with a box where they can enter the number of the thing /// that they want to go to. Then when they press enter, that will be the selected. class GoTo final @@ -21,6 +26,9 @@ namespace trview { uint32_t number; std::string name; + std::variant, std::weak_ptr, std::weak_ptr> item; + + std::string type() const; }; /// Gets whether the window is currently visible. @@ -32,19 +40,12 @@ namespace trview /// Event raised when the user selects a new room. The newly selected room is passed as /// a parameter when the event is raised. - Event on_selected; - - /// Get the name of the type of thing being selected. - std::string name() const; + Event on_selected; void render(); - /// Set the name of the type of thing that is being gone to. - void set_name(const std::string& name); - void set_items(const std::vector& items); private: - std::string _name; bool _visible{ false }; bool _shown{ false }; std::vector _items; diff --git a/trview.app/UI/IViewerUI.h b/trview.app/UI/IViewerUI.h index bb6d5468b..265c84091 100644 --- a/trview.app/UI/IViewerUI.h +++ b/trview.app/UI/IViewerUI.h @@ -4,7 +4,6 @@ #include #include -#include #include #include #include "IContextMenu.h" @@ -14,6 +13,9 @@ namespace trview { + struct IRoom; + struct IItem; + enum class Tool { None, @@ -73,10 +75,10 @@ namespace trview Event> on_sector_hover; /// Event raised when an item is selected. - Event on_select_item; + Event> on_select_item; /// Event raised when a room is selected. - Event on_select_room; + Event> on_select_room; /// Event raised when the user settings are changed. Event on_settings; diff --git a/trview.app/UI/ViewerUI.cpp b/trview.app/UI/ViewerUI.cpp index 777d9f074..e264ef746 100644 --- a/trview.app/UI/ViewerUI.cpp +++ b/trview.app/UI/ViewerUI.cpp @@ -40,40 +40,34 @@ namespace trview _map_renderer->set_cursor_position(client_cursor_position(_window)); }; - _token_store += shortcuts->add_shortcut(true, 'G') += [&]() + _token_store += shortcuts->add_shortcut(true, 'F') += [&]() { if (!is_input_active()) { _tooltip->set_visible(false); - _go_to->set_name("Room"); _go_to->toggle_visible(); if (auto level = _level.lock()) { - _go_to->set_items( - level->rooms() + const auto items = level->items() + | std::views::transform([](auto&& i) { return i.lock(); }) + | std::views::filter([](auto&& i) { return i != nullptr; }) + | std::views::transform([](auto&& i) -> GoTo::GoToItem { return { .number = i->number(), .name = i->type(), .item = i }; }) + | std::ranges::to(); + + const auto triggers = level->triggers() + | std::views::transform([](auto&& t) { return t.lock(); }) + | std::views::filter([](auto&& t) { return t != nullptr; }) + | std::views::transform([](auto&& t) -> GoTo::GoToItem { return { .number = t->number(), .name = trigger_type_name(t->type()), .item = t }; }) + | std::ranges::to(); + + const auto rooms = level->rooms() | std::views::transform([](auto&& r) { return r.lock(); }) | std::views::filter([](auto&& r) { return r != nullptr; }) - | std::views::transform([](auto&& r) -> GoTo::GoToItem { return { .number = r->number(), .name = std::format("Room {}", r->number()) }; }) - | std::ranges::to()); - } - } - }; + | std::views::transform([](auto&& r) -> GoTo::GoToItem { return { .number = r->number(), .name = std::format("Room {}", r->number()), .item = r }; }) + | std::ranges::to(); - _token_store += shortcuts->add_shortcut(true, 'E') += [&]() - { - if (!is_input_active()) - { - _tooltip->set_visible(false); - _go_to->set_name("Item"); - _go_to->toggle_visible(); - if (auto level = _level.lock()) - { - _go_to->set_items( - level->items() - | std::views::transform([](auto&& i) { return i.lock(); }) - | std::views::filter([](auto&& i) { return i != nullptr; }) - | std::views::transform([](auto&& i) -> GoTo::GoToItem { return { .number = i->number(), .name = i->type() }; }) - | std::ranges::to()); + const auto all = { items, triggers, rooms }; + _go_to->set_items(std::views::join(all) | std::ranges::to()); } } }; @@ -81,16 +75,20 @@ namespace trview generate_tool_window(); _go_to = std::make_unique(); - _token_store += _go_to->on_selected += [&](uint32_t index) + _token_store += _go_to->on_selected += [&](const GoTo::GoToItem& item) { _tooltip->set_visible(false); - if (_go_to->name() == "Item") + if (std::holds_alternative>(item.item)) + { + on_select_item(std::get>(item.item)); + } + else if (std::holds_alternative>(item.item)) { - on_select_item(index); + on_select_trigger(std::get>(item.item)); } - else + else if (std::holds_alternative>(item.item)) { - on_select_room(index); + on_select_room(std::get>(item.item)); } }; @@ -214,7 +212,13 @@ namespace trview _view_options->on_alternate_group += on_alternate_group; _room_navigator = std::make_unique(); - _room_navigator->on_room_selected += on_select_room; + _token_store += _room_navigator->on_room_selected += [&](const auto index) + { + if (auto level = _level.lock()) + { + on_select_room(level->room(index)); + } + }; _camera_controls->on_reset += on_camera_reset; _camera_controls->on_mode_selected += on_camera_mode; diff --git a/trview.app/Windows/Viewer.cpp b/trview.app/Windows/Viewer.cpp index 41f68e4bc..f4c881273 100644 --- a/trview.app/Windows/Viewer.cpp +++ b/trview.app/Windows/Viewer.cpp @@ -83,17 +83,14 @@ namespace trview std::unordered_map> scalars; scalars[Options::depth] = [this](int32_t value) { if (auto level = _level.lock()) { level->set_neighbour_depth(value); } }; - _token_store += _ui->on_select_item += [&](uint32_t index) - { - if (auto level = _level.lock()) + _token_store += _ui->on_select_item += [&](const auto& item) { on_item_selected(item); }; + _token_store += _ui->on_select_room += [&](const auto& room) { - if (const auto item = level->item(index).lock()) + if (auto r = room.lock()) { - on_item_selected(item); + on_room_selected(r->number()); } - } - }; - _token_store += _ui->on_select_room += [&](uint32_t room) { on_room_selected(room); }; + }; _token_store += _ui->on_toggle_changed += [this, toggles, persist_toggle_value](const std::string& name, bool value) { auto toggle = toggles.find(name); diff --git a/trview.sln b/trview.sln index 892314c5e..e43f436b6 100644 --- a/trview.sln +++ b/trview.sln @@ -59,8 +59,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "doc", "doc", "{B3A7F8A1-CC6 doc\context_menu.png = doc\context_menu.png doc\filters_1.png = doc\filters_1.png doc\filters_2.png = doc\filters_2.png - doc\go_to_item.png = doc\go_to_item.png - doc\go_to_room.png = doc\go_to_room.png doc\items.png = doc\items.png doc\level_info.png = doc\level_info.png doc\lights.png = doc\lights.png