MultipleChoicePopUpDialogを実装する

 

MultipleChoicePopUpDialogを実装する

説明

プロパティのオプションセットなどで使用されている複数選択できるアイテムとそのポップアップダイアログの実装方法を紹介します。

ダイアログクラスを定義する

  • 必要なヘッダーをインクルード
  • DG::ModalDialogを継承したクラスを定義
  • DG::ButtonItemObserverを継承
    • ボタンのイベント処理に必要
  • MultipleChoiceDataObserverを継承
    • 複数選択のイベント処理に必要
// SampleDialog.h


#include "APIEnvir.h"
#include "ACAPinc.h"
#include "APICommon.h"


#include "DG.h"
#include "DGModule.hpp"

#include "UDResources.hpp"
#include "MultipleChoiceData.hpp"
#include "MultipleChoicePopUpDialog.hpp"



class SampleDialog
	: public DG::ModalDialog
	, public DG::PanelObserver
	, public DG::ButtonItemObserver
	, public UD::MultipleChoiceDataObserver
{
public:
	SampleDialog();
	~SampleDialog();

	void UpdateTextEdit(const GS::UniString& selectedItemStr);

	// from ButtonObserver
	virtual void ButtonClicked(const DG::ButtonClickEvent& ev) override;

	// from MultipleChoiceDataObser
	virtual void SelectionChanged(const UD::MultipleChoiceData& source) override;

private:

	DG::TextEdit textEdit;
	DG::Button button;
	DG::Button okButton;
};

ダイアログクラスを実装する

  • コンストラクタでアイテムの詳細を指定
    • GRCにリソースを定義しなくても良い
  • buttonがクリックされた時に複数選択のダイアログを表示
  • okbuttonがクリックされたと時にダイアログを閉じる
  • 選択肢の選択状態が変更されたときに、文字列を更新する
#include "SampleDialog.h"


SampleDialog::SampleDialog()
	: DG::ModalDialog(DG::NativePoint(), 400, 100, GS::Guid("9F1429AA-E3E9-4856-A7D2-DB5BF12D6946"))
	, textEdit(GetReference(), DG::Rect(50, 30, 330, 50), 0, DG::EditControl::Frame, DG::EditControl::Update, DG::EditControl::ReadOnly)
	, button(GetReference(), DG::Rect(330, 30, 350, 50))
	, okButton(GetReference(), DG::Rect(300, 70, 350, 90))
{
	SetTitle("Sample Dialog");

	textEdit.Show();

	button.SetIcon(UD::GetResourceIcon(UD::OpenPopupIcon));
	button.Show();
	button.Attach(*this);

	okButton.SetText("OK");
	okButton.Show();
	okButton.Attach(*this);

}


SampleDialog::~SampleDialog()
{
}


void SampleDialog::ButtonClicked(const DG::ButtonClickEvent& ev)
{
	if (ev.GetSource() == &button) 
	{
		// set multiple choice item
		UD::MultipleChoiceData multipleChoiceData;

		UD::MultipleChoiceItem multipleChoiceItem;
		multipleChoiceItem.SetSelected(false);
		multipleChoiceItem.SetText("Archicad");
		multipleChoiceData.AddItem(multipleChoiceItem);

		multipleChoiceItem.SetText("BIMcloud");
		multipleChoiceData.AddItem(multipleChoiceItem);

		multipleChoiceItem.SetText("BIMx");
		multipleChoiceData.AddItem(multipleChoiceItem);

		UD::MultipleChoicePopUpDialog dialog(multipleChoiceData, button);
		multipleChoiceData.Attach(*this);
		dialog.Invoke();

	}
	else if (ev.GetSource() == &okButton) 
	{
		// close
		PostCloseRequest(DG::ModalDialog::Accept);
	}
}



void SampleDialog::SelectionChanged(const UD::MultipleChoiceData& source)
{
	GS::Array<UD::MultipleChoiceItem> items;
	items = source.GetItems();

	GS::UniString itemStr;
	for (UD::MultipleChoiceItem item : items)
	{
		if (item.IsSelected()) {
			itemStr += item.GetText() + ";";
		}
	}

	UpdateTextEdit(itemStr);
}


void SampleDialog::UpdateTextEdit(const GS::UniString& selectedItemStr)
{
	textEdit.SetText(selectedItemStr);
}

ダイアログを呼び出す

  • メニューが選択されたときに、ダイアログを呼び出す
// -----------------------------------------------------------------------------
// Handles menu commands
// -----------------------------------------------------------------------------

GSErrCode __ACENV_CALL MenuCommandHandler (const API_MenuParams *menuParams)
{
	switch (menuParams->menuItemRef.menuResID) {
	case ID_MENU_STRINGS:
		switch (menuParams->menuItemRef.itemIndex) {
		case 1:
		{
			SampleDialog sampleDlg;
			sampleDlg.Invoke();
		}
		break;
	}

	return NoError;
}		// MenuCommandHandler