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 void replaceControlCodes();
132 auto getVisibleLines() -> std::size_t;
133 void resetVisibleLineCounter();
136 FStringList column_list{};
137 FDataAccessPtr data_pointer{};
139 std::size_t visible_lines{1};
140 bool expandable{
false};
141 bool is_expand{
false};
142 bool checkable{
false};
143 bool is_checked{
false};
153 template <
typename DT>
154 inline FListViewItem::FListViewItem (
const FStringList& cols
156 , iterator parent_iter )
159 , data_pointer{makeFData(std::forward<DT>(data))}
164 replaceControlCodes();
165 insert (
this, parent_iter);
169 inline auto FListViewItem::getClassName()
const ->
FString 170 {
return "FListViewItem"; }
173 inline auto FListViewItem::getColumnCount()
const -> uInt
174 {
return static_cast<uInt
>(column_list.size()); }
177 template <
typename DT>
178 inline auto FListViewItem::getData()
const -> clean_fdata_t<DT>&
184 template <
typename DT>
185 inline void FListViewItem::setData (DT&& data)
187 const auto data_obj = makeFData(std::forward<DT>(data));
188 data_pointer = data_obj;
192 inline void FListViewItem::setChecked (
bool checked)
193 { is_checked = checked; }
196 inline auto FListViewItem::isChecked()
const ->
bool 197 {
return is_checked; }
200 inline auto FListViewItem::isExpand()
const ->
bool 201 {
return is_expand; }
204 inline auto FListViewItem::isExpandable()
const ->
bool 205 {
return expandable; }
208 inline auto FListViewItem::isCheckable()
const ->
bool 209 {
return checkable; }
220 using FObjectList = std::vector<FObject*>;
221 using Iterator = FObjectList::iterator;
222 using IteratorStack = std::stack<Iterator>;
230 : iter_path{std::move(i.iter_path)}
232 , position{i.position}
245 auto operator * ()
const ->
FObject*&;
246 auto operator -> ()
const ->
FObject*;
251 return lhs.node == rhs.node;
257 return lhs.node != rhs.node;
261 ,
const Iterator& iter) ->
bool 263 return listview_iter.node == iter;
267 ,
const Iterator& iter) ->
bool 269 return listview_iter.node != iter;
273 auto getClassName()
const ->
FString;
274 auto getPosition() ->
int&;
277 void parentElement();
284 for (
int i = n; i > 0 ; i--)
285 tmp.nextElement(tmp.node);
294 for (
int i = n; i > 0 ; i--)
295 tmp.prevElement(tmp.node);
302 void nextElement (Iterator&);
303 void prevElement (Iterator&);
306 IteratorStack iter_path{};
314 inline auto FListViewIterator::operator * ()
const ->
FObject*&
318 inline auto FListViewIterator::operator -> ()
const ->
FObject*
322 inline auto FListViewIterator::getClassName()
const ->
FString 323 {
return "FListViewIterator"; }
326 inline auto FListViewIterator::getPosition() ->
int&
338 using FWidget::setGeometry;
339 using FListViewItems = std::vector<FListViewItem*>;
360 auto getClassName()
const ->
FString override;
361 auto getCount()
const -> std::size_t;
362 auto getColumnCount()
const -> std::size_t;
363 auto getColumnAlignment (
int)
const -> Align;
364 auto getColumnText (
int)
const ->
FString;
365 auto getColumnSortType (
int)
const -> SortType;
366 auto getSortOrder()
const -> SortOrder;
367 auto getSortColumn()
const -> int;
371 void setSize (
const FSize&,
bool =
true)
override;
373 ,
bool =
true )
override;
374 void setColumnAlignment (
int, Align);
375 void setColumnText (
int,
const FString&);
376 void setColumnSortType (
int, SortType = SortType::Name);
377 void setColumnSort (
int, SortOrder = SortOrder::Ascending);
378 template <
typename Compare>
379 void setUserAscendingCompare (Compare);
380 template <
typename Compare>
381 void setUserDescendingCompare (Compare);
382 void hideSortIndicator (
bool =
true);
383 void showColumn (
int);
384 void hideColumn (
int);
385 void setTreeView (
bool =
true);
386 void unsetTreeView();
389 auto isColumnHidden (
int)
const -> bool;
392 virtual auto addColumn (
const FString&,
int = USE_MAX_SIZE) -> int;
393 virtual auto removeColumn (
int) -> int;
394 void removeAllColumns();
395 void hide()
override;
398 template <
typename DT = std::
nullptr_t>
399 auto insert (
const FStringList&, DT&& = DT()) -> iterator;
400 auto insert (
const FStringList&, iterator) -> iterator;
401 template <
typename DT>
402 auto insert (
const FStringList&, DT&&, iterator) -> iterator;
404 ,
typename DT = std::nullptr_t>
405 auto insert (
const std::initializer_list<T>&, DT&& = DT()) -> iterator;
406 template <
typename T>
407 auto insert (
const std::initializer_list<T>&, iterator) -> iterator;
410 auto insert (
const std::initializer_list<T>&, DT&&, iterator) -> iterator;
411 template <
typename ColT
412 ,
typename DT = std::nullptr_t>
413 auto insert (
const std::vector<ColT>&, DT&& = DT()) -> iterator;
414 template <
typename ColT>
415 auto insert (
const std::vector<ColT>&, iterator) -> iterator;
416 template <
typename ColT
418 auto insert (
const std::vector<ColT>&, DT&&, iterator) -> iterator;
421 auto getData() & -> FListViewItems&;
422 auto getData()
const & ->
const FListViewItems&;
438 void initLayout()
override;
439 void adjustViewport (
const int);
440 void adjustScrollbars (
const std::size_t)
const;
441 void adjustSize()
override;
447 using KeyMap = std::unordered_map<FKey, std::function<void()>,
EnumHash<FKey>>;
448 using KeyMapResult = std::unordered_map<FKey, std::function<bool()>, EnumHash<FKey>>;
449 using HeaderItems = std::vector<Header>;
450 using SortTypes = std::vector<SortType>;
455 FObjectList selflist{};
456 FObjectList itemlist{};
460 KeyMapResult key_map_result{};
463 struct SelectionState
467 FPoint clicked_expander_pos{-1, -1};
468 FPoint clicked_header_pos{-1, -1};
475 SortOrder order{SortOrder::Unsorted};
476 bool hide_sort_indicator{
false};
479 struct ScrollingState
481 FScrollbarPtr vbar{
nullptr};
482 FScrollbarPtr hbar{
nullptr};
485 int first_line_position_before{-1};
493 static constexpr std::size_t checkbox_space = 4;
496 static constexpr
int USE_MAX_SIZE = -1;
499 static auto getNullIterator() -> iterator&;
502 static void setNullIterator (
const iterator&);
505 auto isHorizontallyScrollable()
const -> bool;
506 auto isVerticallyScrollable()
const -> bool;
507 auto canSkipListDrawing()
const -> bool;
508 auto canSkipDragScrolling() -> bool;
512 void mapKeyFunctions();
514 template <
typename Compare>
516 auto getAlignOffset (
const Align
518 ,
const std::size_t )
const -> std::size_t;
520 void draw()
override;
521 void drawBorder()
override;
522 void drawScrollbars()
const;
523 void drawHeadlines();
526 void finalizeListDrawing (
int);
527 void adjustWidthForTreeView (std::size_t&, std::size_t,
bool)
const;
530 void printColumnsString (
FString&);
532 void setLineAttributes (
bool,
bool)
const;
535 void drawSortIndicator (std::size_t&, std::size_t);
536 void drawHeadlineLabel (
const HeaderItems::const_iterator&);
537 void drawHeaderBorder (std::size_t);
538 auto findHeaderStartPos (
bool&) -> FVTermBuffer::iterator;
539 auto findHeaderEndPos (FVTermBuffer::iterator,
bool,
bool&) -> FVTermBuffer::iterator;
540 void drawBufferedHeadline();
541 void drawColumnEllipsis (
const HeaderItems::const_iterator&
544 void updateDrawing (
bool,
bool);
547 void afterInsertion();
550 void updateListAfterRemoval();
551 void recalculateHorizontalBar (std::size_t);
552 void recalculateVerticalBar (std::size_t)
const;
553 void mouseHeaderClicked();
557 void wheelDown (
int);
558 void wheelLeft (
int);
559 void wheelRight (
int);
560 auto dragScrollUp (
int) -> bool;
561 auto dragScrollDown (
int) -> bool;
562 void dragUp (MouseButton);
563 void dragDown (MouseButton);
564 void stopDragScroll();
567 auto isCheckboxClicked (
int,
int)
const -> bool;
568 void resetClickedPositions();
569 auto isWithinHeaderBounds (
const FPoint&)
const -> bool;
570 auto isWithinListBounds (
const FPoint&)
const -> bool;
573 void processClick()
const;
574 void processRowChanged()
const;
575 void processChanged()
const;
576 void changeOnResize()
const;
577 void toggleCheckbox();
578 void collapseAndScrollLeft();
580 void expandAndScrollRight();
583 auto expandSubtree() -> bool;
584 auto collapseSubtree() -> bool;
585 void setRelativePosition (
int);
588 void stepForward (
int);
589 void stepBackward (
int);
590 void scrollToX (
int);
591 void scrollToY (
int);
592 void scrollTo (
const FPoint&);
593 void scrollTo (
int,
int);
594 void scrollBy (
int,
int);
595 auto isItemListEmpty()
const -> bool;
596 auto isTreeView()
const -> bool;
597 auto isColumnIndexInvalid (
int)
const -> bool;
598 auto hasCheckableItems()
const -> bool;
599 auto getScrollBarMaxHorizontal()
const noexcept -> int;
600 auto getScrollBarMaxVertical (
const std::size_t)
const noexcept -> int;
601 void updateViewAfterVBarChange (
const FScrollbar::ScrollType);
602 void updateViewAfterHBarChange (
const FScrollbar::ScrollType,
const int);
603 auto getVerticalScrollDistance (
const FScrollbar::ScrollType)
const -> int;
604 auto getHorizontalScrollDistance (
const FScrollbar::ScrollType)
const -> int;
607 void cb_vbarChange (
const FWidget*);
608 void cb_hbarChange (
const FWidget*);
611 std::size_t nf_offset{0};
612 std::size_t max_line_width{1};
613 bool tree_view{
false};
614 bool has_checkable_items{
false};
617 ScrollingState scroll{};
618 SelectionState selection{};
619 DragScrollMode drag_scroll{DragScrollMode::None};
622 bool (*user_defined_ascending) (
const FObject*,
const FObject*){
nullptr};
623 bool (*user_defined_descending) (
const FObject*,
const FObject*){
nullptr};
640 Align alignment{Align::Left};
642 bool fixed_width{
false};
649 inline auto FListView::getClassName()
const ->
FString 650 {
return "FListView"; }
653 inline auto FListView::getSortOrder()
const -> SortOrder
654 {
return sorting.order; }
657 inline auto FListView::getSortColumn()
const ->
int 658 {
return sorting.column; }
662 {
return static_cast<FListViewItem*
>(*selection.current_iter); }
665 template <
typename Compare>
666 inline void FListView::setUserAscendingCompare (Compare cmp)
667 { user_defined_ascending = cmp; }
670 template <
typename Compare>
671 inline void FListView::setUserDescendingCompare (Compare cmp)
672 { user_defined_descending = cmp; }
675 inline void FListView::hideSortIndicator (
bool hide)
676 { sorting.hide_sort_indicator = hide; }
679 inline void FListView::setTreeView (
bool enable)
680 { tree_view = enable; }
683 inline void FListView::unsetTreeView()
684 { setTreeView(
false); }
687 inline auto FListView::insert (
FListViewItem* item) -> FObject::iterator
688 {
return insert (item, data.root); }
691 template <
typename DT>
693 FListView::insert (
const FStringList& cols, DT&& d) -> FObject::iterator
694 {
return insert (cols, std::forward<DT>(d), data.root); }
698 FListView::insert (
const FStringList& cols
699 , iterator parent_iter ) -> FObject::iterator
700 {
return insert (cols,
nullptr, parent_iter); }
703 template <
typename DT>
704 inline auto FListView::insert (
const FStringList& cols
706 , iterator parent_iter ) -> FObject::iterator
710 if ( cols.empty() || parent_iter == getNullIterator() )
711 return getNullIterator();
713 if ( ! *parent_iter )
714 parent_iter = data.root;
718 item =
new FListViewItem (cols, std::forward<DT>(d), getNullIterator());
720 catch (
const std::bad_alloc&)
722 badAllocOutput (
"FListViewItem");
723 return getNullIterator();
726 item->replaceControlCodes();
727 return insert(item, parent_iter);
734 FListView::insert (
const std::initializer_list<T>& list, DT&& d) -> FObject::iterator
735 {
return insert (list, std::forward<DT>(d), data.root); }
738 template <
typename T>
740 FListView::insert (
const std::initializer_list<T>& list
741 , iterator parent_iter ) -> FObject::iterator
742 {
return insert (list, 0, parent_iter); }
747 auto FListView::insert (
const std::initializer_list<T>& list
749 , iterator parent_iter ) -> FObject::iterator
751 FStringList str_cols;
753 std::transform ( std::begin(list)
755 , std::back_inserter(str_cols)
756 , [] (
const auto& col)
763 auto item_iter = insert (str_cols, std::forward<DT>(d), parent_iter);
768 template <
typename ColT
771 FListView::insert (
const std::vector<ColT>& cols, DT&& d) -> FObject::iterator
772 {
return insert (cols, std::forward<DT>(d), data.root); }
775 template <
typename ColT>
777 FListView::insert (
const std::vector<ColT>& cols
778 , iterator parent_iter ) -> FObject::iterator
779 {
return insert (cols, 0, parent_iter); }
782 template <
typename ColT
785 FListView::insert (
const std::vector<ColT>& cols
787 , iterator parent_iter ) -> FObject::iterator
789 FStringList str_cols;
791 std::transform ( std::begin(cols)
793 , std::back_inserter(str_cols)
794 , [] (
const auto& col)
801 auto item_iter = insert (str_cols, std::forward<DT>(d), parent_iter);
806 inline auto FListView::getData() & -> FListViewItems&
808 FObjectList* ptr = &data.itemlist;
809 return *
static_cast<FListViewItems*
>(
static_cast<void*
>(ptr));
813 inline auto FListView::getData()
const & ->
const FListViewItems&
815 const FObjectList* ptr = &data.itemlist;
816 return *
static_cast<const FListViewItems*
>(
static_cast<const void*
>(ptr));
820 inline auto FListView::isHorizontallyScrollable()
const ->
bool 821 {
return max_line_width > getClientWidth(); }
824 inline auto FListView::isVerticallyScrollable()
const ->
bool 825 {
return getCount() > getClientHeight(); }
828 inline auto FListView::canSkipListDrawing()
const ->
bool 829 {
return isItemListEmpty() || getHeight() <= 2 || getWidth() <= 4; }
832 inline auto FListView::getColumnCount()
const -> std::size_t
833 {
return data.header.size(); }
836 inline void FListView::toggleItemCheckState (
FListViewItem* item)
const 837 { item->setChecked(! item->isChecked()); }
840 inline void FListView::scrollTo (
const FPoint& pos)
841 { scrollTo(pos.getX(), pos.getY()); }
844 inline auto FListView::isItemListEmpty()
const ->
bool 845 {
return data.itemlist.empty(); }
848 inline auto FListView::isTreeView()
const ->
bool 849 {
return tree_view; }
852 inline auto FListView::isColumnIndexInvalid (
int column)
const ->
bool 854 return column < 1 || data.header.empty() || column > int(data.header.size());
858 inline auto FListView::hasCheckableItems()
const ->
bool 859 {
return has_checkable_items; }
863 #endif // FLISTVIEW_H
Definition: flistview.h:216
Definition: flistview.h:334
Definition: fvtermbuffer.h:56
Definition: class_template.cpp:25
Definition: flistview.h:75