Added ImGui extension to create single- and multiline formatted selec… (#1249)
(Partial) implementation of #1245 with additional functionality to supersede PR #1240.
This commit is contained in:
parent
285b79f31e
commit
d2e6d8e4d9
@ -10,6 +10,8 @@
|
|||||||
|
|
||||||
#include <hex/helpers/fmt.hpp>
|
#include <hex/helpers/fmt.hpp>
|
||||||
|
|
||||||
|
#include <wolv/utils/string.hpp>
|
||||||
|
|
||||||
enum ImGuiCustomCol {
|
enum ImGuiCustomCol {
|
||||||
ImGuiCustomCol_DescButton,
|
ImGuiCustomCol_DescButton,
|
||||||
ImGuiCustomCol_DescButtonHovered,
|
ImGuiCustomCol_DescButtonHovered,
|
||||||
@ -141,6 +143,24 @@ namespace ImGui {
|
|||||||
ImGui::TextUnformatted(hex::format(fmt, std::forward<decltype(args)>(args)...).c_str());
|
ImGui::TextUnformatted(hex::format(fmt, std::forward<decltype(args)>(args)...).c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline void TextFormattedSelectable(const std::string &fmt, auto &&...args) {
|
||||||
|
auto text = hex::format(fmt, std::forward<decltype(args)>(args)...);
|
||||||
|
|
||||||
|
ImGui::PushID(text.c_str());
|
||||||
|
|
||||||
|
ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2());
|
||||||
|
ImGui::PushStyleColor(ImGuiCol_FrameBg, ImVec4());
|
||||||
|
|
||||||
|
ImGui::PushItemWidth(-FLT_MIN);
|
||||||
|
ImGui::InputText("##", const_cast<char *>(text.c_str()), text.size(), ImGuiInputTextFlags_ReadOnly);
|
||||||
|
ImGui::PopItemWidth();
|
||||||
|
|
||||||
|
ImGui::PopStyleColor();
|
||||||
|
ImGui::PopStyleVar();
|
||||||
|
|
||||||
|
ImGui::PopID();
|
||||||
|
}
|
||||||
|
|
||||||
inline void TextFormattedColored(ImColor color, const std::string &fmt, auto &&...args) {
|
inline void TextFormattedColored(ImColor color, const std::string &fmt, auto &&...args) {
|
||||||
ImGui::TextColored(color, "%s", hex::format(fmt, std::forward<decltype(args)>(args)...).c_str());
|
ImGui::TextColored(color, "%s", hex::format(fmt, std::forward<decltype(args)>(args)...).c_str());
|
||||||
}
|
}
|
||||||
@ -153,6 +173,35 @@ namespace ImGui {
|
|||||||
ImGui::TextWrapped("%s", hex::format(fmt, std::forward<decltype(args)>(args)...).c_str());
|
ImGui::TextWrapped("%s", hex::format(fmt, std::forward<decltype(args)>(args)...).c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline void TextFormattedWrappedSelectable(const std::string &fmt, auto &&...args) {
|
||||||
|
//Manually wrap text, using the letter M (generally the widest character in non-monospaced fonts) to calculate the character width to use.
|
||||||
|
auto text = wolv::util::wrapMonospacedString(
|
||||||
|
hex::format(fmt, std::forward<decltype(args)>(args)...),
|
||||||
|
ImGui::CalcTextSize("M").x,
|
||||||
|
ImGui::GetContentRegionAvail().x - ImGui::GetStyle().ScrollbarSize - ImGui::GetStyle().FrameBorderSize
|
||||||
|
);
|
||||||
|
|
||||||
|
ImGui::PushID(text.c_str());
|
||||||
|
|
||||||
|
ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2());
|
||||||
|
ImGui::PushStyleColor(ImGuiCol_FrameBg, ImVec4());
|
||||||
|
|
||||||
|
ImGui::PushItemWidth(-FLT_MIN);
|
||||||
|
ImGui::InputTextMultiline(
|
||||||
|
"##",
|
||||||
|
const_cast<char *>(text.c_str()),
|
||||||
|
text.size(),
|
||||||
|
ImVec2(0, -FLT_MIN),
|
||||||
|
ImGuiInputTextFlags_ReadOnly | ImGuiInputTextFlags_NoHorizontalScroll
|
||||||
|
);
|
||||||
|
ImGui::PopItemWidth();
|
||||||
|
|
||||||
|
ImGui::PopStyleColor();
|
||||||
|
ImGui::PopStyleVar();
|
||||||
|
|
||||||
|
ImGui::PopID();
|
||||||
|
}
|
||||||
|
|
||||||
inline void TextFormattedCentered(const std::string &fmt, auto &&...args) {
|
inline void TextFormattedCentered(const std::string &fmt, auto &&...args) {
|
||||||
auto text = hex::format(fmt, std::forward<decltype(args)>(args)...);
|
auto text = hex::format(fmt, std::forward<decltype(args)>(args)...);
|
||||||
auto availableSpace = ImGui::GetContentRegionAvail();
|
auto availableSpace = ImGui::GetContentRegionAvail();
|
||||||
|
@ -694,7 +694,12 @@ namespace hex::plugin::builtin::ui {
|
|||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
{
|
{
|
||||||
auto pageAddress = this->m_provider->getCurrentPageAddress();
|
auto pageAddress = this->m_provider->getCurrentPageAddress();
|
||||||
ImGui::TextFormatted("{0}: 0x{1:08X} - 0x{2:08X} ({1} - {2})", "hex.builtin.hex_editor.region"_lang, pageAddress, pageAddress + this->m_provider->getSize() - 1);
|
ImGui::TextFormatted("{}:", "hex.builtin.hex_editor.region"_lang);
|
||||||
|
ImGui::SameLine();
|
||||||
|
ImGui::TextFormattedSelectable("0x{0:08X} - 0x{1:08X} ({0} - {1})",
|
||||||
|
pageAddress,
|
||||||
|
pageAddress + this->m_provider->getSize() - 1
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
ImGui::TableNextRow();
|
ImGui::TableNextRow();
|
||||||
@ -715,13 +720,17 @@ namespace hex::plugin::builtin::ui {
|
|||||||
else
|
else
|
||||||
value = std::string("hex.builtin.hex_editor.selection.none"_lang);
|
value = std::string("hex.builtin.hex_editor.selection.none"_lang);
|
||||||
|
|
||||||
ImGui::TextFormatted("{0}: {1}", "hex.builtin.hex_editor.selection"_lang, value);
|
ImGui::TextFormatted("{}:", "hex.builtin.hex_editor.selection"_lang);
|
||||||
|
ImGui::SameLine();
|
||||||
|
ImGui::TextFormattedSelectable(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Loaded data size
|
// Loaded data size
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
{
|
{
|
||||||
ImGui::TextFormatted("{0}: 0x{1:08X} (0x{2:X} | {3})", "hex.builtin.hex_editor.data_size"_lang,
|
ImGui::TextFormatted("{}:", "hex.builtin.hex_editor.data_size"_lang);
|
||||||
|
ImGui::SameLine();
|
||||||
|
ImGui::TextFormattedSelectable("0x{0:08X} (0x{1:X} | {2})",
|
||||||
this->m_provider->getActualSize(),
|
this->m_provider->getActualSize(),
|
||||||
this->m_provider->getActualSize(),
|
this->m_provider->getActualSize(),
|
||||||
hex::toByteString(this->m_provider->getActualSize())
|
hex::toByteString(this->m_provider->getActualSize())
|
||||||
|
Loading…
x
Reference in New Issue
Block a user