OpenClonk
C4Gui.h
Go to the documentation of this file.
1 /*
2  * OpenClonk, http://www.openclonk.org
3  *
4  * Copyright (c) 2001-2009, RedWolf Design GmbH, http://www.clonk.de/
5  * Copyright (c) 2009-2016, The OpenClonk Team and contributors
6  *
7  * Distributed under the terms of the ISC license; see accompanying file
8  * "COPYING" for details.
9  *
10  * "Clonk" is a registered trademark of Matthes Bender, used with permission.
11  * See accompanying file "TRADEMARK" for details.
12  *
13  * To redistribute this file separately, substitute the full license texts
14  * for the above references.
15  */
16 // generic user interface
17 // defines user controls
18 
19 // 2do:
20 // mouse wheel processing
21 // disabled buttons
22 
23 #ifndef INC_C4Gui
24 #define INC_C4Gui
25 
26 #include "graphics/C4FacetEx.h"
27 #include "graphics/C4FontLoader.h"
28 #include "gui/C4KeyboardInput.h"
29 #include "lib/C4Rect.h"
30 #include "lib/C4LogBuf.h"
31 #include "object/C4Id.h"
32 #include "platform/C4Window.h"
33 #include "platform/StdScheduler.h"
34 
35 // consts (load those from a def file some time)
36 // font colors - alpha is font alpha, which is inversed opaque
37 #define C4GUI_CaptionFontClr 0xffffffff
38 #define C4GUI_Caption2FontClr 0xffffff00
39 #define C4GUI_InactCaptionFontClr 0xffafafaf
40 #define C4GUI_ButtonFontClr 0xffffff00
41 #define C4GUI_ButtonFontShadowClr 0xff000000
42 #define C4GUI_StatusFontClr 0xffffffff
43 #define C4GUI_MessageFontClr 0xffffffff
44 #define C4GUI_MessageFontAlpha 0xff000000
45 #define C4GUI_InactMessageFontClr 0xffafafaf
46 #define C4GUI_NotifyFontClr 0xffff0000
47 #define C4GUI_ComboFontClr 0xffffffff
48 #define C4GUI_CheckboxFontClr 0xffffffff
49 #define C4GUI_SmallCheckboxFontClr 0xffffffff
50 #define C4GUI_CheckboxDisabledFontClr 0xffafafaf
51 #define C4GUI_LogFontClr 0xffafafaf
52 #define C4GUI_LogFontClr2 0xffff1f1f
53 #define C4GUI_ErrorFontClr 0xffff1f1f
54 #define C4GUI_ProgressBarFontClr 0xffffffff
55 #define C4GUI_ContextFontClr 0xffffffff
56 #define C4GUI_GfxTabCaptActiveClr 0xff000000
57 #define C4GUI_GfxTabCaptInactiveClr 0xff000000
58 
59 // other colors
60 #define C4GUI_ImportantBGColor 0x2f00007f
61 #define C4GUI_ProgressBarColor 0x4fffffff
62 #define C4GUI_ListBoxSelColor 0x4faf0000
63 #define C4GUI_ListBoxInactSelColor 0x4f7f7f7f
64 #define C4GUI_ContextSelColor 0x4faf0000
65 #define C4GUI_ContextBGColor 0xaf3f1a00
66 #define C4GUI_StandardBGColor 0x9f000000
67 #define C4GUI_ActiveTabBGColor C4GUI_StandardBGColor
68 #define C4GUI_ListBoxBarColor 0x7f772200
69 #define C4GUI_EditBGColor 0x7f000000
70 #define C4GUI_EditFontColor 0xffffffff
71 
72 #define C4GUI_ToolTipBGColor 0xFFF1EA78
73 #define C4GUI_ToolTipFrameColor 0x7f000000
74 #define C4GUI_ToolTipColor 0xFF483222
75 
76 // winner/loser color marking
77 #define C4GUI_WinningTextColor 0xffffdf00
78 #define C4GUI_WinningBackgroundColor 0xafaf7a00
79 #define C4GUI_LosingTextColor 0xffffffff
80 #define C4GUI_LosingBackgroundColor 0x7fafafaf
81 
82 
83 // border colors for 3D-frames
84 #define C4GUI_BorderAlpha 0x4f
85 #define C4GUI_BorderColor1 0x772200
86 #define C4GUI_BorderColor2 0x331100
87 #define C4GUI_BorderColor3 0xaa4400
88 #define C4GUI_BorderColorA1 (C4GUI_BorderAlpha<<24 | C4GUI_BorderColor1)
89 #define C4GUI_BorderColorA2 (C4GUI_BorderAlpha<<24 | C4GUI_BorderColor2)
90 #define C4GUI_BorderColorA3 (C4GUI_BorderAlpha<<24 | C4GUI_BorderColor3)
91 
92 // GUI icon sizes
93 #define C4GUI_IconWdt 40
94 #define C4GUI_IconHgt 40
95 #define C4GUI_IconExWdt 64
96 #define C4GUI_IconExHgt 64
97 #define C4GUI_ControllerIconWdt 100
98 #define C4GUI_ControllerIconHgt 100
99 
100 #define C4GUI_IconLabelSpacing 2 // space between an icon and its text
101 
102 // scroll bar size
103 #define C4GUI_ScrollBarWdt 16
104 #define C4GUI_ScrollBarHgt 16
105 #define C4GUI_ScrollArrowHgt 16
106 #define C4GUI_ScrollArrowWdt 16
107 #define C4GUI_ScrollThumbHgt 16 // only for non-dynamic scroll thumbs
108 #define C4GUI_ScrollThumbWdt 16 // only for non-dynamic scroll thumbs
109 
110 // button size
111 #define C4GUI_ButtonHgt 32 // height of buttons
112 #define C4GUI_BigButtonHgt 40 // height of bigger buttons (main menu)
113 #define C4GUI_ButtonAreaHgt 40 // height of button areas
114 #define C4GUI_DefButtonWdt 140 // width of default buttons
115 #define C4GUI_DefButton2Wdt 120 // width of default buttons if there are two of them
116 #define C4GUI_DefButton2HSpace 10 // horzontal space between two def dlg buttons
117 
118 // default checkbox height
119 #define C4GUI_CheckBoxHgt 32
120 #define C4GUI_CheckBoxLabelSpacing 4 // pixels between checkbox box and label
121 
122 // list box item spacing
123 #define C4GUI_DefaultListSpacing 1 // 1 px of free space between two list items
124 #define C4GUI_ListBoxBarIndent 10
125 
126 // default dialog box sizes
127 #define C4GUI_MessageDlgWdt 500 // width of message dialog
128 #define C4GUI_MessageDlgWdtMedium 360 // width of message dialog w/o much text
129 #define C4GUI_MessageDlgWdtSmall 300 // width of message dialog w/o much text
130 #define C4GUI_ProgressDlgWdt 500 // width of progress dialog
131 #define C4GUI_InputDlgWdt 300
132 #define C4GUI_DefDlgIndent 10 // indent for default dlg items
133 #define C4GUI_DefDlgSmallIndent 4 // indent for dlg items that are grouped
134 #define C4GUI_MessageDlgVRoom 100 // height added to text height in message dialog
135 #define C4GUI_ProgressDlgVRoom 150 // height added to text height in progress dialog
136 #define C4GUI_InputDlgVRoom 150
137 #define C4GUI_ProgressDlgPBHgt 30 // height of progress bar in progress dlg
138 #define C4GUI_InfoDlgWdt 620 // width of info dialog
139 #define C4GUI_InfoDlgVRoom 100 // height added to text height in info dialog
140 #define C4GUI_MaxToolTipWdt 500 // maximum width for tooltip boxes
141 
142 // time for tooltips to appear (msecs) -evaluated while drawing
143 #define C4GUI_ToolTipShowTime 500 // 0.5 seconds
144 
145 // time for title bars to start scrolling to make longer text visible -evaluated while drawing
146 #define C4GUI_TitleAutoScrollTime 3000 // 3 seconds
147 
148 // time interval for tab caption scrolling
149 #define C4GUI_TabCaptionScrollTime 500 // 0.5 seconds
150 
151 // Z-ordering of dialogs
152 #define C4GUI_Z_CHAT +2 // chat input dialog more important than other input dialogs
153 #define C4GUI_Z_INPUT +1 // input dialogs on top of others
154 #define C4GUI_Z_DEFAULT 0 // normal placement on top of viewports
155 #define C4GUI_Z_PLAYERMENU -1 // inside viewport: player menu
156 #define C4GUI_Z_OBJECTMENU -2 // inside viewport: cursor menu
157 
158 #define C4GUI_MinWoodBarHgt 23
159 
160 #define C4GUI_FullscreenDlg_TitleHeight C4UpperBoardHeight // pixels reserved for top of fullscreen dialog title
161 #define C4GUI_FullscreenCaptionFontClr 0xffffff00
162 
163 namespace C4GUI
164 {
165 
166  // some class predefs
167 
168  // C4Gui.cpp
169  class Element; class Screen; class CMouse;
170  class ComponentAligner;
171 
172  // C4GuiLabels.cpp
173  class Label; class WoodenLabel; class MultilineLabel;
174  class HorizontalLine; class ProgressBar;
175  class Picture; class Icon; class PaintBox;
176  class TextWindow;
177 
178  // C4GuiContainers.cpp
179  class Container; class Window; class GroupBox; class Control;
180  class ScrollBar; class ScrollWindow;
181 
182  // C4GuiButton.cpp
183  class Button; template <class CallbackDlg, class Base> class CallbackButton;
184  class IconButton;
185  class CloseButton; class OKButton; class CancelButton;
186  class CloseIconButton; class OKIconButton; class CancelIconButton;
187 
188  // C4GuiEdit.cpp
189  class Edit;
190 
191  // C4GuiCheckBox.cpp
192  class CheckBox;
193 
194  // C4GuiListBox.cpp
195  class ListBox;
196 
197  // C4GuiTabular.cpp
198  class Tabular;
199 
200  // C4GuiMenu.cpp
201  class ContextMenu;
202  class ContextButton;
203 
204  // C4GUIComboBox.cpp
205  class ComboBox;
206 
207  // C4GuiDialog.cpp
208  class Dialog; class MessageDialog; class ProgressDialog;
209  class InputDialog; class InfoDialog;
210 
211  // inline
212  class MenuHandler; class ContextHandler;
213 
214 
215  // expand text like "Te&xt" to "Te<c ffff00>x</c>t". Color yellow for normal hotkey and red for tooltip.
216  bool ExpandHotkeyMarkup(StdStrBuf &sText, uint32_t &rcHotkey, bool for_tooltip = false);
217 
218  // make color readable on black: max alpha to 0x1f, max color hues
220 
221  // menu handler: generic context menu callback
223  {
224  public:
225  MenuHandler() = default; //ctor
226  virtual ~MenuHandler() = default; // dtor
227 
228  virtual void OnOK(Element *pTarget) = 0; // menu item selected
229  };
230 
231  // context handler: opens context menu on right-click or menu key
233  {
234  private:
235  int32_t iRefs{0};
236  public:
237  ContextHandler() = default; //ctor
238  virtual ~ContextHandler() = default; // dtor
239 
240  virtual bool OnContext(Element *pOnElement, int32_t iX, int32_t iY) = 0; // context queried - ret true if handled
241  virtual ContextMenu *OnSubcontext(Element *pOnElement) = 0; // subcontext queried
242 
243  inline void Ref() { ++iRefs; }
244  inline void DeRef() { if (!--iRefs) delete this; }
245  };
246 
247  // generic callback handler
249  {
250  private:
251  int32_t iRefs{0};
252  public:
253  BaseCallbackHandler() = default;
254  virtual ~BaseCallbackHandler() = default;
255 
256  inline void Ref() { ++iRefs; }
257  inline void DeRef() { if (!--iRefs) delete this; }
258 
259  virtual void DoCall(class Element *pElement) = 0;
260  };
261 
262  template <class CB> class CallbackHandler : public BaseCallbackHandler
263  {
264  public:
265  typedef void (CB::*Func)(class Element *pElement);
266 
267  private:
268  CB *pCBClass;
269  Func CBFunc;
270 
271  public:
272  void DoCall(class Element *pElement) override
273  {
274  ((pCBClass)->*CBFunc)(pElement);
275  }
276 
277  CallbackHandler(CB *pTarget, Func rFunc) : pCBClass(pTarget), CBFunc(rFunc) {}
278  };
279 
280  template <class CB> class CallbackHandlerNoPar : public BaseCallbackHandler
281  {
282  public:
283  typedef void (CB::*Func)();
284 
285  private:
286  CB *pCBClass;
287  Func CBFunc;
288 
289  public:
290  void DoCall(class Element *pElement) override
291  {
292  ((pCBClass)->*CBFunc)();
293  }
294 
295  CallbackHandlerNoPar(CB *pTarget, Func rFunc) : pCBClass(pTarget), CBFunc(rFunc) {}
296  };
297 
298  template <class CB, class ParType> class CallbackHandlerExPar : public BaseCallbackHandler
299  {
300  public:
301  typedef void (CB::*Func)(ParType);
302 
303  private:
304  CB *pCBClass;
305  ParType par;
306  Func CBFunc;
307 
308  public:
309  void DoCall(class Element *pElement) override
310  {
311  ((pCBClass)->*CBFunc)(par);
312  }
313 
314  CallbackHandlerExPar(CB *pTarget, Func rFunc, ParType par) : pCBClass(pTarget), par(par), CBFunc(rFunc) {}
315  };
316 
317  // callback with parameter coming from calling class
318  template <class ParType> class BaseParCallbackHandler : public BaseCallbackHandler
319  {
320  protected:
321  void DoCall(class Element *pElement) override {assert(false);} // no-par: Not to be called
322  public:
324 
325  virtual void DoCall(ParType par) = 0;
326  };
327 
328  template <class CB, class ParType> class ParCallbackHandler : public BaseParCallbackHandler<ParType>
329  {
330  public:
331  typedef void (CB::*Func)(ParType par);
332 
333  private:
334  CB *pCBClass;
335  Func CBFunc;
336 
337 
338  protected:
339  // not to be called, but avoid warning for hiding base class functions
341 
342  public:
343  void DoCall(ParType par) override { ((pCBClass)->*CBFunc)(par); }
344 
345  ParCallbackHandler(CB *pTarget, Func rFunc) : pCBClass(pTarget), CBFunc(rFunc) {}
346  };
347 
348  // three facets for left/top, middle and right/bottom of an auto-sized bar
349  struct DynBarFacet
350  {
352 
353  void SetHorizontal(C4Surface &rBySfc, int iHeight=0, int iBorderWidth=0);
354  void SetHorizontal(C4Facet &rByFct, int32_t iBorderWidth=0);
356  };
357 
358  // facets used to draw a scroll bar
360  {
363 
364  void Set(const C4Facet &rByFct, int32_t iPinIndex=0);
366  };
367 
368  // a generic gui-element
369  class Element
370  {
371  private:
372  StdStrBuf ToolTip; // MouseOver - status text
373  bool is_immediate_tooltip{false};
374 
375  protected:
376  Container *pParent{nullptr}; // owning container
377  Element *pPrev, *pNext; // previous and next element of same container
378  Window *pDragTarget{nullptr}; // target that is dragged around when the user drags this element
379  int32_t iDragX, iDragY; // drag start pos
380  bool fDragging{false}; // if set, mouse is down on component and dragging enabled
381  ContextHandler *pContextHandler{nullptr}; // context handler to be called upon context menu request
382  public:
383  bool fVisible{true}; // if false, component (and subcomponents) are not drawn
384  protected:
385  C4Rect rcBounds; // element bounds
386 
387  virtual void Draw(C4TargetFacet &cgo) { DrawElement(cgo); } // draw this class (this + any contents)
388  virtual void DrawElement(C4TargetFacet &cgo) { }; // draw element itself
389 
390  virtual void RemoveElement(Element *pChild); // clear ptrs
391 
392  virtual void UpdateSize(); // called when own size changed
393  virtual void UpdatePos(); // called when own position changed
394 
395  void Draw3DFrame(C4TargetFacet &cgo, bool fUp=false, int32_t iIndent=1, BYTE byAlpha=C4GUI_BorderAlpha, bool fDrawTop=true, int32_t iTopOff=0, bool fDrawLeft=true, int32_t iLeftOff=0); // draw frame around element
396  void DrawBar(C4TargetFacet &cgo, DynBarFacet &rFacets); // draw gfx bar within element bounds
397  void DrawVBar(C4TargetFacet &cgo, DynBarFacet &rFacets); // draw gfx bar within element bounds
398  void DrawHBarByVGfx(C4TargetFacet &cgo, DynBarFacet &rFacets); // draw horizontal gfx bar within element bounds, using gfx of vertical one
399  void DrawHVBar(C4TargetFacet &cgo, DynBarFacet &rFacets, C4DrawTransform &trf, int32_t iMiddleLength);
400 
401  virtual bool IsOwnPtrElement() { return false; } // if true is returned, item will not be deleted when container is cleared
402  virtual bool IsExternalDrawDialog() { return false; }
403  virtual bool IsMenu() { return false; }
404  virtual class DialogWindow* GetDialogWindow() { return nullptr; } // return DialogWindow if this element is a dialog
405 
406  // for listbox-selection by character input
407  virtual bool CheckNameHotkey(const char *) { return false; }
408 
409  public:
410  virtual Container *GetContainer() { return pParent; } // returns parent for elements; this for containers
411 
412  virtual void MouseInput(CMouse &rMouse, int32_t iButton, int32_t iX, int32_t iY, DWORD dwKeyParam); // input: mouse movement or buttons
413  virtual void MouseEnter(CMouse &rMouse) {}; // called when mouse cursor enters element region
414  virtual void MouseLeave(CMouse &rMouse) {}; // called when mouse cursor leaves element region
415 
416  virtual void StartDragging(CMouse &rMouse, int32_t iX, int32_t iY, DWORD dwKeyParam); // called by element in MouseInput: start dragging
417  virtual void DoDragging(CMouse &rMouse, int32_t iX, int32_t iY, DWORD dwKeyParam); // called by mouse: dragging process
418  virtual void StopDragging(CMouse &rMouse, int32_t iX, int32_t iY, DWORD dwKeyParam); // called by mouse: mouse released after dragging process
419 
420  virtual bool OnHotkey(uint32_t cHotkey) { return false; } // return true when hotkey has been processed
421 
422  public:
423  bool DoContext(); // open context menu if assigned
424 
425  public:
426  Element(); // ctor
427  virtual ~Element(); // dtor
428 
429  Container *GetParent() { return pParent; } // get owning container
430  virtual class Dialog *GetDlg(); // return contained dialog
431  virtual Screen *GetScreen(); // return contained screen
432  virtual Control *IsFocusElement() { return nullptr; }; // return control to gain focus in search-cycle
433 
434  virtual void UpdateOwnPos() { }; // called when element bounds were changed externally
435  void ScreenPos2ClientPos(int32_t &riX, int32_t &riY); // transform screen coordinates to element coordinates
436  void ClientPos2ScreenPos(int32_t &riX, int32_t &riY); // transform element coordinates to screen coordinates
437 
438  void SetToolTip(const char *szNewTooltip, bool is_immediate = false); // update used tooltip
439  const char *GetToolTip(); // return tooltip const char* (own or fallback to parent)
440  const char *GetOwnToolTip() { return ToolTip.getData(); } // return tooltip const char*, without fallback to parent
441  bool IsImmediateToolTip() const { return is_immediate_tooltip; }
442 
443  int32_t GetWidth() { return rcBounds.Wdt; }
444  int32_t GetHeight() { return rcBounds.Hgt; }
445  C4Rect &GetBounds() { return rcBounds; }
446  void SetBounds(const C4Rect &rcNewBound) { rcBounds=rcNewBound; UpdatePos(); UpdateSize(); }
447  virtual C4Rect &GetClientRect() { return rcBounds; }
448  C4Rect GetContainedClientRect() { C4Rect rc=GetClientRect(); rc.x=rc.y=0; return rc; }
449  Element *GetNext() const { return pNext; }
450  Element *GetPrev() const { return pPrev; }
451  virtual Element *GetFirstNestedElement(bool fBackwards) { return this; }
452  virtual Element *GetFirstContained() { return nullptr; }
453  bool IsInActiveDlg(bool fForKeyboard);
454  virtual bool IsParentOf(Element *pEl) { return false; } // whether this is the parent container (directly or recursively) of the passed element
455 
456  C4Rect GetToprightCornerRect(int32_t iWidth=16, int32_t iHeight=16, int32_t iHIndent=4, int32_t iVIndent=4, int32_t iIndexX=0); // get rectangle to be used for context buttons and stuff
457 
458  bool IsVisible();
459  virtual void SetVisibility(bool fToValue);
460 
461  virtual int32_t GetListItemTopSpacing() { return C4GUI_DefaultListSpacing; }
462  virtual bool GetListItemTopSpacingBar() { return false; }
463 
464  void SetDragTarget(Window *pToWindow) { pDragTarget = pToWindow; }
465  void SetContextHandler(ContextHandler *pNewHd) // takes over ptr
466  {
468  if ((pContextHandler = pNewHd)) pNewHd->Ref();
469  }
470  virtual ContextHandler *GetContextHandler(); // get context handler to be used (own or parent)
471 
472  friend class Container; friend class TextWindow; friend class ListBox;
473  };
474 
475  // a simple text label on the screen
476  class Label : public Element
477  {
478  protected:
479  StdStrBuf sText; // label text
480  DWORD dwFgClr; // text color
481  int32_t x0, iAlign; // x-textstart-pos; horizontal alignment
483  uint32_t cHotkey; // hotkey for this label
484  bool fAutosize;
485  bool fMarkup;
486 
487  Control *pClickFocusControl; // control that gets focus if the label is clicked or hotkey is pressed
488 
489  void DrawElement(C4TargetFacet &cgo) override; // output label
490  void UpdateOwnPos() override;
491 
492  bool OnHotkey(uint32_t cHotkey) override; // focus control on correct hotkey
493 
494  virtual int32_t GetLeftIndent() { return 0; }
495 
496  public:
497  Label(const char *szLblText, int32_t iX0, int32_t iTop, int32_t iAlign=ALeft, DWORD dwFClr=0xffffffff, CStdFont *pFont=nullptr, bool fMakeReadableOnBlack = true, bool fMarkup=true); // ctor
498  Label(const char *szLblText, const C4Rect &rcBounds, int32_t iAlign=ALeft, DWORD dwFClr=0xffffffff, CStdFont *pFont=nullptr, bool fMakeReadableOnBlack = true, bool fAutosize = true, bool fMarkup=true); // ctor
499 
500  void MouseInput(CMouse &rMouse, int32_t iButton, int32_t iX, int32_t iY, DWORD dwKeyParam) override; // input: mouse
501 
502  void SetText(const char *szToText, bool fAllowHotkey=true); // update text
503  const char *GetText() { return sText.getData(); } // retrieve current text
504  void SetClickFocusControl(Control *pToCtrl) { pClickFocusControl=pToCtrl; }
505  void SetColor(DWORD dwToClr, bool fMakeReadableOnBlack=true) { dwFgClr = fMakeReadableOnBlack ? MakeColorReadableOnBlack(dwToClr) : dwToClr; } // update label color
506  void SetX0(int32_t iToX0);
507  void SetAutosize(bool fToVal) { fAutosize = fToVal; }
508  };
509 
510  // a label with some wood behind
511  // used for captions
512  class WoodenLabel : public Label
513  {
514  private:
515  uint32_t iAutoScrollDelay; // if set and text is longer than would fit, the label will automatically start moving if not changed and displayed for a while
516 
517  // Time when the label text was changed last. nullptr if not initialized; set upon first drawing
518  C4TimeMilliseconds tLastChangeTime;
519  int32_t iScrollPos, iScrollDir;
520  int32_t iRightIndent;
521  protected:
522  void DrawElement(C4TargetFacet &cgo) override; // output label
523 
524  C4Facet fctIcon; // icon shown at left-side of label; if set, text is aligned to left
525 
526  int32_t GetLeftIndent() override { return fctIcon.Surface ? rcBounds.Hgt : 0; }
527  int32_t GetRightIndent() const { return iRightIndent; }
528 
529  public:
530  WoodenLabel(const char *szLblText, const C4Rect &rcBounds, DWORD dwFClr=0xffffffff, CStdFont *pFont=nullptr, int32_t iAlign=ACenter, bool fMarkup=true) // ctor
531  : Label(szLblText, rcBounds, iAlign, dwFClr, pFont, true, true, fMarkup), iAutoScrollDelay(0), tLastChangeTime(C4TimeMilliseconds::Now()), iScrollPos(0), iScrollDir(0), iRightIndent(0)
532  { SetAutosize(false); this->rcBounds=rcBounds; }// ctor - re-sets bounds after SetText
533 
534  static int32_t GetDefaultHeight(CStdFont *pUseFont=nullptr);
535 
536  void SetIcon(const C4Facet &rfctIcon);
537  void SetAutoScrollTime(uint32_t tDelay) { iAutoScrollDelay=tDelay; ResetAutoScroll(); }
538  void ResetAutoScroll();
539 
540  void SetRightIndent(int32_t iNewIndent) { iRightIndent = iNewIndent; }
541  };
542 
543  // a multiline label with automated text clipping
544  // used for display of log buffers
545  class MultilineLabel : public Element
546  {
547  protected:
549  bool fMarkup;
550 
551  protected:
552  void DrawElement(C4TargetFacet &cgo) override; // output label
553  void UpdateHeight();
554  void UpdateSize() override; // update label height
555 
556  public:
557  MultilineLabel(const C4Rect &rcBounds, int32_t iMaxLines, int32_t iMaxBuf, const char *szIndentChars, bool fAutoGrow, bool fMarkup); // ctor
558 
559  void AddLine(const char *szLine, CStdFont *pFont, DWORD dwClr, bool fDoUpdate, bool fMakeReadableOnBlack, CStdFont *pCaptionFont); // add line of text
560  void Clear(bool fDoUpdate); // clear lines
561 
562  friend class TextWindow;
563  };
564 
565  // a bar that show progress
566  class ProgressBar : public Element
567  {
568  protected:
569  int32_t iProgress, iMax;
570 
571  void DrawElement(C4TargetFacet &cgo) override; // draw progress bar
572 
573  public:
574  ProgressBar(C4Rect &rrcBounds, int32_t iMaxProgress=100) // progress bar ctor
575  : Element(), iProgress(0), iMax(iMaxProgress)
576  { rcBounds=rrcBounds; UpdatePos(); }
577 
578  void SetProgress(int32_t iToProgress) { iProgress = iToProgress; }
579  };
580 
581  // Auxiliary design gfx: a horizontal line
582  class HorizontalLine : public Element
583  {
584  protected:
585  uint32_t dwClr, dwShadowClr;
586 
587  void DrawElement(C4TargetFacet &cgo) override; // draw horizontal line
588  public:
589  HorizontalLine(C4Rect &rrcBounds, uint32_t dwClr=0x000000, uint32_t dwShadowClr=0xaf7f7f7f)
591  { SetBounds(rrcBounds); }
592  };
593 
594  // picture displaying a FacetEx
595  class Picture : public Element
596  {
597  protected:
598  C4FacetSurface Facet; // picture facet
599  bool fAspect; // preserve width/height-ratio when drawing
600  bool fCustomDrawClr; // custom drawing color for clrbyowner-surfaces
601  uint32_t dwDrawClr;
602  bool fAnimate; // if true, the picture is animated. Whoaa!
603  int32_t iPhaseTime, iAnimationPhase, iDelay; // current animation phase - undefined if not animated
604 
605  void DrawElement(C4TargetFacet &cgo) override; // draw the image
606 
607  public:
608  Picture(const C4Rect &rcBounds, bool fAspect); // ctor - does not load image
609 
610  const C4FacetSurface &GetFacet() const { return Facet; } // get picture facet
611  C4FacetSurface &GetMFacet() { return Facet; } // get picture facet
612  void SetFacet(const C4Facet &fct) { Facet.Clear(); Facet.Set(fct); }
613  bool EnsureOwnSurface(); // create an own surface, if it's just a link
614  void SetDrawColor(uint32_t dwToClr) { dwDrawClr = dwToClr; fCustomDrawClr = true; }
615  void SetAnimated(bool fEnabled, int iDelay); // starts/stops cycling through all phases of the specified facet
616  };
617 
618  // picture displaying two facets
619  class OverlayPicture : public Picture
620  {
621  protected:
622  int iBorderSize; // border of overlay image if not zoomed
623  C4Facet OverlayImage; // image to be displayed on top of the actual picture
624 
625  void DrawElement(C4TargetFacet &cgo) override; // draw the image
626 
627  public:
628  OverlayPicture(const C4Rect &rcBounds, bool fAspect, const C4Facet &rOverlayImage, int iBorderSize); // ctor - does not load image
629  };
630 
631  // icon indices
632  enum
633  {
634  Ico_Extended = 0x100, // icon index offset for extended icons
635  Ico_Controller = 0x200,
636  };
637  enum Icons
638  {
639  Ico_Empty = -2, // for context menus only
640  Ico_None = -1,
643  Ico_Wait = 2,
645  Ico_Host = 4,
652  Ico_Error = 11,
654  Ico_Save = 13,
659  Ico_Kick = 16,
662  Ico_Team = 19,
665  Ico_Chart = 21,
666  Ico_Gfx = 22,
667  Ico_Sound = 23,
672  Ico_Help = 28,
675  Ico_Lobby = 31,
677  Ico_Exit = 33,
678  Ico_Close = 34,
679  Ico_Rank1 = 35,
680  Ico_Rank2 = 36,
681  Ico_Rank3 = 37,
682  Ico_Rank4 = 38,
683  Ico_Rank5 = 39,
684  Ico_Rank6 = 40,
685  Ico_Rank7 = 41,
686  Ico_Rank8 = 42,
687  Ico_Rank9 = 43,
691  Ico_Ready = 47,
692  Ico_Star = 48,
694  Ico_View = 50,
695 // Ico_RegJoinOnly = 51,
697 
700 // Ico_Ex_FairCrew = Ico_Extended + 2,
707 // Ico_Ex_FairCrewGray = Ico_Extended + 9,
716 
734  };
735 
736  // cute, litte, useless thingy
737  class Icon : public Picture
738  {
739  public:
740  Icon(const C4Rect &rcBounds, Icons icoIconIndex);
741 
742  void SetIcon(Icons icoNewIconIndex);
743  static C4Facet GetIconFacet(Icons icoIconIndex);
744  };
745 
746  // a collection of gui-elements
747  class Container : public Element
748  {
749  protected:
750  Element *pFirst, *pLast; // contained elements
751 
752  void Draw(C4TargetFacet &cgo) override; // draw all elements
753  virtual void ElementSizeChanged(Element *pOfElement) { } // called when an element size is changed
754  virtual void ElementPosChanged(Element *pOfElement) { } // called when an element position is changed
755 
756  virtual void AfterElementRemoval()
757  { if (pParent) pParent->AfterElementRemoval(); } // called by ScrollWindow to parent after an element has been removed
758 
759  bool OnHotkey(uint32_t cHotkey) override; // check all contained elements for hotkey
760 
761  public:
762  Container(); // ctor
763  ~Container() override; // dtor
764 
765  void Clear(); // delete all child elements
766  void ClearChildren(); // delete all child elements
767  void RemoveElement(Element *pChild) override; // remove child element from container
768  void MakeLastElement(Element *pChild); // resort to the end of the list
769  void AddElement(Element *pChild); // add child element to container
770  void ReaddElement(Element *pChild); // resort child element to end of list
771  void InsertElement(Element *pChild, Element *pInsertBefore); // add child element to container, ordered directly before given, other element
772  Element *GetNextNestedElement(Element *pPrevElement, bool fBackwards); // get next element after given, applying recursion
773  Element *GetFirstContained() override { return pFirst; }
774  virtual Element *GetLastContained() { return pLast; }
775  Element *GetFirstNestedElement(bool fBackwards) override;
776 
777  class Iterator
778  {
779  private:
780  Element *current;
781  public:
782  Iterator(Element *element = nullptr) : current(element) { }
783 
784  Element * operator*() const { return current; }
785  Element * operator->() const { return current; }
786  void operator++() { current = current->GetNext(); };
787  void operator++(int) { operator++(); }
788 
789  bool operator==(const Iterator & other) const
790  {
791  return (current == other.current);
792  }
793 
794  bool operator!=(const Iterator & other) const
795  {
796  return !(*this == other);
797  }
798  };
799 
801  {
802  private:
803  Element *current;
804  public:
805  ReverseIterator(Element *element = nullptr) : current(element) { }
806 
807  Element * operator*() const { return current; }
808  Element * operator->() const { return current; }
809  void operator++() { current = current->GetPrev(); };
810  void operator++(int) { operator++(); }
811 
812  bool operator==(const ReverseIterator & other) const
813  {
814  return (current == other.current);
815  }
816 
817  bool operator!=(const ReverseIterator & other) const
818  {
819  return !(*this == other);
820  }
821  };
822 
823  // provide C++-style iterator interface
824  Iterator begin() { return Iterator(pFirst); }
825  Iterator end() { return Iterator(nullptr); }
827  ReverseIterator rend() { return ReverseIterator(nullptr); }
828 
829  Element *GetFirst() { return pFirst; }
830  Element *GetLast() { return pLast; }
831  Container *GetContainer() override { return this; } // returns parent for elements; this for containers
832  Element *GetElementByIndex(int32_t i); // get indexed child element
833  int32_t GetElementCount();
834 
835  void SetVisibility(bool fToValue) override;
836  virtual bool IsFocused(Control *pCtrl) { return pParent ? pParent->IsFocused(pCtrl) : false; }
837  virtual bool IsSelectedChild(Element *pChild) { return pParent ? pParent->IsSelectedChild(pChild) : true; } // whether the child element is selected - only false for list-box-containers which can have unselected children
838  bool IsParentOf(Element *pEl) override; // whether this is the parent container (directly or recursively) of the passed element
839 
840  virtual void ApplyElementOffset(int32_t &riX, int32_t &riY) {} // apply child drawing offset
841  virtual void ApplyInvElementOffset(int32_t &riX, int32_t &riY) {} // subtract child drawing offset
842 
843 
844  friend class Element; friend class ScrollWindow;
845  };
846 
847  // a rectangled control that contains other elements
848  class Window : public Container
849  {
850  protected:
851  C4Rect rcClientRect; // area for contained elements
852 
853  void Draw(C4TargetFacet &cgo) override; // draw this window
854 
855  public:
856  Window(); // ctor
857 
858  void MouseInput(CMouse &rMouse, int32_t iButton, int32_t iX, int32_t iY, DWORD dwKeyParam) override; // input: mouse movement or buttons
859 
860  void SetPos(int32_t iXPos, int32_t iYPos)
861  { rcBounds.x=iXPos; rcBounds.y=iYPos; UpdatePos(); }
862 
863  void UpdateOwnPos() override; // update client rect
864  C4Rect &GetClientRect() override { return rcClientRect; }
865 
866  void ApplyElementOffset(int32_t &riX, int32_t &riY) override
867  { riX -= rcClientRect.x; riY -= rcClientRect.y; }
868  void ApplyInvElementOffset(int32_t &riX, int32_t &riY) override
869  { riX += rcClientRect.x; riY += rcClientRect.y; }
870  virtual bool IsComponentOutsideClientArea() { return false; } // if set, drawing routine of subcomponents will clip to Bounds rather than to ClientRect
871 
872  // get margins from bounds to client rect
873  virtual int32_t GetMarginTop() { return 0; }
874  virtual int32_t GetMarginLeft() { return 0; }
875  virtual int32_t GetMarginRight() { return 0; }
876  virtual int32_t GetMarginBottom() { return 0; }
877  };
878 
879  // a scroll bar
880  class ScrollBar : public Element
881  {
882  protected:
883  bool fScrolling; // if set, scrolling is currently enabled
884  bool fAutoHide; // if set, bar is made invisible if scrolling is not possible anyway
885  int32_t iScrollThumbSize; // height(/width) of scroll thumb
886  int32_t iScrollPos; // y(/x) offset of scroll thumb
887  bool fTopDown, fBottomDown; // whether scrolling buttons are pressed
888  bool fHorizontal; // if set, the scroll bar is horizontal instead of vertical
889  int32_t iCBMaxRange; // range for callback class
890 
891  ScrollWindow *pScrollWindow; // associated scrolled window - may be 0 for callback scrollbars
892  BaseParCallbackHandler<int32_t> *pScrollCallback; // callback called when scroll pos changes
893 
895 
896  void Update(); // update scroll bar according to window
897  void OnPosChanged(); // update window according to scroll bar, and/or do callbacks
898 
899  void DrawElement(C4TargetFacet &cgo) override; // draw scroll bar
900 
901  // suppress scrolling pin for very narrow menus
902  bool HasPin()
903  {
906  }
907  int32_t GetMaxScroll()
908  {
910  else return HasPin() ? GetBounds().Hgt - 2*C4GUI_ScrollArrowHgt - iScrollThumbSize : 100;
911  }
912  int32_t GetScrollByPos(int32_t iX, int32_t iY)
913  {
914  return Clamp<int32_t>((fHorizontal ? iX-C4GUI_ScrollArrowWdt : iY-C4GUI_ScrollArrowHgt)-iScrollThumbSize/2, 0, GetMaxScroll());
915  }
916  bool IsScrolling() { return fScrolling; }
917 
918  public:
919  ScrollBar(C4Rect &rcBounds, ScrollWindow *pWin); // ctor for scroll window
920  ScrollBar(C4Rect &rcBounds, bool fHorizontal, BaseParCallbackHandler<int32_t> *pCB, int32_t iCBMaxRange=256); // ctor for callback
921  ~ScrollBar() override; // dtor
922 
923  // mouse handling
924  void MouseInput(CMouse &rMouse, int32_t iButton, int32_t iX, int32_t iY, DWORD dwKeyParam) override; // input: mouse movement or buttons
925  void DoDragging(CMouse &rMouse, int32_t iX, int32_t iY, DWORD dwKeyParam) override; // dragging: allow dragging of thumb
926  void MouseLeave(CMouse &rMouse) override; // mouse leaves with button down: reset down state of buttons
927 
928  // change style
930  { pCustomGfx = pToGfx; this->fAutoHide=fAutoHide; }
931  // change scroll pos in a [0, iCBMaxRange-1] scale
932  void SetScrollPos(int32_t iToPos) { iScrollPos = iToPos * GetMaxScroll() / (iCBMaxRange-1); }
933 
934  friend class ScrollWindow;
935  friend class ::C4ScriptGuiWindow;
936  };
937 
938  // a window that can be scrolled
939  class ScrollWindow : public Window
940  {
941  protected:
942  ScrollBar *pScrollBar; // vertical scroll bar associated with the window
943  int32_t iScrollY; // vertical scroll pos
944  int32_t iClientHeight; // client rect height
945  bool fHasBar;
946  int32_t iFrozen; // if >0, no scrolling updates are done (used during window refill)
947 
948  // pass element updates through to parent window
949  void ElementSizeChanged(Element *pOfElement) override // called when an element size is changed
950  {
951  Window::ElementSizeChanged(pOfElement);
952  if (pParent) pParent->ElementSizeChanged(pOfElement);
953  }
954  void ElementPosChanged(Element *pOfElement) override // called when an element position is changed
955  {
956  Window::ElementPosChanged(pOfElement);
957  if (pParent) pParent->ElementPosChanged(pOfElement);
958  }
959 
960  public:
961  ScrollWindow(Window *pParentWindow); // create scroll window in client area of window
962  ~ScrollWindow() override { if (pScrollBar) pScrollBar->pScrollWindow = nullptr; }
963 
964  void MouseInput(CMouse &rMouse, int32_t iButton, int32_t iX, int32_t iY, DWORD dwKeyParam) override;
965 
966  bool IsComponentOutsideClientArea() override { return true; } // always clip drawing routine of subcomponents to Bounds
967  void Update(); // update client rect and scroll bar according to window
968  void UpdateOwnPos() override;
969  void Freeze() { ++iFrozen; }
970  void UnFreeze() { if (!--iFrozen) Update(); }
971  bool IsFrozen() const { return !!iFrozen; }
972 
973  void SetClientHeight(int32_t iToHgt) // set new client height
974  { iClientHeight=iToHgt; Update(); }
975 
976  // change style
977  void SetDecoration(ScrollBarFacets *pToGfx, bool fAutoScroll)
978  { if (pScrollBar) pScrollBar->SetDecoration(pToGfx, fAutoScroll); }
979 
980  void SetScroll(int32_t iToScroll); // sets new scrolling; does not update scroll bar
981  void ScrollToBottom(); // set scrolling to bottom range; updates scroll bar
982  void ScrollPages(int iPageCount); // scroll down by multiples of visible height; updates scroll bar
983  void ScrollBy(int iAmount); // scroll down by vertical pixel amount; updates scroll bar
984  void ScrollRangeInView(int32_t iY, int32_t iHgt); // sets scrolling so range is in view; updates scroll bar
985  bool IsRangeInView(int32_t iY, int32_t iHgt); // returns whether scrolling range is in view
986 
987  int32_t GetScrollY() { return iScrollY; }
988 
989  void SetScrollBarEnabled(bool fToVal, bool noAutomaticPositioning = false);
990  bool IsScrollBarEnabled() { return fHasBar; }
991 
994 
995  friend class ScrollBar;
996  };
997 
998  // a collection of components
999  class GroupBox : public Window
1000  {
1001  private:
1002  StdStrBuf sTitle;
1003  CStdFont *pFont;
1004  uint32_t dwFrameClr, dwTitleClr, dwBackClr;
1005  int32_t iMargin;
1006 
1007  CStdFont *GetTitleFont() const;
1008 
1009  public:
1010  GroupBox(C4Rect &rtBounds) : Window(), pFont(nullptr), dwFrameClr(0u), dwTitleClr(C4GUI_CaptionFontClr), dwBackClr(0xffffffff), iMargin(4)
1011  {
1012  // init client rect
1013  SetBounds(rtBounds);
1014  } // ctor
1015 
1016  void SetFont(CStdFont *pToFont) { pFont = pToFont; }
1017  void SetColors(uint32_t dwFrameClr, uint32_t dwTitleClr, uint32_t dwBackClr=0xffffffff) { this->dwFrameClr = dwFrameClr; this->dwTitleClr = dwTitleClr; this->dwBackClr = dwBackClr; }
1018  void SetTitle(const char *szToTitle) { if (szToTitle && *szToTitle) sTitle.Copy(szToTitle); else sTitle.Clear(); UpdateOwnPos(); }
1019  void SetMargin(int32_t iNewMargin) { iMargin = iNewMargin; UpdateOwnPos(); }
1020 
1021  bool HasTitle() const { return !!sTitle.getLength(); }
1022 
1023  void DrawElement(C4TargetFacet &cgo) override; // draw frame
1024 
1025  int32_t GetMarginTop() override { return HasTitle() ? iMargin + GetTitleFont()->GetLineHeight() : iMargin; }
1026  int32_t GetMarginLeft() override { return iMargin; }
1027  int32_t GetMarginRight() override { return iMargin; }
1028  int32_t GetMarginBottom() override { return iMargin; }
1029  };
1030 
1031  // a drawing area
1032  class PaintBox : public Window
1033  {
1034  protected:
1036 
1037  void DrawElement(C4TargetFacet &cgo) override; // draw what has been painted
1038  public:
1039  PaintBox(C4Rect &rtBounds, int32_t iSfcWdt=-1, int32_t iSfcHgt=-1); // ctor
1040  ~PaintBox() override; // dtor
1041 
1042  void MouseInput(CMouse &rMouse, int32_t iButton, int32_t iX, int32_t iY, DWORD dwKeyParam) override; // input: mouse
1043  };
1044 
1045  // a control that may have focus
1046  class Control : public Window
1047  {
1048  private:
1049  class C4KeyBinding *pKeyContext;
1050  protected:
1051  virtual bool CharIn(const char *) { return false; } // input: character key pressed - should return false for none-character-inputs
1052 
1053  void DisableFocus(); // called when control gets disabled: Make sure it loses focus
1054  virtual bool IsFocusOnClick() { return true; } // defaultly, controls get focused on left-down
1055  Control *IsFocusElement() override { return this; }; // this control can gain focus
1056  virtual void OnGetFocus(bool fByMouse) {}; // callback when control gains focus
1057  virtual void OnLooseFocus() {}; // callback when control looses focus
1058 
1059  bool KeyContext() { return DoContext(); }
1060 
1061  public:
1062  Control(const C4Rect &rtBounds); // ctor
1063  ~Control() override;
1064 
1065  void MouseInput(CMouse &rMouse, int32_t iButton, int32_t iX, int32_t iY, DWORD dwKeyParam) override; // input: mouse. left-click sets focus
1066 
1067  bool HasFocus() { return pParent && pParent->IsFocused(this); }
1068  bool HasDrawFocus();
1069 
1070  friend class Dialog; friend class ListBox;
1071  };
1072 
1073  // generic callback-functions to the dialog
1074  template <class CallbackDlg> class DlgCallback
1075  {
1076  public:
1077  typedef void (CallbackDlg::*Func)(Control *pFromControl);
1078  typedef bool (CallbackDlg::*BoolFunc)(Control *pFromControl);
1079  typedef bool (CallbackDlg::*Bool2Func)(Control *pFromControl, bool fBool, bool fBool2);
1080  typedef ContextMenu *(CallbackDlg::*ContextFunc)(Element *pFromElement, int32_t iX, int32_t iY);
1081  typedef void (CallbackDlg::*ContextClickFunc)(Element *pTargetElement);
1082  };
1083 
1084  // multi-param callback-functions to the dialog
1085  template <class CallbackDlg, class TEx> class DlgCallbackEx
1086  {
1087  public:
1088  typedef void (CallbackDlg::*ContextClickFunc)(Element *pTargetElement, TEx Extra);
1089  };
1090 
1091  // a button. may be pressed.
1092  class Button : public Control
1093  {
1094  private:
1095  class C4KeyBinding *pKeyButton;
1096  DynBarFacet *pCustomGfx, *pCustomGfxDown;
1097 
1098  protected:
1099  StdStrBuf sText; // button label
1100  CStdFont *pCustomFont; // custom font (if assigned)
1101  DWORD dwCustomFontClr; // text font color (valid only if pCustomFont)
1102  bool fDown; // if set, button is currently held down
1103  bool fMouseOver; // if set, the mouse hovers over the button
1104  uint32_t cHotkey; // hotkey for this button
1105  bool fEnabled;
1106 
1107  bool IsFocusOnClick() override { return false; } // buttons don't get focus on click (for easier input, e.g. in chatbox)
1108 
1109  void DrawElement(C4TargetFacet &cgo) override; // draw dlg bg
1110 
1111  virtual void OnPress(); // called when button is pressed
1112 
1113  bool KeyButtonDown();
1114  bool KeyButtonUp();
1115  void SetDown(); // mark down and play sound
1116  void SetUp(bool fPress); // mark up and play sound
1117 
1118  bool OnHotkey(uint32_t cHotkey) override; // press btn on correct hotkey
1119 
1120  public:
1121  Button(const char *szBtnText, const C4Rect &rtBounds); // ctor
1122  ~Button() override; // dtor
1123 
1124  void MouseInput(CMouse &rMouse, int32_t iButton, int32_t iX, int32_t iY, DWORD dwKeyParam) override; // input: mouse movement or buttons
1125  void MouseEnter(CMouse &rMouse) override; // mouse re-enters with button down: set button down
1126  void MouseLeave(CMouse &rMouse) override; // mouse leaves with button down: reset down state
1127 
1128  void SetText(const char *szToText); // update button text (and hotkey)
1129  void SetCustomGraphics(DynBarFacet *pCustomGfx, DynBarFacet *pCustomGfxDown)
1130  { this->pCustomGfx = pCustomGfx; this->pCustomGfxDown = pCustomGfxDown; }
1131  void SetEnabled(bool fToVal) { fEnabled=fToVal; if (!fEnabled) fDown=false; }
1132  void SetFont(CStdFont *pFont, DWORD dwCustomFontClr=C4GUI_CaptionFontClr) { this->pCustomFont = pFont; this->dwCustomFontClr=dwCustomFontClr; }
1133  };
1134 
1135  // button using icon image
1136  class IconButton : public Button
1137  {
1138  protected:
1140  uint32_t dwClr;
1141  bool fHasClr;
1142  bool fHighlight; // if true, the button is highlighted permanently
1143 
1144  void DrawElement(C4TargetFacet &cgo) override; // draw icon and highlight if necessary
1145 
1146  public:
1147  IconButton(Icons eUseIcon, const C4Rect &rtBounds, char cHotkey='\0', const char *tooltip_text=nullptr); // ctor
1148  void SetIcon(Icons eUseIcon);
1149  void SetFacet(const C4Facet &rCpy, uint32_t dwClr=0u) { fctIcon = rCpy; }
1150  void SetColor(uint32_t dwClr) { fHasClr=true; this->dwClr=dwClr; }
1151  void SetHighlight(bool fToVal) { fHighlight=fToVal; }
1152  bool GetHighlight() const { return fHighlight; }
1153  };
1154 
1155  // button using arrow image
1156  class ArrowButton : public Button
1157  {
1158  public:
1159  enum ArrowFct { Left=0, Right=1, Down=2 };
1160  protected:
1162 
1163  void DrawElement(C4TargetFacet &cgo) override; // draw arrow; highlight and down if necessary
1164 
1165  public:
1166  ArrowButton(ArrowFct eDir, const C4Rect &rtBounds, char cHotkey=0); // ctor
1167 
1168  static int32_t GetDefaultWidth();
1169  static int32_t GetDefaultHeight();
1170  };
1171 
1172  // button using facets for highlight
1173  class FacetButton : public Button
1174  {
1175  protected:
1177  uint32_t dwTextClrInact, dwTextClrAct; // text colors for inactive/active button
1178  FLOAT_RECT rcfDrawBounds; // drawing bounds
1179 
1180  // title drawing parameters
1181  int32_t iTxtOffX, iTxtOffY;
1182  uint8_t byTxtAlign; // ALeft, ACenter or ARight
1184 
1185  void DrawElement(C4TargetFacet &cgo) override; // draw base facet or highlight facet if necessary
1186 
1187  public:
1188  FacetButton(const C4Facet &rBaseFct, const C4Facet &rHighlightFct, const FLOAT_RECT &rtfBounds, char cHotkey); // ctor
1189  void SetTextColors(uint32_t dwClrInact, uint32_t dwClrAct)
1190  { dwTextClrInact = dwClrInact; dwTextClrAct = dwClrAct; }
1191  void SetTextPos(int32_t iOffX, int32_t iOffY, uint8_t byAlign=ACenter)
1192  { iTxtOffX=iOffX; iTxtOffY=iOffY; byTxtAlign=byAlign; }
1194  { this->pFont=pFont; this->fFontZoom=fFontZoom; }
1195  };
1196 
1197  // a button doing some callback...
1198  template <class CallbackDlg, class Base=Button> class CallbackButton : public Base
1199  {
1200  protected:
1201  CallbackDlg *pCB;
1202 
1203  typename DlgCallback<CallbackDlg>::Func pCallbackFn; // callback function
1204  void OnPress() override
1205  {
1206  if (pCallbackFn)
1207  {
1208  CallbackDlg *pC=pCB;
1209  if (!pC) if (!(pC=reinterpret_cast<CallbackDlg *>(Base::GetDlg()))) return;
1210  (pC->*pCallbackFn)(this);
1211  }
1212  }
1213 
1214  public:
1215  CallbackButton(ArrowButton::ArrowFct eDir, const C4Rect &rtBounds, typename DlgCallback<CallbackDlg>::Func pFn, CallbackDlg *pCB=nullptr) // ctor
1216  : Base(eDir, rtBounds, 0), pCB(pCB), pCallbackFn(pFn) { }
1217  CallbackButton(const char *szBtnText, C4Rect &rtBounds, typename DlgCallback<CallbackDlg>::Func pFn, CallbackDlg *pCB=nullptr) // ctor
1218  : Base(szBtnText, rtBounds), pCB(pCB), pCallbackFn(pFn) { }
1219  CallbackButton(Icons eUseIcon, const C4Rect &rtBounds, char cHotkey, typename DlgCallback<CallbackDlg>::Func pFn, CallbackDlg *pCB=nullptr) // ctor
1220  : Base(eUseIcon, rtBounds, cHotkey), pCB(pCB), pCallbackFn(pFn) { }
1221  CallbackButton(Icons eUseIcon, const C4Rect &rtBounds, const char *tooltip_text, typename DlgCallback<CallbackDlg>::Func pFn, CallbackDlg *pCB = nullptr) // ctor
1222  : Base(eUseIcon, rtBounds, '\0', tooltip_text), pCB(pCB), pCallbackFn(pFn) { }
1223  CallbackButton(int32_t iID, const C4Rect &rtBounds, char cHotkey, typename DlgCallback<CallbackDlg>::Func pFn, CallbackDlg *pCB=nullptr) // ctor
1224  : Base(iID, rtBounds, cHotkey), pCB(pCB), pCallbackFn(pFn) { }
1225  };
1226 
1227  // a button doing some callback to any class
1228  template <class CallbackDlg, class Base=Button> class CallbackButtonEx : public Base
1229  {
1230  protected:
1231  typedef CallbackDlg * CallbackDlgPointer;
1232  CallbackDlgPointer pCBTarget; // callback target
1233  typename DlgCallback<CallbackDlg>::Func pCallbackFn; // callback function
1234  void OnPress() override
1235  { (pCBTarget->*pCallbackFn)(this); }
1236 
1237  public:
1238  CallbackButtonEx(const char *szBtnText, const C4Rect &rtBounds, CallbackDlgPointer pCBTarget, typename DlgCallback<CallbackDlg>::Func pFn) // ctor
1239  : Base(szBtnText, rtBounds), pCBTarget(pCBTarget), pCallbackFn(pFn) { }
1240  CallbackButtonEx(Icons eUseIcon, const C4Rect &rtBounds, char cHotkey, CallbackDlgPointer pCBTarget, typename DlgCallback<CallbackDlg>::Func pFn) // ctor
1241  : Base(eUseIcon, rtBounds, cHotkey), pCBTarget(pCBTarget), pCallbackFn(pFn) { }
1242  CallbackButtonEx(const C4Facet &fctBase, const C4Facet &fctHighlight, const FLOAT_RECT &rtfBounds, char cHotkey, CallbackDlgPointer pCBTarget, typename DlgCallback<CallbackDlg>::Func pFn) // ctor
1243  : Base(fctBase, fctHighlight, rtfBounds, cHotkey), pCBTarget(pCBTarget), pCallbackFn(pFn) { }
1244  };
1245 
1246  // an edit control to type text in
1247  class Edit : public Control
1248  {
1249  public:
1250  Edit(const C4Rect &rtBounds, bool fFocusEdit=false); // ctor
1251  ~Edit() override;
1252 
1253  enum InputResult // action to be taken when text is confirmed with enter
1254  {
1255  IR_None=0, // do nothing and continue pasting
1256  IR_CloseDlg, // stop any pastes and close parent dialog successfully
1257  IR_CloseEdit, // stop any pastes and remove this control
1258  IR_Abort // do nothing and stop any pastes
1259  };
1260 
1261  private:
1262  enum CursorOperation { COP_BACK, COP_DELETE, COP_LEFT, COP_RIGHT, COP_HOME, COP_END };
1263  static const char *CursorRepresentation;
1264 
1265  bool KeyCursorOp(const C4KeyCodeEx &key, const CursorOperation &op);
1266  bool KeyEnter();
1267  bool KeyCopy() { Copy(); return true; }
1268  bool KeyPaste() { Paste(); return true; }
1269  bool KeyCut() { Cut(); return true; }
1270  bool KeySelectAll() { SelectAll(); return true; }
1271 
1272  class C4KeyBinding *RegisterCursorOp(CursorOperation op, C4KeyCode key, const char *szName, C4CustomKey::Priority eKeyPrio);
1273 
1274  class C4KeyBinding *pKeyCursorBack, *pKeyCursorDel, *pKeyCursorLeft, *pKeyCursorRight, *pKeyCursorHome, *pKeyCursorEnd,
1275  *pKeyEnter, *pKeyCopy, *pKeyPaste, *pKeyCut, *pKeySelAll;
1276 
1277  protected:
1278  // context callbacks
1279  ContextMenu *OnContext(C4GUI::Element *pListItem, int32_t iX, int32_t iY);
1280  void OnCtxCopy(C4GUI::Element *pThis) { Copy(); };
1281  void OnCtxPaste(C4GUI::Element *pThis) { Paste(); };
1282  void OnCtxCut(C4GUI::Element *pThis) { Cut(); };
1284  void OnCtxSelAll(C4GUI::Element *pThis) { SelectAll(); };
1285 
1286  private:
1287  void Deselect(); // clear selection range
1288 
1289  public:
1290  bool InsertText(const char *szText, bool fUser); // insert text at cursor pos (returns whether all text could be inserted)
1291  void ClearText(); // remove all the text
1292  void DeleteSelection(); // deletes the selected text. Adjust cursor position if necessary
1293  bool SetText(const char *szText, bool fUser) { ClearText(); return InsertText(szText, fUser); }
1294  void SetPasswordMask(char cNewPasswordMask) { cPasswordMask = cNewPasswordMask; } // mask edit box contents using the given character
1295 
1296  private:
1297  int32_t GetCharPos(int32_t iControlXPos); // get character index of pixel position; always resides within current text length
1298  void EnsureBufferSize(int32_t iMinBufferSize); // ensure buffer has desired size
1299  void ScrollCursorInView(); // ensure cursor pos is visible in edit control
1300  bool DoFinishInput(bool fPasting, bool fPastingMore); // do OnFinishInput callback and process result - returns whether pasting operation should be continued
1301 
1302  bool Copy(); bool Cut(); bool Paste(); // clipboard operations
1303 
1304  protected:
1305  CStdFont *pFont; // font for edit
1306  char *Text; // edit text
1307  uint32_t dwBGClr, dwFontClr, dwBorderColor; // drawing colors for edit box
1308  int32_t iBufferSize; // size of current buffer
1309  int32_t iCursorPos; // cursor position: char, before which the cursor is located
1310  int32_t iSelectionStart, iSelectionEnd; // selection range (start may be larger than end)
1311  int32_t iMaxTextLength; // maximum number of characters to be input here
1312  C4TimeMilliseconds tLastInputTime; // time of last input (for cursor flashing)
1313  int32_t iXScroll; // horizontal scrolling
1314  char cPasswordMask; // character to be used for masking the contents. 0 for none.
1315 
1316  bool fLeftBtnDown; // flag whether left mouse button is down or not
1317 
1318  bool CharIn(const char * c) override; // input: character key pressed - should return false for none-character-inputs
1319  void DoDragging(CMouse &rMouse, int32_t iX, int32_t iY, DWORD dwKeyParam) override; // dragging: allow text selection outside the component
1320  bool IsFocusOnClick() override { return true; } // edit fields do get focus on click
1321  void OnGetFocus(bool fByMouse) override; // edit control gets focus
1322  void OnLooseFocus() override; // edit control looses focus
1323 
1324  void DrawElement(C4TargetFacet &cgo) override; // draw edit control
1325 
1326  // called when user presses enter in single-line edit control - closes the current dialog
1327  virtual InputResult OnFinishInput(bool fPasting, bool fPastingMore) { return IR_CloseDlg; }
1328  virtual void OnAbortInput() {}
1329 
1330  // get margins from bounds to client rect
1331  int32_t GetMarginTop() override { return 2; }
1332  int32_t GetMarginLeft() override { return 4; }
1333  int32_t GetMarginRight() override { return 4; }
1334  int32_t GetMarginBottom() override { return 2; }
1335 
1336  public:
1337  void MouseInput(CMouse &rMouse, int32_t iButton, int32_t iX, int32_t iY, DWORD dwKeyParam) override; // input: mouse movement or buttons
1338 
1339  const char *GetText() { return Text; }
1340  void SelectAll(); // select all the text
1341 
1342  static int32_t GetDefaultEditHeight();
1343  static int32_t GetCustomEditHeight(CStdFont *pUseFont);
1344 
1345  bool GetCurrentWord(char *szTargetBuf, int32_t iMaxTargetBufLen); // get word before cursor pos (for nick completion)
1346 
1347  // layout
1348  void SetFont(CStdFont *pToFont) { pFont=pToFont; ScrollCursorInView(); }
1349  void SetColors(uint32_t dwNewBGClr, uint32_t dwNewFontClr, uint32_t dwNewBorderColor)
1350  { dwBGClr = dwNewBGClr; dwFontClr = dwNewFontClr; dwBorderColor = dwNewBorderColor; }
1351 
1352  void SetMaxText(int32_t iTo) { iMaxTextLength = iTo; }
1353  };
1354 
1355  // an edit doing some callback
1356  template <class CallbackCtrl> class CallbackEdit : public Edit
1357  {
1358  private:
1359  CallbackCtrl *pCBCtrl;
1360 
1361  protected:
1362  typedef InputResult (CallbackCtrl::*CBFunc)(Edit *, bool, bool);
1363  typedef void (CallbackCtrl::*CBAbortFunc)();
1365  InputResult OnFinishInput(bool fPasting, bool fPastingMore) override
1366  { if (pCBFunc && pCBCtrl) return (pCBCtrl->*pCBFunc)(this, fPasting, fPastingMore); else return IR_CloseDlg; }
1367  void OnAbortInput() override
1368  { if (pCBAbortFunc && pCBCtrl) (pCBCtrl->*pCBAbortFunc)(); }
1369 
1370  public:
1371  CallbackEdit(const C4Rect &rtBounds, CallbackCtrl * pCBCtrl, CBFunc pCBFunc, CBAbortFunc pCBAbortFunc=nullptr) // ctor
1372  : Edit(rtBounds), pCBCtrl(pCBCtrl), pCBFunc(pCBFunc), pCBAbortFunc(pCBAbortFunc) { }
1373  };
1374 
1375  // an edit control that renames a label - some less decoration; abort on Escape and focus loss
1376  class RenameEdit : public Edit
1377  {
1378  private:
1379  C4KeyBinding *pKeyAbort; // key bindings
1380  bool fFinishing; // set during deletion process
1381  Label *pForLabel; // label that is being renamed
1382  Control *pPrevFocusCtrl; // previous focus element to be restored after rename
1383 
1384  public:
1386  {
1387  RR_Invalid=0, // rename not accepted; continue editing
1388  RR_Accepted, // rename accepted; delete control
1389  RR_Deleted // control deleted - leave everything
1390  };
1391 
1392  public:
1393  RenameEdit(Label *pLabel); // ctor - construct for label; add element; set focus
1394  ~RenameEdit() override;
1395 
1396  void Abort();
1397 
1398  private:
1399  void FinishRename(); // renaming aborted or finished - remove this element and restore label
1400 
1401  protected:
1402  bool KeyAbort() { Abort(); return true; }
1403  InputResult OnFinishInput(bool fPasting, bool fPastingMore) override; // forward last input to OnOKRename
1404  void OnLooseFocus() override; // callback when control looses focus: OK input
1405 
1406  virtual void OnCancelRename() {} // renaming was aborted
1407  virtual RenameResult OnOKRename(const char *szNewName) = 0; // rename performed - return whether name was accepted
1408  };
1409 
1410  template <class CallbackDlg, class ParType> class CallbackRenameEdit : public RenameEdit
1411  {
1412  public:
1413  protected:
1414  typedef void (CallbackDlg::*CBCancelFunc)(ParType);
1415  typedef RenameResult (CallbackDlg::*CBOKFunc)(ParType, const char *);
1416 
1418  CallbackDlg *pDlg; ParType par;
1419 
1420  void OnCancelRename() override { if (pDlg && pCBCancelFunc) (pDlg->*pCBCancelFunc)(par); }
1421  RenameResult OnOKRename(const char *szNewName) override { return (pDlg && pCBOKFunc) ? (pDlg->*pCBOKFunc)(par, szNewName) : RR_Accepted; }
1422 
1423  public:
1424  CallbackRenameEdit(Label *pForLabel, CallbackDlg *pDlg, const ParType &par, CBOKFunc pCBOKFunc, CBCancelFunc pCBCancelFunc) // ctor
1426  };
1427 
1428  // editbox below descriptive label sharing one window for common tooltip
1430  {
1431  public:
1432  LabeledEdit(const C4Rect &rcBounds, const char *szName, bool fMultiline, const char *szPrefText=nullptr, CStdFont *pUseFont=nullptr, uint32_t dwTextClr = C4GUI_CaptionFontClr);
1433  private:
1434  C4GUI::Edit *pEdit;
1435  public:
1436  const char *GetText() const { return pEdit->GetText(); }
1437  C4GUI::Edit *GetEdit() const { return pEdit; }
1438  static bool GetControlSize(int *piWdt, int *piHgt, const char *szForText, CStdFont *pForFont, bool fMultiline);
1439  };
1440 
1441  // checkbox with a text label right of it
1442  class CheckBox : public Control
1443  {
1444  private:
1445  bool fChecked;
1446  class C4KeyBinding *pKeyCheck;
1447  StdStrBuf sCaption;
1448  bool fMouseOn;
1449  BaseCallbackHandler *pCBHandler; // callback handler called if check state changes
1450  bool fEnabled;
1451  CStdFont *pFont;
1452  uint32_t dwEnabledClr, dwDisabledClr;
1453  uint32_t cHotkey;
1454 
1455  public:
1456  CheckBox(const C4Rect &rtBounds, const char *szCaption, bool fChecked); // ctor
1457  ~CheckBox() override;
1458 
1459  private:
1460  bool KeyCheck() { ToggleCheck(true); return true; }
1461 
1462  public:
1463  void ToggleCheck(bool fByUser); // check on/off; do callback
1464 
1465  protected:
1466  void UpdateOwnPos() override;
1467  bool IsFocusOnClick() override { return false; } // just check/uncheck on click; do not gain keyboard focus as well
1468  Control *IsFocusElement() override { return fEnabled ? Control::IsFocusElement() : nullptr; }; // this control can gain focus if enabled
1469  void DrawElement(C4TargetFacet &cgo) override; // draw checkbox
1470  bool OnHotkey(uint32_t cHotkey) override; // return true when hotkey has been processed
1471 
1472  public:
1473  void MouseInput(CMouse &rMouse, int32_t iButton, int32_t iX, int32_t iY, DWORD dwKeyParam) override; // input: mouse movement or buttons
1474  void MouseEnter(CMouse &rMouse) override;
1475  void MouseLeave(CMouse &rMouse) override;
1476 
1477  void SetChecked(bool fToVal) { fChecked = fToVal; } // set w/o callback
1478  bool GetChecked() const { return fChecked; }
1479  void SetOnChecked(BaseCallbackHandler *pCB);
1480  void SetEnabled(bool fToVal) { if (!(fEnabled=fToVal)) DisableFocus(); }
1481 
1482  const char *GetText() { return sCaption.getData(); }
1483 
1484  void SetFont(CStdFont *pFont, uint32_t dwEnabledClr, uint32_t dwDisabledClr)
1485  { this->pFont=pFont; this->dwEnabledClr=dwEnabledClr; this->dwDisabledClr=dwDisabledClr; }
1486 
1487  static bool GetStandardCheckBoxSize(int *piWdt, int *piHgt, const char *szForCaptionText, CStdFont *pUseFont); // get needed size to construct a checkbox
1488  };
1489 
1490  // a vertical list of elements
1491  class ListBox : public Control
1492  {
1493  private:
1494  class C4KeyBinding *pKeyContext, *pKeyUp, *pKeyDown, *pKeyPageUp, *pKeyPageDown, *pKeyHome, *pKeyEnd, *pKeyActivate, *pKeyLeft, *pKeyRight;
1495 
1496  bool KeyContext();
1497  bool KeyUp();
1498  bool KeyDown();
1499  bool KeyLeft();
1500  bool KeyRight();
1501  bool KeyPageUp();
1502  bool KeyPageDown();
1503  bool KeyHome();
1504  bool KeyEnd();
1505  bool KeyActivate();
1506 
1507  protected:
1508  int32_t iMultiColItemWidth; // if nonzero, the listbox is multicolumn and the column count depends on how many items fit in
1509  int32_t iColCount; // number of columns (usually 1)
1510  ScrollWindow *pClientWindow; // client scrolling window
1511  Element *pSelectedItem; // selected list item
1513  bool fDrawBackground; // whether darker background is to be drawn
1514  bool fDrawBorder; // whether 3D frame around box shall be drawn or nay
1515  bool fSelectionDisabled; // if set, no entries can be selected
1516 
1517  void DrawElement(C4TargetFacet &cgo) override; // draw listbox
1518 
1519  bool IsFocused(Control *pCtrl) override
1520  {
1521  // subcontrol also counts as focused if the list has focus and the subcontrol is selected
1522  return Control::IsFocused(pCtrl) || (HasFocus() && pSelectedItem == pCtrl);
1523  }
1524  bool IsFocusOnClick() override { return true; } // list boxes do get focus on click
1525  Control *IsFocusElement() override { return this; }; // this control can gain focus
1526  void OnGetFocus(bool fByMouse) override; // callback when control gains focus - select a list item if none are selected
1527  bool CharIn(const char * c) override; // character input for direct list element selection
1528 
1529  void AfterElementRemoval() override
1530  { Container::AfterElementRemoval(); UpdateElementPositions(); } // called by ScrollWindow to parent after an element has been removed
1531 
1532  void UpdateColumnCount();
1533 
1534  public:
1535  ListBox(const C4Rect &rtBounds, int32_t iMultiColItemWidth=0); // ctor
1536  ~ListBox() override; // dtor
1537 
1538  void MouseInput(CMouse &rMouse, int32_t iButton, int32_t iX, int32_t iY, DWORD dwKeyParam) override; // input: mouse movement or buttons
1539 
1540  void RemoveElement(Element *pChild) override; // remove child component
1541  bool AddElement(Element *pChild, int32_t iIndent=0); // add element and adjust its pos
1542  bool InsertElement(Element *pChild, Element *pInsertBefore, int32_t iIndent=0); // insert element and adjust its pos
1543  void ElementSizeChanged(Element *pOfElement) override; // called when an element size is changed
1544  void ElementPosChanged(Element *pOfElement) override; // called when an element position is changed
1545 
1547 
1548  void SelectionChanged(bool fByUser); // pSelectedItem changed: sound, tooltip, etc.
1549  void SetSelectionChangeCallbackFn(BaseCallbackHandler *pToHandler) // update selection change handler
1550  {
1552  if ((pSelectionChangeHandler = pToHandler)) pToHandler->Ref();
1553  }
1554  void SetSelectionDblClickFn(BaseCallbackHandler *pToHandler) // update selection doubleclick handler
1555  {
1558  }
1559 
1560  void ScrollToBottom() // set scrolling to bottom range
1562  void ScrollItemInView(Element *pItem); // set scrolling so a specific item is visible
1565 
1566  // change style
1567  void SetDecoration(bool fDrawBG, ScrollBarFacets *pToGfx, bool fAutoScroll, bool fDrawBorder=false)
1568  { fDrawBackground=fDrawBG; this->fDrawBorder=fDrawBorder; if (pClientWindow) pClientWindow->SetDecoration(pToGfx, fAutoScroll); }
1569  void SetSelectionDiabled(bool fToVal=true) { fSelectionDisabled = fToVal; }
1570 
1571  // get head and tail list items
1572  Element *GetFirst() { return pClientWindow ? pClientWindow->GetFirst() : nullptr; }
1573  Element *GetLast() { return pClientWindow ? pClientWindow->GetLast() : nullptr; }
1574 
1575  // get margins from bounds to client rect
1576  int32_t GetMarginTop() override { return 3; }
1577  int32_t GetMarginLeft() override { return 3; }
1578  int32_t GetMarginRight() override { return 3; }
1579  int32_t GetMarginBottom() override { return 3; }
1580 
1581  Element *GetSelectedItem() { return pSelectedItem; } // get focused listbox item
1584  void SelectEntry(Element *pNewSel, bool fByUser);
1585  void SelectFirstEntry(bool fByUser) { SelectEntry(GetFirst(), fByUser); }
1586  void SelectNone(bool fByUser) { SelectEntry(nullptr, fByUser); }
1587  bool IsMultiColumn() const { return iColCount > 1; }
1588  int32_t ContractToElementHeight(); // make smaller if elements don't use up all of the available height. Return amount by which list box got contracted
1589 
1590  void UpdateElementPositions(); // reposition list items so they are stacked vertically
1591  void UpdateElementPosition(Element *pOfElement, int32_t iIndent); // update pos for one specific element
1593 
1594  bool IsSelectedChild(Element *pChild) override { return pChild == pSelectedItem || (pSelectedItem && pSelectedItem->IsParentOf(pChild)); }
1595 
1596  typedef int32_t (*SortFunction)(const Element *pEl1, const Element *pEl2, void *par);
1597  void SortElements(SortFunction SortFunc, void *par); // sort list items
1598  };
1599 
1600  // tabbing panel
1601  class Tabular : public Control
1602  {
1603  public:
1604  // sheet covering the client area of a tabular
1605  class Sheet : public Window
1606  {
1607  protected:
1608  StdStrBuf sTitle; // sheet label
1609  int32_t icoTitle; // sheet label icon
1610  uint32_t cHotkey;
1611  uint32_t dwCaptionClr; // caption color - default if 0
1614 
1615  Sheet(const char *szTitle, const C4Rect &rcBounds, int32_t icoTitle = Ico_None, bool fHasCloseButton=false, bool fTitleMarkup=true); // ctor; expands hotkey markup in title
1616 
1617  void DrawCaption(C4TargetFacet &cgo, int32_t x, int32_t y, int32_t iMaxWdt, bool fLarge, bool fActive, bool fFocus, C4Facet *pfctClip, C4Facet *pfctIcon, CStdFont *pUseFont);
1618  void GetCaptionSize(int32_t *piWdt, int32_t *piHgt, bool fLarge, bool fActive, C4Facet *pfctClip, C4Facet *pfctIcon, CStdFont *pUseFont);
1619  virtual void OnShown(bool fByUser) { } // calklback from tabular after sheet has been made visible
1620  void SetCloseButtonHighlight(bool fToVal) { fCloseButtonHighlighted = fToVal; }
1621  bool IsPosOnCloseButton(int32_t x, int32_t y, int32_t iCaptWdt, int32_t iCaptHgt, bool fLarge);
1622  bool IsActiveSheet();
1623 
1624  public:
1625  const char *GetTitle() { return sTitle.getData(); }
1626  char GetHotkey() { return cHotkey; }
1627  void SetTitle(const char *szNewTitle);
1628  void SetCaptionColor(uint32_t dwNewClr=0) { dwCaptionClr=dwNewClr; }
1629  virtual void UserClose() { delete this; } // user pressed close button
1630  bool HasCloseButton() const { return fHasCloseButton; }
1631 
1632  friend class Tabular;
1633  };
1634 
1636  {
1637  tbNone=0, // no tabs
1638  tbTop, // tabs on top
1639  tbLeft // tabs to the left
1640  };
1641 
1642  private:
1643  Sheet *pActiveSheet; // currently selected sheet
1644  TabPosition eTabPos; // whither tabs shalt be shown or nay, en where art thy shown?
1645  int32_t iMaxTabWidth; // maximum tab length; used when tabs are positioned left and do not have gfx
1646  int32_t iSheetSpacing, iSheetOff; // distances of sheet captions
1647  int32_t iCaptionLengthTotal, iCaptionScrollPos; // scrolling in captions (top only)
1648  bool fScrollingLeft, fScrollingRight, fScrollingLeftDown, fScrollingRightDown; // scrolling in captions (top only)
1649  C4TimeMilliseconds tLastScrollTime; // set when fScrollingLeftDown or fScrollingRightDown are true: Time for next scrolling if mouse is held down
1650  int iSheetMargin;
1651  bool fDrawSelf; // if border and bg shall be drawn
1652 
1653  C4Facet *pfctBack, *pfctClip, *pfctIcons; // set for tabulars that have custom gfx
1654  CStdFont *pSheetCaptionFont; // font to be used for caption drawing; nullptr if default GUI font is to be used
1655 
1656  C4KeyBinding *pKeySelUp, *pKeySelDown, *pKeySelUp2, *pKeySelDown2, *pKeyCloseTab; // key bindings
1657 
1658  void SelectionChanged(bool fByUser); // pActiveSheet changed: sound, tooltip, etc.
1659  void SheetsChanged(); // update iMaxTabWidth by new set of sheet labels
1660  void UpdateScrolling();
1661  void DoCaptionScroll(int32_t iDir);
1662 
1663 
1664  private:
1665  bool HasGfx() { return pfctBack && pfctClip && pfctIcons; } // whether the control uses custom graphics
1666 
1667  protected:
1668  bool KeySelUp(); // keyboard callback: Select previous sheet
1669  bool KeySelDown(); // keyboard callback: Select next sheet
1670  bool KeyCloseTab(); // keyboard callback: Close current sheet if possible
1671 
1672  void DrawElement(C4TargetFacet &cgo) override;
1673  void MouseLeaveCaptionArea();
1674  void MouseLeave(CMouse &rMouse) override;
1675  void OnGetFocus(bool fByMouse) override;
1676 
1677  Control *IsFocusElement() override { return eTabPos ? this : nullptr; }; // this control can gain focus only if tabs are enabled only
1678  bool IsFocusOnClick() override { return false; } // but never get focus on single mouse click, because this would de-focus any contained controls!
1679 
1680  int32_t GetTopSize() { return (eTabPos == tbTop) ? 20 : 0; } // vertical size of tab selection bar
1681  int32_t GetLeftSize() { return (eTabPos == tbLeft) ? (HasGfx() ? GetLeftClipSize(pfctClip) : 20+iMaxTabWidth) : 0; } // horizontal size of tab selection bar
1682  bool HasLargeCaptions() { return eTabPos == tbLeft; }
1683 
1684  int32_t GetMarginTop() override { return iSheetMargin+GetTopSize() + (HasGfx() ? (rcBounds.Hgt-GetTopSize())*30/483 : 0); }
1685  int32_t GetMarginLeft() override { return iSheetMargin+GetLeftSize() + (HasGfx() ? (rcBounds.Wdt-GetLeftSize())*13/628 : 0); }
1686  int32_t GetMarginRight() override { return iSheetMargin + (HasGfx() ? (rcBounds.Wdt-GetLeftSize())*30/628 : 0); }
1687  int32_t GetMarginBottom() override { return iSheetMargin + (HasGfx() ? (rcBounds.Hgt-GetTopSize())*32/483 : 0); }
1688 
1689  void UpdateSize() override;
1690 
1691  bool IsSelectedChild(Element *pChild) override { return pChild == pActiveSheet || (pActiveSheet && pActiveSheet->IsParentOf(pChild)); }
1692 
1693  public:
1694  Tabular(C4Rect &rtBounds, TabPosition eTabPos); // ctor
1695  ~Tabular() override; // dtor
1696 
1697  void MouseInput(CMouse &rMouse, int32_t iButton, int32_t iX, int32_t iY, DWORD dwKeyParam) override;
1698 
1699  void RemoveElement(Element *pChild) override; // clear ptr
1700  Sheet *AddSheet(const char *szTitle, int32_t icoTitle = Ico_None);
1701  void AddCustomSheet(Sheet *pAddSheet);
1702  void ClearSheets(); // del all sheets
1703  void SelectSheet(int32_t iIndex, bool fByUser);
1704  void SelectSheet(Sheet *pSelSheet, bool fByUser);
1705 
1706 
1707  Sheet *GetSheet(int32_t iIndex) { return (Sheet *) GetElementByIndex(iIndex); }
1708  Sheet *GetActiveSheet() { return pActiveSheet; }
1709  int32_t GetActiveSheetIndex();
1710  int32_t GetSheetCount() { return GetElementCount(); }
1711 
1712  void SetGfx(C4Facet *pafctBack, C4Facet *pafctClip, C4Facet *pafctIcons, CStdFont *paSheetCaptionFont, bool fResizeByAspect);
1713  static int32_t GetLeftClipSize(C4Facet *pfctForClip) { return pfctForClip->Wdt*95/120; } // left clip area size by gfx
1714  void SetSheetMargin(int32_t iMargin) { iSheetMargin = iMargin; UpdateOwnPos(); }
1715  void SetDrawDecoration(bool fToVal) { fDrawSelf = fToVal; }
1716 
1717  friend class Sheet;
1718  };
1719 
1720  // scrollable text box
1721  class TextWindow : public Control
1722  {
1723  protected:
1724  ScrollWindow *pClientWindow; // client scrolling window
1725  Picture *pTitlePicture; // [optional]: Picture shown atop the text
1726  MultilineLabel *pLogBuffer; // buffer holding text data
1727  bool fDrawBackground, fDrawFrame; // whether dark background should be drawn (default true)
1728  size_t iPicPadding;
1729 
1730  void DrawElement(C4TargetFacet &cgo) override; // draw text window
1731 
1732  void ElementSizeChanged(Element *pOfElement) override; // called when an element size is changed
1733  void ElementPosChanged(Element *pOfElement) override; // called when an element position is changed
1734  void UpdateSize() override;
1735 
1736  Control *IsFocusElement() override { return nullptr; }; // no focus element for now, because there's nothing to do (2do: scroll?)
1737 
1738  public:
1739  TextWindow(C4Rect &rtBounds, size_t iPicWdt=0, size_t iPicHgt=0, size_t iPicPadding=0, size_t iMaxLines=100, size_t iMaxTextLen=4096, const char *szIndentChars=" ", bool fAutoGrow=false, const C4Facet *pOverlayPic=nullptr, int iOverlayBorder=0, bool fMarkup=false); // ctor
1740 
1741  void AddTextLine(const char *szText, CStdFont *pFont, DWORD dwClr, bool fDoUpdate, bool fMakeReadableOnBlack, CStdFont *pCaptionFont=nullptr) // add text in a new line
1742  { if (pLogBuffer) pLogBuffer->AddLine(szText, pFont, dwClr, fDoUpdate, fMakeReadableOnBlack, pCaptionFont); }
1743  void ScrollToBottom() // set scrolling to bottom range
1745  void ClearText(bool fDoUpdate)
1746  { if (pLogBuffer) pLogBuffer->Clear(fDoUpdate); }
1747  int32_t GetScrollPos()
1748  { return pClientWindow ? pClientWindow->GetScrollY() : 0; }
1749  void SetScrollPos(int32_t iPos)
1750  { if (pClientWindow) pClientWindow->ScrollRangeInView(iPos, 0); }
1752  { if (pLogBuffer) pLogBuffer->UpdateHeight(); }
1753  void SetDecoration(bool fDrawBG, bool fDrawFrame, ScrollBarFacets *pToGfx, bool fAutoScroll)
1754  { fDrawBackground=fDrawBG; this->fDrawFrame=fDrawFrame; if (pClientWindow) pClientWindow->SetDecoration(pToGfx, fAutoScroll); }
1755  void SetPicture(const C4Facet &rNewPic);
1756 
1757  // get margins from bounds to client rect
1758  int32_t GetMarginTop() override { return 8; }
1759  int32_t GetMarginLeft() override { return 10; }
1760  int32_t GetMarginRight() override { return 5; }
1761  int32_t GetMarginBottom() override { return 8; }
1762  };
1763 
1764  // context menu opened on right-click
1765  class ContextMenu : public Window
1766  {
1767  private:
1768  // key bindings
1769  class C4KeyBinding *pKeySelUp, *pKeySelDown, *pKeySubmenu, *pKeyBack, *pKeyAbort, *pKeyConfirm, *pKeyHotkey;
1770 
1771  bool KeySelUp();
1772  bool KeySelDown();
1773  bool KeySubmenu();
1774  bool KeyBack();
1775  bool KeyAbort();
1776  bool KeyConfirm();
1777  bool KeyHotkey(const C4KeyCodeEx &key);
1778 
1779  private:
1780  static int32_t iGlobalMenuIndex;
1781  int32_t iMenuIndex;
1782 
1783  void UpdateElementPositions(); // stack all menu elements
1784 
1785  // element adding made private: May only add entries
1786  bool AddElement(Element *pChild);
1787  bool InsertElement(Element *pChild, Element *pInsertBefore);
1788 
1789  public:
1790  // one text entry (icon+text+eventually right-arrow)
1791  class Entry : public Element
1792  {
1793  private:
1794  int32_t GetIconIndent() { return (icoIcon==-1) ? 0 : rcBounds.Hgt+2; }
1795 
1796  protected:
1797  StdStrBuf sText; // entry text
1798  uint32_t cHotkey; // entry hotkey
1799  Icons icoIcon; // icon to be drawn left of text
1800  MenuHandler *pMenuHandler; // callback when item is selected
1801  ContextHandler *pSubmenuHandler; // callback when submenu is opened
1802 
1803  protected:
1804  void DrawElement(C4TargetFacet &cgo) override; // draw element
1805 
1807  { MenuHandler *pMH = pMenuHandler; pMenuHandler=nullptr; return pMH; }
1808 
1809  void MouseLeave(CMouse &rMouse) override
1810  { if (GetParent()) ((ContextMenu *) GetParent())->MouseLeaveEntry(rMouse, this); }
1811 
1812  bool OnHotkey(uint32_t cKey) override { return cKey==cHotkey; }
1813 
1814  bool IsMenu() override { return true; }
1815 
1816  public:
1817  Entry(const char *szText, Icons icoIcon=Ico_None, MenuHandler *pMenuHandler=nullptr, ContextHandler *pSubmenuHandler=nullptr); // ctor
1818  ~Entry() override
1819  {
1820  if (pMenuHandler) delete pMenuHandler;
1821  if (pSubmenuHandler) delete pSubmenuHandler;
1822  }
1823 
1824  const char *GetText() { return sText.getData(); }
1825 
1826  friend class ContextMenu;
1827  };
1828 
1829  protected:
1830  Element *pTarget{nullptr}; // target element; close menu if this is lost
1831  Element *pSelectedItem{nullptr}; // currently highlighted menu item
1832 
1833  ContextMenu *pSubmenu{nullptr}; // currently open submenu
1834 
1835  // mouse movement or buttons forwarded from screen:
1836  // Check bounds and forward as MouseInput to context menu or submenus
1837  // return whether inside context menu bounds
1838  bool CtxMouseInput(CMouse &rMouse, int32_t iButton, int32_t iScreenX, int32_t iScreenY, DWORD dwKeyParam);
1839  void RemoveElement(Element *pChild) override; // clear ptr - abort menu if target is destroyed
1840 
1841  virtual bool CharIn(const char * c); // input: character key pressed - should return false for none-character-inputs
1842  void MouseLeaveEntry(CMouse &rMouse, Entry *pOldEntry); // callback: mouse leaves - deselect menu item if no submenu is open (callback done by menu item)
1843 
1844  void DrawElement(C4TargetFacet &cgo) override; // draw BG
1845  void Draw(C4TargetFacet &cgo) override; // draw inherited (element+contents) plus submenu
1846 
1847  bool IsMenu() override { return true; }
1848 
1849  Screen *GetScreen() override; // return screen by static var
1850 
1851  int32_t GetMarginTop() override { return 5; }
1852  int32_t GetMarginLeft() override { return 5; }
1853  int32_t GetMarginRight() override { return 5; }
1854  int32_t GetMarginBottom() override { return 5; }
1855 
1856  void SelectionChanged(bool fByUser); // other item selected: Close any submenu; do callbacks
1857 
1858  void ElementSizeChanged(Element *pOfElement) override; // called when an element size is changed
1859  void ElementPosChanged(Element *pOfElement) override; // called when an element position is changed
1860 
1861  void CheckOpenSubmenu(); // open submenu if present for selected item
1862  bool IsSubmenu(); // return whether it's a submenu
1863  void DoOK(); // do OK for selected item
1864 
1865  public:
1866  ContextMenu(); // ctor
1867  ~ContextMenu() override; // dtor
1868 
1869  void MouseInput(CMouse &rMouse, int32_t iButton, int32_t iX, int32_t iY, DWORD dwKeyParam) override; // input: mouse movement or buttons
1870 
1871  void Open(Element *pTarget, int32_t iScreenX, int32_t iScreenY);
1872  void Abort(bool fByUser);
1873 
1874  void AddItem(const char *szText, const char *szToolTip=nullptr, Icons icoIcon=Ico_None, MenuHandler *pMenuHandler=nullptr, ContextHandler *pSubmenuHandler=nullptr)
1875  {
1876  Element *pNew = new ContextMenu::Entry(szText, icoIcon, pMenuHandler, pSubmenuHandler);
1877  AddElement(pNew); pNew->SetToolTip(szToolTip);
1878  }
1879 
1880  Entry *GetIndexedEntry(int32_t iIndex) { return static_cast<Entry *>(GetElementByIndex(iIndex)); }
1881 
1882  void SelectItem(int32_t iIndex);
1883 
1884  int32_t GetMenuIndex() { return iMenuIndex; }
1885  static int32_t GetLastMenuIndex() { return iGlobalMenuIndex; }
1886 
1887  Dialog *GetTargetDialog() const { return pTarget ? pTarget->GetDlg() : nullptr; }
1888 
1889  friend class Screen; friend class Entry; friend class Dialog;
1890  };
1891 
1892  // a button to open a context menu
1893  class ContextButton : public Control
1894  {
1895  private:
1896  C4KeyBinding *pKeyContext;
1897  int32_t iOpenMenu; // associated menu (used to flag button down)
1898  bool fMouseOver;
1899 
1900  public:
1901  ContextButton(C4Rect &rtBounds); // ctor
1902  ContextButton(Element *pForEl, bool fAdd, int32_t iHIndent=4, int32_t iVIndent=4); // ctor creating at topright pos of element
1903  ~ContextButton() override;
1904 
1905  private:
1906  bool DoContext(int32_t iX=-1, int32_t iY=-1); // open context menu
1907  bool KeyContext() { return DoContext(); }
1908  void RegisterContextKey();
1909 
1910  protected:
1911  void DrawElement(C4TargetFacet &cgo) override; // draw btn
1912 
1913  bool IsFocusOnClick() override { return false; } // don't select control on click
1914 
1915  public:
1916  void MouseInput(CMouse &rMouse, int32_t iButton, int32_t iX, int32_t iY, DWORD dwKeyParam) override; // input: mouse. left-click opens menu
1917  void MouseEnter(CMouse &rMouse) override;
1918  void MouseLeave(CMouse &rMouse) override;
1919  };
1920 
1921 
1922  // combo box filler
1923  // should be ComboBox::FillCB; but nested class will cause internal compiler faults
1925  {
1926  private:
1927  ComboBox *pCombo;
1928  ContextMenu *pDrop;
1929  public:
1930  virtual ~ComboBox_FillCB() = default;
1931  void FillDropDown(ComboBox *pComboBox, ContextMenu *pDropdownList)
1932  { pCombo = pComboBox; pDrop = pDropdownList; FillDropDownCB(); }
1933  virtual void FillDropDownCB() = 0;
1934  virtual bool OnComboSelChange(ComboBox *pForCombo, int32_t idNewSelection) = 0;
1935 
1936  // to be used in fill-callback only (crash otherwise!)
1937  void AddEntry(const char *szText, int32_t id);
1938  bool FindEntry(const char *szText);
1939  void ClearEntries();
1940  void SelectEntry(int32_t iEntry); // select entry by index
1941  };
1942 
1943  template <class CB> class ComboBox_FillCallback : public ComboBox_FillCB
1944  {
1945  public:
1946  typedef void (CB::*ComboFillFunc)(ComboBox_FillCB *pFiller);
1947  typedef bool (CB::*ComboSelFunc)(ComboBox *pForCombo, int32_t idNewSelection);
1948 
1949  private:
1950  CB *pCBClass;
1951  ComboFillFunc FillFunc;
1952  ComboSelFunc SelFunc;
1953  protected:
1954  void FillDropDownCB() override
1955  { if (pCBClass && FillFunc) (pCBClass->*FillFunc)(this); }
1956  bool OnComboSelChange(ComboBox *pForCombo, int32_t idNewSelection) override
1957  { if (pCBClass && SelFunc) return (pCBClass->*SelFunc)(pForCombo, idNewSelection); else return false; }
1958 
1959  public:
1960  ComboBox_FillCallback(CB * pCBClass, ComboFillFunc FillFunc, ComboSelFunc SelFunc) :
1961  pCBClass(pCBClass), FillFunc(FillFunc), SelFunc(SelFunc) { }
1962  };
1963 
1964 
1965  // dropdown box to select elements from a list
1966  class ComboBox : public Control
1967  {
1968  public:
1969  struct ComboMenuCBStruct // struct used as menu callback parameter for dropdown menu
1970  {
1972  int32_t id{0};
1973 
1975  ComboMenuCBStruct(const char *szText, int32_t id) : sText(szText), id(id) {}
1976  };
1977  private:
1978  class C4KeyBinding *pKeyOpenCombo, *pKeyCloseCombo;
1979  private:
1980  int32_t iOpenMenu; // associated menu (used to flag dropped down)
1981  ComboBox_FillCB *pFillCallback; // callback used to display the dropdown
1982  char Text[C4MaxTitle+1]; // currently selected item
1983  bool fReadOnly; // merely a label in ReadOnly-mode
1984  bool fSimple; // combo without border and stuff
1985  bool fMouseOver; // mouse hovering over this?
1986  CStdFont *pUseFont; // font used to draw this control
1987  uint32_t dwFontClr, dwBGClr, dwBorderClr; // colors used to draw this control
1988  C4Facet *pFctSideArrow; // arrow gfx used to start combo-dropdown
1989 
1990  private:
1991  bool DoDropdown(); // open dropdown menu (context menu)
1992  bool KeyDropDown() { return DoDropdown(); }
1993  bool KeyAbortDropDown() { return AbortDropdown(true); }
1994  bool AbortDropdown(bool fByUser); // abort dropdown menu, if it's open
1995 
1996  protected:
1997  void DrawElement(C4TargetFacet &cgo) override; // draw combo box
1998 
1999  bool IsFocusOnClick() override { return false; } // don't select control on click
2000  Control *IsFocusElement() override { return fReadOnly ? nullptr : this; }; // this control can gain focus if not readonly
2001 
2002  void OnCtxComboSelect(C4GUI::Element *pListItem, const ComboMenuCBStruct &rNewSel);
2003 
2004  public:
2005  ComboBox(const C4Rect &rtBounds);
2006  ~ComboBox() override;
2007 
2008  void MouseInput(CMouse &rMouse, int32_t iButton, int32_t iX, int32_t iY, DWORD dwKeyParam) override; // input: mouse. left-click opens menu
2009  void MouseEnter(CMouse &rMouse) override; // called when mouse cursor enters element region
2010  void MouseLeave(CMouse &rMouse) override; // called when mouse cursor leaves element region
2011 
2012  void SetComboCB(ComboBox_FillCB *pNewFillCallback);
2013  static int32_t GetDefaultHeight();
2014  void SetText(const char *szToText);
2015  void SetReadOnly(bool fToVal) { if ((fReadOnly = fToVal)) AbortDropdown(false); }
2016  void SetSimple(bool fToVal) { fSimple = fToVal; }
2017  const StdStrBuf GetText() { return StdStrBuf(Text, false); }
2018  void SetFont(CStdFont *pToFont) { pUseFont=pToFont; }
2019  void SetColors(uint32_t dwFontClr, uint32_t dwBGClr, uint32_t dwBorderClr)
2020  { this->dwFontClr=dwFontClr; this->dwBGClr=dwBGClr; this->dwBorderClr=dwBorderClr; }
2021  void SetDecoration(C4Facet *pFctSideArrow)
2022  { this->pFctSideArrow = pFctSideArrow; }
2023 
2024  friend class ComboBox_FillCB;
2025  };
2026 
2027  class Dialog;
2028 
2029  // EM window class
2030  class DialogWindow : public C4Window
2031  {
2032  public:
2033  Dialog* pDialog{nullptr};
2035  using C4Window::Init;
2036  C4Window * Init(C4AbstractApp * pApp, const char * Title, const C4Rect &rcBounds, const char *szID);
2037  void Close() override;
2038  void PerformUpdate() override;
2039  };
2040 
2041  // information on how to draw dialog borders and face
2043  {
2044  private:
2045  int iRefCount{0};
2046 
2047  bool SetFacetByAction(C4Def *pOfDef, class C4TargetFacet &rfctTarget, const char *szFacetName);
2048 
2049  public:
2052  uint32_t dwBackClr; // background face color
2056 
2058  void Clear(); // zero data
2059 
2060  // create from ActMap and graphics of a definition (does some script callbacks to get parameters)
2061  bool SetByDef(C4Def *pSrcDef);
2062  bool SetByDef(C4ID idSourceDef); // a wrapper for the above method
2063  bool UpdateGfx(); // update Surface, e.g. after def reload
2064 
2065  void Ref() { ++iRefCount; }
2066  void Deref() { if (!--iRefCount) delete this; }
2067 
2068  void Draw(C4TargetFacet &cgo, C4Rect &rcDrawArea); // draw deco for given rect (rect includes border)
2069  };
2070 
2071  // a dialog
2072  class Dialog: public Window
2073  {
2074  private:
2075  enum Fade { eFadeNone=0, eFadeOut, eFadeIn };
2076 
2077  C4KeyBinding *pKeyAdvanceControl, *pKeyAdvanceControlB, *pKeyHotkey, *pKeyEnter, *pKeyEscape, *pKeyFocusDefControl;
2078  protected:
2079  WoodenLabel *pTitle; // title bar text
2081  Control *pActiveCtrl; // control that has focus
2082  bool fShow; // if set, the dlg is shown
2083  bool fOK; // if set, the user pressed OK
2084  int32_t iFade; // dlg fade (percent)
2085  Fade eFade; // fading mode
2086  bool fDelOnClose; // auto-delete when closing
2088  bool fViewportDlg; // set in ctor: if true, dlg is not independant, but drawn ad controlled within viewports
2089  DialogWindow *pWindow; // window in console mode
2091 
2092  bool CreateConsoleWindow();
2093  void DestroyConsoleWindow();
2094 
2095  void UpdateSize() override; // called when own size changed - update assigned pWindow
2096  void UpdatePos() override; // Dialogs with their own windows can only be at 0/0
2097 
2098  public:
2099  Dialog(int32_t iWdt, int32_t iHgt, const char *szTitle, bool fViewportDlg); // ctor
2100  ~Dialog() override; // dtor
2101 
2102  void RemoveElement(Element *pChild) override; // clear ptr
2103 
2104  void Draw(C4TargetFacet &cgo) override; // render dialog (published)
2105  void DrawElement(C4TargetFacet &cgo) override; // draw dlg bg
2106  bool IsComponentOutsideClientArea() override { return !!pTitle; } // pTitle lies outside client area
2107 
2108  virtual const char *GetID() { return nullptr; }
2109 
2110  // special handling for viewport dialogs
2111  void ApplyElementOffset(int32_t &riX, int32_t &riY) override;
2112  void ApplyInvElementOffset(int32_t &riX, int32_t &riY) override;
2113 
2114  bool IsFocused(Control *pCtrl) override { return pCtrl == pActiveCtrl; }
2115  void SetFocus(Control *pCtrl, bool fByMouse);
2117  Dialog *GetDlg() override { return this; } // this is the dialog
2118  DialogWindow* GetDialogWindow() override { return pWindow; }
2119 
2120  virtual bool CharIn(const char * c); // input: character key pressed - should return false for none-character-inputs (forward to focused control)
2121 
2122  private:
2123  bool KeyHotkey(const C4KeyCodeEx &key);
2124  bool KeyFocusDefault();
2125 
2126  public:
2127  void MouseInput(CMouse &rMouse, int32_t iButton, int32_t iX, int32_t iY, DWORD dwKeyParam) override; // input: mouse. forwards to child controls
2128 
2129  // default control to be set if unprocessed keyboard input has been detected
2130  virtual class Control *GetDefaultControl() { return nullptr; }
2131 
2132  // default dlg actions for enter/escape
2133  virtual bool OnEnter() { UserClose(true); return true; }
2134  bool KeyEnter() { return OnEnter(); }
2135  virtual bool OnEscape() { UserClose(false); return true; }
2136  bool KeyEscape() { return OnEscape(); }
2137 
2138  void AdvanceFocus(bool fBackwards); // change focus to next component
2139  bool KeyAdvanceFocus(bool fBackwards) { AdvanceFocus(fBackwards); return true; }
2140 
2141  int32_t GetMarginTop() override { return (pTitle ? pTitle->GetBounds().Hgt : 0) + (pFrameDeco ? pFrameDeco->iBorderTop : Window::GetMarginTop()); }
2145 
2146  static int32_t GetDefaultTitleHeight();
2147 
2148  bool IsShown() { return fShow; } // returns whether dlg is on screen (may be invisible)
2149  bool IsOK() { return fOK; } // returns whether user pressed OK
2150  bool IsAborted() { return !fShow && !fOK; } // returns whether dialog has been aborted
2151  bool IsActive(bool fForKeyboard); // return whether dlg has mouse control focus
2152  bool IsFading() { return eFade != eFadeNone; }
2153 
2154  virtual bool IsFullscreenDialog() { return false; }
2155  virtual bool HasBackground() { return false; } // true if dlg draws screen background (fullscreen dialogs only)
2156 
2157  // true for dialogs that should span the whole screen
2158  // not just the mouse-viewport
2159  virtual bool IsFreePlaceDialog() { return false; }
2160 
2161  // true for dialogs that should be placed at the bottom of the screen (chat)
2162  virtual bool IsBottomPlacementDialog() { return false; }
2163 
2164  // true for dialogs that receive full keyboard and mouse input even in shared mode
2165  virtual bool IsExclusiveDialog() { return false; }
2166 
2167  // some dialogs, like menus or chat control, don't really need a mouse
2168  // so do not enable it for those in shared mode if mouse control is disabled
2169  virtual bool IsMouseControlled() { return true; }
2170 
2171  // For dialogs associated to a viewport: Return viewport (for placement)
2172  virtual C4Viewport *GetViewport() { return nullptr; }
2173  bool IsViewportDialog() { return fViewportDlg; }
2174 
2175  // for custom placement procedures; should call SetPos
2176  virtual bool DoPlacement(Screen *pOnScreen, const C4Rect &rPreferredDlgRect) { return false; }
2177 
2178  // true for dialogs drawn externally
2179  bool IsExternalDrawDialog() override { return false; }
2180 
2181  // z-ordering used for dialog placement
2182  virtual int32_t GetZOrdering() { return C4GUI_Z_DEFAULT; }
2183 
2184  bool Show(Screen *pOnScreen, bool fCB); // show dialog on screen - default to last created screen
2185  void Close(bool fOK); // close dlg
2186  bool FadeIn(Screen *pOnScreen); // fade dlg into screen
2187  void FadeOut(bool fCloseWithOK); // fade out dlg
2188  bool DoModal(); // execute message loop until dlg is closed (or GUI destructed) - returns whether dlg was OK
2189  bool Execute(); // execute dialog - does message handling, gfx output and idle proc; return false if dlg got closed or GUI deleted
2190  bool Execute2(); // execute dialog - does message handling, gfx output and idle proc; return false and deletes self if dlg got closed or GUI deleted
2191  void SetDelOnClose(bool fToVal=true) { fDelOnClose=fToVal; } // dialog will delete itself when closed
2192 
2193  void SetTitle(const char *szToTitle, bool fShowCloseButton = true); // change title text; creates or removes title bar if necessary
2194  void SetFrameDeco(FrameDecoration *pNewDeco) // change border decoration
2195  {
2196  if (pFrameDeco) pFrameDeco->Deref();
2197  if ((pFrameDeco = pNewDeco)) pNewDeco->Ref();
2198  UpdateOwnPos(); // margin may have changed; might need to reposition stuff
2199  }
2200  void ClearFrameDeco() // clear border decoration; no own pos update!
2201  {if (pFrameDeco) pFrameDeco->Deref(); pFrameDeco = nullptr; }
2203  void SetClientSize(int32_t iToWdt, int32_t iToHgt); // resize dialog so its client area has the specified size
2204 
2205  void OnUserClose(C4GUI::Control *btn) // user presses close btn: Usually close dlg with abort
2206  { UserClose(false); }
2207  virtual void UserClose(bool fOK) { Close(fOK); }
2208  virtual void OnClosed(bool fOK); // callback when dlg got closed
2209  virtual void OnShown() {} // callback when shown - should not delete the dialog
2210  virtual void OnIdle() {} // idle proc in DoModal
2211 
2212  ContextHandler *GetContextHandler() override // always use own context handler only (no fall-through to screen)
2213  { return pContextHandler; }
2214 #ifdef _WIN32
2215  static bool RegisterWindowClass(HINSTANCE hInst); // registers WNDCLASS for console mode dialogs
2216 #endif
2217  friend class Screen;
2218  };
2219 
2220  // a dialog covering the whole screen (using UpperBoard-caption)
2221  class FullscreenDialog : public Dialog
2222  {
2223  protected:
2224  Label *pFullscreenTitle, *pSubTitle; // subtitle to be put in upper-right corner
2225  int32_t iDlgMarginX, iDlgMarginY; // dialog margin set by screen size
2226 
2227  const char *GetID() override { return nullptr; } // no ID needed, because it's never created as a window
2228 
2229  public:
2230  FullscreenDialog(const char *szTitle, const char *szSubtitle); // ctor
2231 
2232  void SetTitle(const char *szToTitle); // change title text; creates or removes title bar if necessary
2233 
2234  protected:
2235  void DrawElement(C4TargetFacet &cgo) override; // draw dlg bg
2236 
2237  // fullscreen dialogs are not closed on Enter
2238  bool OnEnter() override { return false; }
2239 
2240  bool IsComponentOutsideClientArea() override { return true; }
2241 
2242  virtual bool HasUpperBoard() { return false; } // standard fullscreen dialog: UpperBoard no longer present
2243 
2244  bool IsFullscreenDialog() override { return true; }
2245  bool DoPlacement(Screen *pOnScreen, const C4Rect &rPreferredDlgRect) override { return true; } // fullscreen dlg already placed
2246 
2248  int32_t GetMarginLeft() override { return iDlgMarginX; }
2249  int32_t GetMarginRight() override { return iDlgMarginX; }
2250  int32_t GetMarginBottom() override { return iDlgMarginY; }
2251  void UpdateOwnPos() override; // called when element bounds were changed externally
2252 
2253  // helper func: draw facet to screen background
2254  void DrawBackground(C4TargetFacet &cgo, C4Facet &rFromFct);
2255  };
2256 
2257  // a button closing the Dlg
2258  class CloseButton : public Button
2259  {
2260  protected:
2262 
2263  void OnPress() override
2264  { Dialog *pDlg; if ((pDlg = GetDlg())) pDlg->UserClose(fCloseResult); }
2265 
2266  public:
2267  CloseButton(const char *szBtnText, const C4Rect &rtBounds, bool fResult) // ctor
2268  : Button(szBtnText, rtBounds), fCloseResult(fResult) { }
2269  };
2271  {
2272  protected:
2274 
2275  void OnPress() override
2276  { Dialog *pDlg; if ((pDlg = GetDlg())) pDlg->UserClose(fCloseResult); }
2277 
2278  public:
2279  CloseIconButton(const C4Rect &rtBounds, Icons eIcon, bool fResult) // ctor
2280  : IconButton(eIcon, rtBounds, 0), fCloseResult(fResult) { }
2281  };
2282 
2283  // OK button
2284  class OKButton : public CloseButton
2285  {
2286  public: OKButton(const C4Rect &rtBounds) // ctor
2287  : CloseButton(LoadResStr("IDS_DLG_OK"), rtBounds, true) {} };
2289  {
2290  public: OKIconButton(const C4Rect &rtBounds, Icons eIcon) // ctor
2291  : CloseIconButton(rtBounds, eIcon, true) {} };
2292  // cancel button
2293  class CancelButton : public CloseButton
2294  {
2295  public: CancelButton(const C4Rect &rtBounds) // ctor
2296  : CloseButton(LoadResStr("IDS_DLG_CANCEL"), rtBounds, false) {} };
2298  {
2299  public: CancelIconButton(const C4Rect &rtBounds, Icons eIcon) // ctor
2300  : CloseIconButton(rtBounds, eIcon, false) {} };
2301  // regular close button
2303  {
2304  public: DlgCloseButton(const C4Rect &rtBounds) // ctor
2305  : CloseButton(LoadResStr("IDS_DLG_CLOSE"), rtBounds, true) {} };
2306  // Yes button
2307  class YesButton : public CloseButton
2308  {
2309  public: YesButton(const C4Rect &rtBounds) // ctor
2310  : CloseButton(LoadResStr("IDS_DLG_YES"), rtBounds, true) {} };
2311  // No button
2312  class NoButton : public CloseButton
2313  {
2314  public: NoButton(const C4Rect &rtBounds) // ctor
2315  : CloseButton(LoadResStr("IDS_DLG_NO"), rtBounds, false) {} };
2316  // Retry button
2317  class RetryButton : public CloseButton
2318  {
2319  public: RetryButton(const C4Rect &rtBounds) // ctor
2320  : CloseButton(LoadResStr("IDS_BTN_RETRY"), rtBounds, true) {} };
2321  // Reset button
2322  class ResetButton : public CloseButton
2323  {
2324  public: ResetButton(const C4Rect &rtBounds) // ctor
2325  : CloseButton(LoadResStr("IDS_BTN_RESET"), rtBounds, true) {} };
2326 
2327  // a simple message dialog
2328  class MessageDialog : public Dialog
2329  {
2330  private:
2331  bool fHasOK;
2332  int32_t *piConfigDontShowAgainSetting;
2333  class C4KeyBinding *pKeyCopy;
2334  std::string sCopyText; // text that goes into clipboard if user presses Ctrl+C on this window
2335  public:
2336  enum Buttons { btnOK=1, btnAbort=2, btnYes=4, btnNo=8, btnRetry=16, btnReset=32,
2338  };
2340  MessageDialog(const char *szMessage, const char *szCaption, DWORD dwButtons, Icons icoIcon, DlgSize eSize=dsRegular, int32_t *piConfigDontShowAgainSetting=nullptr, bool fDefaultNo=false);
2341  ~MessageDialog() override;
2342 
2343  protected:
2344  bool OnEnter() override { if (!fHasOK) return false; Close(true); return true; }
2346  { if (piConfigDontShowAgainSetting) *piConfigDontShowAgainSetting = static_cast<C4GUI::CheckBox *>(pCheckBox)->GetChecked(); }
2347  bool KeyCopy();
2348 
2349  const char *GetID() override { return "MessageDialog"; }
2350  int32_t GetZOrdering() override { return C4GUI_Z_INPUT; }
2351  };
2352 
2353  // a confirmation dialog, which performs a callback after confirmation
2355  {
2356  private:
2357  BaseCallbackHandler *pCB;
2358 
2359  public:
2360  ConfirmationDialog(const char *szMessage, const char *szCaption, BaseCallbackHandler *pCB, DWORD dwButtons=MessageDialog::btnOKAbort, bool fSmall=false, Icons icoIcon=Ico_Confirm);
2361  ~ConfirmationDialog() override { if (pCB) pCB->DeRef(); }
2362 
2363  protected:
2364  void OnClosed(bool fOK) override; // callback when dlg got closed
2365  };
2366 
2367  // a simple progress dialog
2368  class ProgressDialog : public Dialog
2369  {
2370  protected:
2371  ProgressBar *pBar; // progress bar component
2372  Label *pLblMessage; // message label
2373 
2374  const char *GetID() override { return "ProgressDialog"; }
2375 
2376  public:
2377  ProgressDialog(const char *szMessage, const char *szCaption, int32_t iMaxProgress, int32_t iInitialProgress, Icons icoIcon);
2378 
2379  void SetProgress(int32_t iToProgress) { pBar->SetProgress(iToProgress); } // change progress
2380  bool OnEnter() override { return false; } // don't close on Enter!
2381  void SetMessage(const char *szMessage);
2382  };
2383 
2384 
2386  {
2387  public:
2388  virtual void OnOK(const StdStrBuf &sText) = 0;
2389  virtual ~BaseInputCallback() = default;
2390  };
2391 
2392  template <class T> class InputCallback : public BaseInputCallback
2393  {
2394  public:
2395  typedef void (T::*CBFunc)(const StdStrBuf &);
2396  private:
2397  T *pTarget;
2398  CBFunc pCBFunc;
2399  public:
2400  InputCallback(T *pTarget, CBFunc pCBFunc) : pTarget(pTarget), pCBFunc(pCBFunc) {}
2401 
2402  void OnOK(const StdStrBuf &sText) override { (pTarget->*pCBFunc)(sText); }
2403  };
2404 
2405  // a dialog for a one-line text input; contains OK and cancel button
2406  class InputDialog : public Dialog
2407  {
2408  protected:
2409  Edit *pEdit; // edit for text input
2414 
2415  const char *GetID() override { return "InputDialog"; }
2416 
2417  public:
2418  InputDialog(const char *szMessage, const char *szCaption, Icons icoIcon, BaseInputCallback *pCB, bool fChatLayout=false);
2419  ~InputDialog() override { if (pCB) delete pCB; }
2420 
2421  void OnClosed(bool fOK) override { if (pCB && fOK) pCB->OnOK(StdStrBuf(pEdit->GetText())); Dialog::OnClosed(fOK); } // close CB
2422  void SetMaxText(int32_t iMaxLen) { pEdit->SetMaxText(iMaxLen); }
2423  void SetInputText(const char *szToText);
2424  const char *GetInputText() { return pEdit->GetText(); }
2425  void SetCustomEdit(Edit *pCustomEdit);
2426  };
2427 
2428  // a dialog showing some information text
2429  class InfoDialog : public Dialog, private C4ApplicationSec1Timer
2430  {
2431  private:
2432  int32_t iScroll; // current scroll pos; backup for text update
2433 
2434  protected:
2436 
2437  void CreateSubComponents(); // ctor func
2438 
2439  // add text to the info window
2440  void AddLine(const char *szText);
2441  void AddLineFmt(const char *szFmtString, ...) GNUC_FORMAT_ATTRIBUTE_O;
2442 
2443  void BeginUpdateText(); // backup scrolling and clear text window
2444  void EndUpdateText(); // restore scroll pos; set last update time
2445 
2446  virtual void UpdateText() {}; // function to be overwritten for timed dlgs: Update window text
2447 
2448  void OnSec1Timer() override; // idle proc: update text if necessary
2449  public:
2450  InfoDialog(const char *szCaption, int32_t iLineCount); // ctor
2451  InfoDialog(const char *szCaption, int iLineCount, const StdStrBuf &sText); // ctor - init w/o timer
2452  ~InfoDialog() override;
2453  };
2454 
2455  // a keyboard event that's only executed if the dialog is activated
2456  template <class TargetClass> class DlgKeyCB : public C4KeyCB<TargetClass>
2457  {
2458  private:
2459  typedef C4KeyCB<TargetClass> Base;
2460  typedef bool(TargetClass::*CallbackFunc)();
2461  public:
2462  DlgKeyCB(TargetClass &rTarget, CallbackFunc pFuncDown, CallbackFunc pFuncUp=nullptr, CallbackFunc pFuncPressed=nullptr)
2464 
2465  bool CheckCondition() override { return Base::rTarget.IsInActiveDlg(true) && Base::rTarget.IsVisible(); }
2466  };
2467 
2468  template <class TargetClass> class DlgKeyCBPassKey : public C4KeyCBPassKey<TargetClass>
2469  {
2470  private:
2472  typedef bool(TargetClass::*CallbackFunc)(const C4KeyCodeEx &key);
2473  public:
2474  DlgKeyCBPassKey(TargetClass &rTarget, CallbackFunc pFuncDown, CallbackFunc pFuncUp=nullptr, CallbackFunc pFuncPressed=nullptr)
2476 
2477  bool CheckCondition() override { return Base::rTarget.IsInActiveDlg(true) && Base::rTarget.IsVisible(); }
2478  };
2479 
2480  template <class TargetClass, class ParameterType> class DlgKeyCBEx : public C4KeyCBEx<TargetClass, ParameterType>
2481  {
2482  private:
2484  typedef bool(TargetClass::*CallbackFunc)(ParameterType par);
2485  public:
2486  DlgKeyCBEx(TargetClass &rTarget, const ParameterType &par, CallbackFunc pFuncDown, CallbackFunc pFuncUp=nullptr, CallbackFunc pFuncPressed=nullptr)
2488 
2489  bool CheckCondition() override { return Base::rTarget.IsInActiveDlg(true) && Base::rTarget.IsVisible(); }
2490  };
2491 
2492  // a keyboard event that's only executed if the control has focus
2493  template <class TargetClass> class ControlKeyCB : public C4KeyCB<TargetClass>
2494  {
2495  private:
2496  typedef C4KeyCB<TargetClass> Base;
2497  typedef bool(TargetClass::*CallbackFunc)();
2498  public:
2499  ControlKeyCB(TargetClass &rTarget, CallbackFunc pFuncDown, CallbackFunc pFuncUp=nullptr, CallbackFunc pFuncPressed=nullptr)
2501 
2502  bool CheckCondition() override { return Base::rTarget.HasDrawFocus(); }
2503  };
2504 
2505  template <class TargetClass, class ParameterType> class ControlKeyCBExPassKey : public C4KeyCBExPassKey<TargetClass, ParameterType>
2506  {
2507  private:
2509  typedef bool(TargetClass::*CallbackFunc)(const C4KeyCodeEx &key, const ParameterType &par);
2510  public:
2511  ControlKeyCBExPassKey(TargetClass &rTarget, const ParameterType &rPar, CallbackFunc pFuncDown, CallbackFunc pFuncUp=nullptr, CallbackFunc pFuncPressed=nullptr)
2512  : Base(rTarget, rPar, pFuncDown, pFuncUp, pFuncPressed) {}
2513 
2514  bool CheckCondition() override { return Base::rTarget.HasDrawFocus(); }
2515  };
2516 
2517  // key event that checks whether a control is active, but forwards to the dialog
2518  template <class TargetClass> class ControlKeyDlgCB : public C4KeyCB<TargetClass>
2519  {
2520  private:
2521  class Control *pCtrl;
2522  typedef C4KeyCB<TargetClass> Base;
2523  typedef bool(TargetClass::*CallbackFunc)();
2524  public:
2525  ControlKeyDlgCB(Control *pCtrl, TargetClass &rTarget, CallbackFunc pFuncDown, CallbackFunc pFuncUp=nullptr, CallbackFunc pFuncPressed=nullptr)
2526  : Base(rTarget, pFuncDown, pFuncUp, pFuncPressed), pCtrl(pCtrl) {}
2527 
2528  bool CheckCondition() override { return pCtrl && pCtrl->IsInActiveDlg(true) && pCtrl->IsVisible(); }
2529  };
2530 
2531  // mouse cursor control
2532  class CMouse
2533  {
2534  public:
2535  int32_t x,y; // cursor position
2536  bool LDown, MDown, RDown; // mouse button states
2537  int32_t LDownX, LDownY; // position where left button was pressed last
2538  DWORD dwKeys; // shift, ctrl, etc.
2539  bool fActive;
2540  C4TimeMilliseconds tLastMovementTime; // C4TimeMilliseconds::Now() when the mouse pos changed last
2541 
2542  // whether last input was done by mouse
2543  // set to true whenever mouse pos changes or buttons are pressed
2544  // reset by keyboard actions to avoid tooltips where the user isn't even doing anything
2546 
2548  {
2549  TTST_None = 0, // show no tooltips
2550  TTST_Immediate = 1, // show only tooltips of elements that require immediate show (i.e. otherwise unlabeled buttons)
2551  TTST_All = 2, // show all tooltips (mouse hovered on same element for some time)
2552  };
2553 
2554  public:
2555  Element *pMouseOverElement, *pPrevMouseOverElement; // elements at mouse position (after and before processing of mouse event)
2556  Element *pDragElement; // element at pos where left mouse button was clicked last
2557 
2558  public:
2559  CMouse(int32_t iX, int32_t iY); // ctor
2560  ~CMouse(); // dtor
2561 
2562  void Draw(C4TargetFacet &cgo, TooltipShowState draw_tool_tips); // draw cursor
2563 
2564  void Input(int32_t iButton, int32_t iX, int32_t iY, DWORD dwKeyParam); // process mouse input
2565  bool IsLDown() { return LDown; }
2566 
2567  void GetLastXY(int32_t &rX, int32_t &rY, DWORD &rdwKeys) { rX=x; rY=y; rdwKeys=dwKeys; }
2568 
2569  void ResetElements() // reset MouseOver/etc.-controls
2571  void ReleaseElements(); // reset MouseOver/etc.-controls, doing the appropriate callbacks
2572  void OnElementGetsInvisible(Element *pChild); // clear ptr
2573 
2574  void RemoveElement(Element *pChild); // clear ptr
2575 
2576  void SetOwnedMouse(bool fToVal) { fActive=fToVal; }
2577 
2580  void ResetActiveInput() { fActiveInput = false; }
2581  bool IsActiveInput() { return fActiveInput; }
2582 
2583  void ReleaseButtons() { LDown = RDown = MDown = false; }
2584  };
2585 
2586  // the dialog client area
2587  class Screen : public Window
2588  {
2589  public:
2591 
2592  protected:
2593  Dialog *pActiveDlg; // current, active dialog
2594  ContextMenu *pContext{nullptr}; // currently opened context menu (lowest submenu)
2595  bool fExclusive{true}; // default true. if false, input is shared with the game
2596  C4Rect PreferredDlgRect; // rectangle in which dialogs should be placed
2597  float fZoom{1.0f};
2598 
2599  static Screen *pScreen; // static singleton var
2600 
2601  public:
2602  void RemoveElement(Element *pChild) override; // clear ptr
2604 
2605  protected:
2606  using Window::Draw;
2607  virtual void Draw(C4TargetFacet &cgo, bool fDoBG); // draw screen contents
2608 
2609  void ElementPosChanged(Element *pOfElement) override; // called when a dialog is moved
2610 
2611  public:
2612  void ShowDialog(Dialog *pDlg, bool fFade); // present dialog to user
2613  void CloseDialog(Dialog *pDlg, bool fFade);// hide dialog from user
2614  void ActivateDialog(Dialog *pDlg); // set dlg as active
2615  void RecheckActiveDialog();
2616 
2617  Dialog *GetTopDialog(); // get topmost dlg
2618  public:
2619  Screen();
2620  ~Screen() override;
2621 
2622  void Init(int32_t tx, int32_t ty, int32_t twdt, int32_t thgt);
2623  void Clear();
2624 
2625  void Render(bool fDoBG); // render to pDraw
2626  void RenderMouse(C4TargetFacet &cgo); // draw mouse only
2627 
2628  Screen *GetScreen() override { return this; }; // return contained screen
2629  static Screen *GetScreenS() { return pScreen; } // get global screen
2630 
2631  float GetZoom() const { return fZoom; }; // get GUI zoom
2632 
2633  bool IsActive() { return !!GetTopDialog(); } // return whether GUI is active
2634 
2635  bool KeyAny(); // to be called on keystrokes; resets some tooltip-times
2636  virtual bool CharIn(const char * c); // input: character key pressed - should return false for none-character-inputs
2637  using Window::MouseInput;
2638  bool MouseInput(int32_t iButton, int32_t iX, int32_t iY, DWORD dwKeyParam, Dialog *pDlg, class C4Viewport *pVP); // input: mouse movement or buttons; sends MouseEnter/Leave; return whether inside dialog
2639  void MouseMove(int32_t iButton, int32_t iX, int32_t iY, DWORD dwKeyParam, class C4Viewport *pVP); // pVP specified for console mode viewports only
2640  void SetMouseInGUI(bool fInGUI, bool fByMouse);
2641  bool RecheckMouseInput(); // do mouse movement iusing last input flags
2642 
2643  bool ShowMessage(const char *szMessage, const char *szCaption, Icons icoIcon, int32_t *piConfigDontShowAgainSetting=nullptr); // show message
2644  bool ShowErrorMessage(const char *szMessage); // show message: Error caption and icon
2645  bool ShowMessageModal(const char *szMessage, const char *szCaption, DWORD dwButtons, Icons icoIcon, int32_t *piConfigDontShowAgainSetting=nullptr); // show modal message dlg
2646  ProgressDialog *ShowProgressDlg(const char *szMessage, const char *szCaption, int32_t iMaxProgress=100, int32_t iInitialProgress=0, Icons icoIcon=Ico_Wait); // create and show a progress dialog
2647  bool ShowModalDlg(Dialog *pDlg, bool fDestruct=true); // show any dialog modal and destruct it afterwards
2648  bool ShowRemoveDlg(Dialog *pDlg); // show dialog, and flag it to delete itself when closed; return immediately
2649 
2650  void CloseAllDialogs(bool fWithOK); // close all dialogs on the screen; top dlgs first
2651  void SetPreferredDlgRect(const C4Rect &rtNewPref) { PreferredDlgRect = rtNewPref; }
2652 #ifdef USE_WIN32_WINDOWS
2653  Dialog *GetDialog(HWND hWindow); // get console dialog
2654 #endif
2655  Dialog *GetDialog(C4Window * pWindow); // get console dialog
2656  void DoContext(ContextMenu *pNewCtx, Element *pAtElement, int32_t iX, int32_t iY); // open context menu (closes any other contextmenu)
2657  void AbortContext(bool fByUser) { if (pContext) pContext->Abort(fByUser); } // close context menu
2658  int32_t GetContextMenuIndex() { return pContext ? pContext->GetMenuIndex() : 0; } // get current context-menu (lowest level)
2659  int32_t GetLastContextMenuIndex() { return ContextMenu::GetLastMenuIndex(); } // get last opened context-menu (lowest level)
2660  bool HasContext() { return !!pContext; }
2661 
2662  bool HasFullscreenDialog(bool fIncludeFading); // true if on fullscreen dialog is visible
2663  Dialog *GetFullscreenDialog(bool fIncludeFading); // return dlg pointer to first found fullscreen dialog
2664 
2665  // callback from C4Game from message-handling of WM_TIMER; forwards to dialog-timer
2666  void OnSec1Timer();
2667 
2668  // exclusive
2669  void SetExclusive(bool fToState) { fExclusive = fToState; Mouse.SetOwnedMouse(fExclusive); UpdateMouseFocus(); }
2670  bool IsExclusive() { return fExclusive; }
2672  {
2673  // always hook keyboard in exclusive mode; only on exclusive top dialogs in shared mode
2674  if (IsExclusive()) return true;
2675  Dialog *pDlg = GetTopDialog();
2676  return pDlg && pDlg->IsExclusiveDialog();
2677  }
2678  bool HasMouseFocus() // return whether mouse controls GUI only
2679  { return HasKeyboardFocus(); }
2680  int32_t GetMouseControlledDialogCount(); // count dlgs with that flag set
2681  void UpdateMouseFocus(); // when exclusive mode has changed: Make sure mouse clip is correct
2682 
2683  // draw a tooltip in a box
2684  static void DrawToolTip(const char *szTip, C4TargetFacet &cgo, float guix, float guiy);
2685 
2686  // gamepad
2687  void UpdateGamepadGUIControlEnabled(); // callback when gamepad gui option changed
2688 
2689  friend class Dialog; friend class ContextMenu;
2690  };
2691 
2692  // menu handler bound to member functions of another class
2693  template <class CBClass> class CBMenuHandler : public MenuHandler
2694  {
2695  private:
2696  CBClass *pCBTarget; // callback target
2697  typename DlgCallback<CBClass>::ContextClickFunc pCallbackFn; // callback function
2698 
2699  public:
2700  // ctor
2701  CBMenuHandler<CBClass>(CBClass *pCBTarget, typename DlgCallback<CBClass>::ContextClickFunc pCallbackFn, int32_t iaExtra=0)
2702  : MenuHandler(), pCBTarget(pCBTarget), pCallbackFn(pCallbackFn) { }
2703 
2704  void OnOK(Element *pTargetElement) override
2705  {
2706  if (!pCBTarget /* || !pCallbackFn */) return;
2707  // do callback
2708  (pCBTarget->*pCallbackFn)(pTargetElement);
2709  }
2710  };
2711 
2712  // menu handler bound to member functions of another class, providing extra storage for parameters
2713  template <class CBClass, class TEx> class CBMenuHandlerEx : public MenuHandler
2714  {
2715  private:
2716  CBClass *pCBTarget; // callback target
2717  typename DlgCallbackEx<CBClass, const TEx &>::ContextClickFunc pCallbackFn; // callback function
2718  TEx Extra; // extra data
2719  public:
2720  // ctor
2721  CBMenuHandlerEx<CBClass, TEx>(CBClass *pCBTarget, typename DlgCallbackEx<CBClass, const TEx &>::ContextClickFunc pCallbackFn, TEx aExtra)
2722  : MenuHandler(), pCBTarget(pCBTarget), pCallbackFn(pCallbackFn), Extra(std::move(aExtra)) { }
2724  : MenuHandler(), pCBTarget(pCBTarget), pCallbackFn(pCallbackFn), Extra() { }
2725 
2726  const TEx &GetExtra() const { return Extra; }
2727  void SetExtra(const TEx &e) { Extra = e; }
2728 
2729  void OnOK(Element *pTargetElement) override
2730  {
2731  if (!pCBTarget || !pCallbackFn) return;
2732  // do callback
2733  (pCBTarget->*pCallbackFn)(pTargetElement, Extra);
2734  }
2735  };
2736 
2737  // context handler bound to member functions of another class
2738  template <class CBClass> class CBContextHandler : public ContextHandler
2739  {
2740  private:
2741  CBClass *pCBTarget; // callback target
2742  typename DlgCallback<CBClass>::ContextFunc pCallbackFn; // callback function
2743 
2744  public:
2745  // ctor
2746  CBContextHandler<CBClass>(CBClass *pCBTarget, typename DlgCallback<CBClass>::ContextFunc pCallbackFn)
2747  : ContextHandler(), pCBTarget(pCBTarget), pCallbackFn(pCallbackFn) { }
2748 
2749  bool OnContext(Element *pOnElement, int32_t iX, int32_t iY) override
2750  {
2752  if (!pCBTarget) return false;
2753  // if (!pCallbackFn) return false;
2754  Screen *pScreen = pOnElement->GetScreen();
2755  if (!pScreen) return false;
2756  // let CB func create context menu
2757  ContextMenu *pNewMenu = (pCBTarget->*pCallbackFn)(pOnElement, iX, iY);
2758  if (!pNewMenu) return false;
2759  // open it on screen
2760  pScreen->DoContext(pNewMenu, pOnElement, iX, iY);
2761  // done, success
2762  return true;
2763  }
2764 
2765  C4GUI::ContextMenu *OnSubcontext(Element *pOnElement) override
2766  {
2767  // query directly
2768  return (pCBTarget->*pCallbackFn)(pOnElement, 0, 0);
2769  }
2770  friend class Dialog;
2771  };
2772 
2773  // a helper used to align elements
2775  {
2776  protected:
2777  C4Rect rcClientArea; // free client area
2778  int32_t iMarginX, iMarginY; // horizontal and vertical margins of components
2779 
2780  static C4Rect rcTemp; // temp rect
2781 
2782  public:
2783  ComponentAligner(const C4Rect &rcArea, int32_t iMarginX, int32_t iMarginY, bool fZeroAreaXY=false) // ctor
2785  { if (fZeroAreaXY) rcClientArea.x=rcClientArea.y=0; }
2786 
2787  bool GetFromTop(int32_t iHgt, int32_t iWdt, C4Rect &rcOut); // get a portion from the top
2788  bool GetFromLeft(int32_t iWdt, int32_t iHgt, C4Rect &rcOut); // get a portion from the left
2789  bool GetFromRight(int32_t iWdt, int32_t iHgt, C4Rect &rcOut); // get a portion from the right
2790  bool GetFromBottom(int32_t iHgt, int32_t iWdt, C4Rect &rcOut); // get a portion from the bottom
2791  void GetAll(C4Rect &rcOut); // get remaining client area
2792  bool GetCentered(int32_t iWdt, int32_t iHgt, C4Rect &rcOut); // get centered subregion within area
2793 
2794  C4Rect &GetFromTop(int32_t iHgt, int32_t iWdt=-1) { GetFromTop(iHgt, iWdt, rcTemp); return rcTemp; } // get a portion from the top
2795  C4Rect &GetFromLeft(int32_t iWdt, int32_t iHgt=-1) { GetFromLeft(iWdt, iHgt, rcTemp); return rcTemp; } // get a portion from the left
2796  C4Rect &GetFromRight(int32_t iWdt, int32_t iHgt=-1) { GetFromRight(iWdt, iHgt, rcTemp); return rcTemp; } // get a portion from the right
2797  C4Rect &GetFromBottom(int32_t iHgt, int32_t iWdt=-1) { GetFromBottom(iHgt, iWdt, rcTemp); return rcTemp; } // get a portion from the bottom
2798  C4Rect &GetAll() { GetAll(rcTemp); return rcTemp; } // get remaining client are
2799  C4Rect &GetCentered(int32_t iWdt, int32_t iHgt) { GetCentered(iWdt, iHgt, rcTemp); return rcTemp; } // get centered subregion within area (w/o size checks)
2800 
2801  C4Rect &GetGridCell(int32_t iSectX, int32_t iSectXMax, int32_t iSectY, int32_t iSectYMax, int32_t iSectSizeX=-1, int32_t iSectSizeY=-1, bool fCenterPos=false, int32_t iSectNumX=1, int32_t iSectNumY=1);
2802 
2803  int32_t GetWidth() const { return rcClientArea.Wdt; }
2804  int32_t GetHeight() const { return rcClientArea.Hgt; }
2805  int32_t GetHMargin() const { return iMarginX; }
2806  int32_t GetVMargin() const { return iMarginY; }
2807 
2808  int32_t GetInnerWidth() const { return rcClientArea.Wdt-2*iMarginX; }
2809  int32_t GetInnerHeight() const { return rcClientArea.Hgt-2*iMarginY; }
2810 
2811  void ExpandTop(int32_t iByHgt) { rcClientArea.y-=iByHgt; rcClientArea.Hgt+=iByHgt; } // enlarge client rect
2812  void ExpandLeft(int32_t iByWdt) { rcClientArea.x-=iByWdt; rcClientArea.Wdt+=iByWdt; } // enlarge client rect
2813  void ExpandRight(int32_t iByWdt) { rcClientArea.Wdt+=iByWdt; } // enlarge client rect
2814  void ExpandBottom(int32_t iByHgt) { rcClientArea.Hgt+=iByHgt; } // enlarge client rect
2815 
2816  void LogIt(const char *szName);
2817  };
2818 
2819  // shortcut for check whether GUI is active
2820  inline bool IsActive() { return Screen::GetScreenS()->IsActive(); }
2821  inline bool IsExclusive() { return Screen::GetScreenS()->IsExclusive(); }
2822 
2823  // shortcut for GUI screen size
2824  inline int32_t GetScreenWdt() { return Screen::GetScreenS()->GetBounds().Wdt; }
2825  inline int32_t GetScreenHgt() { return Screen::GetScreenS()->GetBounds().Hgt; }
2826 
2827  // sound effect in GUI: Only if enabled
2828  void GUISound(const char *szSound);
2829 
2830  // Zoom
2831  inline float GetZoom() { return Screen::GetScreenS()->GetZoom(); }
2832  inline void MouseMove(int32_t iButton, int32_t iX, int32_t iY, DWORD dwKeyParam, class C4Viewport *pVP) // pVP specified for console mode viewports only
2833  { Screen::GetScreenS()->MouseMove(iButton, iX, iY, dwKeyParam, pVP); }
2834 
2835  extern Screen TheScreen;
2836 } // end of namespace
2837 
2839 extern C4GUIScreen *pGUI;
2840 #endif
const size_t C4MaxTitle
Definition: C4Constants.h:25
const int C4UpperBoardHeight
Definition: C4Constants.h:59
C4GameControl Control
#define C4GUI_ToolTipShowTime
Definition: C4Gui.h:143
#define C4GUI_ScrollArrowHgt
Definition: C4Gui.h:105
#define C4GUI_FullscreenDlg_TitleHeight
Definition: C4Gui.h:160
#define C4GUI_MessageDlgWdtMedium
Definition: C4Gui.h:128
#define C4GUI_Z_DEFAULT
Definition: C4Gui.h:154
#define C4GUI_BorderAlpha
Definition: C4Gui.h:84
#define C4GUI_DefaultListSpacing
Definition: C4Gui.h:123
C4GUIScreen * pGUI
Definition: C4Gui.cpp:1191
#define C4GUI_ScrollThumbWdt
Definition: C4Gui.h:108
#define C4GUI_ScrollThumbHgt
Definition: C4Gui.h:107
#define C4GUI_CaptionFontClr
Definition: C4Gui.h:37
#define C4GUI_Z_INPUT
Definition: C4Gui.h:153
C4GUI::Screen C4GUIScreen
Definition: C4Gui.h:2838
#define C4GUI_MessageDlgWdt
Definition: C4Gui.h:127
#define C4GUI_MessageDlgWdtSmall
Definition: C4Gui.h:129
#define C4GUI_ScrollArrowWdt
Definition: C4Gui.h:106
unsigned long C4KeyCode
const char * LoadResStr(const char *id)
Definition: C4Language.h:83
const int ALeft
Definition: C4Surface.h:41
const int ACenter
Definition: C4Surface.h:41
#define GNUC_FORMAT_ATTRIBUTE_O
uint8_t BYTE
uint32_t DWORD
Definition: C4Def.h:99
C4Surface * Surface
Definition: C4Facet.h:117
float Wdt
Definition: C4Facet.h:118
void Default()
Definition: C4Facet.cpp:31
void Clear()
Definition: C4FacetEx.h:44
void Set(const C4Facet &cpy)
Definition: C4FacetEx.h:46
ArrowButton(ArrowFct eDir, const C4Rect &rtBounds, char cHotkey=0)
ArrowFct eDir
Definition: C4Gui.h:1161
static int32_t GetDefaultHeight()
static int32_t GetDefaultWidth()
void DrawElement(C4TargetFacet &cgo) override
virtual void DoCall(class Element *pElement)=0
virtual ~BaseCallbackHandler()=default
virtual ~BaseInputCallback()=default
virtual void OnOK(const StdStrBuf &sText)=0
virtual void DoCall(ParType par)=0
void DoCall(class Element *pElement) override
Definition: C4Gui.h:321
void SetEnabled(bool fToVal)
Definition: C4Gui.h:1131
void MouseEnter(CMouse &rMouse) override
bool KeyButtonUp()
void MouseLeave(CMouse &rMouse) override
bool KeyButtonDown()
void SetFont(CStdFont *pFont, DWORD dwCustomFontClr=C4GUI_CaptionFontClr)
Definition: C4Gui.h:1132
StdStrBuf sText
Definition: C4Gui.h:1099
virtual void OnPress()
void SetCustomGraphics(DynBarFacet *pCustomGfx, DynBarFacet *pCustomGfxDown)
Definition: C4Gui.h:1129
bool fDown
Definition: C4Gui.h:1102
void MouseInput(CMouse &rMouse, int32_t iButton, int32_t iX, int32_t iY, DWORD dwKeyParam) override
CStdFont * pCustomFont
Definition: C4Gui.h:1100
bool OnHotkey(uint32_t cHotkey) override
Definition: C4GuiButton.cpp:71
void SetUp(bool fPress)
Button(const char *szBtnText, const C4Rect &rtBounds)
Definition: C4GuiButton.cpp:33
void DrawElement(C4TargetFacet &cgo) override
Definition: C4GuiButton.cpp:82
bool fEnabled
Definition: C4Gui.h:1105
bool fMouseOver
Definition: C4Gui.h:1103
uint32_t cHotkey
Definition: C4Gui.h:1104
~Button() override
Definition: C4GuiButton.cpp:50
DWORD dwCustomFontClr
Definition: C4Gui.h:1101
void SetText(const char *szToText)
Definition: C4GuiButton.cpp:55
bool IsFocusOnClick() override
Definition: C4Gui.h:1107
bool OnContext(Element *pOnElement, int32_t iX, int32_t iY) override
Definition: C4Gui.h:2749
C4GUI::ContextMenu * OnSubcontext(Element *pOnElement) override
Definition: C4Gui.h:2765
const TEx & GetExtra() const
Definition: C4Gui.h:2726
void SetExtra(const TEx &e)
Definition: C4Gui.h:2727
void OnOK(Element *pTargetElement) override
Definition: C4Gui.h:2729
void OnOK(Element *pTargetElement) override
Definition: C4Gui.h:2704
bool IsActiveInput()
Definition: C4Gui.h:2581
bool LDown
Definition: C4Gui.h:2536
bool fActive
Definition: C4Gui.h:2539
bool IsLDown()
Definition: C4Gui.h:2565
bool MDown
Definition: C4Gui.h:2536
void ResetToolTipTime()
Definition: C4Gui.h:2578
void ReleaseElements()
Definition: C4Gui.cpp:519
@ TTST_Immediate
Definition: C4Gui.h:2550
int32_t LDownX
Definition: C4Gui.h:2537
void ResetElements()
Definition: C4Gui.h:2569
C4TimeMilliseconds tLastMovementTime
Definition: C4Gui.h:2540
void Input(int32_t iButton, int32_t iX, int32_t iY, DWORD dwKeyParam)
Definition: C4Gui.cpp:463
Element * pMouseOverElement
Definition: C4Gui.h:2555
Element * pDragElement
Definition: C4Gui.h:2556
int32_t y
Definition: C4Gui.h:2535
void OnElementGetsInvisible(Element *pChild)
Definition: C4Gui.cpp:546
Element * pPrevMouseOverElement
Definition: C4Gui.h:2555
void ResetActiveInput()
Definition: C4Gui.h:2580
int32_t LDownY
Definition: C4Gui.h:2537
void Draw(C4TargetFacet &cgo, TooltipShowState draw_tool_tips)
Definition: C4Gui.cpp:485
void RemoveElement(Element *pChild)
Definition: C4Gui.cpp:534
int32_t x
Definition: C4Gui.h:2535
CMouse(int32_t iX, int32_t iY)
Definition: C4Gui.cpp:448
bool IsMouseStill()
Definition: C4Gui.h:2579
void ReleaseButtons()
Definition: C4Gui.h:2583
bool fActiveInput
Definition: C4Gui.h:2545
bool RDown
Definition: C4Gui.h:2536
void SetOwnedMouse(bool fToVal)
Definition: C4Gui.h:2576
DWORD dwKeys
Definition: C4Gui.h:2538
void GetLastXY(int32_t &rX, int32_t &rY, DWORD &rdwKeys)
Definition: C4Gui.h:2567
CallbackDlg * CallbackDlgPointer
Definition: C4Gui.h:1231
CallbackButtonEx(const C4Facet &fctBase, const C4Facet &fctHighlight, const FLOAT_RECT &rtfBounds, char cHotkey, CallbackDlgPointer pCBTarget, typename DlgCallback< CallbackDlg >::Func pFn)
Definition: C4Gui.h:1242
CallbackDlgPointer pCBTarget
Definition: C4Gui.h:1232
DlgCallback< CallbackDlg >::Func pCallbackFn
Definition: C4Gui.h:1233
CallbackButtonEx(const char *szBtnText, const C4Rect &rtBounds, CallbackDlgPointer pCBTarget, typename DlgCallback< CallbackDlg >::Func pFn)
Definition: C4Gui.h:1238
void OnPress() override
Definition: C4Gui.h:1234
CallbackButtonEx(Icons eUseIcon, const C4Rect &rtBounds, char cHotkey, CallbackDlgPointer pCBTarget, typename DlgCallback< CallbackDlg >::Func pFn)
Definition: C4Gui.h:1240
CallbackButton(Icons eUseIcon, const C4Rect &rtBounds, char cHotkey, typename DlgCallback< CallbackDlg >::Func pFn, CallbackDlg *pCB=nullptr)
Definition: C4Gui.h:1219
DlgCallback< CallbackDlg >::Func pCallbackFn
Definition: C4Gui.h:1203
void OnPress() override
Definition: C4Gui.h:1204
CallbackDlg * pCB
Definition: C4Gui.h:1201
CallbackButton(Icons eUseIcon, const C4Rect &rtBounds, const char *tooltip_text, typename DlgCallback< CallbackDlg >::Func pFn, CallbackDlg *pCB=nullptr)
Definition: C4Gui.h:1221
CallbackButton(const char *szBtnText, C4Rect &rtBounds, typename DlgCallback< CallbackDlg >::Func pFn, CallbackDlg *pCB=nullptr)
Definition: C4Gui.h:1217
CallbackButton(int32_t iID, const C4Rect &rtBounds, char cHotkey, typename DlgCallback< CallbackDlg >::Func pFn, CallbackDlg *pCB=nullptr)
Definition: C4Gui.h:1223
CallbackButton(ArrowButton::ArrowFct eDir, const C4Rect &rtBounds, typename DlgCallback< CallbackDlg >::Func pFn, CallbackDlg *pCB=nullptr)
Definition: C4Gui.h:1215
CallbackEdit(const C4Rect &rtBounds, CallbackCtrl *pCBCtrl, CBFunc pCBFunc, CBAbortFunc pCBAbortFunc=nullptr)
Definition: C4Gui.h:1371
CBAbortFunc pCBAbortFunc
Definition: C4Gui.h:1364
InputResult OnFinishInput(bool fPasting, bool fPastingMore) override
Definition: C4Gui.h:1365
InputResult(CallbackCtrl::* CBFunc)(Edit *, bool, bool)
Definition: C4Gui.h:1362
void OnAbortInput() override
Definition: C4Gui.h:1367
void(CallbackCtrl::* CBAbortFunc)()
Definition: C4Gui.h:1363
CallbackHandlerExPar(CB *pTarget, Func rFunc, ParType par)
Definition: C4Gui.h:314
void DoCall(class Element *pElement) override
Definition: C4Gui.h:309
void(CB::* Func)(ParType)
Definition: C4Gui.h:301
void DoCall(class Element *pElement) override
Definition: C4Gui.h:272
void(CB::* Func)(class Element *pElement)
Definition: C4Gui.h:265
CallbackHandler(CB *pTarget, Func rFunc)
Definition: C4Gui.h:277
void(CB::* Func)()
Definition: C4Gui.h:283
CallbackHandlerNoPar(CB *pTarget, Func rFunc)
Definition: C4Gui.h:295
void DoCall(class Element *pElement) override
Definition: C4Gui.h:290
CBCancelFunc pCBCancelFunc
Definition: C4Gui.h:1417
RenameResult(CallbackDlg::* CBOKFunc)(ParType, const char *)
Definition: C4Gui.h:1415
CallbackRenameEdit(Label *pForLabel, CallbackDlg *pDlg, const ParType &par, CBOKFunc pCBOKFunc, CBCancelFunc pCBCancelFunc)
Definition: C4Gui.h:1424
CallbackDlg * pDlg
Definition: C4Gui.h:1418
void OnCancelRename() override
Definition: C4Gui.h:1420
void(CallbackDlg::* CBCancelFunc)(ParType)
Definition: C4Gui.h:1414
RenameResult OnOKRename(const char *szNewName) override
Definition: C4Gui.h:1421
CancelButton(const C4Rect &rtBounds)
Definition: C4Gui.h:2295
CancelIconButton(const C4Rect &rtBounds, Icons eIcon)
Definition: C4Gui.h:2299
const char * GetText()
Definition: C4Gui.h:1482
void SetFont(CStdFont *pFont, uint32_t dwEnabledClr, uint32_t dwDisabledClr)
Definition: C4Gui.h:1484
void DrawElement(C4TargetFacet &cgo) override
~CheckBox() override
void MouseInput(CMouse &rMouse, int32_t iButton, int32_t iX, int32_t iY, DWORD dwKeyParam) override
void SetOnChecked(BaseCallbackHandler *pCB)
bool IsFocusOnClick() override
Definition: C4Gui.h:1467
void MouseLeave(CMouse &rMouse) override
void SetChecked(bool fToVal)
Definition: C4Gui.h:1477
CheckBox(const C4Rect &rtBounds, const char *szCaption, bool fChecked)
bool OnHotkey(uint32_t cHotkey) override
void MouseEnter(CMouse &rMouse) override
Control * IsFocusElement() override
Definition: C4Gui.h:1468
void SetEnabled(bool fToVal)
Definition: C4Gui.h:1480
static bool GetStandardCheckBoxSize(int *piWdt, int *piHgt, const char *szForCaptionText, CStdFont *pUseFont)
void ToggleCheck(bool fByUser)
bool GetChecked() const
Definition: C4Gui.h:1478
void UpdateOwnPos() override
void OnPress() override
Definition: C4Gui.h:2263
CloseButton(const char *szBtnText, const C4Rect &rtBounds, bool fResult)
Definition: C4Gui.h:2267
void OnPress() override
Definition: C4Gui.h:2275
CloseIconButton(const C4Rect &rtBounds, Icons eIcon, bool fResult)
Definition: C4Gui.h:2279
virtual void FillDropDownCB()=0
void AddEntry(const char *szText, int32_t id)
void SelectEntry(int32_t iEntry)
virtual bool OnComboSelChange(ComboBox *pForCombo, int32_t idNewSelection)=0
bool FindEntry(const char *szText)
virtual ~ComboBox_FillCB()=default
void FillDropDown(ComboBox *pComboBox, ContextMenu *pDropdownList)
Definition: C4Gui.h:1931
ComboBox_FillCallback(CB *pCBClass, ComboFillFunc FillFunc, ComboSelFunc SelFunc)
Definition: C4Gui.h:1960
void FillDropDownCB() override
Definition: C4Gui.h:1954
void(CB::* ComboFillFunc)(ComboBox_FillCB *pFiller)
Definition: C4Gui.h:1946
bool OnComboSelChange(ComboBox *pForCombo, int32_t idNewSelection) override
Definition: C4Gui.h:1956
bool(CB::* ComboSelFunc)(ComboBox *pForCombo, int32_t idNewSelection)
Definition: C4Gui.h:1947
void SetSimple(bool fToVal)
Definition: C4Gui.h:2016
void DrawElement(C4TargetFacet &cgo) override
static int32_t GetDefaultHeight()
const StdStrBuf GetText()
Definition: C4Gui.h:2017
Control * IsFocusElement() override
Definition: C4Gui.h:2000
void SetComboCB(ComboBox_FillCB *pNewFillCallback)
void OnCtxComboSelect(C4GUI::Element *pListItem, const ComboMenuCBStruct &rNewSel)
void SetColors(uint32_t dwFontClr, uint32_t dwBGClr, uint32_t dwBorderClr)
Definition: C4Gui.h:2019
void SetFont(CStdFont *pToFont)
Definition: C4Gui.h:2018
void SetReadOnly(bool fToVal)
Definition: C4Gui.h:2015
bool IsFocusOnClick() override
Definition: C4Gui.h:1999
void SetDecoration(C4Facet *pFctSideArrow)
Definition: C4Gui.h:2021
void SetText(const char *szToText)
void MouseLeave(CMouse &rMouse) override
void MouseInput(CMouse &rMouse, int32_t iButton, int32_t iX, int32_t iY, DWORD dwKeyParam) override
ComboBox(const C4Rect &rtBounds)
~ComboBox() override
void MouseEnter(CMouse &rMouse) override
ComponentAligner(const C4Rect &rcArea, int32_t iMarginX, int32_t iMarginY, bool fZeroAreaXY=false)
Definition: C4Gui.h:2783
int32_t GetWidth() const
Definition: C4Gui.h:2803
int32_t GetInnerHeight() const
Definition: C4Gui.h:2809
C4Rect & GetFromLeft(int32_t iWdt, int32_t iHgt=-1)
Definition: C4Gui.h:2795
bool GetFromLeft(int32_t iWdt, int32_t iHgt, C4Rect &rcOut)
Definition: C4Gui.cpp:1076
static C4Rect rcTemp
Definition: C4Gui.h:2780
C4Rect & GetFromTop(int32_t iHgt, int32_t iWdt=-1)
Definition: C4Gui.h:2794
void ExpandLeft(int32_t iByWdt)
Definition: C4Gui.h:2812
C4Rect & GetAll()
Definition: C4Gui.h:2798
C4Rect & GetFromBottom(int32_t iHgt, int32_t iWdt=-1)
Definition: C4Gui.h:2797
bool GetCentered(int32_t iWdt, int32_t iHgt, C4Rect &rcOut)
Definition: C4Gui.cpp:1133
int32_t GetHeight() const
Definition: C4Gui.h:2804
int32_t GetInnerWidth() const
Definition: C4Gui.h:2808
bool GetFromRight(int32_t iWdt, int32_t iHgt, C4Rect &rcOut)
Definition: C4Gui.cpp:1093
int32_t GetHMargin() const
Definition: C4Gui.h:2805
void ExpandBottom(int32_t iByHgt)
Definition: C4Gui.h:2814
void ExpandTop(int32_t iByHgt)
Definition: C4Gui.h:2811
bool GetFromTop(int32_t iHgt, int32_t iWdt, C4Rect &rcOut)
Definition: C4Gui.cpp:1059
int32_t GetVMargin() const
Definition: C4Gui.h:2806
C4Rect & GetCentered(int32_t iWdt, int32_t iHgt)
Definition: C4Gui.h:2799
void LogIt(const char *szName)
Definition: C4Gui.cpp:1143
C4Rect & GetGridCell(int32_t iSectX, int32_t iSectXMax, int32_t iSectY, int32_t iSectYMax, int32_t iSectSizeX=-1, int32_t iSectSizeY=-1, bool fCenterPos=false, int32_t iSectNumX=1, int32_t iSectNumY=1)
Definition: C4Gui.cpp:1148
bool GetFromBottom(int32_t iHgt, int32_t iWdt, C4Rect &rcOut)
Definition: C4Gui.cpp:1109
C4Rect & GetFromRight(int32_t iWdt, int32_t iHgt=-1)
Definition: C4Gui.h:2796
void ExpandRight(int32_t iByWdt)
Definition: C4Gui.h:2813
ConfirmationDialog(const char *szMessage, const char *szCaption, BaseCallbackHandler *pCB, DWORD dwButtons=MessageDialog::btnOKAbort, bool fSmall=false, Icons icoIcon=Ico_Confirm)
void OnClosed(bool fOK) override
~ConfirmationDialog() override
Definition: C4Gui.h:2361
Element * operator->() const
Definition: C4Gui.h:785
Element * operator*() const
Definition: C4Gui.h:784
bool operator!=(const Iterator &other) const
Definition: C4Gui.h:794
bool operator==(const Iterator &other) const
Definition: C4Gui.h:789
Iterator(Element *element=nullptr)
Definition: C4Gui.h:782
bool operator!=(const ReverseIterator &other) const
Definition: C4Gui.h:817
bool operator==(const ReverseIterator &other) const
Definition: C4Gui.h:812
Element * operator*() const
Definition: C4Gui.h:807
Element * operator->() const
Definition: C4Gui.h:808
ReverseIterator(Element *element=nullptr)
Definition: C4Gui.h:805
virtual Element * GetLastContained()
Definition: C4Gui.h:774
void AddElement(Element *pChild)
void RemoveElement(Element *pChild) override
virtual void ElementPosChanged(Element *pOfElement)
Definition: C4Gui.h:754
Iterator end()
Definition: C4Gui.h:825
virtual void ElementSizeChanged(Element *pOfElement)
Definition: C4Gui.h:753
Element * GetElementByIndex(int32_t i)
virtual bool IsSelectedChild(Element *pChild)
Definition: C4Gui.h:837
void MakeLastElement(Element *pChild)
Container * GetContainer() override
Definition: C4Gui.h:831
Element * pFirst
Definition: C4Gui.h:750
Iterator begin()
Definition: C4Gui.h:824
ReverseIterator rend()
Definition: C4Gui.h:827
Element * pLast
Definition: C4Gui.h:750
void ReaddElement(Element *pChild)
virtual void AfterElementRemoval()
Definition: C4Gui.h:756
ReverseIterator rbegin()
Definition: C4Gui.h:826
Element * GetFirst()
Definition: C4Gui.h:829
void InsertElement(Element *pChild, Element *pInsertBefore)
bool OnHotkey(uint32_t cHotkey) override
Element * GetNextNestedElement(Element *pPrevElement, bool fBackwards)
virtual void ApplyInvElementOffset(int32_t &riX, int32_t &riY)
Definition: C4Gui.h:841
virtual void ApplyElementOffset(int32_t &riX, int32_t &riY)
Definition: C4Gui.h:840
void Draw(C4TargetFacet &cgo) override
void SetVisibility(bool fToValue) override
bool IsParentOf(Element *pEl) override
Element * GetFirstContained() override
Definition: C4Gui.h:773
friend class ScrollWindow
Definition: C4Gui.h:844
Element * GetLast()
Definition: C4Gui.h:830
Element * GetFirstNestedElement(bool fBackwards) override
virtual bool IsFocused(Control *pCtrl)
Definition: C4Gui.h:836
void DrawElement(C4TargetFacet &cgo) override
Definition: C4GuiMenu.cpp:620
void MouseEnter(CMouse &rMouse) override
Definition: C4GuiMenu.cpp:647
bool IsFocusOnClick() override
Definition: C4Gui.h:1913
void MouseInput(CMouse &rMouse, int32_t iButton, int32_t iX, int32_t iY, DWORD dwKeyParam) override
Definition: C4GuiMenu.cpp:638
void MouseLeave(CMouse &rMouse) override
Definition: C4GuiMenu.cpp:654
~ContextButton() override
Definition: C4GuiMenu.cpp:581
ContextButton(C4Rect &rtBounds)
Definition: C4GuiMenu.cpp:563
virtual bool OnContext(Element *pOnElement, int32_t iX, int32_t iY)=0
virtual ContextMenu * OnSubcontext(Element *pOnElement)=0
virtual ~ContextHandler()=default
Definition: C4Gui.h:1792
uint32_t cHotkey
Definition: C4Gui.h:1798
bool OnHotkey(uint32_t cKey) override
Definition: C4Gui.h:1812
~Entry() override
Definition: C4Gui.h:1818
bool IsMenu() override
Definition: C4Gui.h:1814
MenuHandler * GetAndZeroCallback()
Definition: C4Gui.h:1806
ContextHandler * pSubmenuHandler
Definition: C4Gui.h:1801
const char * GetText()
Definition: C4Gui.h:1824
void MouseLeave(CMouse &rMouse) override
Definition: C4Gui.h:1809
void DrawElement(C4TargetFacet &cgo) override
Definition: C4GuiMenu.cpp:36
MenuHandler * pMenuHandler
Definition: C4Gui.h:1800
Icons icoIcon
Definition: C4Gui.h:1799
Entry(const char *szText, Icons icoIcon=Ico_None, MenuHandler *pMenuHandler=nullptr, ContextHandler *pSubmenuHandler=nullptr)
Definition: C4GuiMenu.cpp:61
StdStrBuf sText
Definition: C4Gui.h:1797
~ContextMenu() override
Definition: C4GuiMenu.cpp:150
Element * pTarget
Definition: C4Gui.h:1830
void Draw(C4TargetFacet &cgo) override
Definition: C4GuiMenu.cpp:460
int32_t GetMarginTop() override
Definition: C4Gui.h:1851
void ElementPosChanged(Element *pOfElement) override
Definition: C4GuiMenu.cpp:415
void AddItem(const char *szText, const char *szToolTip=nullptr, Icons icoIcon=Ico_None, MenuHandler *pMenuHandler=nullptr, ContextHandler *pSubmenuHandler=nullptr)
Definition: C4Gui.h:1874
Dialog * GetTargetDialog() const
Definition: C4Gui.h:1887
void DrawElement(C4TargetFacet &cgo) override
Definition: C4GuiMenu.cpp:177
bool IsMenu() override
Definition: C4Gui.h:1847
Screen * GetScreen() override
Definition: C4GuiMenu.cpp:435
Element * pSelectedItem
Definition: C4Gui.h:1831
friend class Entry
Definition: C4Gui.h:1889
ContextMenu * pSubmenu
Definition: C4Gui.h:1833
void RemoveElement(Element *pChild) override
Definition: C4GuiMenu.cpp:364
int32_t GetMenuIndex()
Definition: C4Gui.h:1884
int32_t GetMarginBottom() override
Definition: C4Gui.h:1854
virtual bool CharIn(const char *c)
Definition: C4GuiMenu.cpp:453
void MouseLeaveEntry(CMouse &rMouse, Entry *pOldEntry)
Definition: C4GuiMenu.cpp:228
void Open(Element *pTarget, int32_t iScreenX, int32_t iScreenY)
Definition: C4GuiMenu.cpp:471
static int32_t GetLastMenuIndex()
Definition: C4Gui.h:1885
void ElementSizeChanged(Element *pOfElement) override
Definition: C4GuiMenu.cpp:407
int32_t GetMarginRight() override
Definition: C4Gui.h:1853
bool CtxMouseInput(CMouse &rMouse, int32_t iButton, int32_t iScreenX, int32_t iScreenY, DWORD dwKeyParam)
Definition: C4GuiMenu.cpp:441
void SelectionChanged(bool fByUser)
Definition: C4GuiMenu.cpp:423
int32_t GetMarginLeft() override
Definition: C4Gui.h:1852
void Abort(bool fByUser)
Definition: C4GuiMenu.cpp:169
void MouseInput(CMouse &rMouse, int32_t iButton, int32_t iX, int32_t iY, DWORD dwKeyParam) override
Definition: C4GuiMenu.cpp:200
Entry * GetIndexedEntry(int32_t iIndex)
Definition: C4Gui.h:1880
void SelectItem(int32_t iIndex)
Definition: C4GuiMenu.cpp:549
friend class ListBox
Definition: C4Gui.h:1070
virtual void OnLooseFocus()
Definition: C4Gui.h:1057
bool KeyContext()
Definition: C4Gui.h:1059
bool HasFocus()
Definition: C4Gui.h:1067
Control(const C4Rect &rtBounds)
Control * IsFocusElement() override
Definition: C4Gui.h:1055
virtual void OnGetFocus(bool fByMouse)
Definition: C4Gui.h:1056
virtual bool CharIn(const char *)
Definition: C4Gui.h:1051
void MouseInput(CMouse &rMouse, int32_t iButton, int32_t iX, int32_t iY, DWORD dwKeyParam) override
virtual bool IsFocusOnClick()
Definition: C4Gui.h:1054
ControlKeyCBExPassKey(TargetClass &rTarget, const ParameterType &rPar, CallbackFunc pFuncDown, CallbackFunc pFuncUp=nullptr, CallbackFunc pFuncPressed=nullptr)
Definition: C4Gui.h:2511
bool CheckCondition() override
Definition: C4Gui.h:2514
bool CheckCondition() override
Definition: C4Gui.h:2502
ControlKeyCB(TargetClass &rTarget, CallbackFunc pFuncDown, CallbackFunc pFuncUp=nullptr, CallbackFunc pFuncPressed=nullptr)
Definition: C4Gui.h:2499
ControlKeyDlgCB(Control *pCtrl, TargetClass &rTarget, CallbackFunc pFuncDown, CallbackFunc pFuncUp=nullptr, CallbackFunc pFuncPressed=nullptr)
Definition: C4Gui.h:2525
bool CheckCondition() override
Definition: C4Gui.h:2528
bool KeyEnter()
Definition: C4Gui.h:2134
void SetFocus(Control *pCtrl, bool fByMouse)
void SetDelOnClose(bool fToVal=true)
Definition: C4Gui.h:2191
virtual bool OnEnter()
Definition: C4Gui.h:2133
CallbackButton< Dialog, C4GUI::IconButton > * pCloseBtn
Definition: C4Gui.h:2080
bool fViewportDlg
Definition: C4Gui.h:2088
bool IsOK()
Definition: C4Gui.h:2149
virtual bool CharIn(const char *c)
virtual bool OnEscape()
Definition: C4Gui.h:2135
void FadeOut(bool fCloseWithOK)
int32_t GetMarginTop() override
Definition: C4Gui.h:2141
void RemoveElement(Element *pChild) override
int32_t GetMarginBottom() override
Definition: C4Gui.h:2144
virtual void UserClose(bool fOK)
Definition: C4Gui.h:2207
Control * pActiveCtrl
Definition: C4Gui.h:2081
bool IsViewportDialog()
Definition: C4Gui.h:2173
virtual void OnIdle()
Definition: C4Gui.h:2210
bool fDelOnClose
Definition: C4Gui.h:2086
virtual bool IsExclusiveDialog()
Definition: C4Gui.h:2165
virtual C4Viewport * GetViewport()
Definition: C4Gui.h:2172
bool KeyAdvanceFocus(bool fBackwards)
Definition: C4Gui.h:2139
void MouseInput(CMouse &rMouse, int32_t iButton, int32_t iX, int32_t iY, DWORD dwKeyParam) override
bool fShow
Definition: C4Gui.h:2082
void OnUserClose(C4GUI::Control *btn)
Definition: C4Gui.h:2205
void Close(bool fOK)
virtual bool IsBottomPlacementDialog()
Definition: C4Gui.h:2162
bool IsComponentOutsideClientArea() override
Definition: C4Gui.h:2106
int32_t GetMarginRight() override
Definition: C4Gui.h:2143
bool IsFading()
Definition: C4Gui.h:2152
virtual bool IsFullscreenDialog()
Definition: C4Gui.h:2154
bool IsExternalDrawDialog() override
Definition: C4Gui.h:2179
int32_t iFade
Definition: C4Gui.h:2084
virtual class Control * GetDefaultControl()
Definition: C4Gui.h:2130
virtual bool HasBackground()
Definition: C4Gui.h:2155
static int32_t GetDefaultTitleHeight()
bool KeyEscape()
Definition: C4Gui.h:2136
bool IsShown()
Definition: C4Gui.h:2148
bool IsActive(bool fForKeyboard)
bool fOK
Definition: C4Gui.h:2083
DialogWindow * GetDialogWindow() override
Definition: C4Gui.h:2118
void UpdatePos() override
virtual const char * GetID()
Definition: C4Gui.h:2108
void SetClientSize(int32_t iToWdt, int32_t iToHgt)
void SetFrameDeco(FrameDecoration *pNewDeco)
Definition: C4Gui.h:2194
bool FadeIn(Screen *pOnScreen)
virtual int32_t GetZOrdering()
Definition: C4Gui.h:2182
FrameDecoration * GetFrameDecoration() const
Definition: C4Gui.h:2202
void ApplyInvElementOffset(int32_t &riX, int32_t &riY) override
~Dialog() override
Fade eFade
Definition: C4Gui.h:2085
void AdvanceFocus(bool fBackwards)
virtual bool IsMouseControlled()
Definition: C4Gui.h:2169
bool IsFocused(Control *pCtrl) override
Definition: C4Gui.h:2114
void UpdateSize() override
bool IsAborted()
Definition: C4Gui.h:2150
DialogWindow * pWindow
Definition: C4Gui.h:2089
void ClearFrameDeco()
Definition: C4Gui.h:2200
void Draw(C4TargetFacet &cgo) override
Dialog * GetDlg() override
Definition: C4Gui.h:2117
virtual void OnShown()
Definition: C4Gui.h:2209
Dialog(int32_t iWdt, int32_t iHgt, const char *szTitle, bool fViewportDlg)
void ApplyElementOffset(int32_t &riX, int32_t &riY) override
virtual void OnClosed(bool fOK)
virtual bool DoPlacement(Screen *pOnScreen, const C4Rect &rPreferredDlgRect)
Definition: C4Gui.h:2176
bool CreateConsoleWindow()
ContextHandler * GetContextHandler() override
Definition: C4Gui.h:2212
int32_t GetMarginLeft() override
Definition: C4Gui.h:2142
void DestroyConsoleWindow()
WoodenLabel * pTitle
Definition: C4Gui.h:2079
void SetTitle(const char *szToTitle, bool fShowCloseButton=true)
bool Show(Screen *pOnScreen, bool fCB)
FrameDecoration * pFrameDeco
Definition: C4Gui.h:2090
StdStrBuf TitleString
Definition: C4Gui.h:2087
Control * GetFocus()
Definition: C4Gui.h:2116
void DrawElement(C4TargetFacet &cgo) override
virtual bool IsFreePlaceDialog()
Definition: C4Gui.h:2159
void PerformUpdate() override
virtual C4Window * Init(WindowKind windowKind, C4AbstractApp *pApp, const char *Title, const C4Rect *size)
Definition: C4AppT.cpp:109
void Close() override
Dialog * pDialog
Definition: C4Gui.h:2033
DlgCloseButton(const C4Rect &rtBounds)
Definition: C4Gui.h:2304
DlgKeyCBEx(TargetClass &rTarget, const ParameterType &par, CallbackFunc pFuncDown, CallbackFunc pFuncUp=nullptr, CallbackFunc pFuncPressed=nullptr)
Definition: C4Gui.h:2486
bool CheckCondition() override
Definition: C4Gui.h:2489
bool CheckCondition() override
Definition: C4Gui.h:2465
DlgKeyCB(TargetClass &rTarget, CallbackFunc pFuncDown, CallbackFunc pFuncUp=nullptr, CallbackFunc pFuncPressed=nullptr)
Definition: C4Gui.h:2462
bool CheckCondition() override
Definition: C4Gui.h:2477
DlgKeyCBPassKey(TargetClass &rTarget, CallbackFunc pFuncDown, CallbackFunc pFuncUp=nullptr, CallbackFunc pFuncPressed=nullptr)
Definition: C4Gui.h:2474
bool GetCurrentWord(char *szTargetBuf, int32_t iMaxTargetBufLen)
Definition: C4GuiEdit.cpp:676
static int32_t GetCustomEditHeight(CStdFont *pUseFont)
Definition: C4GuiEdit.cpp:119
CStdFont * pFont
Definition: C4Gui.h:1305
int32_t GetMarginTop() override
Definition: C4Gui.h:1331
ContextMenu * OnContext(C4GUI::Element *pListItem, int32_t iX, int32_t iY)
Definition: C4GuiEdit.cpp:650
int32_t iCursorPos
Definition: C4Gui.h:1309
void SetMaxText(int32_t iTo)
Definition: C4Gui.h:1352
virtual InputResult OnFinishInput(bool fPasting, bool fPastingMore)
Definition: C4Gui.h:1327
char * Text
Definition: C4Gui.h:1306
int32_t iSelectionStart
Definition: C4Gui.h:1310
bool CharIn(const char *c) override
Definition: C4GuiEdit.cpp:453
@ IR_CloseDlg
Definition: C4Gui.h:1256
@ IR_Abort
Definition: C4Gui.h:1258
@ IR_CloseEdit
Definition: C4Gui.h:1257
int32_t GetMarginRight() override
Definition: C4Gui.h:1333
int32_t iXScroll
Definition: C4Gui.h:1313
static int32_t GetDefaultEditHeight()
Definition: C4GuiEdit.cpp:113
bool fLeftBtnDown
Definition: C4Gui.h:1316
int32_t iSelectionEnd
Definition: C4Gui.h:1310
void OnCtxSelAll(C4GUI::Element *pThis)
Definition: C4Gui.h:1284
char cPasswordMask
Definition: C4Gui.h:1314
int32_t iBufferSize
Definition: C4Gui.h:1308
void ClearText()
Definition: C4GuiEdit.cpp:125
void DoDragging(CMouse &rMouse, int32_t iX, int32_t iY, DWORD dwKeyParam) override
Definition: C4GuiEdit.cpp:535
void DrawElement(C4TargetFacet &cgo) override
Definition: C4GuiEdit.cpp:562
uint32_t dwBGClr
Definition: C4Gui.h:1307
void OnCtxCopy(C4GUI::Element *pThis)
Definition: C4Gui.h:1280
virtual void OnAbortInput()
Definition: C4Gui.h:1328
~Edit() override
Definition: C4GuiEdit.cpp:86
void OnCtxClear(C4GUI::Element *pThis)
Definition: C4Gui.h:1283
Edit(const C4Rect &rtBounds, bool fFocusEdit=false)
Definition: C4GuiEdit.cpp:47
int32_t GetMarginBottom() override
Definition: C4Gui.h:1334
void SetFont(CStdFont *pToFont)
Definition: C4Gui.h:1348
bool SetText(const char *szText, bool fUser)
Definition: C4Gui.h:1293
void SetPasswordMask(char cNewPasswordMask)
Definition: C4Gui.h:1294
C4TimeMilliseconds tLastInputTime
Definition: C4Gui.h:1312
void OnCtxCut(C4GUI::Element *pThis)
Definition: C4Gui.h:1282
void MouseInput(CMouse &rMouse, int32_t iButton, int32_t iX, int32_t iY, DWORD dwKeyParam) override
Definition: C4GuiEdit.cpp:464
const char * GetText()
Definition: C4Gui.h:1339
void OnCtxPaste(C4GUI::Element *pThis)
Definition: C4Gui.h:1281
bool InsertText(const char *szText, bool fUser)
Definition: C4GuiEdit.cpp:163
uint32_t dwBorderColor
Definition: C4Gui.h:1307
void OnLooseFocus() override
Definition: C4GuiEdit.cpp:554
void SetColors(uint32_t dwNewBGClr, uint32_t dwNewFontClr, uint32_t dwNewBorderColor)
Definition: C4Gui.h:1349
uint32_t dwFontClr
Definition: C4Gui.h:1307
void SelectAll()
Definition: C4GuiEdit.cpp:641
bool IsFocusOnClick() override
Definition: C4Gui.h:1320
int32_t GetMarginLeft() override
Definition: C4Gui.h:1332
void DeleteSelection()
Definition: C4GuiEdit.cpp:149
int32_t iMaxTextLength
Definition: C4Gui.h:1311
void OnGetFocus(bool fByMouse) override
Definition: C4GuiEdit.cpp:544
virtual void DrawElement(C4TargetFacet &cgo)
Definition: C4Gui.h:388
virtual bool IsParentOf(Element *pEl)
Definition: C4Gui.h:454
bool DoContext()
Definition: C4Gui.cpp:417
virtual bool IsOwnPtrElement()
Definition: C4Gui.h:401
virtual bool GetListItemTopSpacingBar()
Definition: C4Gui.h:462
Element * GetPrev() const
Definition: C4Gui.h:450
virtual void SetVisibility(bool fToValue)
Definition: C4Gui.cpp:207
void SetDragTarget(Window *pToWindow)
Definition: C4Gui.h:464
bool IsVisible()
Definition: C4Gui.cpp:201
virtual void RemoveElement(Element *pChild)
Definition: C4Gui.cpp:173
const char * GetOwnToolTip()
Definition: C4Gui.h:440
C4Rect rcBounds
Definition: C4Gui.h:385
virtual Container * GetContainer()
Definition: C4Gui.h:410
C4Rect GetToprightCornerRect(int32_t iWidth=16, int32_t iHeight=16, int32_t iHIndent=4, int32_t iVIndent=4, int32_t iIndexX=0)
Definition: C4Gui.cpp:399
void DrawVBar(C4TargetFacet &cgo, DynBarFacet &rFacets)
Definition: C4Gui.cpp:359
virtual Screen * GetScreen()
Definition: C4Gui.cpp:289
Element * GetNext() const
Definition: C4Gui.h:449
C4Rect GetContainedClientRect()
Definition: C4Gui.h:448
int32_t iDragY
Definition: C4Gui.h:379
bool IsInActiveDlg(bool fForKeyboard)
Definition: C4Gui.cpp:435
virtual void MouseInput(CMouse &rMouse, int32_t iButton, int32_t iX, int32_t iY, DWORD dwKeyParam)
Definition: C4Gui.cpp:244
virtual ~Element()
Definition: C4Gui.cpp:161
virtual void UpdateSize()
Definition: C4Gui.cpp:185
virtual C4Rect & GetClientRect()
Definition: C4Gui.h:447
int32_t GetWidth()
Definition: C4Gui.h:443
void SetBounds(const C4Rect &rcNewBound)
Definition: C4Gui.h:446
Element * pPrev
Definition: C4Gui.h:377
friend class TextWindow
Definition: C4Gui.h:472
virtual void StopDragging(CMouse &rMouse, int32_t iX, int32_t iY, DWORD dwKeyParam)
Definition: C4Gui.cpp:282
virtual ContextHandler * GetContextHandler()
Definition: C4Gui.cpp:429
Container * GetParent()
Definition: C4Gui.h:429
int32_t iDragX
Definition: C4Gui.h:379
void DrawBar(C4TargetFacet &cgo, DynBarFacet &rFacets)
Definition: C4Gui.cpp:308
virtual bool IsMenu()
Definition: C4Gui.h:403
void DrawHBarByVGfx(C4TargetFacet &cgo, DynBarFacet &rFacets)
Definition: C4Gui.cpp:365
virtual void StartDragging(CMouse &rMouse, int32_t iX, int32_t iY, DWORD dwKeyParam)
Definition: C4Gui.cpp:259
virtual void UpdatePos()
Definition: C4Gui.cpp:193
bool fVisible
Definition: C4Gui.h:383
virtual void MouseEnter(CMouse &rMouse)
Definition: C4Gui.h:413
Container * pParent
Definition: C4Gui.h:376
virtual class Dialog * GetDlg()
Definition: C4Gui.cpp:288
void DrawHVBar(C4TargetFacet &cgo, DynBarFacet &rFacets, C4DrawTransform &trf, int32_t iMiddleLength)
Definition: C4Gui.cpp:375
virtual class DialogWindow * GetDialogWindow()
Definition: C4Gui.h:404
void SetToolTip(const char *szNewTooltip, bool is_immediate=false)
Definition: C4Gui.cpp:409
Element * pNext
Definition: C4Gui.h:377
virtual bool IsExternalDrawDialog()
Definition: C4Gui.h:402
virtual Control * IsFocusElement()
Definition: C4Gui.h:432
void ClientPos2ScreenPos(int32_t &riX, int32_t &riY)
Definition: C4Gui.cpp:231
Window * pDragTarget
Definition: C4Gui.h:378
const char * GetToolTip()
Definition: C4Gui.cpp:423
virtual void DoDragging(CMouse &rMouse, int32_t iX, int32_t iY, DWORD dwKeyParam)
Definition: C4Gui.cpp:269
void SetContextHandler(ContextHandler *pNewHd)
Definition: C4Gui.h:465
virtual bool CheckNameHotkey(const char *)
Definition: C4Gui.h:407
virtual bool OnHotkey(uint32_t cHotkey)
Definition: C4Gui.h:420
virtual Element * GetFirstNestedElement(bool fBackwards)
Definition: C4Gui.h:451
virtual Element * GetFirstContained()
Definition: C4Gui.h:452
ContextHandler * pContextHandler
Definition: C4Gui.h:381
C4Rect & GetBounds()
Definition: C4Gui.h:445
bool fDragging
Definition: C4Gui.h:380
bool IsImmediateToolTip() const
Definition: C4Gui.h:441
virtual int32_t GetListItemTopSpacing()
Definition: C4Gui.h:461
int32_t GetHeight()
Definition: C4Gui.h:444
virtual void MouseLeave(CMouse &rMouse)
Definition: C4Gui.h:414
void Draw3DFrame(C4TargetFacet &cgo, bool fUp=false, int32_t iIndent=1, BYTE byAlpha=C4GUI_BorderAlpha, bool fDrawTop=true, int32_t iTopOff=0, bool fDrawLeft=true, int32_t iLeftOff=0)
Definition: C4Gui.cpp:291
virtual void Draw(C4TargetFacet &cgo)
Definition: C4Gui.h:387
virtual void UpdateOwnPos()
Definition: C4Gui.h:434
void ScreenPos2ClientPos(int32_t &riX, int32_t &riY)
Definition: C4Gui.cpp:218
uint32_t dwTextClrInact
Definition: C4Gui.h:1177
C4Facet fctHighlight
Definition: C4Gui.h:1176
void DrawElement(C4TargetFacet &cgo) override
uint32_t dwTextClrAct
Definition: C4Gui.h:1177
void SetTextColors(uint32_t dwClrInact, uint32_t dwClrAct)
Definition: C4Gui.h:1189
void SetTextPos(int32_t iOffX, int32_t iOffY, uint8_t byAlign=ACenter)
Definition: C4Gui.h:1191
int32_t iTxtOffX
Definition: C4Gui.h:1181
CStdFont * pFont
Definition: C4Gui.h:1183
void SetTextFont(CStdFont *pFont, float fFontZoom=1.0f)
Definition: C4Gui.h:1193
FLOAT_RECT rcfDrawBounds
Definition: C4Gui.h:1178
FacetButton(const C4Facet &rBaseFct, const C4Facet &rHighlightFct, const FLOAT_RECT &rtfBounds, char cHotkey)
uint8_t byTxtAlign
Definition: C4Gui.h:1182
C4Facet fctBase
Definition: C4Gui.h:1176
int32_t iTxtOffY
Definition: C4Gui.h:1181
bool SetByDef(C4Def *pSrcDef)
C4TargetFacet fctRight
Definition: C4Gui.h:2053
C4TargetFacet fctLeft
Definition: C4Gui.h:2053
C4TargetFacet fctTopRight
Definition: C4Gui.h:2053
uint32_t dwBackClr
Definition: C4Gui.h:2052
C4TargetFacet fctTop
Definition: C4Gui.h:2053
C4TargetFacet fctTopLeft
Definition: C4Gui.h:2053
C4TargetFacet fctBottom
Definition: C4Gui.h:2053
void Draw(C4TargetFacet &cgo, C4Rect &rcDrawArea)
bool fHasGfxOutsideClientArea
Definition: C4Gui.h:2055
C4TargetFacet fctBottomLeft
Definition: C4Gui.h:2053
C4TargetFacet fctBottomRight
Definition: C4Gui.h:2053
bool IsFullscreenDialog() override
Definition: C4Gui.h:2244
const char * GetID() override
Definition: C4Gui.h:2227
bool OnEnter() override
Definition: C4Gui.h:2238
void DrawElement(C4TargetFacet &cgo) override
bool DoPlacement(Screen *pOnScreen, const C4Rect &rPreferredDlgRect) override
Definition: C4Gui.h:2245
void UpdateOwnPos() override
int32_t GetMarginLeft() override
Definition: C4Gui.h:2248
virtual bool HasUpperBoard()
Definition: C4Gui.h:2242
void DrawBackground(C4TargetFacet &cgo, C4Facet &rFromFct)
void SetTitle(const char *szToTitle)
int32_t GetMarginTop() override
Definition: C4Gui.h:2247
FullscreenDialog(const char *szTitle, const char *szSubtitle)
Label * pFullscreenTitle
Definition: C4Gui.h:2224
bool IsComponentOutsideClientArea() override
Definition: C4Gui.h:2240
int32_t GetMarginRight() override
Definition: C4Gui.h:2249
int32_t GetMarginBottom() override
Definition: C4Gui.h:2250
void SetColors(uint32_t dwFrameClr, uint32_t dwTitleClr, uint32_t dwBackClr=0xffffffff)
Definition: C4Gui.h:1017
void SetTitle(const char *szToTitle)
Definition: C4Gui.h:1018
int32_t GetMarginBottom() override
Definition: C4Gui.h:1028
void DrawElement(C4TargetFacet &cgo) override
void SetFont(CStdFont *pToFont)
Definition: C4Gui.h:1016
GroupBox(C4Rect &rtBounds)
Definition: C4Gui.h:1010
bool HasTitle() const
Definition: C4Gui.h:1021
int32_t GetMarginRight() override
Definition: C4Gui.h:1027
void SetMargin(int32_t iNewMargin)
Definition: C4Gui.h:1019
int32_t GetMarginTop() override
Definition: C4Gui.h:1025
int32_t GetMarginLeft() override
Definition: C4Gui.h:1026
uint32_t dwShadowClr
Definition: C4Gui.h:585
void DrawElement(C4TargetFacet &cgo) override
uint32_t dwClr
Definition: C4Gui.h:585
HorizontalLine(C4Rect &rrcBounds, uint32_t dwClr=0x000000, uint32_t dwShadowClr=0xaf7f7f7f)
Definition: C4Gui.h:589
void SetHighlight(bool fToVal)
Definition: C4Gui.h:1151
void SetColor(uint32_t dwClr)
Definition: C4Gui.h:1150
C4Facet fctIcon
Definition: C4Gui.h:1139
void SetIcon(Icons eUseIcon)
uint32_t dwClr
Definition: C4Gui.h:1140
bool GetHighlight() const
Definition: C4Gui.h:1152
void SetFacet(const C4Facet &rCpy, uint32_t dwClr=0u)
Definition: C4Gui.h:1149
void DrawElement(C4TargetFacet &cgo) override
IconButton(Icons eUseIcon, const C4Rect &rtBounds, char cHotkey='\0', const char *tooltip_text=nullptr)
void SetIcon(Icons icoNewIconIndex)
static C4Facet GetIconFacet(Icons icoIconIndex)
Icon(const C4Rect &rcBounds, Icons icoIconIndex)
void AddLine(const char *szText)
InfoDialog(const char *szCaption, int32_t iLineCount)
void AddLineFmt(const char *szFmtString,...) GNUC_FORMAT_ATTRIBUTE_O
virtual void UpdateText()
Definition: C4Gui.h:2446
~InfoDialog() override
void OnSec1Timer() override
TextWindow * pTextWin
Definition: C4Gui.h:2435
InputCallback(T *pTarget, CBFunc pCBFunc)
Definition: C4Gui.h:2400
void OnOK(const StdStrBuf &sText) override
Definition: C4Gui.h:2402
void(T::* CBFunc)(const StdStrBuf &)
Definition: C4Gui.h:2395
void SetMaxText(int32_t iMaxLen)
Definition: C4Gui.h:2422
~InputDialog() override
Definition: C4Gui.h:2419
void SetInputText(const char *szToText)
C4Rect rcEditBounds
Definition: C4Gui.h:2411
const char * GetID() override
Definition: C4Gui.h:2415
const char * GetInputText()
Definition: C4Gui.h:2424
BaseInputCallback * pCB
Definition: C4Gui.h:2410
InputDialog(const char *szMessage, const char *szCaption, Icons icoIcon, BaseInputCallback *pCB, bool fChatLayout=false)
void SetCustomEdit(Edit *pCustomEdit)
void OnClosed(bool fOK) override
Definition: C4Gui.h:2421
Label * pChatLbl
Definition: C4Gui.h:2413
StdStrBuf sText
Definition: C4Gui.h:479
void UpdateOwnPos() override
Definition: C4GuiLabels.cpp:96
virtual int32_t GetLeftIndent()
Definition: C4Gui.h:494
void SetText(const char *szToText, bool fAllowHotkey=true)
Definition: C4GuiLabels.cpp:74
int32_t x0
Definition: C4Gui.h:481
void SetClickFocusControl(Control *pToCtrl)
Definition: C4Gui.h:504
void DrawElement(C4TargetFacet &cgo) override
Definition: C4GuiLabels.cpp:32
CStdFont * pFont
Definition: C4Gui.h:482
void SetAutosize(bool fToVal)
Definition: C4Gui.h:507
void SetX0(int32_t iToX0)
Control * pClickFocusControl
Definition: C4Gui.h:487
const char * GetText()
Definition: C4Gui.h:503
Label(const char *szLblText, int32_t iX0, int32_t iTop, int32_t iAlign=ALeft, DWORD dwFClr=0xffffffff, CStdFont *pFont=nullptr, bool fMakeReadableOnBlack=true, bool fMarkup=true)
Definition: C4GuiLabels.cpp:38
bool OnHotkey(uint32_t cHotkey) override
void MouseInput(CMouse &rMouse, int32_t iButton, int32_t iX, int32_t iY, DWORD dwKeyParam) override
Definition: C4GuiLabels.cpp:65
bool fAutosize
Definition: C4Gui.h:484
void SetColor(DWORD dwToClr, bool fMakeReadableOnBlack=true)
Definition: C4Gui.h:505
uint32_t cHotkey
Definition: C4Gui.h:483
DWORD dwFgClr
Definition: C4Gui.h:480
int32_t iAlign
Definition: C4Gui.h:481
bool fMarkup
Definition: C4Gui.h:485
LabeledEdit(const C4Rect &rcBounds, const char *szName, bool fMultiline, const char *szPrefText=nullptr, CStdFont *pUseFont=nullptr, uint32_t dwTextClr=C4GUI_CaptionFontClr)
Definition: C4GuiEdit.cpp:784
static bool GetControlSize(int *piWdt, int *piHgt, const char *szForText, CStdFont *pForFont, bool fMultiline)
Definition: C4GuiEdit.cpp:812
C4GUI::Edit * GetEdit() const
Definition: C4Gui.h:1437
const char * GetText() const
Definition: C4Gui.h:1436
Element * GetSelectedItem()
Definition: C4Gui.h:1581
void ElementPosChanged(Element *pOfElement) override
bool IsScrollingNecessary()
Definition: C4Gui.h:1583
bool IsFocused(Control *pCtrl) override
Definition: C4Gui.h:1519
bool InsertElement(Element *pChild, Element *pInsertBefore, int32_t iIndent=0)
bool IsFocusOnClick() override
Definition: C4Gui.h:1524
void SetSelectionDblClickFn(BaseCallbackHandler *pToHandler)
Definition: C4Gui.h:1554
void SetSelectionChangeCallbackFn(BaseCallbackHandler *pToHandler)
Definition: C4Gui.h:1549
int32_t ContractToElementHeight()
int32_t GetMarginBottom() override
Definition: C4Gui.h:1579
BaseCallbackHandler * pSelectionChangeHandler
Definition: C4Gui.h:1512
void SelectFirstEntry(bool fByUser)
Definition: C4Gui.h:1585
bool AddElement(Element *pChild, int32_t iIndent=0)
void UnFreezeScrolling()
Definition: C4Gui.h:1564
bool CharIn(const char *c) override
Element * GetFirst()
Definition: C4Gui.h:1572
void UpdateElementPositions()
ScrollWindow * pClientWindow
Definition: C4Gui.h:1510
bool fDrawBackground
Definition: C4Gui.h:1513
Element * pSelectedItem
Definition: C4Gui.h:1511
bool IsScrollingActive()
Definition: C4Gui.h:1582
bool IsSelectedChild(Element *pChild) override
Definition: C4Gui.h:1594
void DrawElement(C4TargetFacet &cgo) override
Control * IsFocusElement() override
Definition: C4Gui.h:1525
~ListBox() override
void ScrollItemInView(Element *pItem)
void ElementSizeChanged(Element *pOfElement) override
void SelectionChanged(bool fByUser)
void MouseInput(CMouse &rMouse, int32_t iButton, int32_t iX, int32_t iY, DWORD dwKeyParam) override
Element * GetLast()
Definition: C4Gui.h:1573
bool fDrawBorder
Definition: C4Gui.h:1514
void UpdateColumnCount()
void SetDecoration(bool fDrawBG, ScrollBarFacets *pToGfx, bool fAutoScroll, bool fDrawBorder=false)
Definition: C4Gui.h:1567
int32_t(* SortFunction)(const Element *pEl1, const Element *pEl2, void *par)
Definition: C4Gui.h:1596
void SelectNone(bool fByUser)
Definition: C4Gui.h:1586
int32_t GetItemWidth()
Definition: C4Gui.h:1546
void SortElements(SortFunction SortFunc, void *par)
bool IsMultiColumn() const
Definition: C4Gui.h:1587
int32_t GetMarginTop() override
Definition: C4Gui.h:1576
int32_t iColCount
Definition: C4Gui.h:1509
BaseCallbackHandler * pSelectionDblClickHandler
Definition: C4Gui.h:1512
void SelectEntry(Element *pNewSel, bool fByUser)
int32_t GetMarginRight() override
Definition: C4Gui.h:1578
void UpdateElementPosition(Element *pOfElement, int32_t iIndent)
void FreezeScrolling()
Definition: C4Gui.h:1563
void SetSelectionDiabled(bool fToVal=true)
Definition: C4Gui.h:1569
int32_t GetMarginLeft() override
Definition: C4Gui.h:1577
int32_t iMultiColItemWidth
Definition: C4Gui.h:1508
void AfterElementRemoval() override
Definition: C4Gui.h:1529
void UpdateSize() override
Definition: C4Gui.h:1592
bool fSelectionDisabled
Definition: C4Gui.h:1515
void ScrollToBottom()
Definition: C4Gui.h:1560
void RemoveElement(Element *pChild) override
void OnGetFocus(bool fByMouse) override
virtual ~MenuHandler()=default
virtual void OnOK(Element *pTarget)=0
MenuHandler()=default
const char * GetID() override
Definition: C4Gui.h:2349
int32_t GetZOrdering() override
Definition: C4Gui.h:2350
MessageDialog(const char *szMessage, const char *szCaption, DWORD dwButtons, Icons icoIcon, DlgSize eSize=dsRegular, int32_t *piConfigDontShowAgainSetting=nullptr, bool fDefaultNo=false)
void OnDontShowAgainCheck(C4GUI::Element *pCheckBox)
Definition: C4Gui.h:2345
bool OnEnter() override
Definition: C4Gui.h:2344
C4LogBuffer Lines
Definition: C4Gui.h:548
void DrawElement(C4TargetFacet &cgo) override
void AddLine(const char *szLine, CStdFont *pFont, DWORD dwClr, bool fDoUpdate, bool fMakeReadableOnBlack, CStdFont *pCaptionFont)
MultilineLabel(const C4Rect &rcBounds, int32_t iMaxLines, int32_t iMaxBuf, const char *szIndentChars, bool fAutoGrow, bool fMarkup)
void Clear(bool fDoUpdate)
void UpdateSize() override
NoButton(const C4Rect &rtBounds)
Definition: C4Gui.h:2314
OKButton(const C4Rect &rtBounds)
Definition: C4Gui.h:2286
OKIconButton(const C4Rect &rtBounds, Icons eIcon)
Definition: C4Gui.h:2290
OverlayPicture(const C4Rect &rcBounds, bool fAspect, const C4Facet &rOverlayImage, int iBorderSize)
C4Facet OverlayImage
Definition: C4Gui.h:623
void DrawElement(C4TargetFacet &cgo) override
void DrawElement(C4TargetFacet &cgo) override
C4FacetSurface fctPaint
Definition: C4Gui.h:1035
void MouseInput(CMouse &rMouse, int32_t iButton, int32_t iX, int32_t iY, DWORD dwKeyParam) override
PaintBox(C4Rect &rtBounds, int32_t iSfcWdt=-1, int32_t iSfcHgt=-1)
~PaintBox() override
void DoCall(ParType par) override
Definition: C4Gui.h:343
void(CB::* Func)(ParType par)
Definition: C4Gui.h:331
ParCallbackHandler(CB *pTarget, Func rFunc)
Definition: C4Gui.h:345
void SetFacet(const C4Facet &fct)
Definition: C4Gui.h:612
C4FacetSurface & GetMFacet()
Definition: C4Gui.h:611
C4FacetSurface Facet
Definition: C4Gui.h:598
int32_t iPhaseTime
Definition: C4Gui.h:603
Picture(const C4Rect &rcBounds, bool fAspect)
void SetDrawColor(uint32_t dwToClr)
Definition: C4Gui.h:614
int32_t iAnimationPhase
Definition: C4Gui.h:603
void DrawElement(C4TargetFacet &cgo) override
uint32_t dwDrawClr
Definition: C4Gui.h:601
bool fCustomDrawClr
Definition: C4Gui.h:600
bool fAspect
Definition: C4Gui.h:599
bool EnsureOwnSurface()
int32_t iDelay
Definition: C4Gui.h:603
bool fAnimate
Definition: C4Gui.h:602
void SetAnimated(bool fEnabled, int iDelay)
const C4FacetSurface & GetFacet() const
Definition: C4Gui.h:610
int32_t iMax
Definition: C4Gui.h:569
int32_t iProgress
Definition: C4Gui.h:569
void SetProgress(int32_t iToProgress)
Definition: C4Gui.h:578
void DrawElement(C4TargetFacet &cgo) override
ProgressBar(C4Rect &rrcBounds, int32_t iMaxProgress=100)
Definition: C4Gui.h:574
Label * pLblMessage
Definition: C4Gui.h:2372
ProgressBar * pBar
Definition: C4Gui.h:2371
bool OnEnter() override
Definition: C4Gui.h:2380
void SetProgress(int32_t iToProgress)
Definition: C4Gui.h:2379
void SetMessage(const char *szMessage)
const char * GetID() override
Definition: C4Gui.h:2374
ProgressDialog(const char *szMessage, const char *szCaption, int32_t iMaxProgress, int32_t iInitialProgress, Icons icoIcon)
bool KeyAbort()
Definition: C4Gui.h:1402
virtual void OnCancelRename()
Definition: C4Gui.h:1406
~RenameEdit() override
Definition: C4GuiEdit.cpp:719
virtual RenameResult OnOKRename(const char *szNewName)=0
InputResult OnFinishInput(bool fPasting, bool fPastingMore) override
Definition: C4GuiEdit.cpp:730
void OnLooseFocus() override
Definition: C4GuiEdit.cpp:772
RenameEdit(Label *pLabel)
Definition: C4GuiEdit.cpp:691
ResetButton(const C4Rect &rtBounds)
Definition: C4Gui.h:2324
RetryButton(const C4Rect &rtBounds)
Definition: C4Gui.h:2319
bool ShowModalDlg(Dialog *pDlg, bool fDestruct=true)
Dialog * GetFullscreenDialog(bool fIncludeFading)
Definition: C4Gui.cpp:1037
static Screen * GetScreenS()
Definition: C4Gui.h:2629
void SetPreferredDlgRect(const C4Rect &rtNewPref)
Definition: C4Gui.h:2651
static void DrawToolTip(const char *szTip, C4TargetFacet &cgo, float guix, float guiy)
Definition: C4Gui.cpp:1009
void UpdateMouseFocus()
Definition: C4Gui.cpp:965
int32_t GetContextMenuIndex()
Definition: C4Gui.h:2658
~Screen() override
Definition: C4Gui.cpp:598
ProgressDialog * ShowProgressDlg(const char *szMessage, const char *szCaption, int32_t iMaxProgress=100, int32_t iInitialProgress=0, Icons icoIcon=Ico_Wait)
void ShowDialog(Dialog *pDlg, bool fFade)
Definition: C4Gui.cpp:611
CMouse Mouse
Definition: C4Gui.h:2590
void RecheckActiveDialog()
Definition: C4Gui.cpp:683
bool HasMouseFocus()
Definition: C4Gui.h:2678
Screen * GetScreen() override
Definition: C4Gui.h:2628
void Clear()
Definition: C4Gui.cpp:588
void Render(bool fDoBG)
Definition: C4Gui.cpp:730
bool RecheckMouseInput()
Definition: C4Gui.cpp:960
bool ShowErrorMessage(const char *szMessage)
virtual bool CharIn(const char *c)
Definition: C4Gui.cpp:779
static Screen * pScreen
Definition: C4Gui.h:2599
void UpdateGamepadGUIControlEnabled()
Definition: C4Gui.cpp:1049
void Init(int32_t tx, int32_t ty, int32_t twdt, int32_t thgt)
Definition: C4Gui.cpp:578
bool fExclusive
Definition: C4Gui.h:2595
bool IsActive()
Definition: C4Gui.h:2633
void MouseInput(CMouse &rMouse, int32_t iButton, int32_t iX, int32_t iY, DWORD dwKeyParam) override
void SetMouseInGUI(bool fInGUI, bool fByMouse)
Definition: C4Gui.cpp:824
void RenderMouse(C4TargetFacet &cgo)
Definition: C4Gui.cpp:739
bool HasKeyboardFocus()
Definition: C4Gui.h:2671
void Draw(C4TargetFacet &cgo) override
bool HasContext()
Definition: C4Gui.h:2660
float GetZoom() const
Definition: C4Gui.h:2631
bool HasFullscreenDialog(bool fIncludeFading)
Definition: C4Gui.cpp:1032
void ActivateDialog(Dialog *pDlg)
Definition: C4Gui.cpp:647
int32_t GetLastContextMenuIndex()
Definition: C4Gui.h:2659
ContextMenu * pContext
Definition: C4Gui.h:2594
Dialog * GetDialog(C4Window *pWindow)
Definition: C4Gui.cpp:720
Dialog * pActiveDlg
Definition: C4Gui.h:2593
bool ShowRemoveDlg(Dialog *pDlg)
bool ShowMessageModal(const char *szMessage, const char *szCaption, DWORD dwButtons, Icons icoIcon, int32_t *piConfigDontShowAgainSetting=nullptr)
void AbortContext(bool fByUser)
Definition: C4Gui.h:2657
void ElementPosChanged(Element *pOfElement) override
Definition: C4Gui.cpp:604
float fZoom
Definition: C4Gui.h:2597
void SetExclusive(bool fToState)
Definition: C4Gui.h:2669
void MouseMove(int32_t iButton, int32_t iX, int32_t iY, DWORD dwKeyParam, class C4Viewport *pVP)
Definition: C4Gui.cpp:797
bool ShowMessage(const char *szMessage, const char *szCaption, Icons icoIcon, int32_t *piConfigDontShowAgainSetting=nullptr)
bool KeyAny()
Definition: C4Gui.cpp:771
void CloseDialog(Dialog *pDlg, bool fFade)
Definition: C4Gui.cpp:663
Dialog * GetTopDialog()
Definition: C4Gui.cpp:692
void CloseAllDialogs(bool fWithOK)
Definition: C4Gui.cpp:704
void OnSec1Timer()
bool IsExclusive()
Definition: C4Gui.h:2670
const C4Rect & GetPreferredDlgRect()
Definition: C4Gui.h:2603
void RemoveElement(Element *pChild) override
Definition: C4Gui.cpp:556
C4Rect PreferredDlgRect
Definition: C4Gui.h:2596
void DoContext(ContextMenu *pNewCtx, Element *pAtElement, int32_t iX, int32_t iY)
Definition: C4Gui.cpp:971
int32_t GetMouseControlledDialogCount()
Definition: C4Gui.cpp:999
void MouseInput(CMouse &rMouse, int32_t iButton, int32_t iX, int32_t iY, DWORD dwKeyParam) override
int32_t iScrollThumbSize
Definition: C4Gui.h:885
void MouseLeave(CMouse &rMouse) override
bool fTopDown
Definition: C4Gui.h:887
ScrollBar(C4Rect &rcBounds, ScrollWindow *pWin)
void DrawElement(C4TargetFacet &cgo) override
bool HasPin()
Definition: C4Gui.h:902
ScrollWindow * pScrollWindow
Definition: C4Gui.h:891
void DoDragging(CMouse &rMouse, int32_t iX, int32_t iY, DWORD dwKeyParam) override
bool IsScrolling()
Definition: C4Gui.h:916
int32_t GetScrollByPos(int32_t iX, int32_t iY)
Definition: C4Gui.h:912
bool fBottomDown
Definition: C4Gui.h:887
ScrollBarFacets * pCustomGfx
Definition: C4Gui.h:894
BaseParCallbackHandler< int32_t > * pScrollCallback
Definition: C4Gui.h:892
int32_t iScrollPos
Definition: C4Gui.h:886
void SetDecoration(ScrollBarFacets *pToGfx, bool fAutoHide)
Definition: C4Gui.h:929
bool fHorizontal
Definition: C4Gui.h:888
int32_t GetMaxScroll()
Definition: C4Gui.h:907
int32_t iCBMaxRange
Definition: C4Gui.h:889
void SetScrollPos(int32_t iToPos)
Definition: C4Gui.h:932
bool fScrolling
Definition: C4Gui.h:883
bool fAutoHide
Definition: C4Gui.h:884
void ElementPosChanged(Element *pOfElement) override
Definition: C4Gui.h:954
bool IsComponentOutsideClientArea() override
Definition: C4Gui.h:966
void SetDecoration(ScrollBarFacets *pToGfx, bool fAutoScroll)
Definition: C4Gui.h:977
bool IsScrollingActive()
Definition: C4Gui.h:992
int32_t iFrozen
Definition: C4Gui.h:946
void SetClientHeight(int32_t iToHgt)
Definition: C4Gui.h:973
bool IsFrozen() const
Definition: C4Gui.h:971
bool IsScrollBarEnabled()
Definition: C4Gui.h:990
bool IsScrollingNecessary()
Definition: C4Gui.h:993
void UnFreeze()
Definition: C4Gui.h:970
void MouseInput(CMouse &rMouse, int32_t iButton, int32_t iX, int32_t iY, DWORD dwKeyParam) override
~ScrollWindow() override
Definition: C4Gui.h:962
bool IsRangeInView(int32_t iY, int32_t iHgt)
int32_t GetScrollY()
Definition: C4Gui.h:987
void SetScrollBarEnabled(bool fToVal, bool noAutomaticPositioning=false)
int32_t iScrollY
Definition: C4Gui.h:943
void ScrollPages(int iPageCount)
void ScrollBy(int iAmount)
void ScrollRangeInView(int32_t iY, int32_t iHgt)
ScrollBar * pScrollBar
Definition: C4Gui.h:942
int32_t iClientHeight
Definition: C4Gui.h:944
void UpdateOwnPos() override
void SetScroll(int32_t iToScroll)
void ElementSizeChanged(Element *pOfElement) override
Definition: C4Gui.h:949
bool HasCloseButton() const
Definition: C4Gui.h:1630
void SetTitle(const char *szNewTitle)
bool IsPosOnCloseButton(int32_t x, int32_t y, int32_t iCaptWdt, int32_t iCaptHgt, bool fLarge)
virtual void UserClose()
Definition: C4Gui.h:1629
void SetCloseButtonHighlight(bool fToVal)
Definition: C4Gui.h:1620
virtual void OnShown(bool fByUser)
Definition: C4Gui.h:1619
uint32_t cHotkey
Definition: C4Gui.h:1610
Sheet(const char *szTitle, const C4Rect &rcBounds, int32_t icoTitle=Ico_None, bool fHasCloseButton=false, bool fTitleMarkup=true)
void DrawCaption(C4TargetFacet &cgo, int32_t x, int32_t y, int32_t iMaxWdt, bool fLarge, bool fActive, bool fFocus, C4Facet *pfctClip, C4Facet *pfctIcon, CStdFont *pUseFont)
void SetCaptionColor(uint32_t dwNewClr=0)
Definition: C4Gui.h:1628
uint32_t dwCaptionClr
Definition: C4Gui.h:1611
StdStrBuf sTitle
Definition: C4Gui.h:1608
void GetCaptionSize(int32_t *piWdt, int32_t *piHgt, bool fLarge, bool fActive, C4Facet *pfctClip, C4Facet *pfctIcon, CStdFont *pUseFont)
bool fCloseButtonHighlighted
Definition: C4Gui.h:1612
const char * GetTitle()
Definition: C4Gui.h:1625
friend class Sheet
Definition: C4Gui.h:1717
void DrawElement(C4TargetFacet &cgo) override
Tabular(C4Rect &rtBounds, TabPosition eTabPos)
void MouseInput(CMouse &rMouse, int32_t iButton, int32_t iX, int32_t iY, DWORD dwKeyParam) override
Sheet * AddSheet(const char *szTitle, int32_t icoTitle=Ico_None)
int32_t GetMarginLeft() override
Definition: C4Gui.h:1685
void SelectSheet(int32_t iIndex, bool fByUser)
Sheet * GetActiveSheet()
Definition: C4Gui.h:1708
int32_t GetActiveSheetIndex()
void OnGetFocus(bool fByMouse) override
Sheet * GetSheet(int32_t iIndex)
Definition: C4Gui.h:1707
Control * IsFocusElement() override
Definition: C4Gui.h:1677
void MouseLeaveCaptionArea()
~Tabular() override
void RemoveElement(Element *pChild) override
static int32_t GetLeftClipSize(C4Facet *pfctForClip)
Definition: C4Gui.h:1713
int32_t GetLeftSize()
Definition: C4Gui.h:1681
bool HasLargeCaptions()
Definition: C4Gui.h:1682
bool IsFocusOnClick() override
Definition: C4Gui.h:1678
void UpdateSize() override
void SetDrawDecoration(bool fToVal)
Definition: C4Gui.h:1715
int32_t GetMarginRight() override
Definition: C4Gui.h:1686
int32_t GetTopSize()
Definition: C4Gui.h:1680
bool IsSelectedChild(Element *pChild) override
Definition: C4Gui.h:1691
int32_t GetSheetCount()
Definition: C4Gui.h:1710
void AddCustomSheet(Sheet *pAddSheet)
void SetSheetMargin(int32_t iMargin)
Definition: C4Gui.h:1714
int32_t GetMarginBottom() override
Definition: C4Gui.h:1687
void MouseLeave(CMouse &rMouse) override
int32_t GetMarginTop() override
Definition: C4Gui.h:1684
void SetGfx(C4Facet *pafctBack, C4Facet *pafctClip, C4Facet *pafctIcons, CStdFont *paSheetCaptionFont, bool fResizeByAspect)
size_t iPicPadding
Definition: C4Gui.h:1728
MultilineLabel * pLogBuffer
Definition: C4Gui.h:1726
int32_t GetMarginBottom() override
Definition: C4Gui.h:1761
void DrawElement(C4TargetFacet &cgo) override
Control * IsFocusElement() override
Definition: C4Gui.h:1736
void SetDecoration(bool fDrawBG, bool fDrawFrame, ScrollBarFacets *pToGfx, bool fAutoScroll)
Definition: C4Gui.h:1753
bool fDrawBackground
Definition: C4Gui.h:1727
void ElementSizeChanged(Element *pOfElement) override
int32_t GetMarginLeft() override
Definition: C4Gui.h:1759
void ScrollToBottom()
Definition: C4Gui.h:1743
int32_t GetScrollPos()
Definition: C4Gui.h:1747
void SetPicture(const C4Facet &rNewPic)
void ClearText(bool fDoUpdate)
Definition: C4Gui.h:1745
void ElementPosChanged(Element *pOfElement) override
void SetScrollPos(int32_t iPos)
Definition: C4Gui.h:1749
ScrollWindow * pClientWindow
Definition: C4Gui.h:1724
int32_t GetMarginTop() override
Definition: C4Gui.h:1758
int32_t GetMarginRight() override
Definition: C4Gui.h:1760
Picture * pTitlePicture
Definition: C4Gui.h:1725
void UpdateSize() override
void AddTextLine(const char *szText, CStdFont *pFont, DWORD dwClr, bool fDoUpdate, bool fMakeReadableOnBlack, CStdFont *pCaptionFont=nullptr)
Definition: C4Gui.h:1741
void UpdateHeight()
Definition: C4Gui.h:1751
void SetPos(int32_t iXPos, int32_t iYPos)
Definition: C4Gui.h:860
virtual int32_t GetMarginRight()
Definition: C4Gui.h:875
virtual int32_t GetMarginTop()
Definition: C4Gui.h:873
C4Rect rcClientRect
Definition: C4Gui.h:851
void UpdateOwnPos() override
void MouseInput(CMouse &rMouse, int32_t iButton, int32_t iX, int32_t iY, DWORD dwKeyParam) override
virtual int32_t GetMarginLeft()
Definition: C4Gui.h:874
void Draw(C4TargetFacet &cgo) override
C4Rect & GetClientRect() override
Definition: C4Gui.h:864
virtual int32_t GetMarginBottom()
Definition: C4Gui.h:876
void ApplyElementOffset(int32_t &riX, int32_t &riY) override
Definition: C4Gui.h:866
virtual bool IsComponentOutsideClientArea()
Definition: C4Gui.h:870
void ApplyInvElementOffset(int32_t &riX, int32_t &riY) override
Definition: C4Gui.h:868
C4Facet fctIcon
Definition: C4Gui.h:524
static int32_t GetDefaultHeight(CStdFont *pUseFont=nullptr)
int32_t GetLeftIndent() override
Definition: C4Gui.h:526
WoodenLabel(const char *szLblText, const C4Rect &rcBounds, DWORD dwFClr=0xffffffff, CStdFont *pFont=nullptr, int32_t iAlign=ACenter, bool fMarkup=true)
Definition: C4Gui.h:530
void SetRightIndent(int32_t iNewIndent)
Definition: C4Gui.h:540
void SetAutoScrollTime(uint32_t tDelay)
Definition: C4Gui.h:537
int32_t GetRightIndent() const
Definition: C4Gui.h:527
void SetIcon(const C4Facet &rfctIcon)
void DrawElement(C4TargetFacet &cgo) override
YesButton(const C4Rect &rtBounds)
Definition: C4Gui.h:2309
Definition: C4Id.h:26
TargetClass & rTarget
CallbackFunc pFuncUp
CallbackFunc pFuncDown
CallbackFunc pFuncPressed
ParameterType par
CallbackFunc pFuncDown
TargetClass & rTarget
ParameterType par
CallbackFunc pFuncUp
CallbackFunc pFuncPressed
CallbackFunc pFuncUp
TargetClass & rTarget
CallbackFunc pFuncPressed
CallbackFunc pFuncDown
CallbackFunc pFuncUp
TargetClass & rTarget
CallbackFunc pFuncPressed
CallbackFunc pFuncDown
Definition: C4Rect.h:28
int32_t y
Definition: C4Rect.h:30
int32_t Hgt
Definition: C4Rect.h:30
int32_t Wdt
Definition: C4Rect.h:30
int32_t x
Definition: C4Rect.h:30
static C4TimeMilliseconds Now()
virtual C4Window * Init(WindowKind windowKind, C4AbstractApp *pApp, const char *Title, const C4Rect *size)
Definition: C4AppT.cpp:109
int GetLineHeight() const
Definition: C4FontLoader.h:125
const char * getData() const
Definition: StdBuf.h:442
void Copy()
Definition: StdBuf.h:467
void Clear()
Definition: StdBuf.h:466
size_t getLength() const
Definition: StdBuf.h:445
int32_t GetScreenHgt()
Definition: C4Gui.h:2825
float GetZoom()
Definition: C4Gui.h:2831
bool IsExclusive()
Definition: C4Gui.h:2821
Screen TheScreen
Definition: C4Gui.cpp:1054
void(CallbackDlg::* ContextClickFunc)(Element *pTargetElement)
Definition: C4Gui.h:1081
bool IsActive()
Definition: C4Gui.h:2820
void MouseMove(int32_t iButton, int32_t iX, int32_t iY, DWORD dwKeyParam, class C4Viewport *pVP)
Definition: C4Gui.h:2832
int32_t GetScreenWdt()
Definition: C4Gui.h:2824
Icons
Definition: C4Gui.h:638
@ Ico_Host
Definition: C4Gui.h:645
@ Ico_Controller_X
Definition: C4Gui.h:719
@ Ico_Controller_Back
Definition: C4Gui.h:721
@ Ico_Controller_LeftStick
Definition: C4Gui.h:732
@ Ico_Controller_LeftTrigger
Definition: C4Gui.h:730
@ Ico_Notify
Definition: C4Gui.h:642
@ Ico_Editor
Definition: C4Gui.h:657
@ Ico_Options
Definition: C4Gui.h:656
@ Ico_Ex_LeagueOff
Definition: C4Gui.h:702
@ Ico_Ex_Update
Definition: C4Gui.h:712
@ Ico_Lobby
Definition: C4Gui.h:675
@ Ico_View
Definition: C4Gui.h:694
@ Ico_Rank1
Definition: C4Gui.h:679
@ Ico_None
Definition: C4Gui.h:640
@ Ico_Inactive
Definition: C4Gui.h:658
@ Ico_NetWait
Definition: C4Gui.h:644
@ Ico_Rank6
Definition: C4Gui.h:684
@ Ico_Rank5
Definition: C4Gui.h:683
@ Ico_Ex_NormalCrew
Definition: C4Gui.h:701
@ Ico_Ex_Unlocked
Definition: C4Gui.h:710
@ Ico_UnknownClient
Definition: C4Gui.h:647
@ Ico_Sound
Definition: C4Gui.h:667
@ Ico_Gfx
Definition: C4Gui.h:666
@ Ico_Ex_LockedFrontal
Definition: C4Gui.h:711
@ Ico_Ex_RecordOff
Definition: C4Gui.h:698
@ Ico_Ex_Locked
Definition: C4Gui.h:709
@ Ico_Controller_DpadUp
Definition: C4Gui.h:727
@ Ico_Rank7
Definition: C4Gui.h:685
@ Ico_Team
Definition: C4Gui.h:662
@ Ico_Definition
Definition: C4Gui.h:673
@ Ico_Surrender
Definition: C4Gui.h:689
@ Ico_Ready
Definition: C4Gui.h:691
@ Ico_Controller_DpadRight
Definition: C4Gui.h:725
@ Ico_Rank3
Definition: C4Gui.h:681
@ Ico_Ex_LeagueOn
Definition: C4Gui.h:703
@ Ico_MouseOff
Definition: C4Gui.h:670
@ Ico_Chart
Definition: C4Gui.h:665
@ Ico_Star
Definition: C4Gui.h:692
@ Ico_AddPlr
Definition: C4Gui.h:663
@ Ico_Resource
Definition: C4Gui.h:651
@ Ico_Controller_DpadDown
Definition: C4Gui.h:726
@ Ico_Ex_Comment
Definition: C4Gui.h:715
@ Ico_Ex_InternetOn
Definition: C4Gui.h:705
@ Ico_Rank8
Definition: C4Gui.h:686
@ Ico_Controller_RightStick
Definition: C4Gui.h:733
@ Ico_Controller_Dpad
Definition: C4Gui.h:723
@ Ico_Ex_InternetOff
Definition: C4Gui.h:704
@ Ico_MouseOn
Definition: C4Gui.h:671
@ Ico_Ex_League
Definition: C4Gui.h:706
@ Ico_Controller_A
Definition: C4Gui.h:717
@ Ico_Ignored
Definition: C4Gui.h:696
@ Ico_ObserverClient
Definition: C4Gui.h:649
@ Ico_RuntimeJoin
Definition: C4Gui.h:676
@ Ico_OfficialServer
Definition: C4Gui.h:688
@ Ico_Gamepad
Definition: C4Gui.h:669
@ Ico_Client
Definition: C4Gui.h:646
@ Ico_Kick
Definition: C4Gui.h:659
@ Ico_Wait
Definition: C4Gui.h:643
@ Ico_Ex_RecordOn
Definition: C4Gui.h:699
@ Ico_Clonk
Definition: C4Gui.h:641
@ Ico_Player
Definition: C4Gui.h:650
@ Ico_Ex_NormalCrewGray
Definition: C4Gui.h:708
@ Ico_Controller_Start
Definition: C4Gui.h:722
@ Ico_Rank2
Definition: C4Gui.h:680
@ Ico_Disconnect
Definition: C4Gui.h:693
@ Ico_Keyboard
Definition: C4Gui.h:668
@ Ico_Close
Definition: C4Gui.h:678
@ Ico_Confirm
Definition: C4Gui.h:661
@ Ico_Ex_Chat
Definition: C4Gui.h:713
@ Ico_Controller_LeftShoulder
Definition: C4Gui.h:728
@ Ico_UnknownPlayer
Definition: C4Gui.h:648
@ Ico_Loading
Definition: C4Gui.h:660
@ Ico_Record
Definition: C4Gui.h:664
@ Ico_Empty
Definition: C4Gui.h:639
@ Ico_Error
Definition: C4Gui.h:652
@ Ico_Controller_RightShoulder
Definition: C4Gui.h:729
@ Ico_Controller_DpadLeft
Definition: C4Gui.h:724
@ Ico_Rank9
Definition: C4Gui.h:687
@ Ico_Exit
Definition: C4Gui.h:677
@ Ico_SavegamePlayer
Definition: C4Gui.h:653
@ Ico_Rank4
Definition: C4Gui.h:682
@ Ico_Controller_RightTrigger
Definition: C4Gui.h:731
@ Ico_Help
Definition: C4Gui.h:672
@ Ico_Save
Definition: C4Gui.h:654
@ Ico_Controller_B
Definition: C4Gui.h:718
@ Ico_Active
Definition: C4Gui.h:655
@ Ico_GameRunning
Definition: C4Gui.h:674
@ Ico_Ex_GameList
Definition: C4Gui.h:714
@ Ico_MeleeLeague
Definition: C4Gui.h:690
@ Ico_Controller_Y
Definition: C4Gui.h:720
void(CallbackDlg::* Func)(Control *pFromControl)
Definition: C4Gui.h:1077
bool(CallbackDlg::* Bool2Func)(Control *pFromControl, bool fBool, bool fBool2)
Definition: C4Gui.h:1079
@ Ico_Extended
Definition: C4Gui.h:634
@ Ico_Controller
Definition: C4Gui.h:635
bool(CallbackDlg::* BoolFunc)(Control *pFromControl)
Definition: C4Gui.h:1078
void(CallbackDlg::* ContextClickFunc)(Element *pTargetElement, TEx Extra)
Definition: C4Gui.h:1088
DWORD MakeColorReadableOnBlack(DWORD &rdwClr)
Definition: C4Gui.cpp:98
bool ExpandHotkeyMarkup(StdStrBuf &sText, uint32_t &rcHotkey, bool for_tooltip)
Definition: C4Gui.cpp:38
ContextMenu *(CallbackDlg::* ContextFunc)(Element *pFromElement, int32_t iX, int32_t iY)
Definition: C4Gui.h:1080
void GUISound(const char *szSound)
Definition: C4Gui.cpp:1175
ComboMenuCBStruct(const char *szText, int32_t id)
Definition: C4Gui.h:1975
void SetHorizontal(C4Surface &rBySfc, int iHeight=0, int iBorderWidth=0)
Definition: C4Gui.cpp:119
C4Facet fctEnd
Definition: C4Gui.h:351
C4Facet fctMiddle
Definition: C4Gui.h:351
void Clear()
Definition: C4Gui.h:355
C4Facet fctBegin
Definition: C4Gui.h:351
C4Facet fctScrollPin
Definition: C4Gui.h:362
void Set(const C4Facet &rByFct, int32_t iPinIndex=0)
Definition: C4Gui.cpp:136
C4Facet fctScrollDBottom
Definition: C4Gui.h:362
DynBarFacet barScroll
Definition: C4Gui.h:361
C4Facet fctScrollDTop
Definition: C4Gui.h:362