Source code of the Treeview example

Browse below the source code for Wt's Treeview example.

  • treeview-dragdrop
    • class CsvUtil
      • CsvUtil.C
        • CsvUtil.h
        • class FolderView
          • TreeViewDragDrop.C
            • about.xml
              • styles.css
                • icons
                  • data
                  #include <fstream>

                  #include <boost/tokenizer.hpp>

                  #include <Wt/WAbstractItemModel.h>
                  #include <Wt/WStandardItemModel.h>
                  #include <Wt/WStandardItem.h>
                  #include <Wt/WString.h>

                  #include "CsvUtil.h"

                  /*
                  * A standard item which converts text edits to numbers
                  */
                  class NumericItem : public WStandardItem {
                  public:
                  virtual std::unique_ptr<WStandardItem> clone() const {
                  return std::unique_ptr<NumericItem>(std::make_unique<NumericItem>());
                  }

                  virtual void setData(const cpp17::any &data, ItemDataRole role = ItemDataRole::User) {
                  cpp17::any dt;

                  if (role == ItemDataRole::Edit) {
                  std::string s = asString(data).toUTF8();

                  char *end;
                  double d = std::strtod(s.c_str(), &end);
                  if (*end == 0)
                  dt = cpp17::any(d);
                  else
                  dt = data;
                  } else
                  dt = data;

                  WStandardItem::setData(dt, role);
                  }
                  };

                  std::shared_ptr<WStandardItemModel> csvToModel(const std::string& csvFile,
                  bool firstLineIsHeaders)
                  {
                  std::ifstream f(csvFile.c_str());

                  if (f) {
                  std::shared_ptr<WStandardItemModel> result = std::make_shared<WStandardItemModel>(0, 0);
                  result->setItemPrototype(std::make_unique<NumericItem>());
                  readFromCsv(f, result, -1, firstLineIsHeaders);
                  return result;
                  } else
                  return nullptr;
                  }

                  void readFromCsv(std::istream& f, std::shared_ptr<WAbstractItemModel> model,
                  int numRows, bool firstLineIsHeaders)
                  {
                  int csvRow = 0;

                  while (f) {
                  std::string line;
                  getline(f, line);

                  if (f) {
                  typedef boost::tokenizer<boost::escaped_list_separator<char> >
                  CsvTokenizer;
                  CsvTokenizer tok(line);

                  int col = 0;
                  for (CsvTokenizer::iterator i = tok.begin();
                  i != tok.end(); ++i, ++col) {

                  if (col >= model->columnCount())
                  model->insertColumns(model->columnCount(),
                  col + 1 - model->columnCount());

                  if (firstLineIsHeaders && csvRow == 0)
                  model->setHeaderData(col, cpp17::any{WString{*i}});
                  else {
                  int dataRow = firstLineIsHeaders ? csvRow - 1 : csvRow;

                  if (numRows != -1 && dataRow >= numRows)
                  return;

                  if (dataRow >= model->rowCount())
                  model->insertRows(model->rowCount(),
                  dataRow + 1 - model->rowCount());

                  cpp17::any data{WString{*i}};
                  model->setData(dataRow, col, data);
                  }
                  }
                  }

                  ++csvRow;
                  }
                  }