sys: Replaced Search view with a generic Find view

Closes #551
This commit is contained in:
WerWolv
2022-07-29 13:59:57 +02:00
parent 1b68ea4eba
commit b7324913e9
16 changed files with 778 additions and 428 deletions

View File

@@ -0,0 +1,67 @@
#pragma once
#include <hex.hpp>
#include <imgui.h>
#include <hex/ui/view.hpp>
#include <atomic>
#include <vector>
namespace hex::plugin::builtin {
class ViewFind : public View {
public:
ViewFind();
~ViewFind() override = default;
void drawContent() override;
private:
struct SearchSettings {
int range = 0;
enum class Mode : int {
Strings,
Sequence,
Regex
} mode = Mode::Strings;
struct Strings {
int minLength = 5;
enum class Type : int { ASCII = 0, UTF16LE = 1, UTF16BE = 2 } type = Type::ASCII;
bool nullTermination = false;
bool m_lowerCaseLetters = true;
bool m_upperCaseLetters = true;
bool m_numbers = true;
bool m_underscores = true;
bool m_symbols = true;
bool m_spaces = true;
bool m_lineFeeds = false;
} strings;
struct Bytes {
std::string sequence;
} bytes;
struct Regex {
std::string pattern;
} regex;
} m_searchSettings, m_decodeSettings;
std::map<prv::Provider*, std::vector<Region>> m_foundRegions, m_sortedRegions;
std::atomic<bool> m_searchRunning;
bool m_settingsValid = false;
private:
static std::vector<Region> searchStrings(prv::Provider *provider, Region searchRegion, SearchSettings::Strings settings);
static std::vector<Region> searchSequence(prv::Provider *provider, Region searchRegion, SearchSettings::Bytes settings);
static std::vector<Region> searchRegex(prv::Provider *provider, Region searchRegion, SearchSettings::Regex settings);
void runSearch();
std::string decodeValue(prv::Provider *provider, Region region);
};
}

View File

@@ -1,39 +0,0 @@
#pragma once
#include <hex/ui/view.hpp>
#include <cstdio>
#include <string>
namespace hex::plugin::builtin {
struct FoundString {
u64 offset;
size_t size;
};
class ViewStrings : public View {
public:
explicit ViewStrings();
~ViewStrings() override;
void drawContent() override;
private:
bool m_searching = false;
bool m_regex = false;
bool m_pattern_parsed = true;
std::vector<FoundString> m_foundStrings;
std::vector<size_t> m_filterIndices;
int m_minimumLength = 5;
std::string m_filter;
std::string m_selectedString;
std::string m_demangledName;
void searchStrings();
void createStringContextMenu(const FoundString &foundString);
};
}