1 module windows.layerlist;
2 
3 import pixelperfectengine.concrete.window;
4 import app;
5 import std.utf : toUTF32, toUTF8;
6 import std.conv : to;
7 import pixelperfectengine.graphics.layers;
8 import pixelperfectengine.map.mapformat : LayerInfo;
9 
10 public class LayerList : Window {
11 	//ListBox listBox_layers;
12 	ListView listView_layers;
13 	SmallButton[] buttons;
14 	CheckBox checkBox_Hide;
15 	CheckBox checkBox_Solo;
16 	public this(int x, int y, void delegate() onClose){
17 		//super(Coordinate(0 + x, 16 + y, 98 + x, 213 + y), "Layers"d);
18 		super(Coordinate(0 + x, 0 + y, 129 + x, 213 + y), "Layers"d);
19 		this.onClose = onClose;
20 		//StyleSheet ss = getStyleSheet();
21 		/+listBox_layers = new ListBox("listBox0", Coordinate(1, 17, 129, 180), [], new ListBoxHeader(["Pri"d ,"Type"d, "Name"d],
22 				[24, 24, 96]));+/
23 		listView_layers = new ListView(
24 			new ListViewHeader(16, [24, 24, 96], ["Pri"d ,"Type"d, "Name"d]), null, "listView_layers", Box(1, 17, 128, 179)
25 		);
26 		listView_layers.editEnable = true;
27 		listView_layers.multicellEditEnable = true;
28 		addElement(listView_layers);
29 		listView_layers.onItemSelect = &listBox_layers_onItemSelect;
30 		listView_layers.onTextInput = &layerList_TextEdit;
31 		{//0
32 			SmallButton sb = new SmallButton("trashButtonB", "trashButtonA", "trash", Box(113, 197, 129, 213));
33 			sb.onMouseLClick = &button_trash_onClick;
34 			buttons ~= sb;
35 		}
36 		{//1
37 			SmallButton sb = new SmallButton("settingsButtonB", "settingsButtonA", "editMat", Box(97, 197, 113, 213));
38 			//sb.onMouseLClickRel = &button_trash_onClick;
39 			buttons ~= sb;
40 		}
41 		{//2
42 			SmallButton sb = new SmallButton("newTileLayerButtonB", "newTileLayerButtonA", "newTileLayer",
43 					Box(1, 181, 16, 196));
44 			sb.onMouseLClick = &button_newTileLayer_onClick;
45 			buttons ~= sb;
46 		}
47 		{//3
48 			SmallButton sb = new SmallButton("newSpriteLayerButtonB", "newSpriteLayerButtonA", "newSpriteLayer",
49 					Box(17, 181, 32, 196));
50 			sb.onMouseLClick = &button_newSpriteLayer_onClick;
51 			buttons ~= sb;
52 		}
53 		{//4
54 			SmallButton sb = new SmallButton("newTransformableTileLayerButtonB", "newTransformableTileLayerButtonA",
55 					"newTransformableTileLayer", Box(33, 181, 48, 196));
56 			sb.onMouseLClick = &button_newTransformableTileLayer_onClick;
57 			buttons ~= sb;
58 		}
59 		{//5
60 			SmallButton sb = new SmallButton("importMaterialDataButtonB", "importMaterialDataButtonA", "importMat",
61 					Box(97, 181, 113, 196));
62 			sb.onMouseLClick = &button_importMaterialData_onClick;
63 			buttons ~= sb;
64 		}
65 		{//6
66 			SmallButton sb = new SmallButton("importLayerDataButtonB", "importLayerDataButtonA", "importLayer",
67 					Box(113, 181, 129, 196));
68 			sb.onMouseLClick = &button_importLayerData_onClick;
69 			buttons ~= sb;
70 		}
71 		checkBox_Hide = new CheckBox("visibilityButtonB", "visibilityButtonA", "checkBox_Hide", Box(1, 197, 16, 212));
72 		checkBox_Hide.onToggle = &checkBox_Hide_onToggle;
73 		addElement(checkBox_Hide);
74 		checkBox_Solo = new CheckBox("soloButtonB", "soloButtonA", "checkBox_Solo", Box(17, 197, 32, 212));
75 		checkBox_Solo.onToggle = &checkBox_Solo_onToggle;
76 		addElement(checkBox_Solo);
77 		/+{
78 			SmallButton sb = new SmallButton("upArrowB", "upArrowA", "moveLayerUp", Coordinate(1, 197, 16, 212));
79 			sb.onMouseLClick = &button_moveLayerUp_onClick;
80 			buttons ~= sb;
81 		}
82 		{
83 			SmallButton sb = new SmallButton("downArrowB", "downArrowA", "moveLayerDown", Coordinate(17, 197, 32, 212));
84 			sb.onMouseLClick = &button_moveLayerDown_onClick;
85 			buttons ~= sb;
86 		}+/
87 		foreach(sb ; buttons){
88 			addElement(sb);
89 		}
90 		//CheckBox_Visible = new CheckBox("Visible"d, "CheckBox0", Coordinate(1, 180, 97, 196));
91 	}
92 	private void listBox_layers_onItemSelect(Event ev){
93 		if (prg.selDoc !is null) {
94 			ListViewItem lbi = cast(ListViewItem)ev.aux;
95 			const int selectedLayer = to!int(lbi.fields[0].text.text);
96 			prg.selDoc.selectedLayer = selectedLayer;
97 			prg.selDoc.updateMaterialList();
98 			if (selectedLayer in prg.selDoc.outputWindow.hiddenLayers)
99 				checkBox_Hide.check();
100 			else
101 				checkBox_Hide.unCheck();
102 			if (selectedLayer in prg.selDoc.outputWindow.soloedLayers)
103 				checkBox_Solo.check();
104 			else
105 				checkBox_Solo.unCheck();
106 		}
107 	}
108 	private void button_trash_onClick(Event ev){
109 		if (prg.selDoc !is null) {
110 			prg.selDoc.removeLayer();
111 		}
112 	}
113 	private void button_newTileLayer_onClick(Event ev){
114 		prg.initNewTileLayer;
115 	}
116 	private void button_newSpriteLayer_onClick(Event ev){
117 
118 	}
119 	private void button_newTransformableTileLayer_onClick(Event ev){
120 
121 	}
122 	private void button_importMaterialData_onClick(Event ev){
123 
124 	}
125 	private void button_importLayerData_onClick(Event ev){
126 
127 	}
128 	private void checkBox_Hide_onToggle(Event ev){
129 		if (prg.selDoc !is null) {
130 			const int selectedLayer = to!int(listView_layers[listView_layers.value][0].text.text);
131 			if (checkBox_Hide.isChecked)
132 				prg.selDoc.outputWindow.hiddenLayers.put(selectedLayer);
133 			else
134 				prg.selDoc.outputWindow.hiddenLayers.removeByElem(selectedLayer);
135 		}	
136 	}
137 	private void checkBox_Solo_onToggle(Event ev){
138 		if (prg.selDoc !is null) {
139 			const int selectedLayer = to!int(listView_layers[listView_layers.value][0].text.text);
140 			if (checkBox_Hide.isChecked)
141 				prg.selDoc.outputWindow.soloedLayers.put(selectedLayer);
142 			else
143 				prg.selDoc.outputWindow.soloedLayers.removeByElem(selectedLayer);
144 		}
145 	}
146 	public void updateLayerList(LayerInfo[] items) {
147 		//ListViewItem[] list;
148 		listView_layers.clear();
149 		foreach (i ; items) {
150 			//list ~= new ListViewItem(16, [to!dstring(i.pri), to!dstring(i.type), toUTF32(i.name)]);
151 			ListViewItem lvi = new ListViewItem(16, [to!dstring(i.pri), to!dstring(i.type), toUTF32(i.name)]);
152 			lvi[0].editable = true;
153 			lvi[0].integer = true;
154 			lvi[2].editable = true;
155 			listView_layers ~= lvi;
156 		}
157 		listView_layers.refresh;
158 		//listView_layers.(list);
159 	}
160 	private void layerList_TextEdit(Event ev) {
161 		import pixelperfectengine.system.etc : isInteger;
162 		CellEditEvent cee = cast(CellEditEvent)ev;
163 		if (prg.selDoc !is null) {
164 			if (cee.column == 2) {	//Rename
165 				prg.selDoc.renameLayer(toUTF8(cee.text.text));
166 			} else if (isInteger(cee.text.text)) {				//Set new priority
167 				prg.selDoc.changeLayerPriority(to!int(cee.text.text));
168 			}
169 		}
170 	}
171 	public override void close(){
172 		if(onClose !is null){
173 			onClose();
174 		}
175 		super.close;
176 	}
177 	public void nextLayer() {
178 		if (prg.selDoc !is null) {
179 			listView_layers.value = listView_layers.value + 1;
180 			const int selectedLayer = to!int(listView_layers[listView_layers.value][0].text.text);
181 			prg.selDoc.selectedLayer = selectedLayer;
182 			prg.selDoc.updateMaterialList();
183 			if (selectedLayer in prg.selDoc.outputWindow.hiddenLayers)
184 				checkBox_Hide.check();
185 			else
186 				checkBox_Hide.unCheck();
187 			if (selectedLayer in prg.selDoc.outputWindow.soloedLayers)
188 				checkBox_Solo.check();
189 			else
190 				checkBox_Solo.unCheck();
191 		}
192 	}
193 	public void prevLayer() {
194 		if (prg.selDoc !is null) {
195 			listView_layers.value = listView_layers.value - 1;
196 			const int selectedLayer = to!int(listView_layers[listView_layers.value][0].text.text);
197 			prg.selDoc.selectedLayer = selectedLayer;
198 			prg.selDoc.updateMaterialList();
199 			if (selectedLayer in prg.selDoc.outputWindow.hiddenLayers)
200 				checkBox_Hide.check();
201 			else
202 				checkBox_Hide.unCheck();
203 			if (selectedLayer in prg.selDoc.outputWindow.soloedLayers)
204 				checkBox_Solo.check();
205 			else
206 				checkBox_Solo.unCheck();
207 		}
208 	}
209 }