リストボックスに埋め込んだ情報(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関数の実装
続きをみる