リストボックスに埋め込んだ情報(DGUserData)を活用する

 

リストボックスに埋め込んだ情報(DGUserData)を活用する

説明

前回のリストボックスにDGUserDataを追加する方法とその活用例を紹介します。

リストボックスアイテムにDGUserDataを追加

DGUserDataのためのメモリ管理

  • リストボックスのアイテムにDGUserDataを付加
    • SetItemValue()
  • 要素の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);

		// ここでGuidをリストボックスアイテムに付加する
		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);
	}
}

続きをみる