1 /*
2    Copyright (C) 2007 - 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 #define GETTEXT_DOMAIN "wesnoth-lib"
16 
17 #include "gui/core/widget_definition.hpp"
18 
19 #include "gettext.hpp"
20 #include "gui/core/log.hpp"
21 #include "gui/widgets/helper.hpp"
22 #include "wml_exception.hpp"
23 
24 namespace gui2
25 {
26 
27 /*WIKI
28  * @page = GUIToolkitWML
29  * @order = 1_widget
30  *
31  * == State ==
32  *
33  * @begin{parent}{name="generic/"}
34  * @begin{tag}{name="state"}{min=0}{max=1}
35  * Definition of a state. A state contains the info what to do in a state.
36  * Atm this is rather focused on the drawing part, might change later.
37  * Keys:
38  * @begin{table}{config}
39  *     draw & section & &                 Section with drawing directions for a
40  *canvas. $
41  * @end{table}
42  * @end{tag}{name="state"}
43  * @end{parent}{name="generic/"}
44  *
45  */
state_definition(const config & cfg)46 state_definition::state_definition(const config& cfg)
47 	: canvas_cfg_(cfg ? cfg.child("draw") : cfg)
48 {
49 	VALIDATE(canvas_cfg_, _("No state or draw section defined."));
50 }
51 
52 /*WIKI
53  * @page = GUIToolkitWML
54  * @order = 1_widget
55  * @begin{parent}{name=generic/widget_definition/}
56  * == Resolution ==
57  * @begin{tag}{name="resolution"}{min="0"}{max="-1"}
58  *
59  * Depending on the resolution a widget can look different. Resolutions are
60  * evaluated in order of appearance. The ''window_width'' and ''window_height''
61  * are the upper limit this resolution is valid for. When one of the sizes
62  * gets above the limit, the next resolution is selected. There's one special
63  * case where both values are ''0''. This resolution always matches. (Resolution
64  * definitions behind that one will never be picked.) This resolution can be
65  * used as upper limit or if there's only one resolution.
66  *
67  * The default (and also minimum) size of a button is determined by two items,
68  * the wanted default size and the size needed for the text. The size of the
69  * text differs per used widget so needs to be determined per button.
70  *
71  * Container widgets like panels and windows have other rules for their sizes.
72  * Their sizes are based on the size of their children (and the border they need
73  * themselves). It's wise to set all sizes to 0 for these kind of widgets.
74  *
75  * @begin{table}{config}
76  * window_width & unsigned & 0 &   Width of the application window. $
77  * window_height & unsigned & 0 &  Height of the application window. $
78  *
79  *
80  * min_width & unsigned & 0 &      The minimum width of the widget. $
81  * min_height & unsigned & 0 &     The minimum height of the widget. $
82  *
83  *
84  * default_width & unsigned & 0 &  The default width of the widget. $
85  * default_height & unsigned & 0 & The default height of the widget. $
86  *
87  *
88  * max_width & unsigned & 0 &      The maximum width of the widget. $
89  * max_height & unsigned & 0 &     The maximum height of the widget. $
90  *
91  * text_extra_width & unsigned & 0 &
92  *     The extra width needed to determine the minimal size for the text. $
93  *
94  * text_extra_height & unsigned & 0 &
95  *     The extra height needed to determine the minimal size for the text. $
96  *
97  * text_font_family & font_family & "" &
98  *     The font family, needed to determine the minimal size for the text. $
99  *
100  * text_font_size & unsigned & 0 &
101  *     The font size, which needs to be used to determine the minimal size for
102  *     the text. $
103  *
104  * text_font_style & font_style & "" &
105  *     The font style, which needs to be used to determine the minimal size for
106  *     the text. $
107  *
108  *
109  * state & section & &
110  *     Every widget has one or more state sections. Note they aren't called
111  *     state but state_xxx the exact names are listed per widget. $
112  * @end{table}
113  * @end{tag}{name="resolution"}
114  * @end{parent}{name=generic/widget_definition/}
115  */
116 
resolution_definition(const config & cfg)117 resolution_definition::resolution_definition(const config& cfg)
118 	: window_width(cfg["window_width"])
119 	, window_height(cfg["window_height"])
120 	, min_width(cfg["min_width"])
121 	, min_height(cfg["min_height"])
122 	, default_width(cfg["default_width"])
123 	, default_height(cfg["default_height"])
124 	, max_width(cfg["max_width"])
125 	, max_height(cfg["max_height"])
126 	, linked_groups()
127 	, text_extra_width(cfg["text_extra_width"])
128 	, text_extra_height(cfg["text_extra_height"])
129 	, text_font_size(cfg["text_font_size"])
130 	, text_font_family(font::str_to_family_class(cfg["text_font_family"]))
131 	, text_font_style(decode_font_style(cfg["text_font_style"]))
132 	, state()
133 {
134 	DBG_GUI_P << "Parsing resolution " << window_width << ", " << window_height
135 			  << '\n';
136 
137 	linked_groups = parse_linked_group_definitions(cfg);
138 }
139 
140 /*WIKI
141  * @page = GUIWidgetDefinitionWML
142  * @order = 1
143  *
144  * {{Autogenerated}}
145  *
146  * = Widget definition =
147  *
148  * This page describes the definition of all widgets in the toolkit. Every
149  * widget has some parts in common, first of all; every definition has the
150  * following fields.
151  * @begin{parent}{name="generic/"}
152  * @begin{tag}{name=widget_definition}{min=0}{max=1}
153  * @begin{table}{config}
154  *     id & string & &               Unique id for this gui (theme). $
155  *     description & t_string & &    Unique translatable name for this gui. $
156  *
157  *     resolution & section & &      The definitions of the widget in various
158  *                                   resolutions. $
159  * @end{table}
160  * @end{tag}{name=widget_definition}
161  * @end{parent}{name="generic/"}
162  */
styled_widget_definition(const config & cfg)163 styled_widget_definition::styled_widget_definition(const config& cfg)
164 	: id(cfg["id"]), description(cfg["description"].t_str()), resolutions()
165 {
166 	VALIDATE(!id.empty(), missing_mandatory_wml_key("styled_widget", "id"));
167 	VALIDATE(!description.empty(),
168 			 missing_mandatory_wml_key("styled_widget", "description"));
169 
170 	/*
171 	 * Do this validation here instead of in load_resolutions so the
172 	 * translatable string is not in the header and we don't need to pull in
173 	 * extra header dependencies.
174 	 */
175 	config::const_child_itors itors = cfg.child_range("resolution");
176 	VALIDATE(!itors.empty(), _("No resolution defined."));
177 }
178 
179 } // namespace gui2
180