From c758eb244b76ca6dfaf1c6384b0287412eac62c1 Mon Sep 17 00:00:00 2001 From: WerWolv Date: Sat, 14 Nov 2020 21:16:03 +0100 Subject: [PATCH] Added a help window --- CMakeLists.txt | 1 + include/views/view_help.hpp | 33 ++++++++ source/main.cpp | 2 + source/views/view_help.cpp | 165 ++++++++++++++++++++++++++++++++++++ 4 files changed, 201 insertions(+) create mode 100644 include/views/view_help.hpp create mode 100644 source/views/view_help.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index f0e87f4c0..81b7d1ca3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -26,6 +26,7 @@ add_executable(ImHex source/views/view_pattern_data.cpp source/views/view_hashes.cpp source/views/view_information.cpp + source/views/view_help.cpp libs/glad/source/glad.c diff --git a/include/views/view_help.hpp b/include/views/view_help.hpp new file mode 100644 index 000000000..50e974c74 --- /dev/null +++ b/include/views/view_help.hpp @@ -0,0 +1,33 @@ +#pragma once + +#include + +#include "imgui.h" +#include "views/view.hpp" +#include "views/pattern_data.hpp" + +#include +#include +#include + +namespace hex { + + namespace prv { class Provider; } + + class ViewHelp : public View { + public: + ViewHelp(); + ~ViewHelp() override; + + void createView() override; + void createMenu() override; + + private: + bool m_aboutWindowOpen = false; + bool m_patternHelpWindowOpen = false; + + void drawAboutPopup(); + void drawPatternHelpPopup(); + }; + +} \ No newline at end of file diff --git a/source/main.cpp b/source/main.cpp index a8f8b4f76..bcb7ada48 100644 --- a/source/main.cpp +++ b/source/main.cpp @@ -6,6 +6,7 @@ #include "views/view_pattern_data.hpp" #include "views/view_hashes.hpp" #include "views/view_information.hpp" +#include "views/view_help.hpp" #include "providers/provider.hpp" @@ -24,6 +25,7 @@ int main() { window.addView(dataProvider, patternData); window.addView(dataProvider); window.addView(dataProvider); + window.addView(); window.loop(); diff --git a/source/views/view_help.cpp b/source/views/view_help.cpp new file mode 100644 index 000000000..d411b4e3d --- /dev/null +++ b/source/views/view_help.cpp @@ -0,0 +1,165 @@ +#include "views/view_help.hpp" + +namespace hex { + + ViewHelp::ViewHelp() { + + } + + ViewHelp::~ViewHelp() { + + } + + void ViewHelp::drawAboutPopup() { + ImGui::OpenPopup("About"); + ImGui::SetNextWindowSizeConstraints(ImVec2(450, 300), ImVec2(450, 300)); + if (ImGui::BeginPopupModal("About", &this->m_aboutWindowOpen, ImGuiWindowFlags_NoResize)) { + + ImGui::Text("ImHex Hex Editor"); + ImGui::Text("by WerWolv"); + ImGui::Separator(); + ImGui::NewLine(); + + ImGui::Text("Source code found at"); ImGui::SameLine(); + ImGui::TextColored(ImVec4(0.4F, 0.4F, 0.8F, 1.0F), "https://github.com/WerWolv/ImHex"); + ImGui::NewLine(); + + ImGui::Separator(); + ImGui::Text("Libraries used"); + ImGui::PushStyleColor(ImGuiCol_ChildBg, ImVec4(0.2F, 0.2F, 0.2F, 0.3F)); + ImGui::BeginChild("##scroll"); + ImGui::NewLine(); + ImGui::BulletText("ImGui by ocornut"); + ImGui::BulletText("imgui_club by ocornut"); + ImGui::BulletText("imgui-filebrowser by AirGuanZ"); + ImGui::NewLine(); + ImGui::BulletText("GNU libmagic"); + ImGui::BulletText("OpenSSL libcrypto"); + ImGui::BulletText("GLFW3"); + + ImGui::EndChild(); + ImGui::PopStyleColor(); + ImGui::EndPopup(); + } + } + + void ViewHelp::drawPatternHelpPopup() { + ImGui::OpenPopup("PatternLanguage"); + ImGui::SetNextWindowSizeConstraints(ImVec2(450, 300), ImVec2(450, 300)); + + constexpr static auto DrawTitle = [](const std::string &title) { + ImGui::TextColored(ImVec4(0.6F, 0.6F, 1.0F, 1.0F), title.c_str()); + }; + + constexpr static auto DrawCodeSegment = [](const std::string &id, size_t height, const std::string &code) { + ImGui::PushStyleColor(ImGuiCol_ChildBg, ImVec4(0.2F, 0.2F, 0.2F, 0.3F)); + ImGui::NewLine(); + ImGui::BeginChild(id.c_str(), ImVec2(-1, height)); + + ImGui::Text("%s", code.c_str()); + + ImGui::EndChild(); + ImGui::NewLine(); + ImGui::PopStyleColor(); + }; + + ImGui::SetNextWindowSizeConstraints(ImVec2(450, 300), ImVec2(2000, 1000)); + if (ImGui::BeginPopupModal("PatternLanguage", &this->m_patternHelpWindowOpen)) { + ImGui::Text("ImHex Pattern Language Cheat Sheet"); + ImGui::Separator(); + ImGui::NewLine(); + + DrawTitle("Built-in types"); + ImGui::TextWrapped( + "The following built-in types are available for use"); + DrawCodeSegment("built-in", 80, + "u8, s8\n" + "u16, s16\n" + "u32, s32\n" + "u64, s64\n" + "u128, s128\n" + "float, double" + ); + + DrawTitle("Variables and Arrays"); + ImGui::TextWrapped( + "Normal variables as well as arrays are used to highlight and display values."); + DrawCodeSegment("vars arrays", 30, + "u32 variable;\n" + "s8 string[16];" + ); + + DrawTitle("Structs"); + ImGui::TextWrapped( + "To bundle multiple variables together, a struct can be used."); + DrawCodeSegment("struct", 70, + "struct Header {\n" + " u32 magic;\n" + " u8 version;\n" + " Flags flags;\n" + "}" + ); + + DrawTitle("Enum"); + ImGui::TextWrapped( + "If a value can only be a few specific values with special meaning, an enum can be used. " + "The underlying type has to be specified using a unsigned, built-in type after the name. " + "Entries can be listed with or without a value. The values start counting at zero and increase by one " + "for every next entry"); + DrawCodeSegment("enum", 70, + "enum OperatingSystem : u8 {\n" + " Windows = 0x10,\n" + " MacOSX,\n" + " Linux\n" + "}" + ); + + DrawTitle("Using declarations"); + ImGui::TextWrapped( + "A using declaration can be used to create type aliases for already existing types. This can be " + "a built-in type, a struct, enum or another alias type."); + DrawCodeSegment("using", 15, + "using magic_t = u32;" + ); + + DrawTitle("Comments"); + ImGui::TextWrapped( + "To create a comment the C // or /* */ syntax can be used. //-style comments end at the next new line " + "and /*-style comments only end when at the next */."); + DrawCodeSegment("comment", 55, + "// This is a single line comment\n\n" + "/* This is a\n" + "multiline comment */" + ); + + DrawTitle("Variable placement"); + ImGui::TextWrapped( + "In order to highlight bytes and displaying their value in the pattern data window, " + "a variable needs to be created and placed in memory. The following line of code creates" + "a unsigned 32 bit variable named data and places it at offset 0x100." + ); + DrawCodeSegment("var placement", 15, "u32 data @ 0x100;"); + ImGui::EndPopup(); + } + } + + void ViewHelp::createView() { + if (this->m_aboutWindowOpen) + drawAboutPopup(); + + if (this->m_patternHelpWindowOpen) + drawPatternHelpPopup(); + } + + void ViewHelp::createMenu() { + if (ImGui::BeginMenu("Help")) { + if (ImGui::MenuItem("About", "")) + this->m_aboutWindowOpen = true; + ImGui::Separator(); + if (ImGui::MenuItem("Pattern Language Cheat Sheet", "")) + this->m_patternHelpWindowOpen = true; + ImGui::EndMenu(); + } + } + +} \ No newline at end of file