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