feat: Added basic introduction tutorial

This commit is contained in:
WerWolv
2023-12-13 23:03:39 +01:00
parent 346f1362c6
commit f000b6bc0a
16 changed files with 246 additions and 28 deletions

View File

@@ -522,8 +522,7 @@ namespace hex::plugin::builtin {
if (view->hasViewMenuItemEntry()) {
auto &state = view->getWindowOpenState();
if (ImGui::MenuItem(Lang(view->getUnlocalizedName()), "", &state, ImHexApi::Provider::isValid() && !LayoutManager::isLayoutLocked()))
view->setWindowJustOpened(state);
ImGui::MenuItem(Lang(view->getUnlocalizedName()), "", &state, ImHexApi::Provider::isValid() && !LayoutManager::isLayoutLocked());
}
}

View File

@@ -0,0 +1,106 @@
#include <content/providers/memory_file_provider.hpp>
#include <hex/api/event_manager.hpp>
#include <hex/api/shortcut_manager.hpp>
#include <hex/api/tutorial_manager.hpp>
#include <hex/ui/view.hpp>
namespace hex::plugin::builtin {
void registerIntroductionTutorial() {
using enum TutorialManager::Position;
auto &tutorial = TutorialManager::createTutorial("hex.builtin.tutorial.introduction", "hex.builtin.tutorial.introduction.description");
{
tutorial.addStep()
.setMessage(
"hex.builtin.tutorial.introduction.step1.title",
"hex.builtin.tutorial.introduction.step1.description",
Bottom | Right
)
.allowSkip();
}
{
auto &step = tutorial.addStep();
step.setMessage(
"hex.builtin.tutorial.introduction.step2.title",
"hex.builtin.tutorial.introduction.step2.description",
Bottom | Right
)
.addHighlight("hex.builtin.tutorial.introduction.step2.highlight",
{
"Welcome Screen/Start##SubWindow_685A2CE9",
Lang("hex.builtin.welcome.start.create_file")
})
.onAppear([&step] {
EventProviderOpened::subscribe(&step, [&step](prv::Provider *provider) {
if (dynamic_cast<MemoryFileProvider*>(provider))
step.complete();
});
})
.onComplete([&step] {
EventProviderOpened::unsubscribe(&step);
});
}
{
tutorial.addStep()
.addHighlight("hex.builtin.tutorial.introduction.step3.highlight", {
View::toWindowName("hex.builtin.view.hex_editor.name")
})
.allowSkip();
}
{
tutorial.addStep()
.addHighlight("hex.builtin.tutorial.introduction.step4.highlight", {
View::toWindowName("hex.builtin.view.data_inspector.name")
})
.onAppear([]{
ImHexApi::HexEditor::setSelection(Region { 0, 1 });
})
.allowSkip();
}
{
tutorial.addStep()
.addHighlight("hex.builtin.tutorial.introduction.step5.highlight.pattern_editor", {
View::toWindowName("hex.builtin.view.pattern_editor.name")
})
.addHighlight("hex.builtin.tutorial.introduction.step5.highlight.pattern_data", {
View::toWindowName("hex.builtin.view.pattern_data.name")
})
.onAppear([] {
RequestSetPatternLanguageCode::post("\n\n\n\n\n\nstruct Test {\n u8 value;\n};\n\nTest test @ 0x00;");
RequestRunPatternCode::post();
})
.allowSkip();
}
{
auto &step = tutorial.addStep();
step.addHighlight("hex.builtin.tutorial.introduction.step6.highlight", {
"##MainMenuBar",
"##menubar",
Lang("hex.builtin.menu.help")
})
.addHighlight({
"##Menu_00",
Lang("hex.builtin.view.tutorials.name")
})
.onAppear([&step] {
EventViewOpened::subscribe([&step](View *view){
if (view->getUnlocalizedName() == "hex.builtin.view.tutorials.name")
step.complete();
});
})
.onComplete([&step]{
EventViewOpened::unsubscribe(&step);
})
.allowSkip();
}
}
}

View File

@@ -0,0 +1,9 @@
namespace hex::plugin::builtin {
void registerIntroductionTutorial();
void registerTutorials() {
registerIntroductionTutorial();
}
}

View File

@@ -145,6 +145,7 @@ namespace hex::plugin::builtin {
ViewPatternEditor::~ViewPatternEditor() {
RequestSetPatternLanguageCode::unsubscribe(this);
RequestRunPatternCode::unsubscribe(this);
EventFileLoaded::unsubscribe(this);
EventProviderChanged::unsubscribe(this);
EventProviderClosed::unsubscribe(this);
@@ -1103,6 +1104,10 @@ namespace hex::plugin::builtin {
this->loadPatternFile(path, ImHexApi::Provider::get());
});
RequestRunPatternCode::subscribe(this, [this] {
this->m_triggerAutoEvaluate = true;
});
RequestSavePatternLanguageFile::subscribe(this, [this](const std::fs::path &path) {
wolv::io::File file(path, wolv::io::File::Mode::Create);
file.writeString(wolv::util::trim(this->m_textEditor.GetText()));

View File

@@ -27,6 +27,9 @@ namespace hex::plugin::builtin {
if (ImGui::BeginTable("Tutorials", 1, ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg, ImGui::GetContentRegionAvail())) {
for (const auto &tutorial : tutorials | std::views::values) {
if (this->m_selectedTutorial == nullptr)
this->m_selectedTutorial = &tutorial;
ImGui::TableNextRow();
ImGui::TableNextColumn();

View File

@@ -30,6 +30,8 @@
#include <string>
#include <random>
#include <content/popups/popup_question.hpp>
#include <hex/api/tutorial_manager.hpp>
#include <hex/api/workspace_manager.hpp>
namespace hex::plugin::builtin {
@@ -539,6 +541,16 @@ namespace hex::plugin::builtin {
PopupTelemetryRequest::open();
#endif
}
if (ContentRegistry::Settings::read("hex.builtin.setting.general", "hex.builtin.setting.general.prev_launch_version", "") == "") {
PopupQuestion::open("hex.builtin.popup.play_tutorial.desc"_lang,
[]{
TutorialManager::startTutorial("hex.builtin.tutorial.introduction");
},
[]{ });
}
ContentRegistry::Settings::write("hex.builtin.setting.general", "hex.builtin.setting.general.prev_launch_version", ImHexApi::System::getImHexVersion());
});
// Clear project context if we go back to the welcome screen