1 /**
2  * ae.demo.test.main
3  *
4  * License:
5  *   This Source Code Form is subject to the terms of
6  *   the Mozilla Public License, v. 2.0. If a copy of
7  *   the MPL was not distributed with this file, You
8  *   can obtain one at http://mozilla.org/MPL/2.0/.
9  *
10  * Authors:
11  *   Vladimir Panteleev <vladimir@thecybershadow.net>
12  */
13 
14 module ae.demo.test.main;
15 
16 import std.conv;
17 
18 import ae.ui.app.application;
19 import ae.ui.app.posix.main;
20 import ae.ui.shell.shell;
21 import ae.ui.shell.sdl2.shell;
22 import ae.ui.video.renderer;
23 import ae.ui.video.sdl2.video;
24 import ae.ui.video.video;
25 import ae.ui.wm.application;
26 import ae.ui.wm.controls.control;
27 
28 final class MyApplication : WMApplication
29 {
30 	override string getName() { return "Demo/UI"; }
31 	override string getCompanyName() { return "CyberShadow"; }
32 
33 	override int run(string[] args)
34 	{
35 		shell = new SDL2Shell(this);
36 		shell.video = new SDL2SoftwareVideo();
37 		root.addChild(createView());
38 		shell.run();
39 		shell.video.shutdown();
40 		return 0;
41 	}
42 
43 	Control createView()
44 	{
45 		return (new Table(2, 2))
46 			.addChild((new Pad(10.px, 5.percent)).addChild(new SetBGColor!(PaintControl, 0x002222)))
47 			.addChild((new Pad(10.px, 5.percent)).addChild(new SetBGColor!(PaintControl, 0x220022)))
48 			.addChild((new Pad(10.px, 5.percent)).addChild(new SetBGColor!(PaintControl, 0x222200)))
49 			.addChild((new Pad(10.px, 5.percent)).addChild(new SetBGColor!(PaintControl, 0x002200)))
50 		;
51 	}
52 }
53 
54 shared static this()
55 {
56 	createApplication!MyApplication();
57 }
58 
59 // ***************************************************************************
60 
61 import ae.utils.meta;
62 
63 /// Subclass any control to give it an arbitrary background color.
64 class SetBGColor(BASE : Control, uint C) : BASE
65 {
66 	mixin GenerateConstructorProxies;
67 
68 	enum BGRX color = BGRX(C&0xFF, (C>>8)&0xFF, C>>16);
69 
70 	override void render(Renderer s, int x, int y)
71 	{
72 		s.fillRect(x, y, x+w, y+h, color);
73 		super.render(s, x, y);
74 	}
75 }
76 
77 // ***************************************************************************
78 
79 class PaintControl : Control
80 {
81 	override void arrange(int rw, int rh) { w = rw; h = rh; }
82 
83 	struct Coord { uint x, y; BGRX c; void* dummy; }
84 	Coord[] coords;
85 
86 	override void handleMouseMove(int x, int y, MouseButtons buttons)
87 	{
88 		if (buttons)
89 		{
90 			uint b = cast(uint)buttons;
91 			ubyte channel(ubyte m) { return ((b>>m)&1) ? 0xFF : 0; }
92 			coords ~= Coord(x, y, BGRX(channel(2), channel(1), channel(0)));
93 		}
94 	}
95 
96 	override void render(Renderer s, int x, int y)
97 	{
98 		//foreach (i; 0..100)
99 		//	coords ~= Coord(uniform(0, w), uniform(0, h), uniform(0, 0x1_00_00_00));
100 		static size_t oldCoordsLength;
101 		if (coords.length != oldCoordsLength)
102 		{
103 			//shell.setCaption(to!string(coords.length));
104 			oldCoordsLength = coords.length;
105 		}
106 
107 		// if (coords.length > 100) throw new Exception("derp");
108 
109 		auto b = s.lock();
110 		scope(exit) s.unlock();
111 		foreach (coord; coords)
112 			if (coord.x < w && coord.y < h)
113 				b[x+coord.x, y+coord.y] = coord.c;
114 		//s.unlock();
115 	}
116 }