リストボックスに埋め込んだ情報(DGUserData)を活用する
説明
前回のリストボックスにDGUserDataを追加する方法とその活用例を紹介します。
リストボックスアイテムにDGUserDataを追加
DGUserDataのためのメモリ管理
- リストボックスのアイテムにDGUserDataを付加
 
- 要素のGUIDをUserDataとして追加しておく
 
void SamplePalette::GetElementList()
{
	if (listBox.GetItemCount() > 0) {
		DeleteUserData();
		listBox.DeleteItem(DG::ListBox::AllItems);
	}
	GSErrCode err = NoError;
	GS::Array<API_Guid> elemGuids;
	
	err = ACAPI_Element_GetElemList(API_ZombieElemID, &elemGuids);
	if(err != NoError)
		return;
	
	for(API_Guid guid: elemGuids)
	{
		API_Element elem = {};
		elem.header.guid = guid;
		
		err = ACAPI_Element_Get(&elem);
		if(err != NoError)
			continue;
		
		listBox.AppendItem();
		GS::UniString text = ElemID_To_Name(elem.header.typeID);
		listBox.SetTabItemText(DG::SingleSelListBox::BottomItem, 1, text);
		
		API_Guid* pGuid = new API_Guid(guid);
		listBox.SetItemValue(DG::SingleSelListBox::BottomItem, (DGUserData)pGuid);		
	}
}
- インスタンスが解放されたときにUserDataも解放
 
class SamplePalette 
	: public DG::Palette
	, public DG::PanelObserver
	, public DG::ListBoxObserver
{
public:
	void ClosePalette();
	void DeleteUserData();
};
void SamplePalette::ClosePalette()
{
	if (instance != nullptr)
	{
		HidePalette();
		DeleteUserData();
		delete instance;
		instance = nullptr;
	}
}
void SamplePalette::DeleteUserData()
{
	for (int i = 1; i <= listBox.GetItemCount(); i++)
	{
		API_Guid* pGuid = (API_Guid*)listBox.GetItemValue(i);
		if (pGuid != nullptr) {
			delete pGuid;
		}
	}
}
リストボックスのイベント処理
ListBoxObserverの関数をOverride
- DG::ListBoxObserverの定義へいく
 
- ListBoxClicked関数をコピー
 
class SamplePalette 
	: public DG::Palette
	, public DG::PanelObserver
	, public DG::ListBoxObserver
{
public:
	virtual void ListBoxClicked (const DG::ListBoxClickEvent& ev) override;
...
};
ListBoxClicked関数の実装
- クリックされたアイテムのDGUserData(GUID)を取得して、該当する要素までカメラを移動・ズームする
 
void SamplePalette::ListBoxClicked (const DG::ListBoxClickEvent& ev)
{
	if(ev.GetSource()==&listBox)
	{		
		short selecedItem = listBox.GetSelectedItem();
		
		API_Guid* pGuid = (API_Guid*)listBox.GetItemValue(selecedItem);
		if(pGuid == nullptr)
			return;
		API_Neig neig = {};
		neig.guid = *pGuid;		
		ACAPI_Element_DeselectAll();
		ACAPI_Element_Select({neig}, true);
	
		GS::Array<API_Guid> guidArray;
		guidArray.Push(*pGuid);
		ACAPI_Automate (APIDo_ZoomToElementsID, &guidArray);
	}
}
続きをみる
 
        
     
    
リストボックスに埋め込んだ情報(DGUserData)を活用する
説明
前回のリストボックスにDGUserDataを追加する方法とその活用例を紹介します。
リストボックスアイテムにDGUserDataを追加
DGUserDataのためのメモリ管理
リストボックスのイベント処理
ListBoxObserverの関数をOverride
ListBoxClicked関数の実装
続きをみる