Line data Source code
1 : // Copyright (c) 2011-2013 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 "csvmodelwriter.h"
6 :
7 : #include <QAbstractItemModel>
8 : #include <QFile>
9 : #include <QTextStream>
10 :
11 0 : CSVModelWriter::CSVModelWriter(const QString &filename, QObject *parent) :
12 : QObject(parent),
13 0 : filename(filename), model(0)
14 : {
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 : 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 : static void writeSep(QTextStream &f)
40 : {
41 0 : f << ",";
42 : }
43 :
44 : static void writeNewline(QTextStream &f)
45 : {
46 0 : f << "\n";
47 : }
48 :
49 0 : bool CSVModelWriter::write()
50 : {
51 0 : QFile file(filename);
52 0 : if(!file.open(QIODevice::WriteOnly | QIODevice::Text))
53 : return false;
54 0 : QTextStream out(&file);
55 :
56 0 : int numRows = 0;
57 0 : if(model)
58 : {
59 0 : numRows = model->rowCount();
60 : }
61 :
62 : // Header row
63 0 : for(int i=0; i<columns.size(); ++i)
64 : {
65 0 : if(i!=0)
66 : {
67 : writeSep(out);
68 : }
69 0 : writeValue(out, columns[i].title);
70 : }
71 : 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 : 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 : writeNewline(out);
86 : }
87 :
88 0 : file.close();
89 :
90 0 : return file.error() == QFile::NoError;
91 : }
|