/********************************************************************/
/* Copyright (c) 2019 System fugen G.K. and Yuzi Mizuno          */
/* All rights reserved.                                             */
/* ***************************************************** */
/********************************************************************/
#pragma once
#include "Undo/ActionBase.h"

struct ICameraActionTarget;
class MGglViewAttrib;

/// @class CCameraAction CameraAction.h "Undo/CameraAction.h"
/// このクラスはズームやパン等のカメラ情報変更アクションを表現する。
class CCameraAction : public CActionBase{
	std::unique_ptr<MGglViewAttrib> m_spEnvOld; ///< カメラ設定 for Undo
	std::unique_ptr<MGglViewAttrib> m_spEnvNew; ///< カメラ設定 for Redo

public:
	/// コンストラクター
	/// @param[in] pView カメラを変更可能なビュー。
	CCameraAction(ICameraActionTarget* pView);

	virtual ~CCameraAction();

	virtual void Do();
	virtual void Redo();
	virtual void Undo();

	// サブクラス固有のメソッド群

	ICameraActionTarget* GetTargetView();

	/// カメラ状態を参照する。
	/// @param[in] actiontype UNDO 用か REDO 用かを指示する。
	const MGglViewAttrib* GetEnvParam(ACTION_TYPE actiontype) const;

	/// 現在のビューのカメラ状態をメンバーデータに保存する。
	/// @param[in] actiontype UNDO 用か REDO 用かを指示する。
	void SaveEnvParam(ACTION_TYPE actiontype);

private:
	void SetLastAction();

private:
	CCameraAction(const CCameraAction& other);
	CCameraAction& operator=(const CCameraAction& other);
};
