1
0
mirror of synced 2024-12-04 04:07:19 +01:00
ImHex/plugins/builtin/source/content/views/view_tools.cpp

86 lines
3.3 KiB
C++
Raw Normal View History

2021-12-07 22:47:41 +01:00
#include "content/views/view_tools.hpp"
#include <imgui_internal.h>
2020-11-15 00:46:38 +01:00
#include <hex/api/content_registry.hpp>
2021-12-07 22:47:41 +01:00
namespace hex::plugin::builtin {
2020-11-15 00:46:38 +01:00
ViewTools::ViewTools() : View::Window("hex.builtin.view.tools.name") {
2023-12-19 13:10:25 +01:00
m_dragStartIterator = ContentRegistry::Tools::impl::getEntries().end();
}
void ViewTools::drawContent() {
auto &tools = ContentRegistry::Tools::impl::getEntries();
// Draw all tools
for (auto iter = tools.begin(); iter != tools.end(); ++iter) {
auto &[name, function, detached] = *iter;
// If the tool has been detached from the main window, don't draw it here anymore
if (detached) continue;
// Draw the tool
if (ImGui::CollapsingHeader(Lang(name))) {
function();
ImGui::NewLine();
} else {
// Handle dragging the tool out of the main window
// If the user clicks on the header, start dragging the tool remember the iterator
2023-12-19 13:10:25 +01:00
if (ImGui::IsMouseClicked(0) && ImGui::IsItemActivated() && m_dragStartIterator == tools.end())
m_dragStartIterator = iter;
// If the user released the mouse button, stop dragging the tool
if (!ImGui::IsMouseDown(0))
2023-12-19 13:10:25 +01:00
m_dragStartIterator = tools.end();
// Detach the tool if the user dragged it out of the main window
2023-12-19 13:10:25 +01:00
if (!ImGui::IsItemHovered() && m_dragStartIterator == iter) {
detached = true;
}
}
2020-11-15 00:46:38 +01:00
}
}
void ViewTools::drawAlwaysVisibleContent() {
// Make sure the tool windows never get drawn over the welcome screen
if (!ImHexApi::Provider::isValid())
return;
auto &tools = ContentRegistry::Tools::impl::getEntries();
2023-11-10 20:47:08 +01:00
for (auto iter = tools.begin(); iter != tools.end(); ++iter) {
auto &[name, function, detached] = *iter;
// If the tool is still attached to the main window, don't draw it here
if (!detached) continue;
// Load the window height that is dependent on the tool content
const auto windowName = View::toWindowName(name);
const auto height = m_windowHeights[ImGui::FindWindowByName(windowName.c_str())];
if (height > 0)
ImGui::SetNextWindowSizeConstraints(ImVec2(400_scaled, height), ImVec2(FLT_MAX, height));
// Create a new window for the tool
if (ImGui::Begin(windowName.c_str(), &detached, ImGuiWindowFlags_NoCollapse)) {
// Draw the tool content
function();
// Handle the first frame after the tool has been detached
2023-12-19 13:10:25 +01:00
if (ImGui::IsWindowAppearing() && m_dragStartIterator == iter) {
m_dragStartIterator = tools.end();
// Attach the newly created window to the cursor, so it gets dragged around
GImGui->MovingWindow = ImGui::GetCurrentWindowRead();
GImGui->ActiveId = GImGui->MovingWindow->MoveId;
}
const auto window = ImGui::GetCurrentWindowRead();
m_windowHeights[ImGui::GetCurrentWindowRead()] = ImGui::CalcWindowNextAutoFitSize(window).y;
}
ImGui::End();
}
2020-11-15 00:46:38 +01:00
}
}