patterns: Added [[hex::spec_name]]
This commit is contained in:
parent
591435761b
commit
fdd2e1fcde
@ -191,5 +191,6 @@ namespace ImGui {
|
|||||||
|
|
||||||
bool DimmedButton(const char* label);
|
bool DimmedButton(const char* label);
|
||||||
bool DimmedIconButton(const char *symbol, ImVec4 color, ImVec2 size_arg = ImVec2(0, 0));
|
bool DimmedIconButton(const char *symbol, ImVec4 color, ImVec2 size_arg = ImVec2(0, 0));
|
||||||
|
bool DimmedIconToggle(const char *icon, bool *v);
|
||||||
|
|
||||||
}
|
}
|
@ -788,4 +788,24 @@ namespace ImGui {
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool DimmedIconToggle(const char *icon, bool *v) {
|
||||||
|
bool pushed = false;
|
||||||
|
bool toggled = false;
|
||||||
|
|
||||||
|
if (*v) {
|
||||||
|
ImGui::PushStyleColor(ImGuiCol_Border, ImGui::GetStyleColorVec4(ImGuiCol_ButtonActive));
|
||||||
|
pushed = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ImGui::DimmedIconButton(icon, ImGui::GetStyleColorVec4(ImGuiCol_Text))) {
|
||||||
|
*v = !*v;
|
||||||
|
toggled = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pushed)
|
||||||
|
ImGui::PopStyleColor();
|
||||||
|
|
||||||
|
return toggled;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
@ -10,6 +10,8 @@
|
|||||||
|
|
||||||
#include <hex/providers/provider.hpp>
|
#include <hex/providers/provider.hpp>
|
||||||
|
|
||||||
|
struct ImGuiTableSortSpecs;
|
||||||
|
|
||||||
namespace hex::plugin::builtin::ui {
|
namespace hex::plugin::builtin::ui {
|
||||||
|
|
||||||
class PatternDrawer : public pl::PatternVisitor {
|
class PatternDrawer : public pl::PatternVisitor {
|
||||||
@ -65,14 +67,17 @@ namespace hex::plugin::builtin::ui {
|
|||||||
void drawVisualizer(const std::map<std::string, ContentRegistry::PatternLanguage::impl::Visualizer> &visualizers, const std::vector<pl::core::Token::Literal> &arguments, pl::ptrn::Pattern &pattern, pl::ptrn::IIterable &iterable, bool reset);
|
void drawVisualizer(const std::map<std::string, ContentRegistry::PatternLanguage::impl::Visualizer> &visualizers, const std::vector<pl::core::Token::Literal> &arguments, pl::ptrn::Pattern &pattern, pl::ptrn::IIterable &iterable, bool reset);
|
||||||
void drawFavoriteColumn(const pl::ptrn::Pattern& pattern);
|
void drawFavoriteColumn(const pl::ptrn::Pattern& pattern);
|
||||||
|
|
||||||
|
bool beginPatternTable(const std::vector<std::shared_ptr<pl::ptrn::Pattern>> &patterns, std::vector<pl::ptrn::Pattern*> &sortedPatterns, float height);
|
||||||
bool createTreeNode(const pl::ptrn::Pattern& pattern, bool leaf = false);
|
bool createTreeNode(const pl::ptrn::Pattern& pattern, bool leaf = false);
|
||||||
void createDefaultEntry(pl::ptrn::Pattern &pattern);
|
void createDefaultEntry(pl::ptrn::Pattern &pattern);
|
||||||
void closeTreeNode(bool inlined);
|
void closeTreeNode(bool inlined);
|
||||||
|
|
||||||
|
bool sortPatterns(const ImGuiTableSortSpecs* sortSpecs, const pl::ptrn::Pattern * left, const pl::ptrn::Pattern * right) const;
|
||||||
bool isEditingPattern(const pl::ptrn::Pattern& pattern) const;
|
bool isEditingPattern(const pl::ptrn::Pattern& pattern) const;
|
||||||
void resetEditing();
|
void resetEditing();
|
||||||
bool matchesFilter(const std::vector<std::string> &filterPath, const std::vector<std::string> &patternPath, bool fullMatch);
|
bool matchesFilter(const std::vector<std::string> &filterPath, const std::vector<std::string> &patternPath, bool fullMatch);
|
||||||
void traversePatternTree(pl::ptrn::Pattern &pattern, std::vector<std::string> &patternPath, const std::function<void(pl::ptrn::Pattern&)> &callback);
|
void traversePatternTree(pl::ptrn::Pattern &pattern, std::vector<std::string> &patternPath, const std::function<void(pl::ptrn::Pattern&)> &callback);
|
||||||
|
std::string getDisplayName(const pl::ptrn::Pattern& pattern) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::map<const pl::ptrn::Pattern*, u64> m_displayEnd;
|
std::map<const pl::ptrn::Pattern*, u64> m_displayEnd;
|
||||||
@ -93,6 +98,8 @@ namespace hex::plugin::builtin::ui {
|
|||||||
std::map<std::vector<std::string>, std::unique_ptr<pl::ptrn::Pattern>> m_favorites;
|
std::map<std::vector<std::string>, std::unique_ptr<pl::ptrn::Pattern>> m_favorites;
|
||||||
bool m_showFavoriteStars = false;
|
bool m_showFavoriteStars = false;
|
||||||
bool m_favoritesUpdated = false;
|
bool m_favoritesUpdated = false;
|
||||||
|
bool m_showSpecName = false;
|
||||||
|
|
||||||
TaskHolder m_favoritesUpdateTask;
|
TaskHolder m_favoritesUpdateTask;
|
||||||
|
|
||||||
std::function<void(Region)> m_selectionCallback = [](Region) { };
|
std::function<void(Region)> m_selectionCallback = [](Region) { };
|
||||||
|
@ -374,6 +374,7 @@
|
|||||||
"hex.builtin.pattern_drawer.favorites": "Favorites",
|
"hex.builtin.pattern_drawer.favorites": "Favorites",
|
||||||
"hex.builtin.pattern_drawer.local": "Local",
|
"hex.builtin.pattern_drawer.local": "Local",
|
||||||
"hex.builtin.pattern_drawer.size": "Size",
|
"hex.builtin.pattern_drawer.size": "Size",
|
||||||
|
"hex.builtin.pattern_drawer.spec_name": "Display specification names",
|
||||||
"hex.builtin.pattern_drawer.start": "Start",
|
"hex.builtin.pattern_drawer.start": "Start",
|
||||||
"hex.builtin.pattern_drawer.tree_style.tree": "Tree",
|
"hex.builtin.pattern_drawer.tree_style.tree": "Tree",
|
||||||
"hex.builtin.pattern_drawer.tree_style.auto_expanded": "Auto Expanded Tree",
|
"hex.builtin.pattern_drawer.tree_style.auto_expanded": "Auto Expanded Tree",
|
||||||
|
@ -725,89 +725,29 @@ namespace hex::plugin::builtin::ui {
|
|||||||
ImGui::SetCursorPosX(ImGui::GetCursorPosX() + 2_scaled);
|
ImGui::SetCursorPosX(ImGui::GetCursorPosX() + 2_scaled);
|
||||||
|
|
||||||
// Upper/lower case hex
|
// Upper/lower case hex
|
||||||
{
|
ImGui::DimmedIconToggle(ICON_VS_CASE_SENSITIVE, &this->m_upperCaseHex);
|
||||||
bool pushed = false;
|
ImGui::InfoTooltip("hex.builtin.hex_editor.uppercase_hex"_lang);
|
||||||
|
|
||||||
if (this->m_upperCaseHex) {
|
|
||||||
ImGui::PushStyleColor(ImGuiCol_Border, ImGui::GetStyleColorVec4(ImGuiCol_ButtonActive));
|
|
||||||
pushed = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ImGui::DimmedIconButton(ICON_VS_CASE_SENSITIVE, ImGui::GetStyleColorVec4(ImGuiCol_Text))) {
|
|
||||||
this->m_upperCaseHex = !this->m_upperCaseHex;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pushed)
|
|
||||||
ImGui::PopStyleColor();
|
|
||||||
|
|
||||||
ImGui::InfoTooltip("hex.builtin.hex_editor.uppercase_hex"_lang);
|
|
||||||
}
|
|
||||||
|
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
|
|
||||||
// Grayed out zeros
|
// Grayed out zeros
|
||||||
{
|
ImGui::DimmedIconToggle(ICON_VS_LIGHTBULB, &this->m_grayOutZero);
|
||||||
bool pushed = false;
|
ImGui::InfoTooltip("hex.builtin.hex_editor.gray_out_zero"_lang);
|
||||||
|
|
||||||
if (this->m_grayOutZero) {
|
|
||||||
ImGui::PushStyleColor(ImGuiCol_Border, ImGui::GetStyleColorVec4(ImGuiCol_ButtonActive));
|
|
||||||
pushed = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ImGui::DimmedIconButton(ICON_VS_LIGHTBULB, ImGui::GetStyleColorVec4(ImGuiCol_Text))) {
|
|
||||||
this->m_grayOutZero = !this->m_grayOutZero;
|
|
||||||
EventManager::post<EventHighlightingChanged>();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pushed)
|
|
||||||
ImGui::PopStyleColor();
|
|
||||||
|
|
||||||
ImGui::InfoTooltip("hex.builtin.hex_editor.gray_out_zero"_lang);
|
|
||||||
}
|
|
||||||
|
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
|
|
||||||
// ASCII view
|
// ASCII view
|
||||||
{
|
ImGui::DimmedIconToggle(ICON_VS_SYMBOL_KEY, &this->m_showAscii);
|
||||||
bool pushed = false;
|
ImGui::InfoTooltip("hex.builtin.hex_editor.ascii_view"_lang);
|
||||||
|
|
||||||
if (this->m_showAscii) {
|
|
||||||
ImGui::PushStyleColor(ImGuiCol_Border, ImGui::GetStyleColorVec4(ImGuiCol_ButtonActive));
|
|
||||||
pushed = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ImGui::DimmedIconButton(ICON_VS_SYMBOL_KEY, ImGui::GetStyleColorVec4(ImGuiCol_Text))) {
|
|
||||||
this->m_showAscii = !this->m_showAscii;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pushed)
|
|
||||||
ImGui::PopStyleColor();
|
|
||||||
|
|
||||||
ImGui::InfoTooltip("hex.builtin.hex_editor.ascii_view"_lang);
|
|
||||||
}
|
|
||||||
|
|
||||||
ImGui::SameLine(0, 1_scaled);
|
ImGui::SameLine(0, 1_scaled);
|
||||||
|
|
||||||
// Custom encoding view
|
// Custom encoding view
|
||||||
{
|
ImGui::BeginDisabled(!this->m_currCustomEncoding.has_value());
|
||||||
bool pushed = false;
|
ImGui::DimmedIconToggle(ICON_VS_WHITESPACE, &this->m_showCustomEncoding);
|
||||||
|
ImGui::EndDisabled();
|
||||||
|
|
||||||
if (this->m_showCustomEncoding) {
|
ImGui::InfoTooltip("hex.builtin.hex_editor.custom_encoding_view"_lang);
|
||||||
ImGui::PushStyleColor(ImGuiCol_Border, ImGui::GetStyleColorVec4(ImGuiCol_ButtonActive));
|
|
||||||
pushed = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
ImGui::BeginDisabled(!this->m_currCustomEncoding.has_value());
|
|
||||||
if (ImGui::DimmedIconButton(ICON_VS_WHITESPACE, ImGui::GetStyleColorVec4(ImGuiCol_Text))) {
|
|
||||||
this->m_showCustomEncoding = !this->m_showCustomEncoding;
|
|
||||||
}
|
|
||||||
ImGui::EndDisabled();
|
|
||||||
|
|
||||||
if (pushed)
|
|
||||||
ImGui::PopStyleColor();
|
|
||||||
|
|
||||||
ImGui::InfoTooltip("hex.builtin.hex_editor.custom_encoding_view"_lang);
|
|
||||||
}
|
|
||||||
|
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
|
|
||||||
|
@ -285,12 +285,19 @@ namespace hex::plugin::builtin::ui {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::string PatternDrawer::getDisplayName(const pl::ptrn::Pattern& pattern) const {
|
||||||
|
if (this->m_showSpecName && pattern.hasAttribute("hex::spec_name"))
|
||||||
|
return pattern.getAttributeArguments("hex::spec_name")[0].toString(true);
|
||||||
|
else
|
||||||
|
return pattern.getDisplayName();
|
||||||
|
}
|
||||||
|
|
||||||
bool PatternDrawer::createTreeNode(const pl::ptrn::Pattern& pattern, bool leaf) {
|
bool PatternDrawer::createTreeNode(const pl::ptrn::Pattern& pattern, bool leaf) {
|
||||||
drawFavoriteColumn(pattern);
|
drawFavoriteColumn(pattern);
|
||||||
|
|
||||||
if (pattern.isSealed() || leaf) {
|
if (pattern.isSealed() || leaf) {
|
||||||
ImGui::Indent();
|
ImGui::Indent();
|
||||||
highlightWhenSelected(pattern, [&]{ ImGui::TextUnformatted(pattern.getDisplayName().c_str()); });
|
highlightWhenSelected(pattern, [&]{ ImGui::TextUnformatted(this->getDisplayName(pattern).c_str()); });
|
||||||
ImGui::Unindent();
|
ImGui::Unindent();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -300,11 +307,11 @@ namespace hex::plugin::builtin::ui {
|
|||||||
using enum TreeStyle;
|
using enum TreeStyle;
|
||||||
default:
|
default:
|
||||||
case Default:
|
case Default:
|
||||||
return ImGui::TreeNodeEx(pattern.getDisplayName().c_str(), ImGuiTreeNodeFlags_SpanFullWidth);
|
return ImGui::TreeNodeEx(this->getDisplayName(pattern).c_str(), ImGuiTreeNodeFlags_SpanFullWidth);
|
||||||
case AutoExpanded:
|
case AutoExpanded:
|
||||||
return ImGui::TreeNodeEx(pattern.getDisplayName().c_str(), ImGuiTreeNodeFlags_SpanFullWidth | ImGuiTreeNodeFlags_DefaultOpen);
|
return ImGui::TreeNodeEx(this->getDisplayName(pattern).c_str(), ImGuiTreeNodeFlags_SpanFullWidth | ImGuiTreeNodeFlags_DefaultOpen);
|
||||||
case Flattened:
|
case Flattened:
|
||||||
return ImGui::TreeNodeEx(pattern.getDisplayName().c_str(), ImGuiTreeNodeFlags_SpanFullWidth | ImGuiTreeNodeFlags_Leaf | ImGuiTreeNodeFlags_NoTreePushOnOpen);
|
return ImGui::TreeNodeEx(this->getDisplayName(pattern).c_str(), ImGuiTreeNodeFlags_SpanFullWidth | ImGuiTreeNodeFlags_Leaf | ImGuiTreeNodeFlags_NoTreePushOnOpen);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -847,7 +854,7 @@ namespace hex::plugin::builtin::ui {
|
|||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
|
|
||||||
chunkOpen = highlightWhenSelected(startOffset, ((endOffset + endSize) - startOffset) - 1, [&]{
|
chunkOpen = highlightWhenSelected(startOffset, ((endOffset + endSize) - startOffset) - 1, [&]{
|
||||||
return ImGui::TreeNodeEx(hex::format("{0}[{1} ... {2}]", this->m_treeStyle == TreeStyle::Flattened ? pattern.getDisplayName().c_str() : "", i, endIndex - 1).c_str(), ImGuiTreeNodeFlags_SpanFullWidth);
|
return ImGui::TreeNodeEx(hex::format("{0}[{1} ... {2}]", this->m_treeStyle == TreeStyle::Flattened ? this->getDisplayName(pattern).c_str() : "", i, endIndex - 1).c_str(), ImGuiTreeNodeFlags_SpanFullWidth);
|
||||||
});
|
});
|
||||||
|
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
@ -900,12 +907,12 @@ namespace hex::plugin::builtin::ui {
|
|||||||
return value->second;
|
return value->second;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool sortPatterns(const ImGuiTableSortSpecs* sortSpecs, const pl::ptrn::Pattern * left, const pl::ptrn::Pattern * right) {
|
bool PatternDrawer::sortPatterns(const ImGuiTableSortSpecs* sortSpecs, const pl::ptrn::Pattern * left, const pl::ptrn::Pattern * right) const {
|
||||||
if (sortSpecs->Specs->ColumnUserID == ImGui::GetID("name")) {
|
if (sortSpecs->Specs->ColumnUserID == ImGui::GetID("name")) {
|
||||||
if (sortSpecs->Specs->SortDirection == ImGuiSortDirection_Ascending)
|
if (sortSpecs->Specs->SortDirection == ImGuiSortDirection_Ascending)
|
||||||
return left->getDisplayName() < right->getDisplayName();
|
return this->getDisplayName(*left) < this->getDisplayName(*right);
|
||||||
else
|
else
|
||||||
return left->getDisplayName() > right->getDisplayName();
|
return this->getDisplayName(*left) > this->getDisplayName(*right);
|
||||||
} else if (sortSpecs->Specs->ColumnUserID == ImGui::GetID("start")) {
|
} else if (sortSpecs->Specs->ColumnUserID == ImGui::GetID("start")) {
|
||||||
if (sortSpecs->Specs->SortDirection == ImGuiSortDirection_Ascending)
|
if (sortSpecs->Specs->SortDirection == ImGuiSortDirection_Ascending)
|
||||||
return left->getOffsetForSorting() < right->getOffsetForSorting();
|
return left->getOffsetForSorting() < right->getOffsetForSorting();
|
||||||
@ -941,7 +948,7 @@ namespace hex::plugin::builtin::ui {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool beginPatternTable(const std::vector<std::shared_ptr<pl::ptrn::Pattern>> &patterns, std::vector<pl::ptrn::Pattern*> &sortedPatterns, float height) {
|
bool PatternDrawer::beginPatternTable(const std::vector<std::shared_ptr<pl::ptrn::Pattern>> &patterns, std::vector<pl::ptrn::Pattern*> &sortedPatterns, float height) {
|
||||||
if (ImGui::BeginTable("##Patterntable", 8, ImGuiTableFlags_Borders | ImGuiTableFlags_Resizable | ImGuiTableFlags_Sortable | ImGuiTableFlags_Hideable | ImGuiTableFlags_Reorderable | ImGuiTableFlags_RowBg | ImGuiTableFlags_ScrollY, ImVec2(0, height))) {
|
if (ImGui::BeginTable("##Patterntable", 8, ImGuiTableFlags_Borders | ImGuiTableFlags_Resizable | ImGuiTableFlags_Sortable | ImGuiTableFlags_Hideable | ImGuiTableFlags_Reorderable | ImGuiTableFlags_RowBg | ImGuiTableFlags_ScrollY, ImVec2(0, height))) {
|
||||||
ImGui::TableSetupScrollFreeze(0, 1);
|
ImGui::TableSetupScrollFreeze(0, 1);
|
||||||
ImGui::TableSetupColumn("##favorite", ImGuiTableColumnFlags_NoSort | ImGuiTableColumnFlags_WidthFixed | ImGuiTableColumnFlags_NoResize | ImGuiTableColumnFlags_NoReorder | ImGuiTableColumnFlags_NoHide | ImGuiTableColumnFlags_IndentDisable, ImGui::GetTextLineHeight(), ImGui::GetID("favorite"));
|
ImGui::TableSetupColumn("##favorite", ImGuiTableColumnFlags_NoSort | ImGuiTableColumnFlags_WidthFixed | ImGuiTableColumnFlags_NoResize | ImGuiTableColumnFlags_NoReorder | ImGuiTableColumnFlags_NoHide | ImGuiTableColumnFlags_IndentDisable, ImGui::GetTextLineHeight(), ImGui::GetID("favorite"));
|
||||||
@ -964,13 +971,13 @@ namespace hex::plugin::builtin::ui {
|
|||||||
return pattern.get();
|
return pattern.get();
|
||||||
});
|
});
|
||||||
|
|
||||||
std::sort(sortedPatterns.begin(), sortedPatterns.end(), [&sortSpecs](pl::ptrn::Pattern *left, pl::ptrn::Pattern *right) -> bool {
|
std::sort(sortedPatterns.begin(), sortedPatterns.end(), [this, &sortSpecs](pl::ptrn::Pattern *left, pl::ptrn::Pattern *right) -> bool {
|
||||||
return sortPatterns(sortSpecs, left, right);
|
return this->sortPatterns(sortSpecs, left, right);
|
||||||
});
|
});
|
||||||
|
|
||||||
for (auto &pattern : sortedPatterns)
|
for (auto &pattern : sortedPatterns)
|
||||||
pattern->sort([&sortSpecs](const pl::ptrn::Pattern *left, const pl::ptrn::Pattern *right){
|
pattern->sort([this, &sortSpecs](const pl::ptrn::Pattern *left, const pl::ptrn::Pattern *right){
|
||||||
return sortPatterns(sortSpecs, left, right);
|
return this->sortPatterns(sortSpecs, left, right);
|
||||||
});
|
});
|
||||||
|
|
||||||
sortSpecs->SpecsDirty = false;
|
sortSpecs->SpecsDirty = false;
|
||||||
@ -1016,7 +1023,7 @@ namespace hex::plugin::builtin::ui {
|
|||||||
this->resetEditing();
|
this->resetEditing();
|
||||||
}
|
}
|
||||||
|
|
||||||
ImGui::PushItemWidth(ImGui::GetContentRegionAvail().x - ImGui::GetTextLineHeightWithSpacing() * 7.5);
|
ImGui::PushItemWidth(ImGui::GetContentRegionAvail().x - ImGui::GetTextLineHeightWithSpacing() * 9.5);
|
||||||
if (ImGui::InputTextIcon("##Search", ICON_VS_FILTER, this->m_filterText)) {
|
if (ImGui::InputTextIcon("##Search", ICON_VS_FILTER, this->m_filterText)) {
|
||||||
this->m_filter = parseRValueFilter(this->m_filterText);
|
this->m_filter = parseRValueFilter(this->m_filterText);
|
||||||
}
|
}
|
||||||
@ -1024,6 +1031,11 @@ namespace hex::plugin::builtin::ui {
|
|||||||
|
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
|
|
||||||
|
ImGui::DimmedIconToggle(ICON_VS_BOOK, &this->m_showSpecName);
|
||||||
|
ImGui::InfoTooltip("hex.builtin.pattern_drawer.spec_name"_lang);
|
||||||
|
|
||||||
|
ImGui::SameLine();
|
||||||
|
|
||||||
treeStyleButton(ICON_VS_SYMBOL_KEYWORD, TreeStyle::Default, "hex.builtin.pattern_drawer.tree_style.tree"_lang);
|
treeStyleButton(ICON_VS_SYMBOL_KEYWORD, TreeStyle::Default, "hex.builtin.pattern_drawer.tree_style.tree"_lang);
|
||||||
ImGui::SameLine(0, 0);
|
ImGui::SameLine(0, 0);
|
||||||
treeStyleButton(ICON_VS_LIST_TREE, TreeStyle::AutoExpanded, "hex.builtin.pattern_drawer.tree_style.auto_expanded"_lang);
|
treeStyleButton(ICON_VS_LIST_TREE, TreeStyle::AutoExpanded, "hex.builtin.pattern_drawer.tree_style.auto_expanded"_lang);
|
||||||
|
Loading…
Reference in New Issue
Block a user