From b3505af04011eeadebd24e722e718c5d32c18d49 Mon Sep 17 00:00:00 2001 From: Markus Gans Date: Fri, 19 May 2017 22:16:50 +0200 Subject: [PATCH] FListBox: Import of data from a container via "lazy conversion" during item print --- ChangeLog | 6 +++++- src/flistbox.cpp | 18 +++++++++--------- src/flistbox.h | 38 +++++++++++++++++++++++++++++++++++--- test/listbox.cpp | 37 +++++++++++++++++++++++++++++++++---- 4 files changed, 82 insertions(+), 17 deletions(-) diff --git a/ChangeLog b/ChangeLog index 83d102b6..cb51d116 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2017-05-19 Markus Gans + * FListBox: Import of data from a container via + "lazy conversion" during item print. + 2017-04-23 Markus Gans * Import of data from a standard container in FListBox is now possible @@ -7,7 +11,7 @@ 2017-04-17 Markus Gans * Speed up FString::setNumber() by using a decimal string lookup table - * FString allocates no new memory if the size in sufficient + * FString allocates no new memory if the size is sufficient 2017-04-15 Markus Gans * Fix unsigned integer underflow in FString::_insert() diff --git a/src/flistbox.cpp b/src/flistbox.cpp index 91466e1e..b9d79328 100644 --- a/src/flistbox.cpp +++ b/src/flistbox.cpp @@ -7,9 +7,6 @@ #include "fscrollbar.h" #include "fstatusbar.h" -// function pointer -FString& (*FListBox::getString)(FListBox::listBoxItems::iterator); - //---------------------------------------------------------------------- // class FListBoxItem @@ -71,7 +68,10 @@ FListBoxItem& FListBoxItem::operator = (const FListBoxItem& item) //---------------------------------------------------------------------- FListBox::FListBox (FWidget* parent) : FWidget(parent) + , convertToItem(0) , data() + , source_container(0) + , conv_type(FListBox::no_convert) , vbar(0) , hbar(0) , text() @@ -314,8 +314,8 @@ void FListBox::insert ( const FString& item , data_ptr d ) { FListBoxItem listItem (item, d); - listItem.brackets = b; - listItem.selected = s; + listItem.brackets = b; + listItem.selected = s; insert (listItem); } @@ -1459,7 +1459,7 @@ void FListBox::adjustSize() // private methods of FListBox //---------------------------------------------------------------------- -FString& FListBox::getString_FListBoxItem (listBoxItems::iterator iter) +inline FString& FListBox::getString (listBoxItems::iterator iter) { return iter->getText(); } @@ -1505,9 +1505,6 @@ void FListBox::init() setLeftPadding(1); setBottomPadding(1); setRightPadding(1 + nf_offset); - - // set the new getString function pointer - getString = &FListBox::getString_FListBoxItem; } //---------------------------------------------------------------------- @@ -1634,6 +1631,9 @@ void FListBox::drawList() bool isLineSelected = isSelected(iter); bool isCurrentLine = bool(y + uInt(yoffset) + 1 == uInt(current)); + if ( conv_type == lazy_convert && iter->getText().isNull() ) + convertToItem (*iter, source_container, int(y) + yoffset); + if ( isLineSelected ) { if ( isMonochron() ) diff --git a/src/flistbox.h b/src/flistbox.h index 8a26b1fb..75282a71 100644 --- a/src/flistbox.h +++ b/src/flistbox.h @@ -60,7 +60,6 @@ class FListBoxItem virtual FString& getText(); virtual FWidget::data_ptr getData() const; - protected: // Mutators void setText (const FString&); void setData (FWidget::data_ptr); @@ -162,6 +161,8 @@ class FListBox : public FWidget void hide(); template void insert (Iterator, Iterator, InsertConverter); + template + void insert (Container, LazyConverter); void insert (FListBoxItem); void insert ( const FString& , fc::brackets_type = fc::NoBrackets @@ -205,6 +206,13 @@ class FListBox : public FWidget scrollDownSelect = 4 }; + enum convert_type + { + no_convert = 0, + direct_convert = 1, + lazy_convert = 2 + }; + // Disable copy constructor FListBox (const FListBox&); @@ -212,8 +220,7 @@ class FListBox : public FWidget FListBox& operator = (const FListBox&); // Accessors - static FString& getString_FListBoxItem (listBoxItems::iterator); - static FString& (*getString)(listBoxItems::iterator); + static FString& getString (listBoxItems::iterator); // Methods void init(); @@ -225,8 +232,15 @@ class FListBox : public FWidget void processChanged(); listBoxItems::iterator index2iterator (int); + // Function Pointer + void (*convertToItem) ( FListBoxItem& + , FWidget::data_ptr + , int index ); + // Data Members listBoxItems data; + FWidget::data_ptr source_container; + convert_type conv_type; FScrollbar* vbar; FScrollbar* hbar; FString text; @@ -257,7 +271,10 @@ inline FListBox::FListBox ( Iterator first , InsertConverter convert , FWidget* parent ) : FWidget(parent) + , convertToItem(0) , data() + , source_container(0) + , conv_type(FListBox::no_convert) , vbar(0) , hbar(0) , text() @@ -395,6 +412,8 @@ inline void FListBox::insert ( Iterator first , Iterator last , InsertConverter convert ) { + conv_type = direct_convert; + while ( first != last ) { insert (convert(first), fc::NoBrackets, false, &(*first)); @@ -402,6 +421,19 @@ inline void FListBox::insert ( Iterator first } } +//---------------------------------------------------------------------- +template +void FListBox::insert (Container container, LazyConverter convert) +{ + conv_type = lazy_convert; + source_container = container; + convertToItem = convert; + size_t size = container->size(); + + if ( size > 0 ) + data.resize(size); +} + //---------------------------------------------------------------------- inline FListBox::listBoxItems::iterator FListBox::index2iterator (int index) { diff --git a/test/listbox.cpp b/test/listbox.cpp index 41202a4b..920d46a8 100644 --- a/test/listbox.cpp +++ b/test/listbox.cpp @@ -3,15 +3,31 @@ #include #include -#include "final.h" +#include "fapp.h" +#include "fdialog.h" +#include "flistbox.h" +#include "fmessagebox.h" + // Global application object static FString* temp_str = 0; // Function prototypes +void doubleToItem (FListBoxItem&, FWidget::data_ptr container, int index); FString& doubleToString (std::list::const_iterator iter); FString& mapToString (std::map::const_iterator iter); +// Lazy conversion import function +void doubleToItem (FListBoxItem& item, FWidget::data_ptr container, int index) +{ + typedef std::list* double_list_ptr; + double_list_ptr dbllist = static_cast(container); + std::list::iterator iter = dbllist->begin(); + std::advance (iter, index); + item.setText (FString().setNumber(*iter)); + item.setData (FWidget::data_ptr(&(*iter))); +} + // Import converter functions FString& doubleToString (std::list::const_iterator iter) { @@ -50,12 +66,16 @@ class Listbox : public FDialog // Callback methods void cb_exitApp (FWidget*, data_ptr); + + // Data Member + std::list* double_list; }; #pragma pack(pop) //---------------------------------------------------------------------- Listbox::Listbox (FWidget* parent) : FDialog(parent) + , double_list() { temp_str = new FString; @@ -72,12 +92,20 @@ Listbox::Listbox (FWidget* parent) list2->setGeometry(21, 1, 10, 10); list2->setText ("double"); - std::list double_list; + double_list = new std::list; for (double i=1; i<=15; i++) - double_list.push_back(2*i + (i/100)); + double_list->push_back(2*i + (i/100)); - list2->insert (double_list.begin(), double_list.end(), doubleToString); + // + // Import via lazy conversion on print + // + //list2->insert (double_list, doubleToItem); + + // + // Direct import of the complete list + // + list2->insert (double_list->begin(), double_list->end(), doubleToString); // listbox 3 std::map TLD; @@ -109,6 +137,7 @@ Listbox::Listbox (FWidget* parent) Listbox::~Listbox() { delete temp_str; + delete double_list; } //----------------------------------------------------------------------