#ifndef UDBTUI_MEMVIEW_HPP
#define UDBTUI_MEMVIEW_HPP
#include <final/final.h>
class MemView final : public finalcut::FDialog
{
public:
MemView(finalcut::FWidget *parent);
void notify();
void draw() override;
private:
void initSegInfo();
void init();
void updateAddrRange();
void mapKeyFunctions();
void updateCell();
void updateVbar();
void stepBackward();
void stepForward();
void pageBackward();
void pageForward();
void cb_vbarChange(const FWidget *);
void onKeyPress(finalcut::FKeyEvent *ev) override;
void onWheel(finalcut::FWheelEvent *ev) override;
void selectSegment();
void initLayout() override;
std::uint64_t segOffset{ 0 }; // address of top left mem cell
std::uint64_t segSize{ 0 }; // address of top left mem cell
std::uint64_t numPages{ 0 };
static constexpr std::size_t numCellCols{ 16 };
static constexpr std::size_t numCellRows{ 16 };
static constexpr std::size_t numCells{ numCellRows * numCellCols };
finalcut::FScrollbarPtr vbar{ nullptr };
std::vector<std::unique_ptr<finalcut::FLabel>> colLabel{ numCellCols };
std::vector<std::unique_ptr<finalcut::FLabel>> rowLabel{ numCellRows };
std::vector<std::unique_ptr<finalcut::FLineEdit>> cell;
using FColor = finalcut::FColor;
using FColorPair = finalcut::FColorPair;
FColor defaultForegroundColor, defaultBackgoundColor;
FColorPair memRead{ FColor::White, FColor::Green };
FColorPair memWrite{ FColor::White, FColor::Red };
FColorPair onStack{ FColor::White, FColor::LightCyan };
FColorPair inFrame{ FColor::White, FColor::LightMagenta };
FColorPair instr{ FColor::Black, FColor::Yellow };
finalcut::FLabel segLabel{ this };
finalcut::FListBox segChoice{ this };
using KeyMap = std::unordered_map<finalcut::FKey, std::function<void()>,
finalcut::EnumHash<finalcut::FKey>>;
KeyMap key_map{};
};
#endif // UDBTUI_MEMVIEW_HPP