Refactored hex viewer in preparation for snapshot viewer and diffs.

Before this refactor, the hex viewer was consuming far too much RAM and wasn't
scaling very well. It can now handle data inspection up to 5MB (way more than we need), comfortably
This commit is contained in:
Nav
2023-02-27 00:14:29 +00:00
parent f37f8f301a
commit 858287a7d0
32 changed files with 2055 additions and 1729 deletions

View File

@@ -1,45 +0,0 @@
#include "ConstructHexViewerByteItems.hpp"
#include <QMetaType>
namespace Bloom
{
ConstructHexViewerByteItems::ConstructHexViewerByteItems(
const Targets::TargetMemoryDescriptor& memoryDescriptor,
std::optional<Targets::TargetStackPointer>& currentStackPointer,
Widgets::ByteItem** hoveredByteItem,
std::set<Widgets::ByteItem*>& highlightedByteItems,
Widgets::HexViewerWidgetSettings& settings
)
: memoryDescriptor(memoryDescriptor)
, currentStackPointer(currentStackPointer)
, hoveredByteItem(hoveredByteItem)
, highlightedByteItems(highlightedByteItems)
, settings(settings)
{
qRegisterMetaType<std::map<Targets::TargetMemoryAddress, Widgets::ByteItem*>>();
}
void ConstructHexViewerByteItems::run(Services::TargetControllerService&) {
const auto memorySize = this->memoryDescriptor.size();
const auto startAddress = this->memoryDescriptor.addressRange.startAddress;
for (Targets::TargetMemorySize i = 0; i < memorySize; i++) {
const auto address = startAddress + i;
this->byteItemsByAddress.emplace(
address,
new Widgets::ByteItem(
i,
address,
this->currentStackPointer,
this->hoveredByteItem,
this->highlightedByteItems,
settings
)
);
}
emit this->byteItems(std::move(this->byteItemsByAddress));
}
}

View File

@@ -1,51 +0,0 @@
#pragma once
#include <optional>
#include <set>
#include "InsightWorkerTask.hpp"
#include "src/Targets/TargetMemory.hpp"
#include "src/Insight/UserInterfaces/InsightWindow/Widgets/TargetMemoryInspectionPane/HexViewerWidget/HexViewerWidgetSettings.hpp"
#include "src/Insight/UserInterfaces/InsightWindow/Widgets/TargetMemoryInspectionPane/FocusedMemoryRegion.hpp"
#include "src/Insight/UserInterfaces/InsightWindow/Widgets/TargetMemoryInspectionPane/ExcludedMemoryRegion.hpp"
#include "src/Insight/UserInterfaces/InsightWindow/Widgets/TargetMemoryInspectionPane/HexViewerWidget/ByteItemGraphicsScene.hpp"
#include "src/Insight/UserInterfaces/InsightWindow/Widgets/TargetMemoryInspectionPane/HexViewerWidget/ByteItem.hpp"
#include "src/Insight/UserInterfaces/InsightWindow/Widgets/Label.hpp"
namespace Bloom
{
class ConstructHexViewerByteItems: public InsightWorkerTask
{
Q_OBJECT
public:
ConstructHexViewerByteItems(
const Targets::TargetMemoryDescriptor& memoryDescriptor,
std::optional<Targets::TargetStackPointer>& currentStackPointer,
Widgets::ByteItem** hoveredByteItem,
std::set<Widgets::ByteItem*>& highlightedByteItems,
Widgets::HexViewerWidgetSettings& settings
);
TaskGroups getTaskGroups() const override {
return TaskGroups();
};
signals:
void sceneCreated(Widgets::ByteItemGraphicsScene* scene);
void byteItems(std::map<Targets::TargetMemoryAddress, Widgets::ByteItem*> byteItemsByAddress);
protected:
void run(Services::TargetControllerService&) override;
private:
std::map<Targets::TargetMemoryAddress, Widgets::ByteItem*> byteItemsByAddress;
const Targets::TargetMemoryDescriptor& memoryDescriptor;
std::optional<Targets::TargetStackPointer>& currentStackPointer;
Widgets::ByteItem** hoveredByteItem;
std::set<Widgets::ByteItem*>& highlightedByteItems;
Widgets::HexViewerWidgetSettings& settings;
};
}

View File

@@ -0,0 +1,19 @@
#include "ConstructHexViewerTopLevelGroupItem.hpp"
namespace Bloom
{
ConstructHexViewerTopLevelGroupItem::ConstructHexViewerTopLevelGroupItem(
const std::vector<FocusedMemoryRegion>& focusedMemoryRegions,
const Widgets::HexViewerSharedState& hexViewerState
)
: focusedMemoryRegions(focusedMemoryRegions)
, hexViewerState(hexViewerState)
{}
void ConstructHexViewerTopLevelGroupItem::run(Services::TargetControllerService&) {
auto* item = new Widgets::TopLevelGroupItem(this->focusedMemoryRegions, this->hexViewerState);
item->rebuildItemHierarchy();
emit this->topLevelGroupItem(item);
}
}

View File

@@ -0,0 +1,37 @@
#pragma once
#include <memory>
#include "InsightWorkerTask.hpp"
#include "src/Targets/TargetMemory.hpp"
#include "src/Insight/UserInterfaces/InsightWindow/Widgets/TargetMemoryInspectionPane/HexViewerWidget/TopLevelGroupItem.hpp"
#include "src/Insight/UserInterfaces/InsightWindow/Widgets/TargetMemoryInspectionPane/HexViewerWidget/HexViewerSharedState.hpp"
namespace Bloom
{
class ConstructHexViewerTopLevelGroupItem: public InsightWorkerTask
{
Q_OBJECT
public:
ConstructHexViewerTopLevelGroupItem(
const std::vector<FocusedMemoryRegion>& focusedMemoryRegions,
const Widgets::HexViewerSharedState& hexViewerState
);
TaskGroups getTaskGroups() const override {
return TaskGroups();
};
signals:
void topLevelGroupItem(Widgets::TopLevelGroupItem* item);
protected:
void run(Services::TargetControllerService&) override;
private:
const Widgets::HexViewerSharedState& hexViewerState;
const std::vector<FocusedMemoryRegion>& focusedMemoryRegions;
};
}