FINAL CUT
flistbox.h
1 /***********************************************************************
2 * flistbox.h - Widget FListBox and FListBoxItem *
3 * *
4 * This file is part of the FINAL CUT widget toolkit *
5 * *
6 * Copyright 2014-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  * ▕▔▔▔▔▔▔▔▔▔▏
34  * ▕ FWidget ▏
35  * ▕▁▁▁▁▁▁▁▁▁▏
36  * ▲
37  * │
38  * ▕▔▔▔▔▔▔▔▔▔▔▏1 *▕▔▔▔▔▔▔▔▔▔▔▔▔▔▔▏1 1▕▔▔▔▔▔▔▔▏
39  * ▕ FListBox ▏- - - -▕ FListBoxItem ▏- - - -▕ FData ▏
40  * ▕▁▁▁▁▁▁▁▁▁▁▏ ▕▁▁▁▁▁▁▁▁▁▁▁▁▁▁▏ ▕▁▁▁▁▁▁▁▏
41  *
42  */
43 
44 #ifndef FLISTBOX_H
45 #define FLISTBOX_H
46 
47 #if !defined (USE_FINAL_H) && !defined (COMPILE_FINAL_CUT)
48  #error "Only <final/final.h> can be included directly."
49 #endif
50 
51 #include <memory>
52 #include <unordered_map>
53 #include <utility>
54 #include <vector>
55 
56 #include "final/fwidget.h"
57 #include "final/util/fdata.h"
58 #include "final/widget/fscrollbar.h"
59 
60 namespace finalcut
61 {
62 
63 // class forward declaration
64 class FScrollbar;
65 class FString;
66 
67 //----------------------------------------------------------------------
68 // class FListBoxItem
69 //----------------------------------------------------------------------
70 
72 {
73  public:
74  // Constructors
75  template <typename DT = std::nullptr_t>
76  explicit FListBoxItem (const FString& = FString{}, DT&& = DT() );
77 
78  // Accessors
79  auto getClassName() const -> FString;
80  auto getText() const -> FString;
81  template <typename DT>
82  auto getData() const -> clean_fdata_t<DT>&;
83 
84  // Mutators
85  void setText (const FString&);
86  template <typename DT>
87  void setData (DT&&);
88 
89  // Inquiries
90  auto isSelected() const -> bool;
91 
92  // Methods
93  void clear();
94 
95  private:
96  // Using-declaration
97  using FDataAccessPtr = std::shared_ptr<FDataAccess>;
98 
99  // Methods
100  auto stringFilter(const FString&) const -> FString;
101 
102  // Data members
103  FString text{};
104  FDataAccessPtr data_pointer{};
105  BracketType brackets{BracketType::None};
106  bool selected{false};
107 
108  // Friend classes
109  friend class FListBox;
110 };
111 
112 
113 // FListBoxItem inline functions
114 //----------------------------------------------------------------------
115 template <typename DT>
116 inline FListBoxItem::FListBoxItem (const FString& txt, DT&& data)
117  : text{stringFilter(txt)}
118  , data_pointer{makeFData(std::forward<DT>(data))}
119 { }
120 
121 //----------------------------------------------------------------------
122 inline auto FListBoxItem::getClassName() const -> FString
123 { return "FListBoxItem"; }
124 
125 //----------------------------------------------------------------------
126 inline auto FListBoxItem::getText() const -> FString
127 { return text; }
128 
129 //----------------------------------------------------------------------
130 template <typename DT>
131 inline auto FListBoxItem::getData() const -> clean_fdata_t<DT>&
132 {
133  return static_cast<FData<clean_fdata_t<DT>>&>(*data_pointer).get();
134 }
135 
136 //----------------------------------------------------------------------
137 inline void FListBoxItem::setText (const FString& txt)
138 {
139  text.setString(stringFilter(txt));
140 }
141 
142 //----------------------------------------------------------------------
143 template <typename DT>
144 inline void FListBoxItem::setData (DT&& data)
145 {
146  const auto data_obj = makeFData(std::forward<DT>(data));
147  data_pointer.reset(data_obj);
148 }
149 
150 //----------------------------------------------------------------------
151 inline auto FListBoxItem::isSelected() const -> bool
152 { return selected; }
153 
154 //----------------------------------------------------------------------
155 inline void FListBoxItem::clear()
156 { text.clear(); }
157 
158 //----------------------------------------------------------------------
159 inline auto FListBoxItem::stringFilter (const FString& txt) const -> FString
160 {
161  return txt.rtrim()
162  .expandTabs(FVTerm::getFOutput()->getTabstop())
163  .removeBackspaces()
164  .removeDel()
165  .replaceControlCodes();
166 }
167 
168 
169 //----------------------------------------------------------------------
170 // class FListBox
171 //----------------------------------------------------------------------
172 
173 class FListBox : public FWidget
174 {
175  public:
176  // Using-declaration
177  using FWidget::setGeometry;
178  using FListBoxItems = std::vector<FListBoxItem>;
179 
180  // Constructor
181  explicit FListBox (FWidget* = nullptr);
182  template <typename Iterator
183  , typename InsertConverter>
184  FListBox (Iterator, Iterator, InsertConverter, FWidget* = nullptr);
185  template <typename Container
186  , typename LazyConverter>
187  FListBox (Container, LazyConverter&&, FWidget* = nullptr);
188 
189  // Disable copy constructor
190  FListBox (const FListBox&) = delete;
191 
192  // Disable move constructor
193  FListBox (FListBox&&) noexcept = delete;
194 
195  // Destructor
196  ~FListBox() override;
197 
198  // Disable copy assignment operator (=)
199  auto operator = (const FListBox&) -> FListBox& = delete;
200 
201  // Disable move assignment operator (=)
202  auto operator = (FListBox&&) noexcept -> FListBox& = delete;
203 
204  // Accessors
205  auto getClassName() const -> FString override;
206  auto getCount() const -> std::size_t;
207  auto getItem (std::size_t) & -> FListBoxItem&;
208  auto getItem (std::size_t) const & -> const FListBoxItem&;
209  auto getItem (FListBoxItems::iterator) & -> FListBoxItem&;
210  auto getItem (FListBoxItems::const_iterator) const & -> const FListBoxItem&;
211  auto currentItem() const noexcept -> std::size_t;
212  auto getData() & -> FListBoxItems&;
213  auto getData() const & -> const FListBoxItems&;
214  auto getText() & -> FString&;
215 
216  // Mutators
217  void setCurrentItem (std::size_t);
218  void setCurrentItem (FListBoxItems::iterator);
219  void selectItem (std::size_t);
220  void selectItem (FListBoxItems::iterator) const;
221  void unselectItem (std::size_t);
222  void unselectItem (FListBoxItems::iterator) const;
223  void showInsideBrackets (const std::size_t, BracketType);
224  void showNoBrackets (std::size_t);
225  void showNoBrackets (FListBoxItems::iterator) const;
226  void setSize (const FSize&, bool = true) override;
227  void setGeometry (const FPoint&, const FSize&, bool = true) override;
228  void setMultiSelection (bool = true);
229  void unsetMultiSelection ();
230  void setDisable() override;
231  void setText (const FString&);
232 
233  // Inquiries
234  auto isSelected (std::size_t) const -> bool;
235  auto isSelected (FListBoxItems::iterator) const -> bool;
236  auto isMultiSelection() const -> bool;
237  auto hasBrackets (std::size_t) const -> bool;
238  auto hasBrackets (FListBoxItems::iterator) const -> bool;
239 
240  // Methods
241  void hide() override;
242  template <typename Iterator
243  , typename InsertConverter>
244  void insert (Iterator, Iterator, const InsertConverter&);
245  template <typename Container
246  , typename LazyConverter>
247  void insert (const Container&, LazyConverter&&);
248  template <typename Container
249  , typename LazyConverter>
250  void insert (Container*, LazyConverter&&);
251  void insert (const FListBoxItem&);
252  template <typename T
253  , typename DT = std::nullptr_t>
254  void insert ( const std::initializer_list<T>& list
255  , BracketType = BracketType::None
256  , bool = false
257  , DT&& = DT() );
258  template <typename ItemT
259  , typename DT = std::nullptr_t>
260  void insert ( const ItemT&
261  , BracketType = BracketType::None
262  , bool = false
263  , DT&& = DT() );
264  void remove (std::size_t);
265  auto findItem (const FString&) -> FListBoxItems::iterator;
266  void reserve (std::size_t);
267  void clear();
268 
269  // Event handlers
270  void onKeyPress (FKeyEvent*) override;
271  void onMouseDown (FMouseEvent*) override;
272  void onMouseUp (FMouseEvent*) override;
273  void onMouseMove (FMouseEvent*) override;
274  void onMouseDoubleClick (FMouseEvent*) override;
275  void onWheel (FWheelEvent*) override;
276  void onTimer (FTimerEvent*) override;
277  void onFocusIn (FFocusEvent*) override;
278  void onFocusOut (FFocusEvent*) override;
279 
280  protected:
281  // Methods
282  void initLayout() override;
283  void adjustYOffset (std::size_t);
284  void adjustSize() override;
285 
286  private:
287  // Using-declaration
288  using KeyMap = std::unordered_map<FKey, std::function<void()>, EnumHash<FKey>>;
289  using KeyMapResult = std::unordered_map<FKey, std::function<bool()>, EnumHash<FKey>>;
290  using LazyInsert = std::function<void(FListBoxItem&, FDataAccess*, std::size_t)>;
291 
292  struct ListBoxData
293  {
294  FListBoxItems itemlist{};
295  FDataAccess* source_container{nullptr};
296  FString text{};
297  FString inc_search{};
298  KeyMap key_map{};
299  KeyMapResult key_map_result{};
300  };
301 
302  struct SelectionState
303  {
304  std::size_t current{0};
305  int last_current{-1};
306  int select_from_item{-1};
307  bool multi_select{false};
308  bool mouse_select{false};
309  bool click_on_list{false};
310  };
311 
312  struct ScrollingState
313  {
314  FScrollbarPtr vbar{nullptr};
315  FScrollbarPtr hbar{nullptr};
316  int xoffset{0};
317  int yoffset{0};
318  int last_yoffset{-1};
319  int repeat{100};
320  int distance{1};
321  bool timer{false};
322  };
323 
324  // Enumeration
325  enum class ConvertType
326  {
327  None = 0,
328  Direct = 1,
329  Lazy = 2
330  };
331 
332  // Accessors
333  static auto getString (FListBoxItems::iterator) -> FString;
334 
335  // Inquiry
336  auto isHorizontallyScrollable() const -> bool;
337  auto isVerticallyScrollable() const -> bool;
338  auto isCurrentLine (int) const -> bool;
339  auto isDragSelect() const -> bool;
340  auto canSkipDragScrolling() -> bool;
341 
342  // Methods
343  void init();
344  void mapKeyFunctions();
345  void processKeyAction (FKeyEvent*);
346  void draw() override;
347  void drawBorder() override;
348  void drawScrollbars() const;
349  void drawHeadline();
350  auto canSkipDrawing() const -> bool;
351  auto calculateNumberItemsToDraw() const -> std::size_t;
352  auto canRedrawPartialList() const -> bool;
353  void updateRedrawParameters (std::size_t&, std::size_t&) const;
354  void finalizeDrawing();
355  void drawList();
356  void drawListLine (int, FListBoxItems::iterator, bool);
357  void printLeftBracket (BracketType);
358  void printRightBracket (BracketType);
359  void drawListBracketsLine (int, FListBoxItems::iterator, bool);
360  auto getMaxWidth() const -> std::size_t;
361  void printLeftCurrentLineArrow (int);
362  void printRightCurrentLineArrow (int);
363  void printRemainingSpacesFromPos (std::size_t);
364  void setInitialLineAttributes (bool) const;
365  void setCurrentLineAttributes (int, bool, bool, bool&);
366  void setSelectedCurrentLineAttributes (int);
367  void setUnselectedCurrentLineAttributes (int, bool, bool&);
368  void setLineAttributes (int, bool, bool, bool&);
369  void unsetAttributes() const;
370  void updateDrawing (bool, bool);
371  void recalculateHorizontalBar (std::size_t, bool);
372  void recalculateVerticalBar (std::size_t) const;
373  void multiSelection (std::size_t);
374  void multiSelectionUpTo (std::size_t);
375  void wheelUp (int);
376  void wheelDown (int);
377  void wheelLeft (int);
378  void wheelRight (int);
379  auto dragScrollUp() -> bool;
380  auto dragScrollDown() -> bool;
381  void dragUp (MouseButton);
382  void dragDown (MouseButton);
383  void stopDragScroll();
384  void prevListItem (int);
385  void nextListItem (int);
386  void scrollToX (int);
387  void scrollToY (int);
388  void scrollLeft (int);
389  void scrollRight (int);
390  void scrollLeft();
391  void scrollRight();
392  void onePosUp();
393  void onePosDown();
394  void onePageUp();
395  void onePageDown();
396  void firstPos();
397  void lastPos();
398  auto isWithinListBounds (const FPoint&) const -> bool;
399  auto skipIncrementalSearch() -> bool;
400  auto isNonSelectMouseButtonPressed (const FMouseEvent*) const -> bool;
401  template <typename MultiSelectionFunction>
402  void handleMouseWithinListBounds (const FMouseEvent*, const MultiSelectionFunction&);
403  void handleMouseDragging (const FMouseEvent*);
404  void acceptSelection();
405  auto spacebarProcessing() -> bool;
406  auto changeSelectionAndPosition() -> bool;
407  auto deletePreviousCharacter() -> bool;
408  auto keyIncSearchInput (FKey) -> bool;
409  void processClick() const;
410  void processSelect() const;
411  void processRowChanged() const;
412  void processChanged() const;
413  void changeOnResize() const;
414  void updateScrollBarAfterRemoval (std::size_t);
415  auto getScrollBarMaxHorizontal() const noexcept -> int;
416  auto getScrollBarMaxVertical() const noexcept -> int;
417  void recalculateMaximumLineWidth();
418  void lazyConvert (FListBoxItems::iterator, std::size_t);
419  auto index2iterator (std::size_t) -> FListBoxItems::iterator;
420  auto index2iterator (std::size_t index) const -> FListBoxItems::const_iterator;
421  void handleSelectionChange (const std::size_t);
422  void handleXOffsetChange (const int);
423  void handleVerticalScrollBarUpdate (const FScrollbar::ScrollType, const int) const;
424  void handleHorizontalScrollBarUpdate (const FScrollbar::ScrollType, const int) const;
425  auto getVerticalScrollDistance (const FScrollbar::ScrollType) const -> int;
426  auto getHorizontalScrollDistance (const FScrollbar::ScrollType) const -> int;
427 
428  // Callback methods
429  void cb_vbarChange (const FWidget*);
430  void cb_hbarChange (const FWidget*);
431 
432  // Function Pointer
433  LazyInsert lazy_inserter{};
434 
435  // Data members
436  std::size_t nf_offset{0};
437  std::size_t max_line_width{0};
438  ListBoxData data{};
439  ScrollingState scroll{};
440  SelectionState selection{};
441  ConvertType conv_type{ConvertType::None};
442  DragScrollMode drag_scroll{DragScrollMode::None};
443 };
444 
445 // non-member function
446 //----------------------------------------------------------------------
447 namespace flistboxhelper
448 {
449 
450 template <typename Container>
451 constexpr auto getContainer(FDataAccess* container) -> clean_fdata_t<Container>&
452 {
453  return static_cast<FData<clean_fdata_t<Container>>&>(*container).get();
454 }
455 
456 } // namespace flistboxhelper
457 
458 // FListBox inline functions
459 //----------------------------------------------------------------------
460 template <typename Iterator
461  , typename InsertConverter>
462 inline FListBox::FListBox ( Iterator first
463  , Iterator last
464  , InsertConverter convert
465  , FWidget* parent )
466  : FWidget{parent}
467 {
468  init();
469 
470  while ( first != last )
471  {
472  insert(convert(first), BracketType::None, false, &(*first));
473  ++first;
474  }
475 }
476 
477 //----------------------------------------------------------------------
478 template <typename Container
479  , typename LazyConverter>
480 inline FListBox::FListBox ( Container container
481  , LazyConverter&& convert
482  , FWidget* parent )
483  : FWidget{parent}
484 {
485  init();
486  insert (container, std::forward<LazyConverter>(convert));
487 }
488 
489 //----------------------------------------------------------------------
490 inline auto FListBox::getClassName() const -> FString
491 { return "FListBox"; }
492 
493 //----------------------------------------------------------------------
494 inline auto FListBox::getCount() const -> std::size_t
495 { return data.itemlist.size(); }
496 
497 //----------------------------------------------------------------------
498 inline auto FListBox::getItem (std::size_t index) & -> FListBoxItem&
499 {
500  auto iter = index2iterator(index - 1);
501  return *iter;
502 }
503 
504 //----------------------------------------------------------------------
505 inline auto FListBox::getItem (std::size_t index) const & -> const FListBoxItem&
506 {
507  auto iter = index2iterator(index - 1);
508  return *iter;
509 }
510 
511 //----------------------------------------------------------------------
512 inline auto FListBox::getItem (FListBoxItems::iterator iter) & -> FListBoxItem&
513 { return *iter; }
514 
515 //----------------------------------------------------------------------
516 inline auto FListBox::getItem (FListBoxItems::const_iterator iter) const & -> const FListBoxItem&
517 { return *iter; }
518 
519 //----------------------------------------------------------------------
520 inline auto FListBox::currentItem() const noexcept -> std::size_t
521 { return selection.current; }
522 
523 //----------------------------------------------------------------------
524 inline auto FListBox::getData() & -> FListBoxItems&
525 { return data.itemlist; }
526 
527 //----------------------------------------------------------------------
528 inline auto FListBox::getData() const & -> const FListBoxItems&
529 { return data.itemlist; }
530 
531 //----------------------------------------------------------------------
532 inline auto FListBox::getText() & -> FString&
533 { return data.text; }
534 
535 //----------------------------------------------------------------------
536 inline void FListBox::selectItem (std::size_t index)
537 { index2iterator(index - 1)->selected = true; }
538 
539 //----------------------------------------------------------------------
540 inline void FListBox::selectItem (FListBoxItems::iterator iter) const
541 { iter->selected = true; }
542 
543 //----------------------------------------------------------------------
544 inline void FListBox::unselectItem (std::size_t index)
545 { index2iterator(index - 1)->selected = false; }
546 
547 //----------------------------------------------------------------------
548 inline void FListBox::unselectItem (FListBoxItems::iterator iter) const
549 { iter->selected = false; }
550 
551 //----------------------------------------------------------------------
552 inline void FListBox::showNoBrackets (std::size_t index)
553 { index2iterator(index - 1)->brackets = BracketType::None; }
554 
555 //----------------------------------------------------------------------
556 inline void FListBox::showNoBrackets (FListBoxItems::iterator iter) const
557 { iter->brackets = BracketType::None; }
558 
559 //----------------------------------------------------------------------
560 inline void FListBox::setMultiSelection (bool enable)
561 { selection.multi_select = enable; }
562 
563 //----------------------------------------------------------------------
564 inline void FListBox::unsetMultiSelection()
565 { setMultiSelection(false); }
566 
567 //----------------------------------------------------------------------
568 inline void FListBox::setDisable()
569 { setEnable(false); }
570 
571 //----------------------------------------------------------------------
572 inline auto FListBox::isSelected (std::size_t index) const -> bool
573 { return index2iterator(index - 1)->selected; }
574 
575 //----------------------------------------------------------------------
576 inline auto FListBox::isSelected (FListBoxItems::iterator iter) const -> bool
577 { return iter->selected; }
578 
579 //----------------------------------------------------------------------
580 inline auto FListBox::isMultiSelection() const -> bool
581 { return selection.multi_select; }
582 
583 //----------------------------------------------------------------------
584 inline auto FListBox::hasBrackets(std::size_t index) const -> bool
585 { return index2iterator(index - 1)->brackets != BracketType::None; }
586 
587 //----------------------------------------------------------------------
588 inline auto FListBox::hasBrackets(FListBoxItems::iterator iter) const -> bool
589 { return iter->brackets != BracketType::None; }
590 
591 //----------------------------------------------------------------------
592 inline void FListBox::reserve (std::size_t new_cap)
593 { data.itemlist.reserve(new_cap); }
594 
595 //----------------------------------------------------------------------
596 template <typename Iterator
597  , typename InsertConverter>
598 inline void FListBox::insert ( Iterator first
599  , Iterator last
600  , const InsertConverter& convert )
601 {
602  conv_type = ConvertType::Direct;
603 
604  while ( first != last )
605  {
606  insert (convert(first), BracketType::None, false, &(*first));
607  ++first;
608  }
609 }
610 
611 //----------------------------------------------------------------------
612 template <typename Container
613  , typename LazyConverter>
614 void FListBox::insert (const Container& container, LazyConverter&& converter)
615 {
616  conv_type = ConvertType::Lazy;
617  data.source_container = makeFData(container);
618  lazy_inserter = std::forward<LazyConverter>(converter);
619  const std::size_t size = container.size();
620 
621  if ( size > 0 )
622  data.itemlist.resize(size);
623 
624  recalculateVerticalBar(size);
625 }
626 
627 //----------------------------------------------------------------------
628 template <typename Container
629  , typename LazyConverter>
630 void FListBox::insert (Container* container, LazyConverter&& converter)
631 {
632  insert (*container, std::forward<LazyConverter>(converter));
633 }
634 
635 //----------------------------------------------------------------------
636 template <typename T
637  , typename DT>
638 void FListBox::insert ( const std::initializer_list<T>& list
639  , BracketType b
640  , bool s
641  , DT&& d )
642 {
643  for (const auto& item : list)
644  {
645  FListBoxItem listItem (FString() << item, std::forward<DT>(d));
646  listItem.brackets = b;
647  listItem.selected = s;
648  insert (listItem);
649  }
650 }
651 
652 //----------------------------------------------------------------------
653 template <typename ItemT
654  , typename DT>
655 void FListBox::insert ( const ItemT& item
656  , BracketType b
657  , bool s
658  , DT&& d )
659 {
660  FListBoxItem listItem (FString() << item, std::forward<DT>(d));
661  listItem.brackets = b;
662  listItem.selected = s;
663  insert (listItem);
664 }
665 
666 //----------------------------------------------------------------------
667 inline auto FListBox::isHorizontallyScrollable() const -> bool
668 { return max_line_width + 1 >= getClientWidth(); }
669 
670 //----------------------------------------------------------------------
671 inline auto FListBox::isVerticallyScrollable() const -> bool
672 { return getCount() > getClientHeight(); }
673 
674 //----------------------------------------------------------------------
675 inline auto FListBox::isCurrentLine (int y) const -> bool
676 { return y + scroll.yoffset + 1 == int(selection.current); }
677 
678 //----------------------------------------------------------------------
679 inline auto FListBox::getMaxWidth() const -> std::size_t
680 { return getWidth() - nf_offset - 4; }
681 
682 //----------------------------------------------------------------------
683 inline auto \
684  FListBox::index2iterator (std::size_t index) -> FListBoxItems::iterator
685 {
686  auto iter = data.itemlist.begin();
687  using distance_type = FListBoxItems::difference_type;
688  std::advance (iter, distance_type(index));
689  return iter;
690 }
691 
692 //----------------------------------------------------------------------
693 inline auto \
694  FListBox::index2iterator (std::size_t index) const -> FListBoxItems::const_iterator
695 {
696  auto iter = data.itemlist.begin();
697  using distance_type = FListBoxItems::difference_type;
698  std::advance (iter, distance_type(index));
699  return iter;
700 }
701 
702 } // namespace finalcut
703 
704 #endif // FLISTBOX_H
Definition: fdata.h:130
Definition: fevent.h:196
Definition: fevent.h:144
Definition: flistbox.h:173
Definition: fevent.h:300
Definition: fevent.h:171
Definition: class_template.cpp:25
Definition: fpoint.h:50
Definition: fsize.h:55
Definition: flistbox.h:71
Definition: fstring.h:79
Definition: fdata.h:51
Definition: fwidget.h:129
Definition: fevent.h:124
Definition: ftypes.h:160