This page has been translated automatically.
编程
Fundamentals
Setting Up Development Environment
Usage Examples
UnigineScript
C++
UUSL (Unified UNIGINE Shader Language)
File Formats
Rebuilding the Engine and Tools
GUI
Double Precision Coordinates
应用程序接口
Containers
Common Functionality
Controls-Related Classes
Engine-Related Classes
Filesystem Functionality
GUI-Related Classes
Math Functionality
Node-Related Classes
Networking Functionality
Pathfinding-Related Classes
Physics-Related Classes
Plugins-Related Classes
CIGI Client Plugin
Rendering-Related Classes
注意! 这个版本的文档是过时的,因为它描述了一个较老的SDK版本!请切换到最新SDK版本的文档。
注意! 这个版本的文档描述了一个不再受支持的旧SDK版本!请升级到最新的SDK版本。

Widget Dialog

This article describes the sample located in the <UnigineSDK>/source/csharp/samples/Api/Widgets/WidgetDialog/ directory. By using WidgetDialog class you can create dialog windows. The article is also explains how to pass a user data in a callback

See also

WidgetDialog Class Usage Example

C# Side

Let's see how works the example:

Source code (C#)
using System;
using Unigine;

/*
 */
class UnigineApp {
	
	/*
	 * Instances for each type of WidgetDialog window
	 */
	private static WidgetDialogMessage dialog_message;
	private static WidgetDialogFile dialog_file;
	private static WidgetDialogColor dialog_color;
	private static WidgetDialogImage dialog_image;
	
	/*
	 * Dialog methods for each dialog window
	 */
	private static void dialog_ok_clicked(int type) {
		WidgetDialog dialog = null;
		if(type == 0) dialog = dialog_message.getWidgetDialog();
		if(type == 1) dialog = dialog_file.getWidgetDialog();
		if(type == 2) dialog = dialog_color.getWidgetDialog();
		if(type == 3) dialog = dialog_image.getWidgetDialog();
		Log.message("{0} ok clicked\n",dialog.getText());
		if(type == 1) Log.message("{0}\n",WidgetDialogFile.create(dialog).getFile());
		if(type == 2) Log.message("{0}\n",WidgetDialogColor.create(dialog).getWebColor());
		Gui.get().removeChild(dialog.getWidget());
	}
	
	private static void dialog_cancel_clicked(int type) {
		WidgetDialog dialog = null;
		if(type == 0) dialog = dialog_message.getWidgetDialog();
		if(type == 1) dialog = dialog_file.getWidgetDialog();
		if(type == 2) dialog = dialog_color.getWidgetDialog();
		if(type == 3) dialog = dialog_image.getWidgetDialog();
		Log.message("{0} cancel clicked\n",dialog.getText());
		Gui.get().removeChild(dialog.getWidget());
	}
	
	private static void dialog_show(WidgetDialog dialog,int type) {
		dialog.getOkButton().setCallback0(Gui.CLICKED,new Widget.Callback0i(dialog_ok_clicked),type);
		dialog.getCancelButton().setCallback0(Gui.CLICKED,new Widget.Callback0i(dialog_cancel_clicked),type);
		Gui.get().addChild(dialog.getWidget(),Gui.ALIGN_OVERLAP | Gui.ALIGN_CENTER);
		dialog.setPermanentFocus();
	}
	
	/*
	 * Callbacks for buttons
	 */
	private static void button_message_clicked() {
		WidgetDialogMessage dialog = WidgetDialogMessage.create(Gui.get(),"DialogMessage");
		dialog.setMessageText("Message");
		dialog_show(dialog.getWidgetDialog(),0);
		dialog_message = dialog;
	}
	
	private static void button_file_clicked() {
		WidgetDialogFile dialog = WidgetDialogFile.create(Gui.get(),"DialogPath");
		dialog.setPath("./");
		dialog_show(dialog.getWidgetDialog(),1);
		dialog_file = dialog;
	}
	
	private static void button_color_clicked() {
		WidgetDialogColor dialog = WidgetDialogColor.create(Gui.get(),"DialogColor");
		dialog.setColor(new vec4(1.0f));
		dialog_show(dialog.getWidgetDialog(),2);
		dialog_color = dialog;
	}
	
	private static void button_image_clicked() {
		WidgetDialogImage dialog = WidgetDialogImage.create(Gui.get(),"DialogImage");
		dialog.setTexture("data/widget_dialog.png");
		dialog_show(dialog.getWidgetDialog(),3);
		dialog_image = dialog;
	}
	
	/*
	 */
	[STAThread]
	static void Main(string[] args) {
		
		Wrapper.init();
		
		// initialize engine
		Engine engine = Engine.init(Engine.VERSION,args);
		
		// get gui
		Gui gui = Gui.get();
		
		// create the main window
		WidgetWindow window = WidgetWindow.create(gui,"Dialogs",4,4);
		
		// create buttons
		WidgetButton button_0 = WidgetButton.create(gui,"Message");
		button_0.setCallback0(Gui.CLICKED,new Widget.Callback0(button_message_clicked));
		window.addChild(button_0.getWidget(),Gui.ALIGN_EXPAND);
		
		WidgetButton button_1 = WidgetButton.create(gui,"File");
		button_1.setCallback0(Gui.CLICKED,new Widget.Callback0(button_file_clicked));
		window.addChild(button_1.getWidget(),Gui.ALIGN_EXPAND);
		
		WidgetButton button_2 = WidgetButton.create(gui,"Color");
		button_2.setCallback0(Gui.CLICKED,new Widget.Callback0(button_color_clicked));
		window.addChild(button_2.getWidget(),Gui.ALIGN_EXPAND);
		
		WidgetButton button_3 = WidgetButton.create(gui,"Image");
		button_3.setCallback0(Gui.CLICKED,new Widget.Callback0(button_image_clicked));
		window.addChild(button_3.getWidget(),Gui.ALIGN_EXPAND);
		
		// arrange window
		window.arrange();
		gui.addChild(window.getWidget(),Gui.ALIGN_OVERLAP | Gui.ALIGN_CENTER);
		
		// enter main loop
		engine.main();
		
		// clear widgets
		if(dialog_message != null) dialog_message.clearPtr();
		if(dialog_file != null) dialog_file.clearPtr();
		if(dialog_color != null) dialog_color.clearPtr();
		if(dialog_image != null) dialog_image.clearPtr();
		button_0.clearPtr();
		button_1.clearPtr();
		button_2.clearPtr();
		button_3.clearPtr();
		window.clearPtr();
		gui.clearPtr();
		
		// shutdown engine
		Engine.shutdown();
	}
}

In this sample we do the following:

  • We create 4 different Widget Dialog windows (all these classes inherit from the WidgetDialog class) (dialog_message, dialog_file, dialog_color, dialog_image).
  • In the Main() method, we create the main window and add 4 buttons on it.
  • We set a callback for each button, which will be performed when the button is clicked (button_message_clicked(), button_file_clicked(), button_color_clicked(), button_image_clicked()).
  • To show the dialog, we create one method dialog_show() which receive an WidgetDialog object and an integer variable called type (from 0 to 3) as arguments.
    Notice
    The callback functions can receive optional arguments of the int or IntPtr type that are used to store user data. IntPtr values can be wrapped in classes, for example:
    Source code (C#)
    IntPtr ptr;
    // create a node and then create a Unigine object
    Unigine.Object.create(new Node(ptr));
  • In the dialog_show() method we set callbacks for Ok and Cancel buttons and pass the integer variable called type as a user data to the callback to handle specific window. Callbacks dialog_ok_clicked() and dialog_cancel_clicked() receive the type variable as an argument. According to the value of the variable the special method will be performed.
  • Before Engine.shutdown() we clear all pointers to widgets if they exist.
    Warning
    You should clear all the GUI objects before engine shutdown to avoid memory leaks!

Output

When you run the application, you see the following:

Last update: 2017-10-20
Build: ()