The Battle for Wesnoth  1.19.5+dev
debug.hpp
Go to the documentation of this file.
1 /*
2  Copyright (C) 2008 - 2024
3  by Mark de Wever <koraq@xs4all.nl>
4  Part of the Battle for Wesnoth Project https://www.wesnoth.org/
5 
6  This program is free software; you can redistribute it and/or modify
7  it under the terms of the GNU General Public License as published by
8  the Free Software Foundation; either version 2 of the License, or
9  (at your option) any later version.
10  This program is distributed in the hope that it will be useful,
11  but WITHOUT ANY WARRANTY.
12 
13  See the COPYING file for more details.
14 */
15 
16 #ifdef DEBUG_WINDOW_LAYOUT_GRAPHS
17 
18 #pragma once
19 
20 #include "gui/widgets/grid.hpp"
21 
22 #include <iosfwd>
23 #include <string>
24 
25 namespace gui2
26 {
27 
28 class widget;
29 class window;
30 
31 /**
32  * Helper class to output the layout to dot files.
33  *
34  * The class will generate .dot files in the location where wesnoth is running
35  * (so needs write access there). These files can be converted to images
36  * containing the graphs. This is used for debugging the widget library and its
37  * sizing algorithm.
38  *
39  * This class needs to be friends with a lot of classes so it can view the
40  * private data in the class. This design is chosen so the debug info can be
41  * put in a separate class instead of adding the info via virtual functions in
42  * the classes themselves. Also adding 'friend class foo' doesn't need to
43  * include the header declaring foo, so it avoids header cluttage.
44  *
45  */
46 class debug_layout_graph
47 {
48 public:
49  /**
50  * Constructor.
51  *
52  * @param window The window, whose information will be
53  * generated.
54  */
55  explicit debug_layout_graph(const window* window);
56 
57  /***** ***** ***** ***** FLAGS ***** ***** ***** *****/
58 
59  // domain flags
60  static const unsigned MANUAL = 0 << 0; /**<
61  * Shows the info when the F12 is
62  * pressed. The value 0 makes sure
63  * the domain is always valid.
64  */
65  static const unsigned SHOW = 1 << 0; /**<
66  * Shows the info when the dialog
67  * is shown.
68  */
69  static const unsigned LAYOUT = 1 << 1; /**<
70  * Shows the info in all layout
71  * phases.
72  */
73  /**
74  * Sets the level of wanted information.
75  *
76  * @param level A comma separated list of levels which are
77  * wanted. Possible values: child, size, state
78  * and all.
79  */
80  static void set_level(const std::string& level);
81 
82  /**
83  * Sets the domain when to show the information.
84  *
85  * @param domain A comma separated list for domains which are
86  * wanted. Possible values: show, layout and all.
87  */
88  static void set_domain(const std::string& domain);
89 
90  /**
91  * Generates a dot file.
92  *
93  * The file will have a fixed prefix filename but for every file a part of
94  * the name will contain where it was generated.
95  *
96  * @param generator The location where the name was generated.
97  */
98  void generate_dot_file(const std::string& generator, const unsigned domain);
99 
100 private:
101  /** The window whose info will be shown. */
102  const window* window_;
103 
104  /** The order in which the files are generated. */
105  unsigned sequence_number_;
106 
107  /** Basic part of the filename. */
108  std::string filename_base_;
109 
110  /***** ***** Widget ***** *****/
111 
112  /**
113  * Generates the info about a widget.
114  *
115  * @param out The stream to write the info to.
116  * @param widget The widget to write the info about.
117  * @param id The dof-file-id of the widget.
118  * @param embedded Is the grid embedded in a container eg parent
119  * inherits from container_base.
120  */
121  void widget_generate_info(std::ostream& out,
122  const widget* widget,
123  const std::string& id,
124  const bool embedded = false) const;
125 
126  /**
127  * Generates the basic info about a widget.
128  *
129  * @param out The stream to write the info to.
130  * @param widget The widget to write the info about.
131  */
132  void widget_generate_basic_info(std::ostream& out,
133  const widget* widget) const;
134 
135  /**
136  * Generates the info about the state of the widget.
137  *
138  * @param out The stream to write the info to.
139  * @param widget The widget to write the info about.
140  */
141  void widget_generate_state_info(std::ostream& out,
142  const widget* widget) const;
143 
144  /**
145  * Generates the info about the size and layout of the widget.
146  *
147  * @param out The stream to write the info to.
148  * @param widget The widget to write the info about.
149  */
150  void widget_generate_size_info(std::ostream& out,
151  const widget* widget) const;
152 
153  /***** ***** Grid ***** *****/
154 
155  /**
156  * Generates the info about a grid.
157  *
158  * @param out The stream to write the info to.
159  * @param grid The grid to write the info about.
160  * @param parent_id The dot-file-id of the parent of the widget.
161  */
162  void grid_generate_info(std::ostream& out,
163  const grid* grid,
164  const std::string& parent_id) const;
165 
166  /**
167  * Generates the info about a grid cell.
168  *
169  * @param out The stream to write the info to.
170  * @param child The grid cell to write the info about.
171  * @param id The dof-file-id of the child.
172  */
173  void child_generate_info(std::ostream& out,
174  const grid::child& child,
175  const std::string& id) const;
176 
177  /***** ***** Helper ***** *****/
178 
179  /**
180  * Returns the control_type of a widget.
181  *
182  * This is a small wrapper around styled_widget::get_control_type() since a
183  * grid is no styled_widget and used rather frequently, so we want to give it a
184  * type.
185  *
186  * @param widget The widget to get the type of.
187  *
188  * @returns If the widget is a styled_widget it returns its
189  * type. If the widget is a grid it returns
190  * 'grid', otherwise 'unknown' will be returned.
191  */
192  std::string get_type(const widget* widget) const;
193 };
194 
195 } // namespace gui2
196 
197 #endif
Generic file dialog.
rng * generator
This generator is automatically synced during synced context.
Definition: random.cpp:60