1 module declgtk.components.menu;
2 
3 import declgtk.components.component;
4 import declgtk.util;
5 import declgtk.queue;
6 import declui.components.menu;
7 import gtk.Application : Application;
8 import gio.Menu;
9 import gio.MenuItem;
10 import gio.SimpleAction;
11 import gio.Application : GioApplication = Application;
12 import std.uuid;
13 
14 /**
15 A GTK menubar.
16 */
17 class GtkMenuBar : GtkComponent!Menu, IMenuBar, IApplicationProxy
18 {
19 	private IApplicationProxy _application;
20 
21 	override Menu createInstance()
22 	{
23 		return new Menu();
24 	}
25 
26 	override void add(IMenu menu)
27 	{
28 		auto gtkMenu = asGtk!GtkMenu(menu);
29 		gtkMenu.application = this;
30 		queue(menu => menu.appendSubmenu(gtkMenu.text, gtkMenu.getWidget));
31 	}
32 
33 	void application(IApplicationProxy app)
34 	{
35 		_application = app;
36 	}
37 
38 	override Application application() pure @nogc @safe nothrow
39 	{
40 		return _application.application();
41 	}
42 
43 	override GioApplication gioApplication()
44 	{
45 		return _application.gioApplication;
46 	}
47 }
48 
49 /**
50 A GTK menu.
51 */
52 class GtkMenu : GtkComponent!Menu, IMenu, IApplicationProxy
53 {
54 	private string _text;
55 	private IApplicationProxy _application;
56 
57 	override Menu createInstance()
58 	{
59 		return new Menu();
60 	}
61 
62 	override string text()
63 	{
64 		return _text;
65 	}
66 
67 	override void text(string text)
68 	{
69 		_text = text;
70 	}
71 
72 	override void add(IMenu menu)
73 	{
74 		assert(0);
75 	}
76 
77 	override void add(IMenuButton menubutton)
78 	{
79 		auto gtkMenuButton = menubutton.asGtk!GtkMenuButton;
80 		gtkMenuButton.application = this;
81 		queue((widget)
82 		{
83 			auto menuWidget = gtkMenuButton.getWidget();
84 			assert(menuWidget !is null, "Menu widget is null");
85 			widget.appendItem(menuWidget);
86 		});
87 	}
88 
89 	void application(IApplicationProxy app)
90 	{
91 		_application = app;
92 	}
93 
94 	override Application application() pure @nogc @safe nothrow
95 	{
96 		return _application.application();
97 	}
98 
99 	override GioApplication gioApplication()
100 	{
101 		return _application.gioApplication;
102 	}
103 }
104 
105 /**
106 A GTK menu button.
107 */
108 class GtkMenuButton : GtkComponent!MenuItem, IMenuButton, IApplicationProxy
109 {
110 	private string _text;
111 	private immutable string _uuid;
112 	private IApplicationProxy _application;
113 
114 	this()
115 	{
116 		_uuid = randomUUID().toString();
117 	}
118 
119 	override MenuItem createInstance()
120 	{
121 		return new MenuItem("(unnamed menubutton)", "app." ~ _uuid);
122 	}
123 
124 	override string text()
125 	{
126 		return _text;
127 	}
128 
129 	override void text(string text)
130 	{
131 		_text = text;
132 		queue((widget)
133 		{
134 			widget.setLabel(text);
135 		});
136 	}
137 
138 	override void delegate() onClick()
139 	{
140 		assert(0);
141 	}
142 
143 	override void onClick(void delegate() callback)
144 	{
145 		queue((MenuItem widget)
146 		{
147 			MenuItem item = widget;
148 			auto action = new SimpleAction(_uuid, null);
149 			action.addOnActivate((variant, action)
150 			{
151 				callback();
152 				executeGtkQueue();
153 			});
154 			gioApplication.addAction(action);
155 		});
156 	}
157 
158 	void application(IApplicationProxy app)
159 	{
160 		_application = app;
161 	}
162 
163 	override Application application()
164 	{
165 		return _application.application;
166 	}
167 
168 	override GioApplication gioApplication()
169 	{
170 		return _application.gioApplication;
171 	}
172 }