feat: Allow hiding data inspector rows
This commit is contained in:
parent
37f9f5619c
commit
3b01dcf230
@ -261,8 +261,8 @@ namespace ImGuiExt {
|
|||||||
|
|
||||||
bool BitCheckbox(const char* label, bool* v);
|
bool BitCheckbox(const char* label, bool* v);
|
||||||
|
|
||||||
bool DimmedButton(const char* label);
|
bool DimmedButton(const char* label, ImVec2 size = ImVec2(0, 0));
|
||||||
bool DimmedIconButton(const char *symbol, ImVec4 color, ImVec2 size_arg = ImVec2(0, 0));
|
bool DimmedIconButton(const char *symbol, ImVec4 color, ImVec2 size = ImVec2(0, 0));
|
||||||
bool DimmedIconToggle(const char *icon, bool *v);
|
bool DimmedIconToggle(const char *icon, bool *v);
|
||||||
|
|
||||||
void TextOverlay(const char *text, ImVec2 pos);
|
void TextOverlay(const char *text, ImVec2 pos);
|
||||||
|
@ -802,14 +802,14 @@ namespace ImGuiExt {
|
|||||||
return pressed;
|
return pressed;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool DimmedButton(const char* label){
|
bool DimmedButton(const char* label, ImVec2 size){
|
||||||
PushStyleColor(ImGuiCol_ButtonHovered, GetCustomColorU32(ImGuiCustomCol_DescButtonHovered));
|
PushStyleColor(ImGuiCol_ButtonHovered, GetCustomColorU32(ImGuiCustomCol_DescButtonHovered));
|
||||||
PushStyleColor(ImGuiCol_Button, GetCustomColorU32(ImGuiCustomCol_DescButton));
|
PushStyleColor(ImGuiCol_Button, GetCustomColorU32(ImGuiCustomCol_DescButton));
|
||||||
PushStyleColor(ImGuiCol_Text, GetColorU32(ImGuiCol_ButtonActive));
|
PushStyleColor(ImGuiCol_Text, GetColorU32(ImGuiCol_ButtonActive));
|
||||||
PushStyleColor(ImGuiCol_ButtonActive, GetCustomColorU32(ImGuiCustomCol_DescButtonActive));
|
PushStyleColor(ImGuiCol_ButtonActive, GetCustomColorU32(ImGuiCustomCol_DescButtonActive));
|
||||||
PushStyleVar(ImGuiStyleVar_FrameBorderSize, 1);
|
PushStyleVar(ImGuiStyleVar_FrameBorderSize, 1);
|
||||||
|
|
||||||
bool res = Button(label);
|
bool res = Button(label, size);
|
||||||
|
|
||||||
PopStyleColor(4);
|
PopStyleColor(4);
|
||||||
PopStyleVar(1);
|
PopStyleVar(1);
|
||||||
@ -817,14 +817,14 @@ namespace ImGuiExt {
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool DimmedIconButton(const char *symbol, ImVec4 color, ImVec2 size_arg){
|
bool DimmedIconButton(const char *symbol, ImVec4 color, ImVec2 size){
|
||||||
PushStyleColor(ImGuiCol_ButtonHovered, GetCustomColorU32(ImGuiCustomCol_DescButtonHovered));
|
PushStyleColor(ImGuiCol_ButtonHovered, GetCustomColorU32(ImGuiCustomCol_DescButtonHovered));
|
||||||
PushStyleColor(ImGuiCol_Button, GetCustomColorU32(ImGuiCustomCol_DescButton));
|
PushStyleColor(ImGuiCol_Button, GetCustomColorU32(ImGuiCustomCol_DescButton));
|
||||||
PushStyleColor(ImGuiCol_Text, GetColorU32(ImGuiCol_ButtonActive));
|
PushStyleColor(ImGuiCol_Text, GetColorU32(ImGuiCol_ButtonActive));
|
||||||
PushStyleColor(ImGuiCol_ButtonActive, GetCustomColorU32(ImGuiCustomCol_DescButtonActive));
|
PushStyleColor(ImGuiCol_ButtonActive, GetCustomColorU32(ImGuiCustomCol_DescButtonActive));
|
||||||
PushStyleVar(ImGuiStyleVar_FrameBorderSize, 1);
|
PushStyleVar(ImGuiStyleVar_FrameBorderSize, 1);
|
||||||
|
|
||||||
bool res = IconButton(symbol, color, size_arg);
|
bool res = IconButton(symbol, color, size);
|
||||||
|
|
||||||
PopStyleColor(4);
|
PopStyleColor(4);
|
||||||
PopStyleVar(1);
|
PopStyleVar(1);
|
||||||
|
@ -24,6 +24,8 @@ namespace hex::plugin::builtin {
|
|||||||
ContentRegistry::DataInspector::impl::DisplayFunction displayFunction;
|
ContentRegistry::DataInspector::impl::DisplayFunction displayFunction;
|
||||||
std::optional<ContentRegistry::DataInspector::impl::EditingFunction> editingFunction;
|
std::optional<ContentRegistry::DataInspector::impl::EditingFunction> editingFunction;
|
||||||
bool editing;
|
bool editing;
|
||||||
|
|
||||||
|
std::string filterValue;
|
||||||
};
|
};
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@ -45,6 +47,9 @@ namespace hex::plugin::builtin {
|
|||||||
|
|
||||||
std::string m_editingValue = "";
|
std::string m_editingValue = "";
|
||||||
|
|
||||||
|
bool m_tableEditingModeEnabled = false;
|
||||||
|
std::set<std::string> m_hiddenValues;
|
||||||
|
|
||||||
pl::PatternLanguage m_runtime;
|
pl::PatternLanguage m_runtime;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -80,6 +80,7 @@
|
|||||||
"hex.builtin.common.decimal": "Decimal",
|
"hex.builtin.common.decimal": "Decimal",
|
||||||
"hex.builtin.common.deny": "Deny",
|
"hex.builtin.common.deny": "Deny",
|
||||||
"hex.builtin.common.dont_show_again": "Don't show again",
|
"hex.builtin.common.dont_show_again": "Don't show again",
|
||||||
|
"hex.builtin.common.edit": "Edit",
|
||||||
"hex.builtin.common.encoding.ascii": "ASCII",
|
"hex.builtin.common.encoding.ascii": "ASCII",
|
||||||
"hex.builtin.common.encoding.utf16be": "UTF-16BE",
|
"hex.builtin.common.encoding.utf16be": "UTF-16BE",
|
||||||
"hex.builtin.common.encoding.utf16le": "UTF-16LE",
|
"hex.builtin.common.encoding.utf16le": "UTF-16LE",
|
||||||
|
@ -5,6 +5,7 @@
|
|||||||
#include <hex/providers/provider.hpp>
|
#include <hex/providers/provider.hpp>
|
||||||
|
|
||||||
#include <hex/api/achievement_manager.hpp>
|
#include <hex/api/achievement_manager.hpp>
|
||||||
|
#include <hex/api/project_file_manager.hpp>
|
||||||
#include <hex/helpers/logger.hpp>
|
#include <hex/helpers/logger.hpp>
|
||||||
|
|
||||||
#include <pl/pattern_language.hpp>
|
#include <pl/pattern_language.hpp>
|
||||||
@ -39,11 +40,18 @@ namespace hex::plugin::builtin {
|
|||||||
EventManager::subscribe<EventProviderClosed>(this, [this](const auto*) {
|
EventManager::subscribe<EventProviderClosed>(this, [this](const auto*) {
|
||||||
this->m_selectedProvider = nullptr;
|
this->m_selectedProvider = nullptr;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
EventManager::subscribe<EventSettingsChanged>(this, [this] {
|
||||||
|
auto filterValues = ContentRegistry::Settings::read("hex.builtin.setting.data_inspector", "hex.builtin.setting.data_inspector.hidden_rows", nlohmann::json::array()).get<std::vector<std::string>>();
|
||||||
|
|
||||||
|
this->m_hiddenValues = std::set(filterValues.begin(), filterValues.end());
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
ViewDataInspector::~ViewDataInspector() {
|
ViewDataInspector::~ViewDataInspector() {
|
||||||
EventManager::unsubscribe<EventRegionSelected>(this);
|
EventManager::unsubscribe<EventRegionSelected>(this);
|
||||||
EventManager::unsubscribe<EventProviderClosed>(this);
|
EventManager::unsubscribe<EventProviderClosed>(this);
|
||||||
|
EventManager::unsubscribe<EventSettingsChanged>(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -74,7 +82,8 @@ namespace hex::plugin::builtin {
|
|||||||
entry.unlocalizedName,
|
entry.unlocalizedName,
|
||||||
entry.generatorFunction(buffer, endian, numberDisplayStyle),
|
entry.generatorFunction(buffer, endian, numberDisplayStyle),
|
||||||
entry.editingFunction,
|
entry.editingFunction,
|
||||||
false
|
false,
|
||||||
|
entry.unlocalizedName
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -111,10 +120,10 @@ namespace hex::plugin::builtin {
|
|||||||
|
|
||||||
// Loop over all files in the inspectors folder and execute them
|
// Loop over all files in the inspectors folder and execute them
|
||||||
for (const auto &folderPath : fs::getDefaultPaths(fs::ImHexPath::Inspectors)) {
|
for (const auto &folderPath : fs::getDefaultPaths(fs::ImHexPath::Inspectors)) {
|
||||||
for (const auto &filePath : std::fs::recursive_directory_iterator(folderPath)) {
|
for (const auto &entry : std::fs::recursive_directory_iterator(folderPath)) {
|
||||||
|
const auto &filePath = entry.path();
|
||||||
// Skip non-files and files that don't end with .hexpat
|
// Skip non-files and files that don't end with .hexpat
|
||||||
if (!filePath.exists() || !filePath.is_regular_file() || filePath.path().extension() != ".hexpat")
|
if (!entry.exists() || !entry.is_regular_file() || filePath.extension() != ".hexpat")
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
// Read the inspector file
|
// Read the inspector file
|
||||||
@ -161,7 +170,8 @@ namespace hex::plugin::builtin {
|
|||||||
pattern->getDisplayName(),
|
pattern->getDisplayName(),
|
||||||
displayFunction,
|
displayFunction,
|
||||||
editingFunction,
|
editingFunction,
|
||||||
false
|
false,
|
||||||
|
wolv::util::toUTF8String(filePath)
|
||||||
});
|
});
|
||||||
|
|
||||||
AchievementManager::unlockAchievement("hex.builtin.achievement.patterns", "hex.builtin.achievement.patterns.data_inspector.name");
|
AchievementManager::unlockAchievement("hex.builtin.achievement.patterns", "hex.builtin.achievement.patterns.data_inspector.name");
|
||||||
@ -172,7 +182,7 @@ namespace hex::plugin::builtin {
|
|||||||
} else {
|
} else {
|
||||||
const auto& error = this->m_runtime.getError();
|
const auto& error = this->m_runtime.getError();
|
||||||
|
|
||||||
log::error("Failed to execute custom inspector file '{}'!", wolv::util::toUTF8String(filePath.path()));
|
log::error("Failed to execute custom inspector file '{}'!", wolv::util::toUTF8String(filePath));
|
||||||
if (error.has_value())
|
if (error.has_value())
|
||||||
log::error("{}", error.value().what());
|
log::error("{}", error.value().what());
|
||||||
}
|
}
|
||||||
@ -200,15 +210,35 @@ namespace hex::plugin::builtin {
|
|||||||
|
|
||||||
if (ImGui::Begin(View::toWindowName("hex.builtin.view.data_inspector.name").c_str(), &this->getWindowOpenState(), ImGuiWindowFlags_NoCollapse)) {
|
if (ImGui::Begin(View::toWindowName("hex.builtin.view.data_inspector.name").c_str(), &this->getWindowOpenState(), ImGuiWindowFlags_NoCollapse)) {
|
||||||
if (this->m_selectedProvider != nullptr && this->m_selectedProvider->isReadable() && this->m_validBytes > 0) {
|
if (this->m_selectedProvider != nullptr && this->m_selectedProvider->isReadable() && this->m_validBytes > 0) {
|
||||||
if (ImGui::BeginTable("##datainspector", 2, ImGuiTableFlags_Borders | ImGuiTableFlags_SizingFixedFit | ImGuiTableFlags_RowBg, ImVec2(0, ImGui::GetTextLineHeightWithSpacing() * (this->m_cachedData.size() + 1)))) {
|
u32 validLineCount = this->m_cachedData.size();
|
||||||
|
if (!this->m_tableEditingModeEnabled) {
|
||||||
|
validLineCount = std::count_if(this->m_cachedData.begin(), this->m_cachedData.end(), [this](const auto &entry) {
|
||||||
|
return !this->m_hiddenValues.contains(entry.filterValue);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ImGui::BeginTable("##datainspector", this->m_tableEditingModeEnabled ? 3 : 2, ImGuiTableFlags_Borders | ImGuiTableFlags_SizingFixedFit | ImGuiTableFlags_RowBg, ImVec2(0, ImGui::GetTextLineHeightWithSpacing() * (validLineCount + 1)))) {
|
||||||
ImGui::TableSetupScrollFreeze(0, 1);
|
ImGui::TableSetupScrollFreeze(0, 1);
|
||||||
ImGui::TableSetupColumn("hex.builtin.view.data_inspector.table.name"_lang);
|
ImGui::TableSetupColumn("hex.builtin.view.data_inspector.table.name"_lang, ImGuiTableColumnFlags_WidthFixed);
|
||||||
ImGui::TableSetupColumn("hex.builtin.view.data_inspector.table.value"_lang);
|
ImGui::TableSetupColumn("hex.builtin.view.data_inspector.table.value"_lang, ImGuiTableColumnFlags_WidthStretch);
|
||||||
|
|
||||||
|
if (this->m_tableEditingModeEnabled)
|
||||||
|
ImGui::TableSetupColumn("##favorite", ImGuiTableColumnFlags_WidthFixed, ImGui::GetTextLineHeight());
|
||||||
|
|
||||||
ImGui::TableHeadersRow();
|
ImGui::TableHeadersRow();
|
||||||
|
|
||||||
int inspectorRowId = 1;
|
int inspectorRowId = 1;
|
||||||
for (auto &[unlocalizedName, displayFunction, editingFunction, editing] : this->m_cachedData) {
|
for (auto &[unlocalizedName, displayFunction, editingFunction, editing, filterValue] : this->m_cachedData) {
|
||||||
|
bool grayedOut = false;
|
||||||
|
if (this->m_hiddenValues.contains(filterValue)) {
|
||||||
|
if (!this->m_tableEditingModeEnabled)
|
||||||
|
continue;
|
||||||
|
else
|
||||||
|
grayedOut = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
ImGui::BeginDisabled(grayedOut);
|
||||||
|
|
||||||
ImGui::PushID(inspectorRowId);
|
ImGui::PushID(inspectorRowId);
|
||||||
ImGui::TableNextRow();
|
ImGui::TableNextRow();
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
@ -267,6 +297,32 @@ namespace hex::plugin::builtin {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ImGui::EndDisabled();
|
||||||
|
|
||||||
|
if (this->m_tableEditingModeEnabled) {
|
||||||
|
ImGui::TableNextColumn();
|
||||||
|
|
||||||
|
ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(0, 0));
|
||||||
|
ImGui::PushStyleColor(ImGuiCol_ButtonActive, ImGui::GetStyleColorVec4(ImGuiCol_Text));
|
||||||
|
|
||||||
|
bool hidden = this->m_hiddenValues.contains(filterValue);
|
||||||
|
if (ImGuiExt::DimmedButton(hidden ? ICON_VS_EYE : ICON_VS_EYE_CLOSED)) {
|
||||||
|
if (hidden)
|
||||||
|
this->m_hiddenValues.erase(filterValue);
|
||||||
|
else
|
||||||
|
this->m_hiddenValues.insert(filterValue);
|
||||||
|
|
||||||
|
{
|
||||||
|
std::vector filterValues(this->m_hiddenValues.begin(), this->m_hiddenValues.end());
|
||||||
|
|
||||||
|
ContentRegistry::Settings::write("hex.builtin.setting.data_inspector", "hex.builtin.setting.data_inspector.hidden_rows", filterValues);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ImGui::PopStyleColor();
|
||||||
|
ImGui::PopStyleVar();
|
||||||
|
}
|
||||||
|
|
||||||
ImGui::PopID();
|
ImGui::PopID();
|
||||||
inspectorRowId++;
|
inspectorRowId++;
|
||||||
}
|
}
|
||||||
@ -274,6 +330,10 @@ namespace hex::plugin::builtin {
|
|||||||
ImGui::EndTable();
|
ImGui::EndTable();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (ImGuiExt::DimmedButton("hex.builtin.common.edit"_lang, ImVec2(ImGui::GetContentRegionAvail().x, 0))) {
|
||||||
|
this->m_tableEditingModeEnabled = !this->m_tableEditingModeEnabled;
|
||||||
|
}
|
||||||
|
|
||||||
ImGui::NewLine();
|
ImGui::NewLine();
|
||||||
ImGui::Separator();
|
ImGui::Separator();
|
||||||
ImGui::NewLine();
|
ImGui::NewLine();
|
||||||
|
Loading…
Reference in New Issue
Block a user