#pragma once
#include <cstdint>
#include <vector>
#include "Core/Debugger/DebugInterface.h"
#include "Core/Debugger/MemBlockInfo.h"
#include "Core/MIPS/MIPSDebugInterface.h"
enum OffsetSpacing {
offsetSpace = 3,
offsetLine = 1,
};
enum CommonToggles {
On,
Off,
};
class CtrlMemView
{
public:
CtrlMemView(HWND _wnd);
~CtrlMemView();
static void init();
static void deinit();
static LRESULT CALLBACK wndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
static CtrlMemView *getFrom(HWND wnd);
void setDebugger(MIPSDebugInterface *deb) {
debugger_ = deb;
}
MIPSDebugInterface *getDebugger() {
return debugger_;
}
std::vector<u32> searchString(const std::string &searchQuery);
void onPaint(WPARAM wParam, LPARAM lParam);
void onVScroll(WPARAM wParam, LPARAM lParam);
void onKeyDown(WPARAM wParam, LPARAM lParam);
void onChar(WPARAM wParam, LPARAM lParam);
void onMouseDown(WPARAM wParam, LPARAM lParam, int button);
void onMouseUp(WPARAM wParam, LPARAM lParam, int button);
void onMouseMove(WPARAM wParam, LPARAM lParam, int button);
void redraw();
void gotoAddr(unsigned int addr);
void drawOffsetScale(HDC hdc);
void toggleOffsetScale(CommonToggles toggle);
void setHighlightType(MemBlockFlags flags);
private:
bool ParseSearchString(const std::string &query, bool asHex, std::vector<uint8_t> &data);
void updateStatusBarText();
void search(bool continueSearch);
uint32_t pickTagColor(const std::string &tag);
enum class GotoMode {
RESET,
RESET_IF_OUTSIDE,
FROM_CUR,
EXTEND,
};
static GotoMode GotoModeFromModifiers(bool isRightClick);
void UpdateSelectRange(uint32_t target, GotoMode mode);
void GotoPoint(int x, int y, GotoMode mode);
void ScrollWindow(int lines, GotoMode mdoe);
void ScrollCursor(int bytes, GotoMode mdoe);
static wchar_t szClassName[];
MIPSDebugInterface *debugger_ = nullptr;
HWND wnd;
HFONT font;
HFONT underlineFont;
bool redrawScheduled_ = false;
bool hasFocus_ = false;
MemBlockFlags highlightFlags_ = MemBlockFlags::ALLOC;
uint32_t curAddress_ = 0;
uint32_t selectRangeStart_ = 0;
uint32_t selectRangeEnd_ = 0;
uint32_t lastSelectReset_ = 0;
uint32_t windowStart_ = 0;
int rowSize_ = 16;
int charWidth_ = 0;
int rowHeight_ = 0;
int offsetPositionY_;
int addressStartX_ = 0;
int hexStartX_ = 0;
int asciiStartX_ = 0;
bool asciiSelected_ = false;
int selectedNibble_ = 0;
bool displayOffsetScale_ = false;
int visibleRows_ = 0;
RECT rect_;
std::string searchQuery_;
uint32_t matchAddress_ = 0xFFFFFFFF;
bool searching_ = false;
};