The Battle for Wesnoth  1.19.7+dev
window.hpp
Go to the documentation of this file.
1 /*
2  Copyright (C) 2007 - 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 /**
17  * @file
18  * This file contains the window object, this object is a top level container
19  * which has the event management as well.
20  */
21 
22 #pragma once
23 
24 #include "formula/callable.hpp"
25 #include "formula/function.hpp"
29 #include "gui/widgets/panel.hpp"
30 #include "gui/widgets/retval.hpp"
31 
32 #include "sdl/texture.hpp"
33 
34 #include <functional>
35 #include <map>
36 #include <memory>
37 #include <string>
38 #include <vector>
39 
40 
41 namespace gui2
42 {
43 
44 class widget;
45 namespace event { struct message; }
46 
47 // ------------ WIDGET -----------{
48 
49 namespace dialogs { class modal_dialog; }
50 
51 namespace event
52 {
53 class distributor;
54 } // namespace event
55 
56 /**
57  * base class of top level items, the only item which needs to store the final canvases to draw on.
58  * A window is a kind of panel see the panel for which fields exist.
59  */
60 class window : public panel, public top_level_drawable
61 {
62  friend class debug_layout_graph;
63  friend std::unique_ptr<window> build(const builder_window::window_resolution&);
64  friend struct window_implementation;
66  friend class pane;
67 
68 public:
69  explicit window(const builder_window::window_resolution& definition);
70 
71  virtual ~window();
72 
73  /**
74  * Returns the instance of a window.
75  *
76  * @param handle The instance id of the window.
77  *
78  * @returns The window or nullptr.
79  */
80  static window* window_instance(const unsigned handle);
81 
82  /** Gets the retval for the default buttons. */
83  static retval get_retval_by_id(const std::string& id);
84 
85  /**
86  * Shows the window, running an event loop until it should close.
87  *
88  * @param auto_close_timeout The time in ms after which the window will
89  * automatically close, if 0 it doesn't close.
90  * @note the timeout is a minimum time and
91  * there's no guarantee about how fast it closes
92  * after the minimum.
93  *
94  * @returns The close code of the window, predefined
95  * values are listed in retval.
96  */
97  int show(unsigned auto_close_timeout = 0);
98 
99  /**
100  * Shows the window as a tooltip.
101  *
102  * A tooltip can't be interacted with and is just shown.
103  *
104  * @todo implement @p auto_close_timeout.
105  *
106  * @p auto_close_timeout The time in ms after which the window will
107  * automatically close, if 0 it doesn't close.
108  * @note the timeout is a minimum time and
109  * there's no guarantee about how fast it closes
110  * after the minimum.
111  */
112  void show_tooltip(/*const unsigned auto_close_timeout = 0*/);
113 
114  /**
115  * Shows the window non modal.
116  *
117  * A tooltip can be interacted with unlike the tooltip.
118  *
119  * @todo implement @p auto_close_timeout.
120  *
121  * @p auto_close_timeout The time in ms after which the window will
122  * automatically close, if 0 it doesn't close.
123  * @note the timeout is a minimum time and
124  * there's no guarantee about how fast it closes
125  * after the minimum.
126  */
127  void show_non_modal(/*const unsigned auto_close_timeout = 0*/);
128 
129  /**
130  * Draws the window.
131  *
132  * This routine draws the window if needed, it's called from the event
133  * handler. This is done by a drawing event. When a window is shown it
134  * manages an SDL timer which fires a drawing event every X milliseconds,
135  * that event calls this routine. Don't call it manually.
136  */
137  void draw();
138 
139  /** Hides the window. It will not draw until it is shown again. */
140  void hide();
141 
142  /**
143  * Lays out the window.
144  *
145  * This part does the pre and post processing for the actual layout
146  * algorithm.
147  *
148  * See @ref layout_algorithm for more information.
149  *
150  * This is also called by draw_manager to finalize screen layout.
151  */
152  virtual void layout() override;
153 
154  /** Ensure the window's internal render buffer is up-to-date.
155  *
156  * This renders the window to an off-screen texture, which is then
157  * copied to the screen during expose().
158  */
159  virtual void render() override;
160 
161 private:
162  /** The internal render buffer used by render() and expose(). */
164 
165  /** The part of the window (if any) currently marked for rerender. */
167 
168  /** Parts of the window (if any) with rendering deferred to next frame */
169  std::vector<rect> deferred_regions_;
170 
171  /** Ensure render textures are valid and correct. */
172  void update_render_textures();
173 
174 public:
175  /**
176  * Called by draw_manager when it believes a redraw is necessary.
177  * Can be called multiple times per vsync.
178  */
179  virtual bool expose(const rect& region) override;
180 
181  /** The current draw location of the window, on the screen. */
182  virtual rect screen_location() override;
183 
184  /**
185  * Queue a rerender of the internal render buffer.
186  *
187  * This does not request a repaint. Ordinarily use queue_redraw()
188  * on a widget, which will call this automatically.
189  *
190  * @param region The region to rerender in screen coordinates.
191  */
192  void queue_rerender(const rect& region);
193  void queue_rerender();
194 
195  /**
196  * Defer rendering of a particular region to next frame.
197  *
198  * This is used for blur, which must render the region underneath once
199  * before rendering the blur.
200  *
201  * @param region The region to defer in screen coordinates.
202  */
203  void defer_region(const rect& region);
204 
205  /** The status of the window. */
206  enum class status {
207  NEW, /**< The window is new and not yet shown. */
208  SHOWING, /**< The window is being shown. */
209  REQUEST_CLOSE, /**< The window has been requested to be closed but still needs to evaluate the request. */
210  CLOSED /**< The window has been closed. */
211  };
212 
213  /**
214  * Requests to close the window.
215  *
216  * This request is not always honored immediately, and so callers must account for the window remaining open.
217  * For example, when overriding draw_manager's update() method.
218  */
219  void close()
220  {
222  }
223 
224  /**
225  * Helper class to block invalidate_layout.
226  *
227  * Some widgets can handling certain layout aspects without help. For
228  * example a listbox can handle hiding and showing rows without help but
229  * setting the visibility calls invalidate_layout(). When this blocker is
230  * Instantiated the call to invalidate_layout() becomes a nop.
231  *
232  * @note The class can't be used recursively.
233  */
235  {
236  public:
239 
240  private:
242  };
243 
244  /** Is invalidate_layout blocked, see invalidate_layout_blocker. */
246  {
248  }
249 
250  /**
251  * Updates the size of the window.
252  *
253  * If the window has automatic placement set this function recalculates the
254  * window. To be used after creation and after modification or items which
255  * can have different sizes eg listboxes.
256  */
257  void invalidate_layout();
258 
259  /** See @ref widget::find_at. */
260  virtual widget* find_at(const point& coordinate,
261  const bool must_be_active) override;
262 
263  /** See @ref widget::find_at. */
264  virtual const widget* find_at(const point& coordinate,
265  const bool must_be_active) const override;
266 
267  /** Inherited from widget. */
269  {
270  return owner_;
271  }
272 
273  /** See @ref widget::find. */
274  widget* find(const std::string_view id, const bool must_be_active) override;
275 
276  /** See @ref widget::find. */
277  const widget* find(const std::string_view id, const bool must_be_active) const override;
278 
279 #if 0
280  /** @todo Implement these functions. */
281  /**
282  * Register a widget that prevents easy closing.
283  *
284  * Duplicate registration are ignored. See click_dismiss_ for more info.
285  *
286  * @param id The id of the widget to register.
287  */
288  void add_click_dismiss_blocker(const std::string& id);
289 
290  /**
291  * Unregister a widget the prevents easy closing.
292  *
293  * Removing a non registered id is allowed but will do nothing. See
294  * click_dismiss_ for more info.
295  *
296  * @param id The id of the widget to register.
297  */
298  void remove_click_dismiss_blocker(const std::string& id);
299 #endif
300 
301  /**
302  * Does the window close easily?
303  *
304  * The behavior can change at run-time, but that might cause oddities
305  * with the easy close button (when one is needed).
306  *
307  * @returns Whether or not the window closes easily.
308  */
309  bool does_click_dismiss() const
310  {
312  }
313 
314  /**
315  * Disable the enter key.
316  *
317  * This is added to block dialogs from being closed automatically.
318  *
319  * @todo this function should be merged with the hotkey support once
320  * that has been added.
321  */
322  void set_enter_disabled(const bool enter_disabled)
323  {
324  enter_disabled_ = enter_disabled;
325  }
326 
327  /**
328  * Disable the escape key.
329  *
330  * This is added to block dialogs from being closed automatically.
331  *
332  * @todo this function should be merged with the hotkey support once
333  * that has been added.
334  */
335  void set_escape_disabled(const bool escape_disabled)
336  {
337  escape_disabled_ = escape_disabled;
338  }
339 
340  /**
341  * Initializes a linked size group.
342  *
343  * Note at least one of fixed_width or fixed_height must be true.
344  *
345  * @param id The id of the group.
346  * @param fixed_width Does the group have a fixed width?
347  * @param fixed_height Does the group have a fixed height?
348  */
349  void init_linked_size_group(const std::string& id,
350  const bool fixed_width,
351  const bool fixed_height);
352 
353  /**
354  * Is the linked size group defined for this window?
355  *
356  * @param id The id of the group.
357  *
358  * @returns True if defined, false otherwise.
359  */
360  bool has_linked_size_group(const std::string& id);
361 
362  /**
363  * Adds a widget to a linked size group.
364  *
365  * The group needs to exist, which is done by calling
366  * init_linked_size_group. A widget may only be member of one group.
367  * @todo Untested if a new widget is added after showing the widgets.
368  *
369  * @param id The id of the group.
370  * @param widget The widget to add to the group.
371  */
372  void add_linked_widget(const std::string& id, widget* widget);
373 
374  /**
375  * Removes a widget from a linked size group.
376  *
377  * The group needs to exist, which is done by calling
378  * init_linked_size_group. If the widget is no member of the group the
379  * function does nothing.
380  *
381  * @param id The id of the group.
382  * @param widget The widget to remove from the group.
383  */
384  void remove_linked_widget(const std::string& id, const widget* widget);
385 
386  /***** ***** ***** setters / getters for members ***** ****** *****/
387 
388  /**
389  * Sets there return value of the window.
390  *
391  * @param retval The return value for the window.
392  * @param close_window Close the window after setting the value.
393  */
394  void set_retval(const int retval, const bool close_window = true)
395  {
396  retval_ = retval;
397  if(close_window)
398  close();
399  }
400 
402  {
403  return retval_;
404  }
405 
407  {
408  owner_ = owner;
409  }
410 
412  {
414  }
415 
416  bool get_need_layout() const
417  {
418  return need_layout_;
419  }
420 
421  void set_variable(const std::string& key, const wfl::variant& value)
422  {
423  variables_.add(key, value);
424  queue_redraw();
425  }
426  point get_linked_size(const std::string& linked_group_id) const
427  {
428  std::map<std::string, linked_size>::const_iterator it = linked_size_.find(linked_group_id);
429  if(it != linked_size_.end()) {
430  return point(it->second.width, it->second.height);
431  }
432 
433  return point(-1, -1);
434  }
435 
436  enum class exit_hook {
437  /** Always run hook */
438  on_all,
439  /** Run hook *only* if result is OK. */
440  on_ok,
441  };
442 
443  /**
444  * Sets the window's exit hook.
445  *
446  * A window will only close if the given function returns true under the specified mode.
447  */
448  void set_exit_hook(exit_hook mode, std::function<bool(window&)> func)
449  {
450  exit_hook_ = [mode, func](window& w) {
451  switch(mode) {
452  case exit_hook::on_all:
453  return func(w);
454  case exit_hook::on_ok:
455  return w.get_retval() != OK || func(w);
456  default:
457  return true;
458  }
459  };
460  }
461 
462  enum class show_mode {
463  none,
464  modal,
465  modeless,
466  tooltip
467  };
468 
469 private:
470  /** The status of the window. */
472 
473  /**
474  * The mode in which the window is shown.
475  *
476  * This is used to determine whether or not to remove the tip.
477  */
479 
480  // return value of the window, 0 default.
481  int retval_;
482 
483  /** The dialog that owns the window. */
485 
486  /**
487  * When set the form needs a full layout redraw cycle.
488  *
489  * This happens when either a widget changes it's size or visibility or
490  * the window is resized.
491  */
493 
494  /** The variables of the canvas. */
496 
497  /** Is invalidate_layout blocked, see invalidate_layout_blocker. */
499 
500  /** Avoid drawing the window. */
501  bool hidden_;
502 
503  /** Do we wish to place the widget automatically? */
505 
506  /**
507  * Sets the horizontal placement.
508  *
509  * Only used if automatic_placement_ is true.
510  * The value should be a grid placement flag.
511  */
512  const unsigned horizontal_placement_;
513 
514  /**
515  * Sets the vertical placement.
516  *
517  * Only used if automatic_placement_ is true.
518  * The value should be a grid placement flag.
519  */
520  const unsigned vertical_placement_;
521 
522  /** The maximum width if automatic_placement_ is true. */
524 
525  /** The maximum height if automatic_placement_ is true. */
527 
528  /** The formula to calculate the x value of the dialog. */
530 
531  /** The formula to calculate the y value of the dialog. */
533 
534  /** The formula to calculate the width of the dialog. */
536 
537  /** The formula to calculate the height of the dialog. */
539 
540  /** The formula to determine whether the size is good. */
542 
543  /** The formula definitions available for the calculation formulas. */
545 
546  /** The settings for the tooltip. */
548 
549  /** The settings for the helptip. */
551 
552  /**
553  * Do we want to have easy close behavior?
554  *
555  * Easy closing means that whenever a mouse click is done the dialog will
556  * be closed. The widgets in the window may override this behavior by
557  * registering themselves as blockers. This is tested by the function
558  * disable_click_dismiss().
559  *
560  * The handling of easy close is done in the window, in order to do so a
561  * window either needs a click_dismiss or an ok button. Both will be hidden
562  * when not needed and when needed first the ok is tried and then the
563  * click_dismiss button. this allows adding a click_dismiss button to the
564  * window definition and use the ok from the window instance.
565  *
566  * @todo After testing the click dismiss feature it should be documented in
567  * the wiki.
568  */
570 
571  /** Disable the enter key see our setter for more info. */
573 
574  /** Disable the escape key see our setter for more info. */
576 
577  /**
578  * Helper struct to force widgets the have the same size.
579  *
580  * Widget which are linked will get the same width and/or height. This
581  * can especially be useful for listboxes, but can also be used for other
582  * applications.
583  */
584  struct linked_size
585  {
586  linked_size(const bool width = false, const bool height = false)
587  : widgets(), width(width ? 0 : -1), height(height ? 0 : -1)
588  {
589  }
590 
591  /** The widgets linked. */
592  std::vector<widget*> widgets;
593 
594  /** The current width of all widgets in the group, -1 if the width is not linked. */
595  int width;
596 
597  /** The current height of all widgets in the group, -1 if the height is not linked. */
598  int height;
599  };
600 
601  /** List of the widgets, whose size are linked together. */
602  std::map<std::string, linked_size> linked_size_;
603 
604  /** List of widgets in the tabbing order. */
605  std::vector<widget*> tab_order;
606 
607  /**
608  * Layouts the linked widgets.
609  *
610  * See @ref layout_algorithm for more information.
611  */
612  void layout_linked_widgets();
613 
614  /**
615  * Handles a mouse click event for dismissing the dialog.
616  *
617  * @param mouse_button_mask The SDL_BUTTON mask for the button used to
618  * dismiss the click. If the caller is from the
619  * keyboard code the value should be 0.
620  *
621  * @return Whether the event should be considered as
622  * handled.
623  */
624  bool click_dismiss(const int mouse_button_mask);
625 
626  /**
627  * The state of the mouse button.
628  *
629  * When click dismissing a dialog in the past the DOWN event was used.
630  * This lead to a bug [1]. The obvious change was to switch to the UP
631  * event, this lead to another bug; the dialog was directly dismissed.
632  * Since the game map code uses the UP and DOWN event to select a unit
633  * there is no simple solution.
634  *
635  * Upon entry this value stores the mouse button state at entry. When a
636  * button is DOWN and goes UP that button does \em not trigger a dismissal
637  * of the dialog, instead that button's down state is removed from this
638  * variable. Therefore the next UP event does dismiss the dialog.
639  *
640  * [1] https://gna.org/bugs/index.php?18970
641  */
643 
644 public:
645  /** Static type getter that does not rely on the widget being constructed. */
646  static const std::string& type();
647 
648 private:
649  /** Inherited from styled_widget, implemented by REGISTER_WIDGET. */
650  virtual const std::string& get_control_type() const override;
651 
652  /**
653  * In how many consecutive frames the window has changed. This is used to
654  * detect the situation where the title screen changes in every frame,
655  * forcing all other windows to redraw everything all the time.
656  */
657  unsigned int consecutive_changed_frames_ = 0u;
658 
659  /** Schedules windows on top of us (if any) to redraw. */
660  void redraw_windows_on_top() const;
661 
662  /**
663  * Finishes the initialization of the grid.
664  *
665  * @param content_grid The new contents for the content grid.
666  */
667  void finalize(const builder_grid& content_grid);
668 
669 #ifdef DEBUG_WINDOW_LAYOUT_GRAPHS
670  std::unique_ptr<debug_layout_graph> debug_layout_;
671 
672 public:
673  /** wrapper for debug_layout_graph::generate_dot_file. */
674  void generate_dot_file(const std::string& generator, const unsigned domain);
675 
676 private:
677 #else
678  void generate_dot_file(const std::string&, const unsigned)
679  {
680  }
681 #endif
682 
683  std::unique_ptr<event::distributor> event_distributor_;
684 
685 public:
686  /** Gets a reference to the window's distributor to allow some state peeking. */
688  {
689  return *event_distributor_;
690  }
691 
692  /** Returns the dialog mode for this window. */
693  show_mode mode() const
694  {
695  return show_mode_;
696  }
697 
698  // mouse and keyboard_capture should be renamed and stored in the
699  // dispatcher. Chaining probably should remain exclusive to windows.
700  void mouse_capture(const bool capture = true);
702 
703  /**
704  * Adds the widget to the keyboard chain.
705  *
706  * @todo rename to keyboard_add_to_chain.
707  * @param widget The widget to add to the chain. The widget
708  * should be valid widget, which hasn't been
709  * added to the chain yet.
710  */
712 
713  /**
714  * Remove the widget from the keyboard chain.
715  *
716  * @todo rename to keyboard_remove_from_chain.
717  *
718  * @param widget The widget to be removed from the chain.
719  */
721 
722  /**
723  * Add the widget to the tabbing order
724  * @param widget The widget to be added to the tabbing order
725  * @param at A hint for where to place the widget in the tabbing order
726  */
727  void add_to_tab_order(widget* widget, int at = -1);
728 
729 private:
730  /***** ***** ***** signal handlers ***** ****** *****/
731 
733  bool& handled,
734  const point& new_size);
735 
736  /**
737  * The handler for the click dismiss mouse 'event'.
738  *
739  * @param event See @ref event::dispatcher::fire.
740  * @param handled See @ref event::dispatcher::fire.
741  * @param halt See @ref event::dispatcher::fire.
742  * @param mouse_button_mask Forwared to @ref click_dismiss.
743  */
745  bool& handled,
746  bool& halt,
747  const int mouse_button_mask);
748 
750  bool& handled,
751  const SDL_Keycode key,
752  const SDL_Keymod mod,
753  bool handle_tab);
754 
756  bool& handled,
757  const event::message& message);
758 
760  bool& handled,
761  const event::message& message);
762 
764  bool& handled);
765 
767 
768  std::function<bool(window&)> exit_hook_;
769 };
770 
771 // }---------- DEFINITION ---------{
772 
774 {
775  explicit window_definition(const config& cfg);
776 
778  {
779  explicit resolution(const config& cfg);
780 
782  };
783 };
784 
785 // }------------ END --------------
786 
787 } // namespace gui2
A config object defines a single node in a WML file, with access to child nodes.
Definition: config.hpp:158
bool disable_click_dismiss() const override
See widget::disable_click_dismiss.
Main class to show messages to the user.
Definition: message.hpp:36
Abstract base class for all modal dialogs.
At the moment two kinds of tips are known:
Definition: tooltip.cpp:41
The event handler class for the widget library.
Basic template class to generate new items.
A pane is a container where new members can be added and removed during run-time.
Definition: pane.hpp:41
A top-level drawable item (TLD), such as a window.
Base class for all widgets.
Definition: widget.hpp:55
void queue_redraw()
Indicates that this widget should be redrawn.
Definition: widget.cpp:464
friend class window
Definition: widget.hpp:57
Helper class to block invalidate_layout.
Definition: window.hpp:235
base class of top level items, the only item which needs to store the final canvases to draw on.
Definition: window.hpp:61
void set_enter_disabled(const bool enter_disabled)
Disable the enter key.
Definition: window.hpp:322
bool need_layout_
When set the form needs a full layout redraw cycle.
Definition: window.hpp:492
void set_retval(const int retval, const bool close_window=true)
Sets there return value of the window.
Definition: window.hpp:394
std::function< bool(window &)> exit_hook_
Definition: window.hpp:768
show_mode mode() const
Returns the dialog mode for this window.
Definition: window.hpp:693
const unsigned vertical_placement_
Sets the vertical placement.
Definition: window.hpp:520
bool invalidate_layout_blocked_
Is invalidate_layout blocked, see invalidate_layout_blocker.
Definition: window.hpp:498
typed_formula< bool > reevaluate_best_size_
The formula to determine whether the size is good.
Definition: window.hpp:541
typed_formula< unsigned > maximum_width_
The maximum width if automatic_placement_ is true.
Definition: window.hpp:523
void remove_from_keyboard_chain(widget *widget)
Remove the widget from the keyboard chain.
Definition: window.cpp:1219
void keyboard_capture(widget *widget)
Definition: window.cpp:1207
void invalidate_layout()
Updates the size of the window.
Definition: window.cpp:761
void add_to_keyboard_chain(widget *widget)
Adds the widget to the keyboard chain.
Definition: window.cpp:1213
void signal_handler_message_show_tooltip(const event::ui_event event, bool &handled, const event::message &message)
Definition: window.cpp:1341
void mouse_capture(const bool capture=true)
Definition: window.cpp:1201
typed_formula< unsigned > maximum_height_
The maximum height if automatic_placement_ is true.
Definition: window.hpp:526
virtual rect screen_location() override
The current draw location of the window, on the screen.
Definition: window.cpp:740
void update_render_textures()
Ensure render textures are valid and correct.
Definition: window.cpp:643
void show_tooltip()
Shows the window as a tooltip.
Definition: window.cpp:432
int mouse_button_state_
The state of the mouse button.
Definition: window.hpp:642
void hide()
Hides the window.
Definition: window.cpp:627
void show_non_modal()
Shows the window non modal.
Definition: window.cpp:464
std::unique_ptr< event::distributor > event_distributor_
Definition: window.hpp:683
void signal_handler_sdl_video_resize(const event::ui_event event, bool &handled, const point &new_size)
Definition: window.cpp:1241
void set_exit_hook(exit_hook mode, std::function< bool(window &)> func)
Sets the window's exit hook.
Definition: window.hpp:448
virtual ~window()
Definition: window.cpp:380
unsigned int consecutive_changed_frames_
In how many consecutive frames the window has changed.
Definition: window.hpp:657
static window * window_instance(const unsigned handle)
Returns the instance of a window.
Definition: window.cpp:414
void close()
Requests to close the window.
Definition: window.hpp:219
status
The status of the window.
Definition: window.hpp:206
@ CLOSED
The window has been closed.
@ NEW
The window is new and not yet shown.
@ SHOWING
The window is being shown.
@ REQUEST_CLOSE
The window has been requested to be closed but still needs to evaluate the request.
builder_window::window_resolution::tooltip_info tooltip_
The settings for the tooltip.
Definition: window.hpp:547
bool invalidate_layout_blocked() const
Is invalidate_layout blocked, see invalidate_layout_blocker.
Definition: window.hpp:245
void signal_handler_sdl_key_down(const event::ui_event event, bool &handled, const SDL_Keycode key, const SDL_Keymod mod, bool handle_tab)
Definition: window.cpp:1275
virtual void layout() override
Lays out the window.
Definition: window.cpp:838
void signal_handler_message_show_helptip(const event::ui_event event, bool &handled, const event::message &message)
Definition: window.cpp:1355
dialogs::modal_dialog * dialog()
Inherited from widget.
Definition: window.hpp:268
void layout_linked_widgets()
Layouts the linked widgets.
Definition: window.cpp:1038
show_mode show_mode_
The mode in which the window is shown.
Definition: window.hpp:478
std::vector< widget * > tab_order
List of widgets in the tabbing order.
Definition: window.hpp:605
typed_formula< unsigned > h_
The formula to calculate the height of the dialog.
Definition: window.hpp:538
widget * find(const std::string_view id, const bool must_be_active) override
See widget::find.
Definition: window.cpp:778
int show(unsigned auto_close_timeout=0)
Shows the window, running an event loop until it should close.
Definition: window.cpp:498
rect awaiting_rerender_
The part of the window (if any) currently marked for rerender.
Definition: window.hpp:166
static const std::string & type()
Static type getter that does not rely on the widget being constructed.
void signal_handler_request_placement(const event::ui_event event, bool &handled)
Definition: window.cpp:1369
friend class debug_layout_graph
Definition: window.hpp:62
bool escape_disabled_
Disable the escape key see our setter for more info.
Definition: window.hpp:575
bool does_click_dismiss() const
Does the window close easily?
Definition: window.hpp:309
void signal_handler_close_window()
Definition: window.cpp:1379
bool click_dismiss_
Do we want to have easy close behavior?
Definition: window.hpp:569
void redraw_windows_on_top() const
Schedules windows on top of us (if any) to redraw.
void set_escape_disabled(const bool escape_disabled)
Disable the escape key.
Definition: window.hpp:335
void add_linked_widget(const std::string &id, widget *widget)
Adds a widget to a linked size group.
Definition: window.cpp:804
void defer_region(const rect &region)
Defer rendering of a particular region to next frame.
Definition: window.cpp:691
const unsigned horizontal_placement_
Sets the horizontal placement.
Definition: window.hpp:512
void queue_rerender()
Definition: window.cpp:677
static retval get_retval_by_id(const std::string &id)
Gets the retval for the default buttons.
Definition: window.cpp:419
bool get_need_layout() const
Definition: window.hpp:416
void set_click_dismiss(const bool click_dismiss)
Definition: window.hpp:411
void add_to_tab_order(widget *widget, int at=-1)
Add the widget to the tabbing order.
Definition: window.cpp:1225
const bool automatic_placement_
Do we wish to place the widget automatically?
Definition: window.hpp:504
void finalize(const builder_grid &content_grid)
Finishes the initialization of the grid.
Definition: window.cpp:1097
int get_retval()
Definition: window.hpp:401
virtual const std::string & get_control_type() const override
Inherited from styled_widget, implemented by REGISTER_WIDGET.
builder_window::window_resolution::tooltip_info helptip_
The settings for the helptip.
Definition: window.hpp:550
std::vector< rect > deferred_regions_
Parts of the window (if any) with rendering deferred to next frame.
Definition: window.hpp:169
bool hidden_
Avoid drawing the window.
Definition: window.hpp:501
bool click_dismiss(const int mouse_button_mask)
Handles a mouse click event for dismissing the dialog.
Definition: window.cpp:1084
typed_formula< unsigned > x_
The formula to calculate the x value of the dialog.
Definition: window.hpp:529
typed_formula< unsigned > y_
The formula to calculate the y value of the dialog.
Definition: window.hpp:532
void set_variable(const std::string &key, const wfl::variant &value)
Definition: window.hpp:421
point get_linked_size(const std::string &linked_group_id) const
Definition: window.hpp:426
void generate_dot_file(const std::string &, const unsigned)
Definition: window.hpp:678
virtual bool expose(const rect &region) override
Called by draw_manager when it believes a redraw is necessary.
Definition: window.cpp:719
wfl::map_formula_callable variables_
The variables of the canvas.
Definition: window.hpp:495
void remove_linked_widget(const std::string &id, const widget *widget)
Removes a widget from a linked size group.
Definition: window.cpp:818
void signal_handler_click_dismiss(const event::ui_event event, bool &handled, bool &halt, const int mouse_button_mask)
The handler for the click dismiss mouse 'event'.
Definition: window.cpp:1256
const event::distributor & get_distributor() const
Gets a reference to the window's distributor to allow some state peeking.
Definition: window.hpp:687
bool enter_disabled_
Disable the enter key see our setter for more info.
Definition: window.hpp:572
virtual void render() override
Ensure the window's internal render buffer is up-to-date.
Definition: window.cpp:697
@ on_all
Always run hook.
@ on_ok
Run hook only if result is OK.
dialogs::modal_dialog * owner_
The dialog that owns the window.
Definition: window.hpp:484
void init_linked_size_group(const std::string &id, const bool fixed_width, const bool fixed_height)
Initializes a linked size group.
Definition: window.cpp:789
void draw()
Draws the window.
Definition: window.cpp:600
typed_formula< unsigned > w_
The formula to calculate the width of the dialog.
Definition: window.hpp:535
wfl::function_symbol_table functions_
The formula definitions available for the calculation formulas.
Definition: window.hpp:544
void set_owner(dialogs::modal_dialog *owner)
Definition: window.hpp:406
status status_
The status of the window.
Definition: window.hpp:471
virtual widget * find_at(const point &coordinate, const bool must_be_active) override
See widget::find_at.
Definition: window.cpp:767
std::map< std::string, linked_size > linked_size_
List of the widgets, whose size are linked together.
Definition: window.hpp:602
texture render_buffer_
The internal render buffer used by render() and expose().
Definition: window.hpp:163
bool has_linked_size_group(const std::string &id)
Is the linked size group defined for this window?
Definition: window.cpp:799
friend std::unique_ptr< window > build(const builder_window::window_resolution &)
Wrapper class to encapsulate creation and management of an SDL_Texture.
Definition: texture.hpp:33
map_formula_callable & add(const std::string &key, const variant &value)
Definition: callable.hpp:253
int w
Various uncategorised dialogs.
void point(int x, int y)
Draw a single point.
Definition: draw.cpp:202
ui_event
The event sent to the dispatcher.
Definition: handler.hpp:115
Generic file dialog.
std::shared_ptr< builder_grid > builder_grid_ptr
retval
Default window/dialog return values.
Definition: retval.hpp:30
@ OK
Dialog was closed with the OK button.
Definition: retval.hpp:35
std::shared_ptr< halo_record > handle
Definition: halo.hpp:31
static std::string at(const std::string &file, int line)
map_location coordinate
Contains an x and y coordinate used for starting positions in maps.
Helper struct to store information about the tips.
The message callbacks hold a reference to a message.
Definition: message.hpp:46
Helper struct to force widgets the have the same size.
Definition: window.hpp:585
int height
The current height of all widgets in the group, -1 if the height is not linked.
Definition: window.hpp:598
linked_size(const bool width=false, const bool height=false)
Definition: window.hpp:586
int width
The current width of all widgets in the group, -1 if the width is not linked.
Definition: window.hpp:595
std::vector< widget * > widgets
The widgets linked.
Definition: window.hpp:592
window_definition(const config &cfg)
Definition: window.cpp:1386
Helper to implement private functions without modifying the header.
Holds a 2D point.
Definition: point.hpp:25
An abstract description of a rectangle with integer coordinates.
Definition: rect.hpp:47