1 module test1.modulerouter;
2 
3 import pixelperfectengine.concrete.window;
4 import pixelperfectengine.audio.base.config;
5 
6 import test1.app;
7 import test1.editorevents;
8 
9 import std.conv : to;
10 
11 public class ModuleRouter : Window {
12 	ListView listView_modules;
13 	ListView listView_routing;
14 	Button button_addMod;
15 	Button button_remMod;
16 	Button button_preset;
17 	Button button_setup;
18 	Button button_audNode;
19 	Button button_midiNode;
20 	Button button_remNode;
21 	AudioDevKit adk;
22 	public this(AudioDevKit adk){
23 		super(Box(0, 16, 640, 480), "Modules and Routing");
24 		listView_modules = new ListView(new ListViewHeader(16, [256, 256], ["Type", "Name"]), null, "listView_modules", 
25 				Box(5, 20, 530, 175));
26 		listView_routing = new ListView(new ListViewHeader(16, [256, 256], ["From", "To"]), null, "listView_routing", 
27 				Box(5, 180, 530, 455));
28 		button_addMod = new Button("Add module..."d, "button_addMod", Box(535, 20, 635, 40));
29 		button_remMod = new Button("Remove module"d, "button_remMod", Box(535, 45, 635, 65));
30 		button_preset = new Button("Presets..."d, "button_preset", Box(535, 70, 635, 90));
31 		button_setup = new Button("Settings..."d, "button_setup", Box(535, 95, 635, 115));
32 		button_audNode = new Button("Add audio node"d, "button_audNode", Box(535, 180, 635, 200));
33 		//button_midiNode = new Button("Add MIDI node"d, "button1", Box(535, 205, 635, 225));
34 		button_remNode = new Button("Remove node"d, "button_remNode", Box(535, 205, 635, 225));
35 		button_addMod.onMouseLClick = &button_addMod_onClick;
36 		button_audNode.onMouseLClick = &button_addNode_onClick;
37 		button_preset.onMouseLClick = &button_preset_onClick;
38 		listView_modules.editEnable = true;
39 		listView_modules.onTextInput = &listView_modules_onTextEdit;
40 		listView_modules.onItemSelect = &listView_modules_onItemSelect;
41 		listView_routing.editEnable = true;
42 		listView_routing.multicellEditEnable = true;
43 		listView_routing.onTextInput = &listView_routing_onTextEdit;
44 		addElement(listView_modules);
45 		addElement(listView_routing);
46 		addElement(button_addMod);
47 		addElement(button_remMod);
48 		addElement(button_setup);
49 		addElement(button_preset);
50 		addElement(button_audNode);
51 		//addElement(button_midiNode);
52 		addElement(button_remNode);
53 
54 		this.adk = adk;
55 		refreshRoutingTable();
56 		refreshModuleList();
57 	}
58 	public void refreshRoutingTable() {
59 		ModuleConfig mcfg = adk.mcfg;
60 		string[2][] routingTable = mcfg.getRoutingTable;
61 		listView_routing.clear();
62 		foreach (string[2] key; routingTable) {
63 			listView_routing ~= new ListViewItem(16, [key[0].to!dstring, key[1].to!dstring], 
64 					[TextInputFieldType.ASCIIText, TextInputFieldType.ASCIIText]);
65 		}
66 		listView_routing.refresh();
67 	}
68 	public void refreshModuleList() {
69 		ModuleConfig mcfg = adk.mcfg;
70 		string[2][] moduleList = mcfg.getModuleList;
71 		listView_modules.clear();
72 		foreach (string[2] key; moduleList) {
73 			listView_modules ~= new ListViewItem(16, [key[0].to!dstring, key[1].to!dstring,], 
74 				[TextInputFieldType.None, TextInputFieldType.ASCIIText]);
75 		}
76 	}
77 	private void listView_modules_onItemSelect(Event e) {
78 		ListViewItem item = cast(ListViewItem)e.aux;
79 		if (item[1].getText != "Rename me!") {
80 			ModuleConfig mcfg = adk.mcfg;
81 			adk.selectedModID = item[1].getText.to!string;
82 			adk.selectedModule = mcfg.getModule(adk.selectedModID);
83 		}
84 	}
85 	private void button_addMod_onClick(Event e) {
86 		handler.addPopUpElement(new PopUpMenu([new PopUpMenuElement("qm816", "QM816"), new PopUpMenuElement("pcm8", "PCM8")], 
87 				"moduleSelector", &onModuleTypeSelect));
88 	}
89 	private void button_preset_onClick(Event e) {
90 		adk.openPresetEditor();
91 	}
92 	private void onModuleTypeSelect(Event e) {
93 		MenuEvent me = cast(MenuEvent)e;
94 		listView_modules ~= new ListViewItem(16, [me.itemSource.to!dstring, "Rename me!"], 
95 				[TextInputFieldType.None, TextInputFieldType.ASCIIText]);
96 		listView_modules.refresh();
97 		//adk.eventStack.addToTop(new AddModuleEvent(adk.mcfg, me.itemSource, me.itemSource));
98 	}
99 	private void button_addNode_onClick(Event e) {
100 		listView_routing ~= new ListViewItem(16, ["!NONE!", "!NONE!"], 
101 				[TextInputFieldType.ASCIIText, TextInputFieldType.ASCIIText]);
102 		listView_routing.refresh();
103 	}
104 	private void listView_modules_onTextEdit(Event e) {
105 		//CellEditEvent ce = cast(CellEditEvent)e;
106 		ListViewItem item = cast(ListViewItem)e.aux;
107 		adk.eventStack.addToTop(new AddModuleEvent(adk.mcfg, item[0].getText().to!string, item[1].getText().to!string));
108 	}
109 	private void listView_routing_onTextEdit(Event e) {
110 		ListViewItem item = cast(ListViewItem)e.aux;
111 		if (item[0].getText != "!NONE!" && item[1].getText != "!NONE!") {
112 			adk.eventStack.addToTop(new AddRoutingNodeEvent(adk.mcfg, item[0].getText().to!string, item[1].getText().to!string));
113 		}
114 	}
115 }