46 #if !defined (USE_FINAL_H) && !defined (COMPILE_FINAL_CUT) 47 #error "Only <final/final.h> can be included directly." 53 #include <unordered_map> 57 #include "final/ftypes.h" 58 #include "final/fwidget.h" 59 #include "final/util/fdata.h" 60 #include "final/vterm/fvtermbuffer.h" 61 #include "final/widget/fscrollbar.h" 80 template <
typename DT>
93 auto getClassName()
const ->
FString override;
94 auto getColumnCount()
const -> uInt;
95 auto getSortColumn()
const -> int;
96 auto getText (
int)
const ->
FString;
97 template <
typename DT>
98 auto getData()
const -> clean_fdata_t<DT>&;
99 auto getDepth()
const -> uInt;
102 void setText (
int,
const FString&);
103 template <
typename DT>
105 void setCheckable (
bool =
true);
106 void setChecked (
bool =
true);
109 auto isChecked()
const -> bool;
110 auto isExpand()
const -> bool;
121 using FDataAccessPtr = std::shared_ptr<FDataAccess>;
124 auto isExpandable()
const -> bool;
125 auto isCheckable()
const -> bool;
128 template <
typename Compare>
131 auto getFListViewOwner()
const ->
FListView*;
132 void replaceControlCodes();
133 auto getVisibleLines() -> std::size_t;
134 void resetVisibleLineCounter();
137 FStringList column_list{};
138 FDataAccessPtr data_pointer{};
140 std::size_t visible_lines{1};
141 bool expandable{
false};
142 bool is_expand{
false};
143 bool checkable{
false};
144 bool is_checked{
false};
154 template <
typename DT>
155 inline FListViewItem::FListViewItem (
const FStringList& cols
157 , iterator parent_iter )
160 , data_pointer{makeFData(std::forward<DT>(data))}
165 replaceControlCodes();
166 insert (
this, parent_iter);
170 inline auto FListViewItem::getClassName()
const ->
FString 171 {
return "FListViewItem"; }
174 inline auto FListViewItem::getColumnCount()
const -> uInt
175 {
return static_cast<uInt
>(column_list.size()); }
178 template <
typename DT>
179 inline auto FListViewItem::getData()
const -> clean_fdata_t<DT>&
185 template <
typename DT>
186 inline void FListViewItem::setData (DT&& data)
188 auto data_obj = makeFData(std::forward<DT>(data));
189 data_pointer = std::move(data_obj);
193 inline void FListViewItem::setChecked (
bool checked)
194 { is_checked = checked; }
197 inline auto FListViewItem::isChecked()
const ->
bool 198 {
return is_checked; }
201 inline auto FListViewItem::isExpand()
const ->
bool 202 {
return is_expand; }
205 inline auto FListViewItem::isExpandable()
const ->
bool 206 {
return expandable; }
209 inline auto FListViewItem::isCheckable()
const ->
bool 210 {
return checkable; }
221 using FObjectList = std::vector<FObject*>;
222 using Iterator = FObjectList::iterator;
223 using IteratorStack = std::stack<Iterator>;
231 : iter_path{std::move(i.iter_path)}
233 , position{i.position}
246 auto operator * ()
const ->
FObject*&;
247 auto operator -> ()
const ->
FObject*;
252 return lhs.node == rhs.node;
258 return lhs.node != rhs.node;
262 ,
const Iterator& iter) ->
bool 264 return listview_iter.node == iter;
268 ,
const Iterator& iter) ->
bool 270 return listview_iter.node != iter;
274 auto getClassName()
const ->
FString;
275 auto getPosition() ->
int&;
278 void parentElement();
285 for (
int i = n; i > 0 ; i--)
286 tmp.nextElement(tmp.node);
295 for (
int i = n; i > 0 ; i--)
296 tmp.prevElement(tmp.node);
303 auto isRootLevel()
const noexcept ->
bool 305 return iter_path.empty();
309 void nextElement (Iterator&);
310 void prevElement (Iterator&);
313 IteratorStack iter_path{};
321 inline auto FListViewIterator::operator * ()
const ->
FObject*&
325 inline auto FListViewIterator::operator -> ()
const ->
FObject*
329 inline auto FListViewIterator::getClassName()
const ->
FString 330 {
return "FListViewIterator"; }
333 inline auto FListViewIterator::getPosition() ->
int&
345 using FWidget::setGeometry;
346 using FListViewItems = std::vector<FListViewItem*>;
367 auto getClassName()
const ->
FString override;
368 auto getCount()
const -> std::size_t;
369 auto getColumnCount()
const -> std::size_t;
370 auto getColumnAlignment (
int)
const -> Align;
371 auto getColumnText (
int)
const ->
FString;
372 auto getColumnSortType (
int)
const -> SortType;
373 auto getSortOrder()
const -> SortOrder;
374 auto getSortColumn()
const -> int;
378 void setSize (
const FSize&,
bool =
true)
override;
380 ,
bool =
true )
override;
381 void setColumnAlignment (
int, Align);
382 void setColumnText (
int,
const FString&);
383 void setColumnSortType (
int, SortType = SortType::Name);
384 void setColumnSort (
int, SortOrder = SortOrder::Ascending);
385 template <
typename Compare>
386 void setUserAscendingCompare (Compare);
387 template <
typename Compare>
388 void setUserDescendingCompare (Compare);
389 void hideSortIndicator (
bool =
true);
390 void showColumn (
int);
391 void hideColumn (
int);
392 void setTreeView (
bool =
true);
393 void unsetTreeView();
396 auto isColumnHidden (
int)
const -> bool;
399 virtual auto addColumn (
const FString&,
int = USE_MAX_SIZE) -> int;
400 virtual auto removeColumn (
int) -> int;
401 void removeAllColumns();
402 void hide()
override;
407 void stepForward (
int);
408 void stepBackward (
int);
411 template <
typename DT = std::
nullptr_t>
412 auto insert (
const FStringList&, DT&& = DT()) -> iterator;
413 auto insert (
const FStringList&, iterator) -> iterator;
414 template <
typename DT>
415 auto insert (
const FStringList&, DT&&, iterator) -> iterator;
417 ,
typename DT = std::nullptr_t>
418 auto insert (
const std::initializer_list<T>&, DT&& = DT()) -> iterator;
419 template <
typename T>
420 auto insert (
const std::initializer_list<T>&, iterator) -> iterator;
423 auto insert (
const std::initializer_list<T>&, DT&&, iterator) -> iterator;
424 template <
typename ColT
425 ,
typename DT = std::nullptr_t>
426 auto insert (
const std::vector<ColT>&, DT&& = DT()) -> iterator;
427 template <
typename ColT>
428 auto insert (
const std::vector<ColT>&, iterator) -> iterator;
429 template <
typename ColT
431 auto insert (
const std::vector<ColT>&, DT&&, iterator) -> iterator;
434 auto getData() & -> FListViewItems&;
435 auto getData()
const & ->
const FListViewItems&;
451 void initLayout()
override;
452 void adjustViewport (
const int);
453 void adjustScrollBars (
const std::size_t)
const;
454 void adjustSize()
override;
460 using KeyMap = std::unordered_map<FKey, std::function<void()>,
EnumHash<FKey>>;
461 using KeyMapResult = std::unordered_map<FKey, std::function<bool()>, EnumHash<FKey>>;
462 using HeaderItems = std::vector<Header>;
463 using SortTypes = std::vector<SortType>;
468 FObjectList selflist{};
469 FObjectList itemlist{};
473 KeyMapResult key_map_result{};
476 struct SelectionState
480 FPoint clicked_expander_pos{-1, -1};
481 FPoint clicked_header_pos{-1, -1};
488 SortOrder order{SortOrder::Unsorted};
489 bool hide_sort_indicator{
false};
492 struct ScrollingState
494 FScrollBarPtr vbar{
nullptr};
495 FScrollBarPtr hbar{
nullptr};
498 int first_line_position_before{-1};
506 static constexpr std::size_t checkbox_space = 4;
509 static constexpr
int USE_MAX_SIZE = -1;
512 auto getNullIterator() -> iterator;
515 static void setNullIterator (
const iterator&);
518 auto isHorizontallyScrollable()
const -> bool;
519 auto isVerticallyScrollable()
const -> bool;
520 auto canSkipListDrawing()
const -> bool;
521 auto canSkipDragScrolling() -> bool;
522 auto isLayoutInitialized()
const -> bool;
526 void mapKeyFunctions();
528 template <
typename Compare>
530 auto getAlignOffset (
const Align
532 ,
const std::size_t )
const -> std::size_t;
534 void draw()
override;
535 void drawBorder()
override;
536 void drawScrollBars()
const;
537 void drawHeadlines();
540 void finalizeListDrawing (
volatile int);
541 void adjustWidthForTreeView (std::size_t&, std::size_t,
bool)
const;
544 void printColumnsString (
FString&);
546 void setLineAttributes (
bool,
bool)
const;
549 void drawSortIndicator (std::size_t&, std::size_t);
550 void drawHeadlineLabel (
const HeaderItems::const_iterator&);
551 void drawHeaderBorder (std::size_t);
552 auto findHeaderStartPos (
bool&) -> FVTermBuffer::iterator;
553 auto findHeaderEndPos (FVTermBuffer::iterator,
bool,
bool&) -> FVTermBuffer::iterator;
554 void drawBufferedHeadline();
555 void drawColumnEllipsis (
const HeaderItems::const_iterator&
558 void updateDrawing (
bool,
bool);
561 void afterInsertion();
564 void updateListAfterRemoval();
565 void recalculateHorizontalBar (std::size_t);
566 void recalculateVerticalBar (std::size_t)
const;
567 void mouseHeaderClicked();
568 auto getHeaderClickWidth (
const Header&,
int)
const -> int;
569 auto isPositionWithinHeader (
int,
int,
int)
const -> bool;
570 void handleColumnSort (
int);
574 void wheelDown (
int);
575 void wheelLeft (
int);
576 void wheelRight (
int);
577 auto dragScrollUp (
int) -> bool;
578 auto dragScrollDown (
int) -> bool;
579 void dragUp (MouseButton);
580 void dragDown (MouseButton);
581 void stopDragScroll();
584 auto isCheckboxClicked (
int,
int)
const -> bool;
585 void resetClickedPositions();
586 auto isWithinHeaderBounds (
const FPoint&)
const -> bool;
587 auto isWithinListBounds (
const FPoint&)
const -> bool;
592 void processClick()
const;
593 void processRowChanged()
const;
594 void processChanged()
const;
595 void changeOnResize()
const;
596 void toggleCheckbox();
597 void collapseAndScrollLeft();
599 void expandAndScrollRight();
600 void firstPos_impl();
602 auto expandSubtree() -> bool;
603 auto collapseSubtree() -> bool;
604 void setRelativePosition (
int);
605 void stepForward_impl();
606 void stepBackward_impl();
607 void stepForward_impl (
int);
608 void stepBackward_impl (
int);
609 void scrollToX (
int);
610 void scrollToY (
int);
611 void scrollTo (
const FPoint&);
612 void scrollTo (
int,
int);
613 void scrollBy (
int,
int);
614 auto isItemListEmpty()
const -> bool;
615 auto isTreeView()
const -> bool;
616 auto isColumnIndexInvalid (
int)
const -> bool;
617 auto hasCheckableItems()
const -> bool;
618 auto getScrollBarMaxHorizontal()
const noexcept -> int;
619 auto getScrollBarMaxVertical (
const std::size_t)
const noexcept -> int;
620 void updateViewAfterVBarChange (
const FScrollBar::ScrollType);
621 void updateViewAfterHBarChange (
const FScrollBar::ScrollType,
const int);
622 auto getVerticalScrollDistance (
const FScrollBar::ScrollType)
const -> int;
623 auto getHorizontalScrollDistance (
const FScrollBar::ScrollType)
const -> int;
626 void cb_vbarChange (
const FWidget*);
627 void cb_hbarChange (
const FWidget*);
630 std::size_t nf_offset{0};
631 std::size_t max_line_width{1};
632 bool tree_view{
false};
633 bool has_checkable_items{
false};
636 ScrollingState scroll{};
637 SelectionState selection{};
638 DragScrollMode drag_scroll{DragScrollMode::None};
641 bool (*user_defined_ascending) (
const FObject*,
const FObject*){
nullptr};
642 bool (*user_defined_descending) (
const FObject*,
const FObject*){
nullptr};
660 Align alignment{Align::Left};
662 bool fixed_width{
false};
669 inline auto FListView::getClassName()
const ->
FString 670 {
return "FListView"; }
673 inline auto FListView::getSortOrder()
const -> SortOrder
674 {
return sorting.order; }
677 inline auto FListView::getSortColumn()
const ->
int 678 {
return sorting.column; }
682 {
return static_cast<FListViewItem*
>(*selection.current_iter); }
685 template <
typename Compare>
686 inline void FListView::setUserAscendingCompare (Compare cmp)
687 { user_defined_ascending = cmp; }
690 template <
typename Compare>
691 inline void FListView::setUserDescendingCompare (Compare cmp)
692 { user_defined_descending = cmp; }
695 inline void FListView::hideSortIndicator (
bool hide)
696 { sorting.hide_sort_indicator = hide; }
699 inline void FListView::setTreeView (
bool enable)
700 { tree_view = enable; }
703 inline void FListView::unsetTreeView()
704 { setTreeView(
false); }
707 inline auto FListView::insert (
FListViewItem* item) -> FObject::iterator
708 {
return insert (item, data.root); }
711 template <
typename DT>
713 FListView::insert (
const FStringList& cols, DT&& d) -> FObject::iterator
714 {
return insert (cols, std::forward<DT>(d), data.root); }
718 FListView::insert (
const FStringList& cols
719 , iterator parent_iter ) -> FObject::iterator
720 {
return insert (cols,
nullptr, parent_iter); }
723 template <
typename DT>
724 inline auto FListView::insert (
const FStringList& cols
726 , iterator parent_iter ) -> FObject::iterator
730 if ( cols.empty() || parent_iter == getNullIterator() )
731 return getNullIterator();
733 if ( ! *parent_iter )
734 parent_iter = data.root;
738 item =
new FListViewItem (cols, std::forward<DT>(d), getNullIterator());
740 catch (
const std::bad_alloc&)
742 badAllocOutput (
"FListViewItem");
743 return getNullIterator();
746 item->replaceControlCodes();
747 return insert(item, parent_iter);
754 FListView::insert (
const std::initializer_list<T>& list, DT&& d) -> FObject::iterator
755 {
return insert (list, std::forward<DT>(d), data.root); }
758 template <
typename T>
760 FListView::insert (
const std::initializer_list<T>& list
761 , iterator parent_iter ) -> FObject::iterator
762 {
return insert (list, 0, parent_iter); }
767 auto FListView::insert (
const std::initializer_list<T>& list
769 , iterator parent_iter ) -> FObject::iterator
771 FStringList str_cols;
773 std::transform ( std::begin(list)
775 , std::back_inserter(str_cols)
776 , [] (
const auto& col)
783 auto item_iter = insert (str_cols, std::forward<DT>(d), parent_iter);
788 template <
typename ColT
791 FListView::insert (
const std::vector<ColT>& cols, DT&& d) -> FObject::iterator
792 {
return insert (cols, std::forward<DT>(d), data.root); }
795 template <
typename ColT>
797 FListView::insert (
const std::vector<ColT>& cols
798 , iterator parent_iter ) -> FObject::iterator
799 {
return insert (cols, 0, parent_iter); }
802 template <
typename ColT
805 FListView::insert (
const std::vector<ColT>& cols
807 , iterator parent_iter ) -> FObject::iterator
809 FStringList str_cols;
811 std::transform ( std::begin(cols)
813 , std::back_inserter(str_cols)
814 , [] (
const auto& col)
821 auto item_iter = insert (str_cols, std::forward<DT>(d), parent_iter);
826 inline auto FListView::getData() & -> FListViewItems&
828 FObjectList* ptr = &data.itemlist;
829 return *
static_cast<FListViewItems*
>(
static_cast<void*
>(ptr));
833 inline auto FListView::getData()
const & ->
const FListViewItems&
835 const FObjectList* ptr = &data.itemlist;
836 return *
static_cast<const FListViewItems*
>(
static_cast<const void*
>(ptr));
840 inline auto FListView::isHorizontallyScrollable()
const ->
bool 841 {
return max_line_width > getClientWidth(); }
844 inline auto FListView::isVerticallyScrollable()
const ->
bool 845 {
return getCount() > getClientHeight(); }
848 inline auto FListView::canSkipListDrawing()
const ->
bool 850 const auto height = getHeight();
851 const auto width = getWidth();
852 return isItemListEmpty()
858 inline auto FListView::isLayoutInitialized()
const ->
bool 859 {
return getFlags().visibility.initialize_layout; }
862 inline auto FListView::getColumnCount()
const -> std::size_t
863 {
return data.header.size(); }
866 inline void FListView::toggleItemCheckState (
FListViewItem* item)
const 868 item->setChecked(! item->isChecked());
873 inline void FListView::scrollTo (
const FPoint& pos)
874 { scrollTo(pos.getX(), pos.getY()); }
877 inline auto FListView::isItemListEmpty()
const ->
bool 878 {
return data.itemlist.empty(); }
881 inline auto FListView::isTreeView()
const ->
bool 882 {
return tree_view; }
885 inline auto FListView::isColumnIndexInvalid (
int column)
const ->
bool 887 return column < 1 || data.header.empty() || column > int(data.header.size());
891 inline auto FListView::hasCheckableItems()
const ->
bool 892 {
return has_checkable_items; }
896 #endif // FLISTVIEW_H
Definition: flistview.h:217
Definition: flistview.h:341
Definition: fvtermbuffer.h:56
Definition: class_template.cpp:25
Definition: flistview.h:75