Line data Source code
1 : // Copyright (c) 2011-2018 The Bitcoin Core developers 2 : // Distributed under the MIT software license, see the accompanying 3 : // file COPYING or http://www.opensource.org/licenses/mit-license.php. 4 : 5 : #include <qt/csvmodelwriter.h> 6 : 7 : #include <QAbstractItemModel> 8 : #include <QFile> 9 : #include <QTextStream> 10 : 11 0 : CSVModelWriter::CSVModelWriter(const QString &_filename, QObject *parent) : 12 0 : QObject(parent), 13 0 : filename(_filename), model(nullptr) 14 0 : { 15 0 : } 16 : 17 0 : void CSVModelWriter::setModel(const QAbstractItemModel *_model) 18 : { 19 0 : this->model = _model; 20 0 : } 21 : 22 0 : void CSVModelWriter::addColumn(const QString &title, int column, int role) 23 : { 24 0 : Column col; 25 0 : col.title = title; 26 0 : col.column = column; 27 0 : col.role = role; 28 : 29 0 : columns.append(col); 30 0 : } 31 : 32 0 : static void writeValue(QTextStream &f, const QString &value) 33 : { 34 0 : QString escaped = value; 35 0 : escaped.replace('"', "\"\""); 36 0 : f << "\"" << escaped << "\""; 37 0 : } 38 : 39 0 : static void writeSep(QTextStream &f) 40 : { 41 0 : f << ","; 42 0 : } 43 : 44 0 : static void writeNewline(QTextStream &f) 45 : { 46 0 : f << "\n"; 47 0 : } 48 : 49 0 : bool CSVModelWriter::write() 50 : { 51 0 : QFile file(filename); 52 0 : if(!file.open(QIODevice::WriteOnly | QIODevice::Text)) 53 0 : return false; 54 0 : QTextStream out(&file); 55 : 56 : int numRows = 0; 57 0 : if(model) 58 : { 59 0 : numRows = model->rowCount(); 60 0 : } 61 : 62 : // Header row 63 0 : for(int i=0; i<columns.size(); ++i) 64 : { 65 0 : if(i!=0) 66 : { 67 0 : writeSep(out); 68 : } 69 0 : writeValue(out, columns[i].title); 70 : } 71 0 : writeNewline(out); 72 : 73 : // Data rows 74 0 : for(int j=0; j<numRows; ++j) 75 : { 76 0 : for(int i=0; i<columns.size(); ++i) 77 : { 78 0 : if(i!=0) 79 : { 80 0 : writeSep(out); 81 : } 82 0 : QVariant data = model->index(j, columns[i].column).data(columns[i].role); 83 0 : writeValue(out, data.toString()); 84 0 : } 85 0 : writeNewline(out); 86 : } 87 : 88 0 : file.close(); 89 : 90 0 : return file.error() == QFile::NoError; 91 0 : }