//
//	ToolLib_Visible.cpp
//
//	エディター共通処理 - ツールのGUI処理の表示・非表示管理
//
//	* Tue Apr 18 21:46:46 JST 2017 Naoyuki Sawa
//	- 1st リリース。
//	* Wed Apr 19 22:11:14 JST 2017 Naoyuki Sawa
//	- 「①DxLibに依存しないようにする」と「②C言語でコンパイル出来るようにする」を対応しました。
//	  詳細は、/clip/ToolLib/README.TXT の、同日のコメントを参照して下さい。
//	* Thu Apr 20 21:31:57 JST 2017 Naoyuki Sawa
//	- 当ライブラリが生成するオブジェクトの識別子を、整数ハンドル⇒ポインタに変更しました。
//	  オリジナル版では生成したオブジェクトを固定長配列に格納して管理していたのですが、メモリ節約のためにリストで管理するように変更し、そのためには整数ハンドルよりもポインタの方が都合が良いからです。
//	  尚、フォントハンドルと文字列入力ハンドルは、当ライブラリが生成するオブジェクトではなくバックエンドのオブジェクトなので、今回の変更には関係無く整数ハンドルのままです。
//
#include "clip.h"
//*****************************************************************************
//	定数、マクロ、構造体
//*****************************************************************************
//表示状態情報構造体
/*typedef*/ struct _SToolVisible {
	SToolVisible*	ParentTVisible;		//親の表示状態情報。(親が居ない場合はNULL)
	int		Visible;		//表示状態。
} /*SToolVisible*/;
//*****************************************************************************
//	ローカル変数
//*****************************************************************************
static GSList*	g_TVisible;
//*****************************************************************************
//	アプリケーション用関数
//*****************************************************************************
//表示状態情報を作成する。
//[out]
//	戻り値			表示状態情報。
SToolVisible* ToolVisible_Create() {
	SToolVisible* TVisible;
	//新しい表示状態情報を格納するためのメモリの確保。
	TVisible = calloc(1, sizeof(SToolVisible));
	if(!TVisible) { DIE(); }
	//確保したメモリ領域を保存。
	g_TVisible = g_slist_append(g_TVisible, TVisible);
	//情報を初期化。
//不要	TVisible->ParentTVisible = NULL;
	TVisible->Visible        = 1;	//【NOTE】オリジナル版のToolLibでは表示状態情報作成直後の初期状態は'非表示'となっていたが、当実装では使い易さのために初期状態を'表示'に変更した。各ウィジットの初期状態も'表示'なので、統一性の観点からもこの方が良いと思う。
	//表示状態情報を返す。
	return TVisible;
}
//-----------------------------------------------------------------------------
//表示状態情報を削除する。
//[in]
//	TVisible		表示状態情報。
void ToolVisible_Delete(SToolVisible* TVisible) {
	//確保していたメモリを解放する。
	g_TVisible = g_slist_remove(g_TVisible, TVisible);
	free(TVisible);
}
//-----------------------------------------------------------------------------
//全ての表示状態情報を削除する。
void ToolVisible_Delete_All() {
	//有効な全ての表示状態を削除する。
	while(g_TVisible) { ToolVisible_Delete(g_TVisible->data); }
}
//-----------------------------------------------------------------------------
//表示状態情報の表示状態を変更する。
//[in]
//	TVisible		表示状態情報。
//	Visible			新しい表示状態。
void ToolVisible_SetVisible(SToolVisible* TVisible, int Visible) {
	//新しい表示状態を保存。
	TVisible->Visible = Visible;
}
//-----------------------------------------------------------------------------
//表示状態情報に親の表示状態情報を設定する。
//[in]
//	TVisible		表示状態情報。
//	ParentTVisible		親となる表示状態情報。
void ToolVisible_SetParent(SToolVisible* TVisible, SToolVisible* ParentTVisible) {
	//親となる表示状態情報を保存。
	TVisible->ParentTVisible = ParentTVisible;
}
//-----------------------------------------------------------------------------
//表示状態情報の表示状態を取得する。(親の表示状態も考慮する)
//[in]
//	TVisible		表示状態情報。(NULL可。NULLが指定されたら常に「0以外:表示」を返す)
//[out]
//	戻り値			表示状態。(0以外:表示,0:非表示)
int ToolVisible_GetVisible(SToolVisible* TVisible) {
	//指定された表示状態情報,及び,親の表示状態情報を辿って、NULLになるまで繰り返す。
	while(TVisible) {
		//表示フラグが倒れていたら0を返す。
		if(!TVisible->Visible) { return 0; }
		//親の表示状態情報が有効な場合は親の表示状態も考慮する。
		TVisible = TVisible->ParentTVisible;
	}
	//ここにきたら非表示ではないということなので0以外を返す。
	return 1;
}
