feat: Make all tool windows be detachable

This commit is contained in:
WerWolv 2022-10-13 10:47:35 +02:00
parent 14b28ba899
commit 8b39c8f219
5 changed files with 53 additions and 6 deletions

View file

@ -174,6 +174,7 @@ namespace hex {
struct Entry {
std::string name;
Callback function;
bool detached;
};
}

View file

@ -338,7 +338,7 @@ namespace hex {
void add(const std::string &unlocalizedName, const impl::Callback &function) {
log::debug("Registered new tool: {}", unlocalizedName);
getEntries().emplace_back(impl::Entry { unlocalizedName, function });
getEntries().emplace_back(impl::Entry { unlocalizedName, function, false });
}
std::vector<impl::Entry> &getEntries() {

View file

@ -47,19 +47,24 @@ namespace hex {
void ImHexSettingsHandler_ReadLine(ImGuiContext *, ImGuiSettingsHandler *, void *, const char *line) {
for (auto &[name, view] : ContentRegistry::Views::getEntries()) {
std::string format = std::string(view->getUnlocalizedName()) + "=%d";
std::string format = view->getUnlocalizedName() + "=%d";
sscanf(line, format.c_str(), &view->getWindowOpenState());
}
for (auto &[name, function, detached] : ContentRegistry::Tools::getEntries()) {
std::string format = name + "=%d";
sscanf(line, format.c_str(), &detached);
}
}
void ImHexSettingsHandler_WriteAll(ImGuiContext *, ImGuiSettingsHandler *handler, ImGuiTextBuffer *buf) {
buf->reserve(buf->size() + 0x20); // Ballpark reserve
buf->appendf("[%s][General]\n", handler->TypeName);
for (auto &[name, view] : ContentRegistry::Views::getEntries()) {
buf->appendf("%s=%d\n", name.c_str(), view->getWindowOpenState());
}
for (auto &[name, function, detached] : ContentRegistry::Tools::getEntries()) {
buf->appendf("%s=%d\n", name.c_str(), detached);
}
buf->append("\n");
}

View file

@ -2,7 +2,7 @@
#include <hex.hpp>
#include <imgui.h>
#include <hex/api/content_registry.hpp>
#include <hex/ui/view.hpp>
#include <array>
@ -16,6 +16,9 @@ namespace hex::plugin::builtin {
~ViewTools() override = default;
void drawContent() override;
private:
std::vector<ContentRegistry::Tools::impl::Entry>::iterator m_dragStartIterator;
};
}

View file

@ -1,4 +1,5 @@
#include "content/views/view_tools.hpp"
#include <imgui_internal.h>
#include <hex/api/content_registry.hpp>
@ -7,14 +8,51 @@ namespace hex::plugin::builtin {
ViewTools::ViewTools() : View("hex.builtin.view.tools.name") { }
void ViewTools::drawContent() {
auto &tools = ContentRegistry::Tools::getEntries();
if (ImGui::Begin(View::toWindowName("hex.builtin.view.tools.name").c_str(), &this->getWindowOpenState(), ImGuiWindowFlags_NoCollapse)) {
for (const auto &[name, function] : ContentRegistry::Tools::getEntries()) {
for (auto iter = tools.begin(); iter != tools.end(); iter++) {
auto &[name, function, detached] = *iter;
if (detached) continue;
if (ImGui::CollapsingHeader(LangEntry(name))) {
function();
} else {
if (ImGui::IsMouseClicked(0) && ImGui::IsItemActivated() && this->m_dragStartIterator == tools.end())
this->m_dragStartIterator = iter;
if (!ImGui::IsItemHovered() && this->m_dragStartIterator == iter) {
detached = true;
}
if (!ImGui::IsMouseDown(0))
this->m_dragStartIterator = tools.end();
}
}
}
ImGui::End();
for (auto iter = tools.begin(); iter != tools.end(); iter++) {
auto &[name, function, detached] = *iter;
if (!detached) continue;
ImGui::SetNextWindowSize(scaled(ImVec2(600, 0)), ImGuiCond_Appearing);
if (ImGui::Begin(View::toWindowName(name).c_str(), &detached, ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoResize)) {
function();
if (ImGui::IsWindowAppearing() && this->m_dragStartIterator == iter) {
this->m_dragStartIterator = tools.end();
// Attach the newly created window to the cursor, so it gets dragged around
GImGui->MovingWindow = ImGui::GetCurrentWindow();
GImGui->ActiveId = GImGui->MovingWindow->MoveId;
ImGui::DockContextQueueUndockWindow(GImGui, GImGui->MovingWindow);
}
}
ImGui::End();
}
}
}