1 /*
2    Copyright (C) 2008 - 2018 by Mark de Wever <koraq@xs4all.nl>
3    Part of the Battle for Wesnoth Project https://www.wesnoth.org/
4 
5    This program is free software; you can redistribute it and/or modify
6    it under the terms of the GNU General Public License as published by
7    the Free Software Foundation; either version 2 of the License, or
8    (at your option) any later version.
9    This program is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY.
11 
12    See the COPYING file for more details.
13 */
14 
15 #pragma once
16 
17 #include "gui/core/widget_definition.hpp"
18 #include "gui/core/window_builder.hpp"
19 
20 namespace gui2
21 {
22 /***** ***** ***** ***** Registrars ***** ***** ***** *****/
23 
24 /**
25  * Registers a window.
26  *
27  * This function is utilized by the @ref REGISTER_WINDOW macro and notes a
28  * window to look for when a GUI definition is initialized.
29  *
30  * All windows need to register themselves before @ref gui2::init is called.
31  *
32  * @warning This function runs before @ref main() so needs to be careful
33  * regarding the static initialization problem.
34  *
35  * @note A window can't be registered twice. Any subsequently added windows
36  * with duplicate IDs will be ignored. Might be worth looking into adding an
37  * unregister function in the future if this becomes an issue.
38  *
39  * @param id                  The id of the window to register.
40  */
41 void register_window(const std::string& id);
42 
43 /** Function type alias for @ref register_widget. */
44 using widget_parser_t = std::function<styled_widget_definition_ptr(const config&)>;
45 
46 /**
47  * Registers a widget type.
48  *
49  * This function is utilized by the @ref REGISTER_WIDGET macro and sets the
50  * the parser function used to process the widget type's WML when a GUI
51  * definition is initialized.
52  *
53  * All widgets need to register themselves before @ref gui2::init is called.
54  *
55  * @warning This function runs before @ref main() so needs to be careful
56  * regarding the static initialization problem.
57  *
58  * @param type                The type of the widget to register.
59  * @param f                   The function to parse the definition config.
60  * @param key                 The tagname from which to read the widget's
61  *                            definition in the game config. If nullptr the
62  *                            default [<id>_definition] is used.
63  */
64 void register_widget(const std::string& type, widget_parser_t f, const char* key = nullptr);
65 
66 /** Function type alias for @ref register_widget_builder. */
67 using widget_builder_func_t = std::function<builder_widget_ptr(const config&)>;
68 
69 /**
70  * Registers a widget builder.
71  *
72  * A widget builder simply creates and returns a pointer to a widget type's
73  * builder struct. This is part of the static registry since widget builders
74  * are simply used to instantiate a widget object when a dialog is being
75  * assembled.
76  *
77  * If the widget inherits from @ref styled_widget, any theme-dependent info
78  * will be fetched from the current GUI theme upon construction.
79  *
80  * @warning This function runs before @ref main() so needs to be careful
81  * regarding the static initialization problem.
82  *
83  * @param type                The type of the widget as used in WML.
84  * @param functor             The functor to create the widget.
85  */
86 void register_widget_builder(const std::string& type, widget_builder_func_t functor);
87 
88 
89 /***** ***** ***** ***** Accessors ***** ***** ***** *****/
90 
91 /*
92  * Notes on the registered widget and window lists.
93  *
94  * These lists are independent of the active GUI definition and are filled
95  * during static initialization via @ref register_widget and @register_window.
96 
97  * Also note these cannot be free-standing static data members within this file
98  * since that can cause a crash.
99  */
100 
101 /** Returns the list of registered windows. */
102 std::set<std::string>& registered_window_types();
103 
104 struct registered_widget_parser
105 {
106     /** The widget definition WML parser function. */
107 	widget_parser_t parser;
108 
109     /** The tag containing the definition WML. */
110 	const char* key;
111 };
112 
113 using registered_widget_map = std::map<std::string, registered_widget_parser>;
114 
115 /** Returns the list of registered widgets and their parsers. */
116 registered_widget_map& registered_widget_types();
117 
118 using widget_builder_map = std::map<std::string, widget_builder_func_t>;
119 
120 /** Returns the list of registered widget builders. */
121 widget_builder_map& widget_builder_lookup();
122 
123 } // namespace gui2
124