Add selectable Qt GUI Styles
[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), model(0)
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     QString escaped = value;
31     escaped.replace('"', "\"\"");
32     f << "\"" << escaped << "\"";
33 }
34
35 static void writeSep(QTextStream &f)
36 {
37     f << ",";
38 }
39
40 static void writeNewline(QTextStream &f)
41 {
42     f << "\n";
43 }
44
45 bool CSVModelWriter::write()
46 {
47     QFile file(filename);
48     if(!file.open(QIODevice::WriteOnly | QIODevice::Text))
49         return false;
50     QTextStream out(&file);
51
52     int numRows = 0;
53     if(model)
54     {
55         numRows = model->rowCount();
56     }
57
58     // Header row
59     for(int i=0; i<columns.size(); ++i)
60     {
61         if(i!=0)
62         {
63             writeSep(out);
64         }
65         writeValue(out, columns[i].title);
66     }
67     writeNewline(out);
68
69     // Data rows
70     for(int j=0; j<numRows; ++j)
71     {
72         for(int i=0; i<columns.size(); ++i)
73         {
74             if(i!=0)
75             {
76                 writeSep(out);
77             }
78             QVariant data = model->index(j, columns[i].column).data(columns[i].role);
79             writeValue(out, data.toString());
80         }
81         writeNewline(out);
82     }
83
84     file.close();
85
86     return file.error() == QFile::NoError;
87 }
88