FListBox: Import of data from a container via "lazy conversion" during item print
This commit is contained in:
parent
ca7ba6ae7e
commit
b3505af040
|
@ -1,3 +1,7 @@
|
|||
2017-05-19 Markus Gans <guru.mail@muenster.de>
|
||||
* FListBox: Import of data from a container via
|
||||
"lazy conversion" during item print.
|
||||
|
||||
2017-04-23 Markus Gans <guru.mail@muenster.de>
|
||||
* Import of data from a standard container in FListBox
|
||||
is now possible
|
||||
|
@ -7,7 +11,7 @@
|
|||
2017-04-17 Markus Gans <guru.mail@muenster.de>
|
||||
* 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 <guru.mail@muenster.de>
|
||||
* Fix unsigned integer underflow in FString::_insert()
|
||||
|
|
|
@ -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()
|
||||
|
@ -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() )
|
||||
|
|
|
@ -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 <class Iterator, class InsertConverter>
|
||||
void insert (Iterator, Iterator, InsertConverter);
|
||||
template <class Container, class LazyConverter>
|
||||
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 <class Container, class LazyConverter>
|
||||
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)
|
||||
{
|
||||
|
|
|
@ -3,15 +3,31 @@
|
|||
#include <iostream>
|
||||
#include <fstream>
|
||||
|
||||
#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<double>::const_iterator iter);
|
||||
FString& mapToString (std::map<FString, FString>::const_iterator iter);
|
||||
|
||||
// Lazy conversion import function
|
||||
void doubleToItem (FListBoxItem& item, FWidget::data_ptr container, int index)
|
||||
{
|
||||
typedef std::list<double>* double_list_ptr;
|
||||
double_list_ptr dbllist = static_cast<double_list_ptr>(container);
|
||||
std::list<double>::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<double>::const_iterator iter)
|
||||
{
|
||||
|
@ -50,12 +66,16 @@ class Listbox : public FDialog
|
|||
|
||||
// Callback methods
|
||||
void cb_exitApp (FWidget*, data_ptr);
|
||||
|
||||
// Data Member
|
||||
std::list<double>* 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> double_list;
|
||||
double_list = new std::list<double>;
|
||||
|
||||
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<FString, FString> TLD;
|
||||
|
@ -109,6 +137,7 @@ Listbox::Listbox (FWidget* parent)
|
|||
Listbox::~Listbox()
|
||||
{
|
||||
delete temp_str;
|
||||
delete double_list;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
|
|
Loading…
Reference in New Issue