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