1 /*
2 
3 Boost Software License - Version 1.0 - August 17th, 2003
4 
5 Permission is hereby granted, free of charge, to any person or organization
6 obtaining a copy of the software and accompanying documentation covered by
7 this license (the "Software") to use, reproduce, display, distribute,
8 execute, and transmit the Software, and to prepare derivative works of the
9 Software, and to permit third-parties to whom the Software is furnished to
10 do so, all subject to the following:
11 
12 The copyright notices in the Software and this entire statement, including
13 the above license grant, this restriction and the following disclaimer,
14 must be included in all copies of the Software, in whole or in part, and
15 all derivative works of the Software, unless such copies or derivative
16 works are solely in the form of machine-executable object code generated by
17 a source language processor.
18 
19 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21 FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
22 SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
23 FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
24 ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
25 DEALINGS IN THE SOFTWARE.
26 
27 */
28 module derelict.allegro5.dialog;
29 
30 private {
31     import derelict.util.loader,
32            derelict.util.system;
33 
34     import derelict.allegro5.internal,
35            derelict.allegro5.types;
36 
37     enum libNames = genLibNames("Dialog");
38 }
39 
40 struct ALLEGRO_FILECHOOSER;
41 struct ALLEGRO_TEXTLOG;
42 struct ALLEGRO_MENU;
43 
44 struct ALLEGRO_MENU_INFO {
45     const(char)* caption;
46     ushort id;
47     int flags;
48     ALLEGRO_BITMAP* icon;
49 }
50 
51 enum {
52     ALLEGRO_FILECHOOSER_FILE_MUST_EXIST = 1,
53     ALLEGRO_FILECHOOSER_SAVE = 2,
54     ALLEGRO_FILECHOOSER_FOLDER = 4,
55     ALLEGRO_FILECHOOSER_PICTURES = 8,
56     ALLEGRO_FILECHOOSER_SHOW_HIDDEN = 16,
57     ALLEGRO_FILECHOOSER_MULTIPLE = 32
58 }
59 
60 enum {
61     ALLEGRO_MESSAGEBOX_WARN = 1<<0,
62     ALLEGRO_MESSAGEBOX_ERROR = 1<<1,
63     ALLEGRO_MESSAGEBOX_OK_CANCEL = 1<<2,
64     ALLEGRO_MESSAGEBOX_YES_NO = 1<<3,
65     ALLEGRO_MESSAGEBOX_QUESTION = 1<<4
66 }
67 
68 enum {
69     ALLEGRO_TEXTLOG_NO_CLOSE = 1<<0,
70     ALLEGRO_TEXTLOG_MONOSPACE = 1<<1
71 }
72 
73 enum {
74     ALLEGRO_EVENT_NATIVE_DIALOG_CLOSE = 600
75 }
76 
77 enum {
78     ALLEGRO_MENU_ITEM_ENABLED            = 0,
79     ALLEGRO_MENU_ITEM_CHECKBOX           = 1,
80     ALLEGRO_MENU_ITEM_CHECKED            = 2,
81     ALLEGRO_MENU_ITEM_DISABLED           = 4
82 };
83 
84 extern(C) @nogc nothrow {
85     alias da_al_init_native_dialog_addon = bool function();
86     alias da_al_shutdown_native_dialog_addon = void function();
87 
88     alias da_al_create_native_file_dialog = ALLEGRO_FILECHOOSER* function(const(char)*,const(char)*,const(char)*,int);
89     alias da_al_show_native_file_dialog = bool function(ALLEGRO_DISPLAY*,ALLEGRO_FILECHOOSER*);
90     alias da_al_get_native_file_dialog_count = int function(const(ALLEGRO_FILECHOOSER)*);
91     alias da_al_get_native_file_dialog_path = const(char)* function(const(ALLEGRO_FILECHOOSER)*,size_t);
92     alias da_al_destroy_native_file_dialog = void function(ALLEGRO_FILECHOOSER*);
93 
94     alias da_al_show_native_message_box = int function(ALLEGRO_DISPLAY*,const(char)*,const(char)*,const(char)*,const(char)*,int);
95 
96     alias da_al_open_native_text_log = ALLEGRO_TEXTLOG* function(const(char)*,int);
97     alias da_al_close_native_text_log = void function(ALLEGRO_TEXTLOG*);
98     alias da_al_append_native_text_log = void function(ALLEGRO_TEXTLOG*,const(char)*,...);
99     alias da_al_get_native_text_log_event_source = ALLEGRO_EVENT_SOURCE* function(ALLEGRO_TEXTLOG*);
100 
101     alias da_al_create_menu = ALLEGRO_MENU* function();
102     alias da_al_create_popup_menu = ALLEGRO_MENU* function();
103     alias da_al_build_menu = ALLEGRO_MENU* function(ALLEGRO_MENU_INFO*);
104     alias da_al_append_menu_item = int function(ALLEGRO_MENU*,const(char)*,short,int,ALLEGRO_BITMAP*,ALLEGRO_MENU*);
105     alias da_al_insert_menu_item = int function(ALLEGRO_MENU*,int,const(char)*,short,int,ALLEGRO_BITMAP*,ALLEGRO_MENU*);
106     alias da_al_remove_menu_item = bool function(ALLEGRO_MENU*,int);
107     alias da_al_clone_menu = ALLEGRO_MENU* function(ALLEGRO_MENU*);
108     alias da_al_clone_menu_for_popup = ALLEGRO_MENU* function(ALLEGRO_MENU*);
109     alias da_al_destroy_menu = void function(ALLEGRO_MENU*);
110 
111     alias da_al_get_menu_item_caption = const(char)* function(ALLEGRO_MENU*,int);
112     alias da_al_set_menu_item_caption = void function(ALLEGRO_MENU*,int,const(char)*);
113     alias da_al_get_menu_item_flags = int function(ALLEGRO_MENU*,int);
114     alias da_al_set_menu_item_flags = void function(ALLEGRO_MENU*,int,int);
115     alias da_al_get_menu_item_icon = ALLEGRO_BITMAP* function(ALLEGRO_MENU*,int);
116     alias da_al_set_menu_item_icon = void function(ALLEGRO_MENU*,int,ALLEGRO_BITMAP*);
117 
118     alias da_al_find_menu = ALLEGRO_MENU* function(ALLEGRO_MENU*,short);
119     alias da_al_find_menu_item = bool function(ALLEGRO_MENU*,short,ALLEGRO_MENU**,int*);
120 
121     alias da_al_get_default_menu_event_source = ALLEGRO_EVENT_SOURCE* function();
122     alias da_al_enable_menu_event_source = ALLEGRO_EVENT_SOURCE* function(ALLEGRO_MENU*);
123     alias da_al_disable_menu_event_source = void function(ALLEGRO_MENU*);
124 
125     alias da_al_get_display_menu = ALLEGRO_MENU* function(ALLEGRO_DISPLAY*);
126     alias da_al_set_display_menu = bool function(ALLEGRO_DISPLAY*,ALLEGRO_MENU*);
127     alias da_al_popup_menu = bool function(ALLEGRO_MENU*,ALLEGRO_DISPLAY*);
128     alias da_al_remove_display_menu = ALLEGRO_MENU* function(ALLEGRO_DISPLAY*);
129 
130     alias da_al_get_allegro_native_dialog_version = uint function();
131 }
132 
133 __gshared {
134     da_al_init_native_dialog_addon al_init_native_dialog_addon;
135     da_al_shutdown_native_dialog_addon al_shutdown_native_dialog_addon;
136     da_al_create_native_file_dialog al_create_native_file_dialog;
137     da_al_show_native_file_dialog al_show_native_file_dialog;
138     da_al_get_native_file_dialog_count al_get_native_file_dialog_count;
139     da_al_get_native_file_dialog_path al_get_native_file_dialog_path;
140     da_al_destroy_native_file_dialog al_destroy_native_file_dialog;
141     da_al_show_native_message_box al_show_native_message_box;
142     da_al_open_native_text_log al_open_native_text_log;
143     da_al_close_native_text_log al_close_native_text_log;
144     da_al_append_native_text_log al_append_native_text_log;
145     da_al_get_native_text_log_event_source al_get_native_text_log_event_source;
146     da_al_create_menu al_create_menu;
147     da_al_create_popup_menu al_create_popup_menu;
148     da_al_build_menu al_build_menu;
149     da_al_append_menu_item al_append_menu_item;
150     da_al_insert_menu_item al_insert_menu_item;
151     da_al_remove_menu_item al_remove_menu_item;
152     da_al_clone_menu al_clone_menu;
153     da_al_clone_menu_for_popup al_clone_menu_for_popup;
154     da_al_destroy_menu al_destroy_menu;
155     da_al_get_menu_item_caption al_get_menu_item_caption;
156     da_al_set_menu_item_caption al_set_menu_item_caption;
157     da_al_get_menu_item_flags al_get_menu_item_flags;
158     da_al_set_menu_item_flags al_set_menu_item_flags;
159     da_al_get_menu_item_icon al_get_menu_item_icon;
160     da_al_set_menu_item_icon al_set_menu_item_icon;
161     da_al_find_menu al_find_menu;
162     da_al_find_menu_item al_find_menu_item;
163     da_al_get_default_menu_event_source al_get_default_menu_event_source;
164     da_al_enable_menu_event_source al_enable_menu_event_source;
165     da_al_disable_menu_event_source al_disable_menu_event_source;
166     da_al_get_display_menu al_get_display_menu;
167     da_al_set_display_menu al_set_display_menu;
168     da_al_popup_menu al_popup_menu;
169     da_al_remove_display_menu al_remove_display_menu;
170     da_al_get_allegro_native_dialog_version al_get_allegro_native_dialog_version;
171 }
172 
173 class DerelictAllegro5DialogLoader : SharedLibLoader {
174     public this() {
175         super(libNames);
176     }
177 
178     protected override void loadSymbols() {
179         bindFunc(cast(void**)&al_init_native_dialog_addon, "al_init_native_dialog_addon");
180         bindFunc(cast(void**)&al_shutdown_native_dialog_addon, "al_shutdown_native_dialog_addon");
181         bindFunc(cast(void**)&al_create_native_file_dialog, "al_create_native_file_dialog");
182         bindFunc(cast(void**)&al_show_native_file_dialog, "al_show_native_file_dialog");
183         bindFunc(cast(void**)&al_get_native_file_dialog_count, "al_get_native_file_dialog_count");
184         bindFunc(cast(void**)&al_get_native_file_dialog_path, "al_get_native_file_dialog_path");
185         bindFunc(cast(void**)&al_destroy_native_file_dialog, "al_destroy_native_file_dialog");
186         bindFunc(cast(void**)&al_show_native_message_box, "al_show_native_message_box");
187         bindFunc(cast(void**)&al_open_native_text_log, "al_open_native_text_log");
188         bindFunc(cast(void**)&al_close_native_text_log, "al_close_native_text_log");
189         bindFunc(cast(void**)&al_append_native_text_log, "al_append_native_text_log");
190         bindFunc(cast(void**)&al_get_native_text_log_event_source, "al_get_native_text_log_event_source");
191         bindFunc(cast(void**)&al_create_menu, "al_create_menu");
192         bindFunc(cast(void**)&al_create_popup_menu, "al_create_popup_menu");
193         bindFunc(cast(void**)&al_build_menu, "al_build_menu");
194         bindFunc(cast(void**)&al_append_menu_item, "al_append_menu_item");
195         bindFunc(cast(void**)&al_insert_menu_item, "al_insert_menu_item");
196         bindFunc(cast(void**)&al_remove_menu_item, "al_remove_menu_item");
197         bindFunc(cast(void**)&al_clone_menu, "al_clone_menu");
198         bindFunc(cast(void**)&al_clone_menu_for_popup, "al_clone_menu_for_popup");
199         bindFunc(cast(void**)&al_destroy_menu, "al_destroy_menu");
200 
201         bindFunc(cast(void**)&al_get_menu_item_caption, "al_get_menu_item_caption");
202         bindFunc(cast(void**)&al_set_menu_item_caption, "al_set_menu_item_caption");
203         bindFunc(cast(void**)&al_get_menu_item_flags, "al_get_menu_item_flags");
204         bindFunc(cast(void**)&al_set_menu_item_flags, "al_set_menu_item_flags");
205         bindFunc(cast(void**)&al_get_menu_item_icon, "al_get_menu_item_icon");
206         bindFunc(cast(void**)&al_set_menu_item_icon, "al_set_menu_item_icon");
207 
208         bindFunc(cast(void**)&al_find_menu, "al_find_menu");
209         bindFunc(cast(void**)&al_find_menu_item, "al_find_menu_item");
210         bindFunc(cast(void**)&al_get_default_menu_event_source, "al_get_default_menu_event_source");
211         bindFunc(cast(void**)&al_enable_menu_event_source, "al_enable_menu_event_source");
212         bindFunc(cast(void**)&al_disable_menu_event_source, "al_disable_menu_event_source");
213         bindFunc(cast(void**)&al_get_display_menu, "al_get_display_menu");
214         bindFunc(cast(void**)&al_set_display_menu, "al_set_display_menu");
215         bindFunc(cast(void**)&al_popup_menu, "al_popup_menu");
216         bindFunc(cast(void**)&al_remove_display_menu, "al_remove_display_menu");
217 
218         bindFunc(cast(void**)&al_get_allegro_native_dialog_version, "al_get_allegro_native_dialog_version");
219     }
220 }
221 
222 __gshared DerelictAllegro5DialogLoader DerelictAllegro5Dialog;
223 
224 shared static this() {
225     DerelictAllegro5Dialog = new DerelictAllegro5DialogLoader;
226 }