diff --git a/source/views/view_strings.cpp b/source/views/view_strings.cpp index f4676f57c..627383452 100644 --- a/source/views/view_strings.cpp +++ b/source/views/view_strings.cpp @@ -24,9 +24,6 @@ namespace hex { if (!this->m_windowOpen) return; - if (this->m_dataProvider == nullptr || !this->m_dataProvider->isReadable()) - return; - if (this->m_shouldInvalidate) { this->m_shouldInvalidate = false; @@ -60,72 +57,86 @@ namespace hex { } } + if (ImGui::Begin("Strings", &this->m_windowOpen)) { - if (ImGui::InputInt("Minimum length", &this->m_minimumLength, 1, 0)) - this->m_shouldInvalidate = true; + if (this->m_dataProvider != nullptr && this->m_dataProvider->isReadable()) { + if (ImGui::InputInt("Minimum length", &this->m_minimumLength, 1, 0)) + this->m_shouldInvalidate = true; - ImGui::InputText("Filter", this->m_filter, 0xFFFF); + ImGui::InputText("Filter", this->m_filter, 0xFFFF); - ImGui::Separator(); - ImGui::NewLine(); + ImGui::Separator(); + ImGui::NewLine(); - ImGui::BeginChild("##scrolling", ImVec2(0, 0), false, ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoNav); + ImGui::BeginChild("##scrolling", ImVec2(0, 0), false, ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoNav); - if (ImGui::BeginTable("##strings", 3, ImGuiTableFlags_Borders | ImGuiTableFlags_Resizable | ImGuiTableFlags_Sortable | ImGuiTableFlags_Reorderable | ImGuiTableFlags_RowBg)) { - ImGui::TableSetupColumn("Position", 0, -1, ImGui::GetID("position")); - ImGui::TableSetupColumn("Size", 0, -1, ImGui::GetID("size")); - ImGui::TableSetupColumn("String", 0, -1, ImGui::GetID("string")); + if (ImGui::BeginTable("##strings", 3, + ImGuiTableFlags_Borders | ImGuiTableFlags_Resizable | ImGuiTableFlags_Sortable | + ImGuiTableFlags_Reorderable | ImGuiTableFlags_RowBg)) { + ImGui::TableSetupColumn("Position", 0, -1, ImGui::GetID("position")); + ImGui::TableSetupColumn("Size", 0, -1, ImGui::GetID("size")); + ImGui::TableSetupColumn("String", 0, -1, ImGui::GetID("string")); - auto sortSpecs = ImGui::TableGetSortSpecs(); + auto sortSpecs = ImGui::TableGetSortSpecs(); - if (sortSpecs->SpecsDirty) { - std::sort(this->m_foundStrings.begin(), this->m_foundStrings.end(), [this, &sortSpecs](FoundString &left, FoundString&right) -> bool { - if (sortSpecs->Specs->ColumnUserID == ImGui::GetID("position")) { - if (sortSpecs->Specs->SortDirection == ImGuiSortDirection_Ascending) - return left.offset > right.offset; - else - return left.offset < right.offset; - } - else if (sortSpecs->Specs->ColumnUserID == ImGui::GetID("size")) { - if (sortSpecs->Specs->SortDirection == ImGuiSortDirection_Ascending) - return left.size > right.size; - else - return left.size < right.size; - } - else if (sortSpecs->Specs->ColumnUserID == ImGui::GetID("string")) { - if (sortSpecs->Specs->SortDirection == ImGuiSortDirection_Ascending) - return left.string > right.string; - else - return left.string < right.string; - } + if (sortSpecs->SpecsDirty) { + std::sort(this->m_foundStrings.begin(), this->m_foundStrings.end(), + [this, &sortSpecs](FoundString &left, FoundString &right) -> bool { + if (sortSpecs->Specs->ColumnUserID == ImGui::GetID("position")) { + if (sortSpecs->Specs->SortDirection == ImGuiSortDirection_Ascending) + return left.offset > right.offset; + else + return left.offset < right.offset; + } else if (sortSpecs->Specs->ColumnUserID == ImGui::GetID("size")) { + if (sortSpecs->Specs->SortDirection == ImGuiSortDirection_Ascending) + return left.size > right.size; + else + return left.size < right.size; + } else if (sortSpecs->Specs->ColumnUserID == ImGui::GetID("string")) { + if (sortSpecs->Specs->SortDirection == ImGuiSortDirection_Ascending) + return left.string > right.string; + else + return left.string < right.string; + } - return false; - }); + return false; + }); - sortSpecs->SpecsDirty = false; + sortSpecs->SpecsDirty = false; + } + + ImGui::TableHeadersRow(); + u32 rowCount = 0; + + ImGuiListClipper clipper; + clipper.Begin(this->m_foundStrings.size(), 14); + clipper.Step(); + + for (u64 i = clipper.DisplayStart; i < clipper.DisplayEnd; i++) { + auto &foundString = this->m_foundStrings[i]; + + if (strlen(this->m_filter) != 0 && foundString.string.find(this->m_filter) == std::string::npos) + continue; + + ImGui::TableNextRow(ImGuiTableRowFlags_Headers); + ImGui::TableNextColumn(); + ImGui::Text("0x%08lx:0x%08lx", foundString.offset, foundString.offset + foundString.size); + ImGui::TableNextColumn(); + ImGui::Text("%08lx", foundString.size); + ImGui::TableNextColumn(); + ImGui::Text("%s", foundString.string.c_str()); + ImGui::TableSetBgColor(ImGuiTableBgTarget_RowBg0, + ((rowCount % 2) == 0) ? 0xFF101010 : 0xFF303030); + rowCount++; + } + clipper.Step(); + clipper.End(); + + ImGui::EndTable(); } - ImGui::TableHeadersRow(); - u32 rowCount = 0; - for (auto &foundString : this->m_foundStrings) { - if (strlen(this->m_filter) != 0 && foundString.string.find(this->m_filter) == std::string::npos) - continue; - - ImGui::TableNextRow(ImGuiTableRowFlags_Headers); - ImGui::TableNextColumn(); - ImGui::Text("0x%08lx:0x%08lx", foundString.offset, foundString.offset + foundString.size); - ImGui::TableNextColumn(); - ImGui::Text("%08lx", foundString.size); - ImGui::TableNextColumn(); - ImGui::Text("%s", foundString.string.c_str()); - ImGui::TableSetBgColor(ImGuiTableBgTarget_RowBg0, ((rowCount % 2) == 0) ? 0xFF101010 : 0xFF303030); - rowCount++; - } - - ImGui::EndTable(); + ImGui::EndChild(); } - - ImGui::EndChild(); } ImGui::End(); }