Export functionality for transaction list
[novacoin.git] / src / qt / csvmodelwriter.cpp
1 #include "csvmodelwriter.h"
2
3 #include <QAbstractItemModel>
4 #include <QFile>
5 #include <QTextStream>
6
7 CSVModelWriter::CSVModelWriter(const QString &filename, QObject *parent) :
8     QObject(parent),
9     filename(filename)
10 {
11 }
12
13 void CSVModelWriter::setModel(const QAbstractItemModel *model)
14 {
15     this->model = model;
16 }
17
18 void CSVModelWriter::addColumn(const QString &title, int column, int role)
19 {
20     Column col;
21     col.title = title;
22     col.column = column;
23     col.role = role;
24
25     columns.append(col);
26 }
27
28 static void writeValue(QTextStream &f, const QString &value)
29 {
30     // TODO: quoting if " or \n in string
31     f << "\"" << value << "\"";
32 }
33
34 static void writeSep(QTextStream &f)
35 {
36     f << ",";
37 }
38
39 static void writeNewline(QTextStream &f)
40 {
41     f << "\n";
42 }
43
44 bool CSVModelWriter::write()
45 {
46     QFile file(filename);
47     if(!file.open(QIODevice::WriteOnly | QIODevice::Text))
48         return false;
49     QTextStream out(&file);
50
51     int numRows = model->rowCount();
52
53     // Header row
54     for(int i=0; i<columns.size(); ++i)
55     {
56         if(i!=0)
57         {
58             writeSep(out);
59         }
60         writeValue(out, columns[i].title);
61     }
62     writeNewline(out);
63
64     // Data rows
65     for(int j=0; j<numRows; ++j)
66     {
67         for(int i=0; i<columns.size(); ++i)
68         {
69             if(i!=0)
70             {
71                 writeSep(out);
72             }
73             QVariant data = model->index(j, columns[i].column).data(columns[i].role);
74             writeValue(out, data.toString());
75         }
76         writeNewline(out);
77     }
78
79     file.close();
80
81     return file.error() == QFile::NoError;
82 }
83