1 module app; 2 3 import std.typecons : Flag, Yes, No; 4 import renderer : render; 5 6 void itemInColumn(Flag!"runTest" runTest = Yes.runTest) 7 { 8 import std.stdio; 9 import std.array : front; 10 import common : makeDom, DomNode, printDom; 11 12 static struct Data 13 { 14 string item0 = "item0", item1 = "item1", item2 = "item2", item3 = "item3"; 15 } 16 17 Data data; 18 19 auto root = new DomNode(false, null); 20 { 21 import common : Direction; 22 23 root.name = "root"; 24 root.attributes.direction = Direction.column; 25 auto root_item0 = new DomNode(false, null); 26 { 27 root.child ~= root_item0; 28 root_item0.name = "root.item0"; 29 } 30 auto root_item1 = new DomNode(false, null); 31 { 32 root.child ~= root_item1; 33 root_item1.name = "root.item1"; 34 } 35 auto root_item2 = new DomNode(false, null); 36 { 37 root.child ~= root_item2; 38 root_item2.name = "root.item2"; 39 } 40 auto root_item3 = new DomNode(false, null); 41 { 42 root.child ~= root_item3; 43 root_item3.name = "root.item3"; 44 } 45 } 46 47 writeln; 48 49 import walker : Walker; 50 import common : Direction, Alignment, Justification; 51 Walker walker; 52 with (walker) 53 { 54 with(area) 55 { 56 x = y = 0; 57 w = 640; 58 h = 480; 59 margin = 10; 60 padding = 10; 61 } 62 direction = Direction.column; 63 alignment = Alignment.stretch; 64 justification = Justification.around; 65 wrapping = false; 66 } 67 walker.render(data, root); 68 writeln; 69 70 walker.renderlog.render("itemInColumn"); 71 72 if (!runTest) 73 return; 74 75 import std.array : popFront; 76 import common; 77 78 auto log = walker.renderlog; 79 80 assert(log.front.name == "root"); 81 assert(log.front.area == WorkArea(0, 0, 640, 480, 10)); 82 assert(log.front.direction == Direction.column); 83 log.popFront; 84 log.popFront; 85 86 assert(log.front.name == "root.item0"); 87 assert(log.front.area == WorkArea(10, 10, 620, 115, 10)); 88 assert(log.front.direction == Direction.column); 89 log.popFront; 90 log.popFront; 91 92 assert(log.front.name == "root.item1"); 93 assert(log.front.area == WorkArea(10, 125, 620, 115, 10)); 94 assert(log.front.direction == Direction.column); 95 log.popFront; 96 log.popFront; 97 98 assert(log.front.name == "root.item2"); 99 assert(log.front.area == WorkArea(10, 240, 620, 115, 10)); 100 assert(log.front.direction == Direction.column); 101 log.popFront; 102 log.popFront; 103 104 assert(log.front.name == "root.item3"); 105 assert(log.front.area == WorkArea(10, 355, 620, 115, 10)); 106 assert(log.front.direction == Direction.column); 107 log.popFront; 108 log.popFront; 109 } 110 111 void itemInRow(Flag!"runTest" runTest = Yes.runTest) 112 { 113 import std.stdio; 114 import std.array : front; 115 import common : makeDom, DomNode, printDom; 116 117 static struct Data 118 { 119 string item0 = "item0", item1 = "item1", item2 = "item2", item3 = "item3"; 120 } 121 122 Data data; 123 124 auto root = new DomNode(false, null); 125 { 126 import common : Direction; 127 128 root.name = "root"; 129 root.attributes.direction = Direction.row; 130 root.attributes.margin = 20; 131 root.attributes.padding = 30; 132 auto root_item0 = new DomNode(false, null); 133 { 134 root.child ~= root_item0; 135 root_item0.name = "root.item0"; 136 } 137 auto root_item1 = new DomNode(false, null); 138 { 139 root.child ~= root_item1; 140 root_item1.name = "root.item1"; 141 } 142 auto root_item2 = new DomNode(false, null); 143 { 144 root.child ~= root_item2; 145 root_item2.name = "root.item2"; 146 } 147 auto root_item3 = new DomNode(false, null); 148 { 149 root.child ~= root_item3; 150 root_item3.name = "root.item3"; 151 } 152 } 153 154 writeln; 155 156 import walker : Walker; 157 import common : Direction, Alignment, Justification; 158 Walker walker; 159 with (walker) 160 { 161 with(area) 162 { 163 x = y = 0; 164 w = 640; 165 h = 480; 166 margin = 10; 167 } 168 direction = Direction.row; 169 alignment = Alignment.stretch; 170 justification = Justification.around; 171 wrapping = false; 172 } 173 walker.render(data, root); 174 writeln; 175 176 walker.renderlog.render("itemInRow"); 177 178 if (!runTest) 179 return; 180 181 import std.array : popFront; 182 import common; 183 184 auto log = walker.renderlog; 185 186 assert(log.front.name == "root"); 187 assert(log.front.area == WorkArea(0, 0, 640, 480, 10)); 188 assert(log.front.direction == Direction.row); 189 log.popFront; 190 log.popFront; 191 192 assert(log.front.name == "root.item0"); 193 assert(log.front.area == WorkArea(10, 10, 155, 460, 10)); 194 assert(log.front.direction == Direction.row); 195 log.popFront; 196 log.popFront; 197 198 assert(log.front.name == "root.item1"); 199 assert(log.front.area == WorkArea(165, 10, 155, 460, 10)); 200 assert(log.front.direction == Direction.row); 201 log.popFront; 202 log.popFront; 203 204 assert(log.front.name == "root.item2"); 205 assert(log.front.area == WorkArea(320, 10, 155, 460, 10)); 206 assert(log.front.direction == Direction.row); 207 log.popFront; 208 log.popFront; 209 210 assert(log.front.name == "root.item3"); 211 assert(log.front.area == WorkArea(475, 10, 155, 460, 10)); 212 assert(log.front.direction == Direction.row); 213 log.popFront; 214 log.popFront; 215 } 216 217 void complexCase(Flag!"runTest" runTest = Yes.runTest) 218 { 219 import std.stdio; 220 import std.array : front; 221 import common : makeDom, DomNode, printDom; 222 223 static struct Data 224 { 225 struct Child0 226 { 227 228 } 229 230 Child0 child0; 231 232 struct Child1 233 { 234 struct Panel0 235 { 236 struct Image 237 { 238 239 } 240 241 Image image; 242 243 struct Text 244 { 245 246 } 247 248 Text text; 249 } 250 251 Panel0 panel0; 252 253 struct Panel1 254 { 255 struct Text 256 { 257 258 } 259 260 Text text; 261 262 struct Panel 263 { 264 struct Ok 265 { 266 267 } 268 269 Ok ok; 270 271 struct Cancel 272 { 273 274 } 275 276 Cancel cancel; 277 } 278 279 Panel panel; 280 } 281 282 Panel1 panel1; 283 } 284 285 Child1 child1; 286 } 287 288 Data data2; 289 290 auto root = new DomNode(false, null); 291 { 292 import common : Direction; 293 294 root.name = "root"; 295 root.attributes.direction = Direction.column; 296 root.attributes.margin = 10; 297 root.attributes.padding = 10; 298 auto root_child0 = new DomNode(false, null); 299 { 300 root.child ~= root_child0; 301 root_child0.name = "root.child0"; 302 } 303 auto root_child1 = new DomNode(false, null); 304 { 305 root.child ~= root_child1; 306 root_child1.name = "root.child1"; 307 root_child1.attributes.direction = Direction.row; 308 309 auto root_child1_panel0 = new DomNode(false, null); 310 { 311 root_child1.child ~= root_child1_panel0; 312 root_child1_panel0.name = "root.child1.panel0"; 313 root_child1_panel0.attributes.direction = Direction.column; 314 root_child1_panel0.attributes.margin = 20; 315 316 auto image = new DomNode(false, null); 317 { 318 root_child1_panel0.child ~= image; 319 image.name = "root.child1.panel0.image"; 320 } 321 auto text = new DomNode(false, null); 322 { 323 root_child1_panel0.child ~= text; 324 text.name = "root.child1.panel0.text"; 325 } 326 } 327 auto root_child1_panel1 = new DomNode(false, null); 328 { 329 root_child1.child ~= root_child1_panel1; 330 root_child1_panel1.name = "root.child1.panel1"; 331 root_child1_panel1.attributes.direction = Direction.column; 332 333 auto text = new DomNode(false, null); 334 { 335 root_child1_panel1.child ~= text; 336 text.name = "root.child1.panel1.text"; 337 } 338 339 auto panel = new DomNode(false, null); 340 { 341 root_child1_panel1.child ~= panel; 342 panel.name = "root.child1.panel1.panel"; 343 panel.attributes.direction = Direction.row; 344 345 auto ok = new DomNode(false, null); 346 { 347 panel.child ~= ok; 348 ok.name = "root.child1.panel1.panel.ok"; 349 } 350 351 auto cancel = new DomNode(false, null); 352 { 353 panel.child ~= cancel; 354 cancel.name = "root.child1.panel1.panel.cancel"; 355 } 356 } 357 } 358 } 359 } 360 361 writeln; 362 363 import walker : Walker; 364 import common : Direction, Alignment, Justification; 365 Walker walker; 366 with (walker) 367 { 368 with(area) 369 { 370 x = y = 0; 371 w = 640; 372 h = 480; 373 } 374 direction = Direction.column; 375 alignment = Alignment.stretch; 376 justification = Justification.around; 377 wrapping = false; 378 } 379 walker.render(data2, root); 380 writeln; 381 382 walker.renderlog.render("complexCase"); 383 384 if (!runTest) 385 return; 386 387 import std.array : popFront; 388 import common; 389 390 auto log = walker.renderlog; 391 assert(log.front.name == "root"); 392 assert(log.front.area == WorkArea(0, 0, 640, 480, 10)); 393 assert(log.front.direction == Direction.column); 394 log.popFront; 395 log.popFront; 396 397 assert(log.front.name == "root.child0"); 398 assert(log.front.area == WorkArea(10, 10, 620, 230, 10)); 399 assert(log.front.direction == Direction.column); 400 log.popFront; 401 log.popFront; 402 403 assert(log.front.name == "root.child1"); 404 assert(log.front.area == WorkArea(10, 240, 620, 230, 10)); 405 assert(log.front.direction == Direction.row); 406 log.popFront; 407 log.popFront; 408 409 assert(log.front.name == "root.child1.panel0"); 410 assert(log.front.area == WorkArea(20, 250, 300, 210, 20)); 411 assert(log.front.direction == Direction.column); 412 log.popFront; 413 log.popFront; 414 415 assert(log.front.name == "root.child1.panel0.image"); 416 assert(log.front.area == WorkArea(40, 270, 260, 85, 20)); 417 assert(log.front.direction == Direction.column); 418 log.popFront; 419 log.popFront; 420 421 assert(log.front.name == "root.child1.panel0.text"); 422 assert(log.front.area == WorkArea(40, 355, 260, 85, 20)); 423 assert(log.front.direction == Direction.column); 424 log.popFront; 425 log.popFront; 426 427 assert(log.front.name == "root.child1.panel1"); 428 assert(log.front.area == WorkArea(320, 250, 300, 210, 10)); 429 assert(log.front.direction == Direction.column); 430 log.popFront; 431 log.popFront; 432 433 assert(log.front.name == "root.child1.panel1.text"); 434 assert(log.front.area == WorkArea(330, 260, 280, 95, 10)); 435 assert(log.front.direction == Direction.column); 436 log.popFront; 437 log.popFront; 438 439 assert(log.front.name == "root.child1.panel1.panel"); 440 assert(log.front.area == WorkArea(330, 355, 280, 95, 10)); 441 assert(log.front.direction == Direction.row); 442 log.popFront; 443 log.popFront; 444 445 assert(log.front.name == "root.child1.panel1.panel.ok"); 446 assert(log.front.area == WorkArea(340, 365, 130, 75, 10)); 447 assert(log.front.direction == Direction.row); 448 log.popFront; 449 log.popFront; 450 451 assert(log.front.name == "root.child1.panel1.panel.cancel"); 452 assert(log.front.area == WorkArea(470, 365, 130, 75, 10)); 453 assert(log.front.direction == Direction.row); 454 log.popFront; 455 log.popFront; 456 } 457 458 void main() 459 { 460 itemInRow(No.runTest); 461 itemInColumn(No.runTest); 462 complexCase(No.runTest); 463 }