
// BKMEMDlg.h : файл заголовка
// !!!доработать

#pragma once
#include "BaseDialog.h"
#include "LockVarType.h"
#include "OctalEditCtrl.h"
#include "resource.h"

constexpr auto MM_FIRST_PAGE = 0;
constexpr auto MM_SECOND_PAGE = 1;
constexpr auto MM_NUM_PAGES = 2;

struct MM16kPage_t
{
	const uint8_t *pBuffer{ nullptr };  // указатель на отображаемый буфер в окне экрана
	uint16_t    nBufSize{ 0 };          // размер этого буфера
	bool        bExist{ false };        // флаг, что эта страница существует и её надо перерисовывать
	bool        bColorMode{ false };    // режим отображения текущей страницы - цветной/ЧБ
	bool        bBWAdaptMode{ false };  // режим отображения текущей страницы - адаптивный/обычный
};

// диалоговое окно CBKMEMDlg
class CScreen;

class CBKMEMDlg : public CBaseDialog
{
		DECLARE_DYNAMIC(CBKMEMDlg)

		// Создание
	public:
		CBKMEMDlg(CWnd *pParent = nullptr);
		virtual ~CBKMEMDlg() override;
		// Данные диалогового окна

		enum { IDD = IDD_BKMEM_MAP_DLG };

		void            DrawTab();

	protected:
		virtual void    DoDataExchange(CDataExchange *pDX) override;   // поддержка DDX/DDV

		void            CreateScreen(const int nPage, const int idUI);
		void            CreateTabs_10(const uint8_t *pMemory);
		void            CreateTabs_11M(const uint8_t *pMemory);
		void            AddTabs_EXT32(const uint8_t *pMemory);
		void            AddTabs_EXT16(const uint8_t *pMemory);
		void            AddTabsA16M(const uint8_t *pMemory);
		void            AddTabsSMK512(const uint8_t *pMemory);
		void            AddTabsAZBK(const uint8_t *pMemory);
		void            SelectTab();
		void            ChangeViewAZ();
		void            SetTabParam(const int nPage);
		void            ChangeColormode(const int nPage);
		void            SetColormode(const int nPage, const bool bMode);
		void            ChangeBWMode(const int nPage);
		void            SetBWMode(const int nPage, const bool bMode);
		void            ViewSprite(const int nPage);
		void            SaveImg(const int nPage);
		void            LoadImg(const int nPage);

		// Реализация
	protected:
		LockVarType     m_lockStop, m_lockDraw;

		/*
		для конфигурации БК10 - 1 вкладка: 0 и 1 страницы (1 - экран)
		для конфигурации БК11 - 4 вкладки: 8 страниц, по 2 шт. во вкладке
		для A16M - вкладка, с одной страницей.
		для смк512 - 16 вкладок
		*/
		int             m_nTabsCount{ 0 };
		int             m_nSelectedTab{ 0 };

		COctalEdit      m_EditAZSegment;
		COctSpinButtonCtrl m_spinAZSegment;

		const uint8_t  *m_pAZMemory{ nullptr }; // указатель на начало массива памяти AZBK
		int             m_nAZSegment{ 0 };      // номер сегмента AZBK
		int             m_bAZTabPresent{ -1 };  // флаг наличия вкладки AZBK (других способов определить нету)
		bool            m_bAZShowed{ true };    // флаг работы с памятью AZBK


		CMFCToolTipCtrl m_ToolTip;

		std::unique_ptr<CScreen> m_Screen[MM_NUM_PAGES];

		using arMM16kPage_t = std::vector <MM16kPage_t>;

		std::vector<arMM16kPage_t> m_Container; // массив окон во вкладках.

		CTabCtrl        m_tab;

		// Созданные функции схемы сообщений
		virtual BOOL OnInitDialog() override;
		virtual void OnCancel() override;
		virtual BOOL PreTranslateMessage(MSG *pMsg) override;
		afx_msg void OnTcnSelchangeTab1(NMHDR *pNMHDR, LRESULT *pResult);
		afx_msg void OnBnClickedButtonMmColorModeP1();
		afx_msg void OnBnClickedButtonMmBwModeP1();
		afx_msg void OnBnClickedButtonMmLoadP1();
		afx_msg void OnBnClickedButtonMmSaveP1();
		afx_msg void OnBnClickedButtonMmSpriteP1();
		afx_msg void OnBnClickedButtonMmColorModeP2();
		afx_msg void OnBnClickedButtonMmBwModeP2();
		afx_msg void OnBnClickedButtonMmLoadP2();
		afx_msg void OnBnClickedButtonMmSaveP2();
		afx_msg void OnBnClickedButtonMmSpriteP2();
		afx_msg void OnEnChangeEditMMAzseg();
		afx_msg void OnDestroy();
		DECLARE_MESSAGE_MAP()
};

