#pragma once #include #include #include #include #include namespace hex::plugin::hashes { class ViewHashes : public View::Window { public: explicit ViewHashes(); ~ViewHashes() override; void drawContent() override; void drawHelpText() override; class Function { public: explicit Function(ContentRegistry::Hashes::Hash::Function hashFunction) : m_hashFunction(std::move(hashFunction)) { } void update(const Region ®ion, prv::Provider *provider) { m_region = { region, provider }; } void update(std::vector data) { m_data = std::move(data); } std::vector get() { if (!m_task.isRunning()) { if (m_region.has_value()) { m_lastResult.clear(); m_task = TaskManager::createBackgroundTask("Updating hash", [this, region = m_region]() { m_lastResult = m_hashFunction.get(region->getRegion(), region->getProvider()); }); m_region.reset(); } else if (!m_data.empty()) { m_lastResult.clear(); m_task = TaskManager::createBackgroundTask("Updating hash", [this, data = std::move(m_data)]() { prv::MemoryProvider provider({ data.begin(), data.end() }); m_lastResult = m_hashFunction.get(Region { 0x00, provider.getActualSize() }, &provider); }); m_region.reset(); m_data = {}; } } return m_lastResult; } bool isCalculating() const { return m_task.isRunning(); } const ContentRegistry::Hashes::Hash::Function& getFunction() const { return m_hashFunction; } private: std::vector m_data; std::optional m_region; ContentRegistry::Hashes::Hash::Function m_hashFunction; std::vector m_lastResult; TaskHolder m_task; }; private: bool importHashes(prv::Provider *provider, const nlohmann::json &json); bool exportHashes(prv::Provider *provider, nlohmann::json &json); void drawAddHashPopup(); private: ContentRegistry::Hashes::Hash *m_selectedHash = nullptr; std::string m_newHashName; PerProvider> m_hashFunctions; }; }