#ifndef UDBTUI_CPUVIEW_HPP
#define UDBTUI_CPUVIEW_HPP
#include <final/final.h>
class CpuView final : public finalcut::FDialog
{
  public:
    CpuView(finalcut::FWidget *parent);
    void notify();
  private:
    class CuView : public finalcut::FScrollView
    {
      public:
        CuView(CpuView *cpu);
        void setGeometry(const finalcut::FPoint &p, const finalcut::FSize &s,
                         bool adj = true) override;
        void notify();
      private:
        finalcut::FLineEdit ip, ir, asmCode;
        finalcut::FLabel stage;
    };
    class AluView : public finalcut::FScrollView
    {
      public:
        AluView(CpuView *cpu);
        void setGeometry(const finalcut::FPoint &p, const finalcut::FSize &s,
                         bool adj = true) override;
        void notify();
      private:
        constexpr static int numRegs{ 256 };
        constexpr static int regWidth{ 2 + 16 }; // num hexdigits + 2
        constexpr static int regSep{ 3 + 3 };    // width of label + 3
        constexpr static int regRows{ 8 };
        constexpr static int regCols{ numRegs / regRows };
        std::unique_ptr<finalcut::FLineEdit> reg[numRegs];
        finalcut::FColor defaultForegroundColor, defaultBackgoundColor;
    };
    class StatusView : public finalcut::FScrollView
    {
      public:
        StatusView(CpuView *cpu);
        void setGeometry(const finalcut::FPoint &p, const finalcut::FSize &s,
                         bool adj = true) override;
        void notify();
      private:
        finalcut::FLineEdit zf, cf, of, sf;
    };
    CuView cuView;
    AluView aluView;
    StatusView statusView;
};
#endif // UDBTUI_CPUVIEW_HPP