3 #include <boost/tokenizer.hpp> 5 #include <Wt/WAbstractItemModel.h> 6 #include <Wt/WStandardItemModel.h> 7 #include <Wt/WStandardItem.h> 8 #include <Wt/WString.h> 17 virtual std::unique_ptr<WStandardItem>
clone()
const {
18 return std::unique_ptr<NumericItem>(cpp14::make_unique<NumericItem>());
21 virtual void setData(
const cpp17::any &
data,
int role = ItemDataRole::User) {
24 if (role == ItemDataRole::Edit) {
28 double d = std::strtod(s.c_str(), &end);
40 std::shared_ptr<WStandardItemModel>
csvToModel(
const std::string& csvFile,
41 bool firstLineIsHeaders)
43 std::ifstream f(csvFile.c_str());
46 std::shared_ptr<WStandardItemModel> result = std::make_shared<WStandardItemModel>(0, 0);
47 result->setItemPrototype(cpp14::make_unique<NumericItem>());
55 int numRows,
bool firstLineIsHeaders)
64 typedef boost::tokenizer<boost::escaped_list_separator<char> >
66 CsvTokenizer tok(line);
69 for (CsvTokenizer::iterator i = tok.begin();
70 i != tok.end(); ++i, ++col) {
72 if (col >= model->columnCount())
73 model->insertColumns(model->columnCount(),
74 col + 1 - model->columnCount());
76 if (firstLineIsHeaders && csvRow == 0)
77 model->setHeaderData(col, cpp17::any{
WString{*i}});
79 int dataRow = firstLineIsHeaders ? csvRow - 1 : csvRow;
81 if (numRows != -1 && dataRow >= numRows)
84 if (dataRow >= model->rowCount())
85 model->insertRows(model->rowCount(),
86 dataRow + 1 - model->rowCount());
89 model->setData(dataRow, col,
data);
virtual std::unique_ptr< WStandardItem > clone() const
virtual cpp17::any data(ItemDataRole role=ItemDataRole::User) const
virtual void setData(const cpp17::any &data, ItemDataRole role=ItemDataRole::User)
std::string toUTF8() const
void readFromCsv(std::istream &f, std::shared_ptr< WAbstractItemModel > model, int numRows, bool firstLineIsHeaders)
WString asString(const cpp17::any &v, const WString &formatString=WString())
std::shared_ptr< WStandardItemModel > csvToModel(const std::string &csvFile, bool firstLineIsHeaders)
WStandardItemModel * model() const
virtual void setData(const cpp17::any &data, int role=ItemDataRole::User)