FINAL CUT
fwidget.h
1 /***********************************************************************
2 * fwidget.h - Intermediate base class for all widget objects *
3 * *
4 * This file is part of the FINAL CUT widget toolkit *
5 * *
6 * Copyright 2015-2024 Markus Gans *
7 * *
8 * FINAL CUT is free software; you can redistribute it and/or modify *
9 * it under the terms of the GNU Lesser General Public License as *
10 * published by the Free Software Foundation; either version 3 of *
11 * the License, or (at your option) any later version. *
12 * *
13 * FINAL CUT is distributed in the hope that it will be useful, but *
14 * WITHOUT ANY WARRANTY; without even the implied warranty of *
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
16 * GNU Lesser General Public License for more details. *
17 * *
18 * You should have received a copy of the GNU Lesser General Public *
19 * License along with this program. If not, see *
20 * <http://www.gnu.org/licenses/>. *
21 ***********************************************************************/
22 
23 /* Inheritance diagram
24  * ═══════════════════
25  *
26  * ▕▔▔▔▔▔▔▔▔▔▏ ▕▔▔▔▔▔▔▔▔▔▏
27  * ▕ FVTerm ▏ ▕ FObject ▏
28  * ▕▁▁▁▁▁▁▁▁▁▏ ▕▁▁▁▁▁▁▁▁▁▏
29  * ▲ ▲
30  * │ │
31  * └─────┬─────┘
32  * │
33  * ▕▔▔▔▔▔▔▔▔▔▏1 1▕▔▔▔▔▔▔▔▔▔▔▔▔▏
34  * ▕ FWidget ▏-┬- - - -▕ FStatusBar ▏
35  * ▕▁▁▁▁▁▁▁▁▁▏ : ▕▁▁▁▁▁▁▁▁▁▁▁▁▏
36  * :
37  * : 1▕▔▔▔▔▔▔▔▔▔▔▏
38  * :- - - -▕ FMenuBar ▏
39  * : ▕▁▁▁▁▁▁▁▁▁▁▏
40  *
41  * : 1▕▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▏
42  * :- - - -▕ FWidgetColors ▏
43  * : ▕▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▏
44  * :
45  * : *▕▔▔▔▔▔▔▔▔▔▏
46  * :- - - -▕ FString ▏
47  * : ▕▁▁▁▁▁▁▁▁▁▏
48  * :
49  * : *▕▔▔▔▔▔▔▔▔▏
50  * :- - - -▕ FEvent ▏
51  * : ▕▁▁▁▁▁▁▁▁▏
52  * :
53  * : *▕▔▔▔▔▔▔▔▔▔▔▔▏
54  * :- - - -▕ FKeyEvent ▏
55  * : ▕▁▁▁▁▁▁▁▁▁▁▁▏
56  * :
57  * : *▕▔▔▔▔▔▔▔▔▔▔▔▔▔▏
58  * :- - - -▕ FMouseEvent ▏
59  * : ▕▁▁▁▁▁▁▁▁▁▁▁▁▁▏
60  * :
61  * : *▕▔▔▔▔▔▔▔▔▔▔▔▔▔▏
62  * :- - - -▕ FWheelEvent ▏
63  * : ▕▁▁▁▁▁▁▁▁▁▁▁▁▁▏
64  * :
65  * : *▕▔▔▔▔▔▔▔▔▔▔▔▔▔▏
66  * :- - - -▕ FFocusEvent ▏
67  * : ▕▁▁▁▁▁▁▁▁▁▁▁▁▁▏
68  * :
69  * : *▕▔▔▔▔▔▔▔▔▔▔▔▔▔▏
70  * :- - - -▕ FAccelEvent ▏
71  * : ▕▁▁▁▁▁▁▁▁▁▁▁▁▁▏
72  * :
73  * : *▕▔▔▔▔▔▔▔▔▔▔▔▔▔▔▏
74  * :- - - -▕ FResizeEvent ▏
75  * : ▕▁▁▁▁▁▁▁▁▁▁▁▁▁▁▏
76  * :
77  * : *▕▔▔▔▔▔▔▔▔▔▔▔▔▏
78  * :- - - -▕ FShowEvent ▏
79  * : ▕▁▁▁▁▁▁▁▁▁▁▁▁▏
80  * :
81  * : *▕▔▔▔▔▔▔▔▔▔▔▔▔▏
82  * :- - - -▕ FHideEvent ▏
83  * : ▕▁▁▁▁▁▁▁▁▁▁▁▁▏
84  * :
85  * : *▕▔▔▔▔▔▔▔▔▔▔▔▔▔▏
86  * └- - - -▕ FCloseEvent ▏
87  * ▕▁▁▁▁▁▁▁▁▁▁▁▁▁▏
88  */
89 
90 #ifndef FWIDGET_H
91 #define FWIDGET_H
92 
93 #if !defined (USE_FINAL_H) && !defined (COMPILE_FINAL_CUT)
94  #error "Only <final/final.h> can be included directly."
95 #endif
96 
97 #include <functional>
98 #include <memory>
99 #include <unordered_map>
100 #include <utility>
101 #include <vector>
102 
103 #include "final/fobject.h"
104 #include "final/ftypes.h"
105 #include "final/fwidget_flags.h"
106 #include "final/fwidget_functions.h"
107 #include "final/output/foutput.h"
108 #include "final/util/fcallback.h"
109 #include "final/util/fpoint.h"
110 #include "final/util/frect.h"
111 #include "final/util/fsize.h"
112 #include "final/vterm/fvterm.h"
113 
114 namespace finalcut
115 {
116 
117 // class forward declaration
118 class FMenuBar;
119 class FRect;
120 class FResizeEvent;
121 class FSize;
122 class FStatusBar;
123 class FWidgetColors;
124 
125 //----------------------------------------------------------------------
126 // class FWidget
127 //----------------------------------------------------------------------
128 
129 class FWidget : public FVTerm
130  , public FObject
131 {
132  public:
134  {
135  alignas(8) FKey key;
136  FWidget* object;
137  };
138 
139  // Using-declarations
140  using FVTerm::setColor;
141  using FVTerm::print;
142  using FWidgetList = std::vector<FWidget*>;
143  using FAcceleratorList = std::vector<FAccelerator>;
144 
145  // Constructor
146  explicit FWidget (FWidget* = nullptr);
147 
148  // Destructor
149  ~FWidget() override;
150 
151  // Accessors
152  auto getClassName() const -> FString override;
153  auto getRootWidget() -> FWidget*;
154  auto getParentWidget() const -> FWidget*;
155  static auto getMainWidget() -> FWidget*&;
156  static auto getActiveWindow() -> FWidget*&;
157  static auto getFocusWidget() -> FWidget*&;
158  static auto getClickedWidget() -> FWidget*&;
159  static auto getOpenMenu() -> FWidget*&;
160  static auto getMoveResizeWidget() -> FWidget*&;
161  static auto getMenuBar() -> FMenuBar*;
162  static auto getStatusBar() -> FStatusBar*;
163  static auto getColorTheme() -> std::shared_ptr<FWidgetColors>&;
164  auto getAcceleratorList() const & -> const FAcceleratorList&;
165  auto getStatusbarMessage() const -> FString;
166  auto getForegroundColor() const noexcept -> FColor; // get the primary
167  auto getBackgroundColor() const noexcept -> FColor; // widget colors
168  auto doubleFlatLine_ref (Side) -> std::vector<bool>&;
169  // Positioning and sizes accessors...
170  auto getX() const -> int;
171  auto getY() const -> int;
172  auto getPos() const -> FPoint;
173  auto getTermX() const -> int;
174  auto getTermY() const -> int;
175  auto getTermPos() const -> FPoint;
176  auto getWidth() const -> std::size_t;
177  auto getHeight() const -> std::size_t;
178  auto getSize() const -> FSize;
179  auto getTopPadding() const noexcept -> int;
180  auto getLeftPadding() const noexcept -> int;
181  auto getBottomPadding() const noexcept -> int;
182  auto getRightPadding() const noexcept -> int;
183  auto getClientWidth() const -> std::size_t;
184  auto getClientHeight() const -> std::size_t;
185  auto getClientSize() const -> FSize;
186  auto getMaxWidth() const -> std::size_t;
187  auto getMaxHeight() const -> std::size_t;
188  auto getShadow() const & -> const FSize&;
189  auto getGeometry() const & -> const FRect&;
190  auto getGeometryWithShadow() & -> const FRect&;
191  auto getTermGeometry() & -> const FRect&;
192  auto getTermGeometryWithShadow() & -> const FRect&;
193  auto getDesktopWidth() const -> std::size_t;
194  auto getDesktopHeight() const -> std::size_t;
195  auto getFlags() const & -> const FWidgetFlags&;
196  auto getCursorPos() const -> FPoint;
197  auto getPrintPos() -> FPoint;
198 
199  // Mutators
200  static void setMainWidget (FWidget*);
201  static void setFocusWidget (FWidget*);
202  static void setClickedWidget (FWidget*);
203  static void setMoveSizeWidget (FWidget*);
204  static void setActiveWindow (FWidget*);
205  static void setOpenMenu (FWidget*);
206  template <typename ClassT>
207  static void setColorTheme();
208  auto setAcceleratorList() & -> FAcceleratorList&;
209  virtual void setStatusbarMessage (const FString&);
210  void setVisible (bool = true);
211  void unsetVisible();
212  virtual void setEnable (bool = true);
213  virtual void unsetEnable();
214  virtual void setDisable();
215  virtual void setVisibleCursor (bool = true); // input cursor visibility
216  virtual void unsetVisibleCursor(); // for the widget
217  virtual auto setFocus ( bool = true
218  , FocusTypes = FocusTypes::DefiniteWidget) -> bool;
219  virtual auto unsetFocus() -> bool;
220  void setFocusable (bool = true);
221  void unsetFocusable();
222  auto ignorePadding (bool = true) -> bool; // ignore padding from
223  auto acceptPadding() -> bool; // the parent widget
224  virtual void setForegroundColor (FColor);
225  virtual void setBackgroundColor (FColor);
226  virtual void resetColors();
227  void useParentWidgetColor();
228  void setColor() const;
229  auto setFlags() & -> FWidgetFlags&;
230  // Positioning and sizes mutators...
231  virtual void setX (int, bool = true);
232  virtual void setY (int, bool = true);
233  virtual void setPos (const FPoint&, bool = true);
234  virtual void setWidth (std::size_t, bool = true);
235  virtual void setHeight (std::size_t, bool = true);
236  virtual void setSize (const FSize&, bool = true);
237  void setTopPadding (int, bool = true);
238  void setLeftPadding (int, bool = true);
239  void setBottomPadding (int, bool = true);
240  void setRightPadding (int, bool = true);
241  void setTerminalSize (const FSize&) const;
242  virtual void setGeometry (const FRect&, bool = true);
243  virtual void setGeometry (const FPoint&, const FSize&, bool = true);
244  virtual void setShadowSize (const FSize&);
245  void setMinimumWidth (std::size_t);
246  void setMinimumHeight (std::size_t);
247  void setMinimumSize (const FSize&);
248  void setMaximumWidth (std::size_t);
249  void setMaximumHeight (std::size_t);
250  void setMaximumSize (const FSize&);
251  void setFixedSize (const FSize&);
252  virtual auto setCursorPos (const FPoint&) -> bool;
253  void unsetCursorPos();
254  virtual void setPrintPos (const FPoint&);
255  void setDoubleFlatLine (Side, bool = true);
256  void unsetDoubleFlatLine (Side);
257  void setDoubleFlatLine (Side, int, bool = true);
258  void unsetDoubleFlatLine (Side, int);
259 
260  // Inquiries
261  auto isRootWidget() const -> bool;
262  auto isWindowWidget() const -> bool;
263  auto isDialogWidget() const -> bool;
264  auto isMenuWidget() const -> bool;
265  auto isVisible() const -> bool;
266  auto isShown() const -> bool;
267  auto isHidden() const -> bool;
268  auto isEnabled() const -> bool;
269  auto hasVisibleCursor() const -> bool;
270  auto hasFocus() const -> bool;
271  auto acceptFocus() const -> bool; // is focusable
272  auto isPaddingIgnored() const -> bool;
273 
274  // Methods
275  auto childWidgetAt (const FPoint&) & -> FWidget*;
276  auto numOfFocusableChildren() & -> int;
277  virtual auto close() -> bool;
278  void clearStatusbarMessage();
279  template <typename... Args>
280  void addCallback (FString&&, Args&&...) & noexcept;
281  template <typename... Args>
282  void delCallback (Args&&...) & noexcept;
283  void emitCallback (const FString&) const &;
284  void addAccelerator (FKey) &;
285  virtual void addAccelerator (FKey, FWidget*) &;
286  void delAccelerator () &;
287  virtual void delAccelerator (FWidget*) &;
288  virtual void flushChanges();
289  virtual void redraw();
290  virtual void resize();
291  virtual void show();
292  virtual void hide();
293  virtual auto focusNextChild() -> bool; // Change child...
294  virtual auto focusPrevChild() -> bool; // ...focus
295  virtual auto focusFirstChild() & -> bool;
296  virtual auto focusLastChild() & -> bool;
297  auto termToWidgetPos (const FPoint&) const -> FPoint;
298  void print (const FPoint&) override;
299  virtual void move (const FPoint&);
300  virtual void drawBorder();
301  static void quit();
302 
303  protected:
304  // Accessor
305  auto getPrintArea() -> FTermArea* override;
306  static auto getModalDialogCounter() -> uInt;
307  static auto getDialogList() -> FWidgetList*&;
308  static auto getAlwaysOnTopList() -> FWidgetList*&;
309  static auto getWidgetCloseList() -> FWidgetList*&;
310  void addPreprocessingHandler ( const FVTerm*
311  , FPreprocessingFunction&& ) override;
312  void delPreprocessingHandler (const FVTerm*) override;
313 
314  // Inquiry
315  auto isChildPrintArea() const -> bool;
316 
317  // Mutators
318  virtual void setStatusBar (FStatusBar*);
319  virtual void setMenuBar (FMenuBar*);
320  static auto setModalDialogCounter() -> uInt&;
321  void setParentOffset();
322  void setTermOffset();
323  void setTermOffsetWithPadding();
324 
325  // Methods
326  void initTerminal() override;
327  void initDesktop();
328  virtual void initLayout();
329  virtual void adjustSize();
330  void adjustSizeGlobal();
331  void hideArea (const FSize&);
332 
333  // Event handlers
334  auto event (FEvent*) -> bool override;
335  virtual void onKeyPress (FKeyEvent*);
336  virtual void onKeyUp (FKeyEvent*);
337  virtual void onKeyDown (FKeyEvent*);
338  virtual void onMouseDown (FMouseEvent*);
339  virtual void onMouseUp (FMouseEvent*);
340  virtual void onMouseDoubleClick (FMouseEvent*);
341  virtual void onWheel (FWheelEvent*);
342  virtual void onMouseMove (FMouseEvent*);
343  virtual void onFocusIn (FFocusEvent*);
344  virtual void onFocusOut (FFocusEvent*);
345  virtual void onChildFocusIn (FFocusEvent*);
346  virtual void onChildFocusOut (FFocusEvent*);
347  virtual void onTermFocusIn (FFocusEvent*);
348  virtual void onTermFocusOut (FFocusEvent*);
349  virtual void onFailAtChildFocus (FFocusEvent*);
350  virtual void onAccel (FAccelEvent*);
351  virtual void onResize (FResizeEvent*);
352  virtual void onShow (FShowEvent*);
353  virtual void onHide (FHideEvent*);
354  virtual void onClose (FCloseEvent*);
355 
356  private:
357  // Using-declaration
358  using EventHandler = std::function<void(FEvent*)>;
359  using EventMap = std::unordered_map<Event, EventHandler, EnumHash<Event>>;
360 
361  struct WidgetSizeHints
362  {
363  WidgetSizeHints() = default;
364  ~WidgetSizeHints() = default;
365 
366  inline void setMinimum (const FSize& s)
367  {
368  min_width = s.getWidth();
369  min_height = s.getHeight();
370  }
371 
372  inline void setMaximum (const FSize& s)
373  {
374  max_width = s.getWidth();
375  max_height = s.getHeight();
376  }
377 
378  std::size_t min_width{0};
379  std::size_t min_height{0};
380  std::size_t max_width{INT_MAX};
381  std::size_t max_height{INT_MAX};
382  };
383 
384  struct DoubleLineMask
385  {
386  DoubleLineMask() = default;
387  ~DoubleLineMask() = default;
388 
389  inline void setWidth (std::size_t width)
390  {
391  if ( top.size() == width && bottom.size() == width )
392  return;
393 
394  top.resize (width, false);
395  bottom.resize (width, false);
396  }
397 
398  inline void setHeight (std::size_t height)
399  {
400  if ( right.size() == height && left.size() == height )
401  return;
402 
403  right.resize (height, false);
404  left.resize (height, false);
405  }
406 
407  inline void setSize (std::size_t width, std::size_t height)
408  {
409  setWidth (width);
410  setHeight (height);
411  }
412 
413  std::vector<bool> top{};
414  std::vector<bool> right{};
415  std::vector<bool> bottom{};
416  std::vector<bool> left{};
417  };
418 
419  struct WidgetPadding
420  {
421  WidgetPadding() = default;
422  ~WidgetPadding() = default;
423 
424  int top{0};
425  int left{0};
426  int bottom{0};
427  int right{0};
428  };
429 
430  // Methods
431  void determineDesktopSize();
432  void mapEventFunctions();
433  void mapKeyEvents();
434  void mapMouseEvents();
435  void mapFocusEvents();
436  void mapWidgetEvents();
437  void initRootWidget();
438  void initWidgetLayout();
439  void initDesktopOnShown() const;
440  void finish();
441  void startShow();
442  void finalizeShow() const;
443  void showChildWidgets();
444  void moveLeftIfNotEnoughSpace();
445  void moveUpIfNotEnoughSpace();
446  void reduceWidthIfNotEnoughSpace();
447  void reduceHeightIfNotEnoughSpace();
448  void insufficientSpaceAdjust();
449  void KeyPressEvent (FKeyEvent*);
450  void KeyDownEvent (FKeyEvent*);
451  void emitWheelCallback (const FWheelEvent*) const;
452  void setWindowFocus (bool = true);
453  auto searchForwardForWidget ( const FWidget*
454  , const FWidget*) const -> FObjectList::const_iterator;
455  auto searchBackwardsForWidget ( const FWidget*
456  , const FWidget* ) const -> FObjectList::const_reverse_iterator;
457  auto isViewable() const -> bool;
458  auto canReceiveFocus (const FWidget*) const -> bool;
459  void setFocusOnThisWidget (FocusTypes);
460  auto sendFailAtChildFocusEvent (FWidget*, FocusTypes) const -> bool;
461  auto sendFocusOutEvent (FWidget*, FocusTypes) const -> bool;
462  auto sendFocusInEvent (FWidget*, FocusTypes) const -> bool;
463  void processDestroy() const;
464  virtual void draw();
465  void drawWindows() const;
466  void drawChildren();
467  void adjustWidget();
468  void adjustSizeWithinArea (FRect&) const;
469  void adjustChildWidgetSizes();
470  void setWindowOffset();
471  void setWidgetOffset (const FWidget*);
472  void setClientOffset();
473  static auto isDefaultTheme() -> bool;
474  static void initColorTheme();
475  void removeQueuedEvent() const;
476  void setStatusbarText (bool = true) const;
477 
478  // Data members
479  struct FWidgetFlags flags{};
480  FPoint widget_cursor_position{-1, -1};
481  WidgetSizeHints size_hints{};
482  DoubleLineMask double_flatline_mask{};
483  WidgetPadding padding{};
484 
485  // widget size
486  FRect wsize{1, 1, 1, 1};
487  FRect adjust_wsize{1, 1, 1, 1};
488  FRect adjust_wsize_term{};
489  FRect adjust_wsize_shadow{};
490  FRect adjust_wsize_term_shadow{};
491  // widget offset
492  FRect woffset{};
493  // offset of the widget client area
494  FRect wclient_offset{};
495  // widget shadow size (on the right and bottom side)
496  FSize wshadow{0, 0};
497 
498  // default widget foreground and background color
499  FColor foreground_color{FColor::Default};
500  FColor background_color{FColor::Default};
501  FString statusbar_message{};
502  FAcceleratorList accelerator_list{};
503  EventMap event_map{};
504  FCallback callback_impl{};
505 
506  static FStatusBar* statusbar;
507  static FMenuBar* menubar;
508  static FWidget* main_widget;
509  static FWidget* active_window;
510  static FWidget* focus_widget;
511  static FWidget* clicked_widget;
512  static FWidget* open_menu;
513  static FWidget* move_resize_widget;
514  static FWidget* first_shown_widget;
515  static FWidget* redraw_root_widget;
516  static FWidgetList* dialog_list;
517  static FWidgetList* always_on_top_list;
518  static FWidgetList* close_widget_list;
519  static uInt modal_dialog_counter;
520  static bool init_terminal;
521  static bool init_desktop;
522 
523  // Friend functions
524  friend void detectTerminalSize();
525  friend void drawShadow (FWidget*);
526  friend void drawTransparentShadow (FWidget*);
527  friend void drawGenericBox (FWidget*, const FRect&, const std::array<wchar_t, 8>&);
528  friend void drawGenericBlockShadow (FWidget*, const std::array<FChar, 4>&);
529  friend void drawFlatBorder (FWidget*);
530  friend void clearFlatBorder (FWidget*);
531 };
532 
533 
534 // FWidget inline functions
535 //----------------------------------------------------------------------
536 inline auto FWidget::getClassName() const -> FString
537 { return "FWidget"; }
538 
539 //----------------------------------------------------------------------
540 inline auto FWidget::getMainWidget() -> FWidget*&
541 { return main_widget; }
542 
543 //----------------------------------------------------------------------
544 inline auto FWidget::getActiveWindow() -> FWidget*& // returns active FWindow object
545 { return active_window; }
546 
547 //----------------------------------------------------------------------
548 inline auto FWidget::getFocusWidget() -> FWidget*&
549 { return focus_widget; }
550 
551 //----------------------------------------------------------------------
552 inline auto FWidget::getClickedWidget() -> FWidget*&
553 { return clicked_widget; }
554 
555 //----------------------------------------------------------------------
556 inline auto FWidget::getOpenMenu() -> FWidget*&
557 { return open_menu; }
558 
559 //----------------------------------------------------------------------
560 inline auto FWidget::getMoveResizeWidget() -> FWidget*&
561 { return move_resize_widget; }
562 
563 //----------------------------------------------------------------------
564 inline auto FWidget::getMenuBar() -> FMenuBar*
565 { return menubar; }
566 
567 //----------------------------------------------------------------------
568 inline auto FWidget::getStatusBar() -> FStatusBar*
569 { return statusbar; }
570 
571 //----------------------------------------------------------------------
572 inline auto FWidget::getAcceleratorList() const & -> const FAcceleratorList&
573 { return accelerator_list; }
574 
575 //----------------------------------------------------------------------
576 inline auto FWidget::setAcceleratorList() & -> FAcceleratorList&
577 { return accelerator_list; }
578 
579 //----------------------------------------------------------------------
580 inline auto FWidget::getStatusbarMessage() const -> FString
581 { return statusbar_message; }
582 
583 //----------------------------------------------------------------------
584 inline auto FWidget::getForegroundColor() const noexcept -> FColor
585 { return foreground_color; }
586 
587 //----------------------------------------------------------------------
588 inline auto FWidget::getBackgroundColor() const noexcept -> FColor
589 { return background_color; }
590 
591 //----------------------------------------------------------------------
592 inline auto FWidget::getX() const -> int // x-position relative to the widget
593 { return adjust_wsize.getX(); }
594 
595 //----------------------------------------------------------------------
596 inline auto FWidget::getY() const -> int // y-position relative to the widget
597 { return adjust_wsize.getY(); }
598 
599 //----------------------------------------------------------------------
600 inline auto FWidget::getPos() const -> FPoint // position relative to the widget
601 {
602  const FPoint& pos = adjust_wsize.getPos(); // initialize pos
603  return pos;
604 }
605 
606 //----------------------------------------------------------------------
607 inline auto FWidget::getTermX() const -> int // x-position on terminal
608 { return woffset.getX1() + adjust_wsize.getX(); }
609 
610 //----------------------------------------------------------------------
611 inline auto FWidget::getTermY() const -> int // y-position on terminal
612 { return woffset.getY1() + adjust_wsize.getY(); }
613 
614 //----------------------------------------------------------------------
615 inline auto FWidget::getTermPos() const -> FPoint // position on terminal
616 { return {getTermX(), getTermY()}; }
617 
618 //----------------------------------------------------------------------
619 inline auto FWidget::getWidth() const -> std::size_t
620 { return adjust_wsize.getWidth(); }
621 
622 //----------------------------------------------------------------------
623 inline auto FWidget::getHeight() const -> std::size_t
624 { return adjust_wsize.getHeight(); }
625 
626 //----------------------------------------------------------------------
627 inline auto FWidget::getSize() const -> FSize
628 {
629  const FSize& size = adjust_wsize.getSize(); // initialize size
630  return size;
631 }
632 
633 //----------------------------------------------------------------------
634 inline auto FWidget::getTopPadding() const noexcept -> int
635 { return padding.top; }
636 
637 //----------------------------------------------------------------------
638 inline auto FWidget::getLeftPadding() const noexcept -> int
639 { return padding.left; }
640 
641 //----------------------------------------------------------------------
642 inline auto FWidget::getBottomPadding() const noexcept -> int
643 { return padding.bottom; }
644 
645 //----------------------------------------------------------------------
646 inline auto FWidget::getRightPadding() const noexcept -> int
647 { return padding.right; }
648 
649 //----------------------------------------------------------------------
650 inline auto FWidget::getClientWidth() const -> std::size_t
651 { return wclient_offset.getWidth(); }
652 
653 //----------------------------------------------------------------------
654 inline auto FWidget::getClientHeight() const -> std::size_t
655 { return wclient_offset.getHeight(); }
656 
657 //----------------------------------------------------------------------
658 inline auto FWidget::getClientSize() const -> FSize
659 {
660  const FSize& size = wclient_offset.getSize(); // initialize size
661  return size;
662 }
663 
664 //----------------------------------------------------------------------
665 inline auto FWidget::getMaxWidth() const -> std::size_t
666 { return woffset.getWidth(); }
667 
668 //----------------------------------------------------------------------
669 inline auto FWidget::getMaxHeight() const -> std::size_t
670 { return woffset.getHeight(); }
671 
672 //----------------------------------------------------------------------
673 inline auto FWidget::getShadow() const & -> const FSize&
674 { return wshadow; }
675 
676 //----------------------------------------------------------------------
677 inline auto FWidget::getGeometry() const & -> const FRect&
678 { return adjust_wsize; }
679 
680 //----------------------------------------------------------------------
681 inline auto FWidget::getGeometryWithShadow() & -> const FRect&
682 {
683  adjust_wsize_shadow.setCoordinates
684  (
685  adjust_wsize.x1_ref(),
686  adjust_wsize.y1_ref(),
687  adjust_wsize.x2_ref() + int(wshadow.width_ref()),
688  adjust_wsize.y2_ref() + int(wshadow.height_ref())
689  );
690 
691  return adjust_wsize_shadow;
692 }
693 
694 //----------------------------------------------------------------------
695 inline auto FWidget::getTermGeometry() & -> const FRect&
696 {
697  adjust_wsize_term.setCoordinates
698  (
699  adjust_wsize.x1_ref() + woffset.x1_ref(),
700  adjust_wsize.y1_ref() + woffset.y1_ref(),
701  adjust_wsize.x2_ref() + woffset.x1_ref(),
702  adjust_wsize.y2_ref() + woffset.y1_ref()
703  );
704 
705  return adjust_wsize_term;
706 }
707 
708 //----------------------------------------------------------------------
709 inline auto FWidget::getTermGeometryWithShadow() & -> const FRect&
710 {
711  adjust_wsize_term_shadow.setCoordinates
712  (
713  adjust_wsize.x1_ref() + woffset.x1_ref(),
714  adjust_wsize.y1_ref() + woffset.y1_ref(),
715  adjust_wsize.x2_ref() + woffset.x1_ref() + int(wshadow.width_ref()),
716  adjust_wsize.y2_ref() + woffset.y1_ref() + int(wshadow.height_ref())
717  );
718 
719  return adjust_wsize_term_shadow;
720 }
721 
722 //----------------------------------------------------------------------
723 inline auto FWidget::getDesktopWidth() const -> std::size_t
724 { return FVTerm::getFOutput()->getColumnNumber(); }
725 
726 //----------------------------------------------------------------------
727 inline auto FWidget::getDesktopHeight() const -> std::size_t
728 { return FVTerm::getFOutput()->getLineNumber(); }
729 
730 //----------------------------------------------------------------------
731 inline auto FWidget::getFlags() const & -> const FWidgetFlags&
732 { return flags; }
733 
734 //----------------------------------------------------------------------
735 inline auto FWidget::getCursorPos() const -> FPoint
736 { return widget_cursor_position; }
737 
738 //----------------------------------------------------------------------
739 inline void FWidget::setActiveWindow (FWidget* obj)
740 { active_window = obj; }
741 
742 //----------------------------------------------------------------------
743 inline void FWidget::setFocusWidget (FWidget* obj)
744 { focus_widget = obj; }
745 
746 //----------------------------------------------------------------------
747 inline void FWidget::setClickedWidget (FWidget* obj)
748 { clicked_widget = obj; }
749 
750 //----------------------------------------------------------------------
751 inline void FWidget::setOpenMenu (FWidget* obj)
752 { open_menu = obj; }
753 
754 //----------------------------------------------------------------------
755 template <typename ClassT>
756 inline void FWidget::setColorTheme()
757 {
758  getColorTheme() = std::make_shared<ClassT>();
759 }
760 
761 //----------------------------------------------------------------------
762 inline void FWidget::setMoveSizeWidget (FWidget* obj)
763 { move_resize_widget = obj; }
764 
765 //----------------------------------------------------------------------
766 inline void FWidget::setStatusbarMessage (const FString& msg)
767 { statusbar_message = msg; }
768 
769 //----------------------------------------------------------------------
770 inline void FWidget::unsetVisible()
771 { setVisible(false); }
772 
773 //----------------------------------------------------------------------
774 inline void FWidget::unsetEnable()
775 { setEnable(false); }
776 
777 //----------------------------------------------------------------------
778 inline void FWidget::setDisable()
779 { setEnable(false); }
780 
781 //----------------------------------------------------------------------
782 inline void FWidget::setVisibleCursor (bool enable)
783 { flags.visibility.visible_cursor = enable; }
784 
785 //----------------------------------------------------------------------
786 inline void FWidget::unsetVisibleCursor()
787 { setVisibleCursor(false); }
788 
789 //----------------------------------------------------------------------
790 inline auto FWidget::unsetFocus() -> bool
791 { return setFocus(false, FocusTypes::DefiniteWidget); }
792 
793 //----------------------------------------------------------------------
794 inline void FWidget::setFocusable (bool enable)
795 { flags.focus.focusable = enable; }
796 
797 //----------------------------------------------------------------------
798 inline void FWidget::unsetFocusable()
799 { flags.focus.focusable = false; }
800 
801 //----------------------------------------------------------------------
802 inline auto FWidget::ignorePadding (bool enable) -> bool
803 { return (flags.feature.ignore_padding = enable); }
804 
805 //----------------------------------------------------------------------
806 inline auto FWidget::acceptPadding() -> bool
807 { return (flags.feature.ignore_padding = false); }
808 
809 //----------------------------------------------------------------------
810 inline void FWidget::setForegroundColor (FColor color)
811 {
812  // valid colors -1..255
813  if ( color == FColor::Default || (color >> 8) == FColor::Black )
814  foreground_color = color;
815 }
816 
817 //----------------------------------------------------------------------
818 inline void FWidget::setBackgroundColor (FColor color)
819 {
820  // valid colors -1..255
821  if ( color == FColor::Default || (color >> 8) == FColor::Black )
822  background_color = color;
823 }
824 
825 //----------------------------------------------------------------------
826 inline auto FWidget::setFlags() & -> FWidgetFlags&
827 {
828  // Gives direct access to the widget flags
829  return flags;
830 }
831 
832 //----------------------------------------------------------------------
833 inline void FWidget::setGeometry (const FRect& box, bool adjust)
834 {
835  setGeometry (box.getPos(), box.getSize(), adjust);
836 }
837 
838 //----------------------------------------------------------------------
839 inline void FWidget::setShadowSize (const FSize& size)
840 {
841  // width = right shadow / height = bottom shadow
842  wshadow.setSize (size);
843 }
844 
845 //----------------------------------------------------------------------
846 inline void FWidget::setMinimumWidth (std::size_t min_width)
847 { size_hints.setMinimum (FSize(min_width, size_hints.min_height)); }
848 
849 //----------------------------------------------------------------------
850 inline void FWidget::setMinimumHeight (std::size_t min_height)
851 { size_hints.setMinimum (FSize(size_hints.min_width, min_height)); }
852 
853 //----------------------------------------------------------------------
854 inline void FWidget::setMinimumSize (const FSize& size)
855 {
856  // Sets the lower size limit to which the widget can be resized
857  size_hints.setMinimum (size);
858 }
859 
860 //----------------------------------------------------------------------
861 inline void FWidget::setMaximumWidth (std::size_t max_width)
862 { size_hints.setMaximum (FSize(max_width, size_hints.max_height)); }
863 
864 //----------------------------------------------------------------------
865 inline void FWidget::setMaximumHeight (std::size_t max_height)
866 { size_hints.setMaximum (FSize(size_hints.max_width, max_height)); }
867 
868 //----------------------------------------------------------------------
869 inline void FWidget::setMaximumSize (const FSize& size)
870 {
871  // Sets the upper size limit to which the widget can be resized
872  size_hints.setMaximum (size);
873 }
874 
875 //----------------------------------------------------------------------
876 inline void FWidget::setFixedSize (const FSize& size)
877 {
878  // Sets the minimum and maximum size limit to fixed sizes to prevent
879  // the widget resizing
880  size_hints.setMinimum (size);
881  size_hints.setMaximum (size);
882 }
883 
884 //----------------------------------------------------------------------
885 inline void FWidget::unsetCursorPos()
886 { setCursorPos ({-1, -1}); }
887 
888 //----------------------------------------------------------------------
889 inline void FWidget::unsetDoubleFlatLine (Side side)
890 { setDoubleFlatLine(side, false); }
891 
892 //----------------------------------------------------------------------
893 inline void FWidget::unsetDoubleFlatLine (Side side, int pos)
894 { setDoubleFlatLine(side, pos, false); }
895 
896 //----------------------------------------------------------------------
897 inline auto FWidget::isRootWidget() const -> bool
898 { return (! hasParent()); }
899 
900 //----------------------------------------------------------------------
901 inline auto FWidget::isVisible() const -> bool
902 { return flags.visibility.visible; }
903 
904 //----------------------------------------------------------------------
905 inline auto FWidget::isShown() const -> bool
906 { return flags.visibility.shown; }
907 
908 //----------------------------------------------------------------------
909 inline auto FWidget::isHidden() const -> bool
910 { return flags.visibility.hidden; }
911 
912 //----------------------------------------------------------------------
913 inline auto FWidget::isWindowWidget() const -> bool
914 { return flags.type.window_widget; }
915 
916 //----------------------------------------------------------------------
917 inline auto FWidget::isDialogWidget() const -> bool
918 { return flags.type.dialog_widget; }
919 
920 //----------------------------------------------------------------------
921 inline auto FWidget::isMenuWidget() const -> bool
922 { return flags.type.menu_widget; }
923 
924 //----------------------------------------------------------------------
925 inline auto FWidget::isEnabled() const -> bool
926 { return flags.feature.active; }
927 
928 //----------------------------------------------------------------------
929 inline auto FWidget::hasVisibleCursor() const -> bool
930 { return flags.visibility.visible_cursor; }
931 
932 //----------------------------------------------------------------------
933 inline auto FWidget::hasFocus() const -> bool
934 { return flags.focus.focus; }
935 
936 //----------------------------------------------------------------------
937 inline auto FWidget::acceptFocus() const -> bool // is focusable
938 { return flags.focus.focusable; }
939 
940 //----------------------------------------------------------------------
941 inline auto FWidget::isPaddingIgnored() const -> bool
942 { return flags.feature.ignore_padding; }
943 
944 //----------------------------------------------------------------------
945 inline void FWidget::clearStatusbarMessage()
946 { statusbar_message.clear(); }
947 
948 //----------------------------------------------------------------------
949 template <typename... Args>
950 inline void FWidget::addCallback (FString&& cb_signal, Args&&... args) & noexcept
951 {
952  callback_impl.addCallback (std::move(cb_signal), std::forward<Args>(args)...);
953 }
954 
955 //----------------------------------------------------------------------
956 template <typename... Args>
957 inline void FWidget::delCallback (Args&&... args) & noexcept
958 {
959  callback_impl.delCallback(std::forward<Args>(args)...);
960 }
961 
962 //----------------------------------------------------------------------
963 inline void FWidget::emitCallback (const FString& emit_signal) const &
964 {
965  callback_impl.emitCallback(emit_signal);
966 }
967 
968 //----------------------------------------------------------------------
969 inline void FWidget::addAccelerator (FKey key) &
970 { addAccelerator (key, this); }
971 
972 //----------------------------------------------------------------------
973 inline void FWidget::delAccelerator() &
974 { delAccelerator(this); }
975 
976 //----------------------------------------------------------------------
977 inline auto FWidget::termToWidgetPos (const FPoint& tPos) const -> FPoint
978 {
979  return { tPos.getX() + 1 - woffset.getX1() - adjust_wsize.getX()
980  , tPos.getY() + 1 - woffset.getY1() - adjust_wsize.getY() };
981 }
982 
983 //----------------------------------------------------------------------
984 inline void FWidget::print (const FPoint& pos)
985 {
986  setPrintPos (pos);
987 }
988 
989 //----------------------------------------------------------------------
990 inline void FWidget::drawBorder()
991 {
992  finalcut::drawBorder (this, FRect(FPoint{1, 1}, getSize()));
993 }
994 
995 //----------------------------------------------------------------------
996 inline auto FWidget::getModalDialogCounter() -> uInt
997 { return modal_dialog_counter; }
998 
999 //----------------------------------------------------------------------
1000 inline auto FWidget::getDialogList() -> FWidgetList*&
1001 { return dialog_list; }
1002 
1003 //----------------------------------------------------------------------
1004 inline auto FWidget::getAlwaysOnTopList() -> FWidgetList*&
1005 { return always_on_top_list; }
1006 
1007 //----------------------------------------------------------------------
1008 inline auto FWidget::getWidgetCloseList() -> FWidgetList*&
1009 { return close_widget_list; }
1010 
1011 //----------------------------------------------------------------------
1012 inline auto FWidget::setModalDialogCounter() -> uInt&
1013 { return modal_dialog_counter; }
1014 
1015 //----------------------------------------------------------------------
1016 inline void FWidget::processDestroy() const
1017 { emitCallback("destroy"); }
1018 
1019 
1020 // Non-member elements for NewFont
1021 //----------------------------------------------------------------------
1022 constexpr wchar_t NF_menu_button[]
1023 {
1024  wchar_t(UniChar::NF_rev_menu_button1),
1025  wchar_t(UniChar::NF_rev_menu_button2),
1026  wchar_t(UniChar::NF_rev_menu_button3),
1027  '\0'
1028 };
1029 
1030 constexpr wchar_t NF_button_up[]
1031 {
1032  wchar_t(UniChar::NF_rev_up_pointing_triangle1),
1033  wchar_t(UniChar::NF_rev_up_pointing_triangle2),
1034  '\0'
1035 };
1036 
1037 constexpr wchar_t NF_button_down[]
1038 {
1039  wchar_t(UniChar::NF_rev_down_pointing_triangle1),
1040  wchar_t(UniChar::NF_rev_down_pointing_triangle2),
1041  '\0'
1042 };
1043 
1044 constexpr wchar_t NF_button_arrow_up[]
1045 {
1046  wchar_t(UniChar::NF_rev_up_arrow1),
1047  wchar_t(UniChar::NF_rev_up_arrow2),
1048  '\0'
1049 };
1050 
1051 constexpr wchar_t NF_button_arrow_down[]
1052 {
1053  wchar_t(UniChar::NF_rev_down_arrow1),
1054  wchar_t(UniChar::NF_rev_down_arrow2),
1055  '\0'
1056 };
1057 
1058 constexpr wchar_t NF_button_arrow_left[]
1059 {
1060  wchar_t(UniChar::NF_rev_left_arrow1),
1061  wchar_t(UniChar::NF_rev_left_arrow2),
1062  '\0'
1063 };
1064 
1065 constexpr wchar_t NF_button_arrow_right[]
1066 {
1067  wchar_t(UniChar::NF_rev_right_arrow1),
1068  wchar_t(UniChar::NF_rev_right_arrow2),
1069  '\0'
1070 };
1071 
1072 constexpr wchar_t NF_Drive[]
1073 {
1074  wchar_t(UniChar::NF_shadow_box_left),
1075  wchar_t(UniChar::NF_shadow_box_middle),
1076  wchar_t(UniChar::NF_shadow_box_hdd),
1077  wchar_t(UniChar::NF_shadow_box_right),
1078  '\0'
1079 };
1080 
1081 constexpr wchar_t NF_CD_ROM[]
1082 {
1083  wchar_t(UniChar::NF_shadow_box_left),
1084  wchar_t(UniChar::NF_shadow_box_middle),
1085  wchar_t(UniChar::NF_shadow_box_cd),
1086  wchar_t(UniChar::NF_shadow_box_right),
1087  '\0'
1088 };
1089 
1090 constexpr wchar_t NF_Net_Drive[]
1091 {
1092  wchar_t(UniChar::NF_shadow_box_left),
1093  wchar_t(UniChar::NF_shadow_box_middle),
1094  wchar_t(UniChar::NF_shadow_box_net),
1095  wchar_t(UniChar::NF_shadow_box_right),
1096  '\0'
1097 };
1098 
1099 constexpr wchar_t CHECKBOX[]
1100 {
1101  wchar_t(UniChar::NF_shadow_box_left),
1102  wchar_t(UniChar::NF_shadow_box_middle),
1103  wchar_t(UniChar::NF_shadow_box_right),
1104  '\0'
1105 };
1106 
1107 constexpr wchar_t CHECKBOX_ON[]
1108 {
1109  wchar_t(UniChar::NF_shadow_box_left),
1110  wchar_t(UniChar::NF_shadow_box_checked),
1111  wchar_t(UniChar::NF_shadow_box_right),
1112  '\0'
1113 };
1114 
1115 constexpr wchar_t RADIO_BUTTON[]
1116 {
1117  wchar_t(UniChar::NF_radio_button1),
1118  wchar_t(UniChar::NF_radio_button2),
1119  wchar_t(UniChar::NF_radio_button3),
1120  '\0'
1121 };
1122 
1123 constexpr wchar_t CHECKED_RADIO_BUTTON[]
1124 {
1125  wchar_t(UniChar::NF_radio_button1),
1126  wchar_t(UniChar::NF_radio_button2_checked),
1127  wchar_t(UniChar::NF_radio_button3),
1128  '\0'
1129 };
1130 
1131 } // namespace finalcut
1132 
1133 #endif // FWIDGET_H
Definition: fwidget_flags.h:83
Definition: fevent.h:242
Definition: fevent.h:196
Definition: fstatusbar.h:187
Definition: fevent.h:144
Definition: frect.h:56
Definition: fmenubar.h:70
Definition: fvterm.h:96
Definition: fcallback.h:85
Definition: fevent.h:282
Definition: fevent.h:171
Definition: class_template.cpp:25
Definition: fpoint.h:50
Definition: fevent.h:260
Definition: fsize.h:55
Definition: fobject.h:79
Definition: fwidget.h:133
Definition: fstring.h:79
Definition: fevent.h:101
Definition: fevent.h:271
Definition: fwidget.h:129
Definition: fevent.h:220
Definition: fevent.h:124
Definition: fvterm.h:373