Mercurial > hg > svgui
comparison widgets/CSVExportDialog.cpp @ 1568:3943553b95b0 csv-export-dialog
Add CSV export dialog, + associated supporting changes
author | Chris Cannam |
---|---|
date | Tue, 14 Jan 2020 15:41:17 +0000 |
parents | |
children | 9cd77efef37c |
comparison
equal
deleted
inserted
replaced
1566:1f80a514ce29 | 1568:3943553b95b0 |
---|---|
1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ | |
2 | |
3 /* | |
4 Sonic Visualiser | |
5 An audio file viewer and annotation editor. | |
6 Centre for Digital Music, Queen Mary, University of London. | |
7 | |
8 This program is free software; you can redistribute it and/or | |
9 modify it under the terms of the GNU General Public License as | |
10 published by the Free Software Foundation; either version 2 of the | |
11 License, or (at your option) any later version. See the file | |
12 COPYING included with this distribution for more information. | |
13 */ | |
14 | |
15 #include "CSVExportDialog.h" | |
16 | |
17 #include "view/ViewManager.h" | |
18 | |
19 #include <QVBoxLayout> | |
20 #include <QGridLayout> | |
21 #include <QGroupBox> | |
22 #include <QLabel> | |
23 #include <QDialogButtonBox> | |
24 #include <QRadioButton> | |
25 #include <QButtonGroup> | |
26 #include <QCheckBox> | |
27 #include <QComboBox> | |
28 | |
29 #include <vector> | |
30 | |
31 using namespace std; | |
32 | |
33 //!!! todo: remember & re-apply last set of options chosen for this layer type | |
34 | |
35 CSVExportDialog::CSVExportDialog(Configuration config, QWidget *parent) : | |
36 QDialog(parent), | |
37 m_config(config) | |
38 { | |
39 setWindowTitle(tr("Export Layer")); | |
40 | |
41 QString intro = tr("Exporting layer \"%1\" to %2 file.") | |
42 .arg(config.layerName) | |
43 .arg(config.fileExtension.toUpper()); | |
44 | |
45 QVBoxLayout *vbox = new QVBoxLayout; | |
46 | |
47 QLabel *label = new QLabel(intro); | |
48 vbox->addWidget(label); | |
49 | |
50 int space = ViewManager::scalePixelSize(2); | |
51 | |
52 vbox->addSpacing(space); | |
53 | |
54 QGroupBox *rowColGroup = new QGroupBox(tr("Row and column options:")); | |
55 QGridLayout *rowColLayout = new QGridLayout; | |
56 rowColGroup->setLayout(rowColLayout); | |
57 | |
58 vector<pair<QString, QChar>> separators { | |
59 { tr("Comma"), ',' }, | |
60 { tr("Tab"), '\t' }, | |
61 { tr("Space"), ' ' }, | |
62 { tr("Pipe"), '|' }, | |
63 { tr("Slash"), '/' }, | |
64 { tr("Colon"), ':' } | |
65 }; | |
66 | |
67 QChar defaultSeparator = ','; | |
68 if (m_config.fileExtension != "csv") { | |
69 defaultSeparator = '\t'; | |
70 } | |
71 | |
72 rowColLayout->addWidget(new QLabel(tr("Column separator:"), 0, 0)); | |
73 m_separatorCombo = new QComboBox; | |
74 for (auto p: separators) { | |
75 if (p.second == '\t' || p.second == ' ') { | |
76 m_separatorCombo->addItem(p.first, p.second); | |
77 } else { | |
78 m_separatorCombo->addItem(tr("%1 '%2'").arg(p.first).arg(p.second), | |
79 p.second); | |
80 } | |
81 if (p.second == defaultSeparator) { | |
82 m_separatorCombo->setCurrentIndex(m_separatorCombo->count()-1); | |
83 } | |
84 } | |
85 m_separatorCombo->setEditable(false); | |
86 rowColLayout->addWidget(m_separatorCombo, 0, 1); | |
87 rowColLayout->setColumnStretch(2, 10); | |
88 | |
89 m_header = new QCheckBox | |
90 (tr("Include a header row before the data rows")); | |
91 m_timestamps = new QCheckBox | |
92 (tr("Include a timestamp column before the data columns")); | |
93 rowColLayout->addWidget(m_header, 1, 0, 1, 3); | |
94 rowColLayout->addWidget(m_timestamps, 2, 0, 1, 3); | |
95 | |
96 if (!m_config.isDense) { | |
97 m_timestamps->setChecked(true); | |
98 m_timestamps->setEnabled(false); | |
99 } | |
100 | |
101 vbox->addWidget(rowColGroup); | |
102 | |
103 vbox->addSpacing(space); | |
104 | |
105 QGroupBox *framesGroup = new QGroupBox | |
106 (tr("Timing format:")); | |
107 | |
108 m_seconds = new QRadioButton | |
109 (tr("Write times in seconds")); | |
110 m_frames = new QRadioButton | |
111 (tr("Write times in audio sample frames")); | |
112 m_seconds->setChecked(true); | |
113 | |
114 QVBoxLayout *framesLayout = new QVBoxLayout; | |
115 framesLayout->addWidget(m_seconds); | |
116 framesLayout->addWidget(m_frames); | |
117 framesGroup->setLayout(framesLayout); | |
118 vbox->addWidget(framesGroup); | |
119 | |
120 vbox->addSpacing(space); | |
121 | |
122 if (m_config.isDense) { | |
123 m_seconds->setEnabled(false); | |
124 m_frames->setEnabled(false); | |
125 } | |
126 | |
127 QGroupBox *rangeGroup = new QGroupBox | |
128 (tr("Range to export:")); | |
129 | |
130 QButtonGroup *selectionGroup = new QButtonGroup(rangeGroup); | |
131 QButtonGroup *viewGroup = new QButtonGroup(rangeGroup); | |
132 | |
133 m_selectionOnly = new QRadioButton | |
134 (tr("Export only the current selection")); | |
135 QRadioButton *fullDuration = new QRadioButton | |
136 (tr("Export the full duration of the model")); | |
137 | |
138 selectionGroup->addButton(m_selectionOnly); | |
139 selectionGroup->addButton(fullDuration); | |
140 | |
141 if (m_config.haveSelection) { | |
142 m_selectionOnly->setChecked(true); | |
143 } else { | |
144 m_selectionOnly->setEnabled(false); | |
145 fullDuration->setEnabled(false); | |
146 fullDuration->setChecked(true); | |
147 } | |
148 | |
149 QVBoxLayout *rangeLayout = new QVBoxLayout; | |
150 rangeLayout->addWidget(m_selectionOnly); | |
151 rangeLayout->addWidget(fullDuration); | |
152 | |
153 if (m_config.haveView && m_config.isDense) { | |
154 | |
155 m_viewOnly = new QRadioButton | |
156 (tr("Export only the height of the visible view")); | |
157 QRadioButton *fullHeight = new QRadioButton | |
158 (tr("Export the full height of the model")); | |
159 | |
160 viewGroup->addButton(m_viewOnly); | |
161 viewGroup->addButton(fullHeight); | |
162 | |
163 m_viewOnly->setChecked(true); | |
164 | |
165 rangeLayout->addSpacing(space); | |
166 | |
167 rangeLayout->addWidget(m_viewOnly); | |
168 rangeLayout->addWidget(fullHeight); | |
169 | |
170 } else { | |
171 m_viewOnly = nullptr; | |
172 } | |
173 | |
174 rangeGroup->setLayout(rangeLayout); | |
175 vbox->addWidget(rangeGroup); | |
176 | |
177 vbox->addSpacing(space); | |
178 | |
179 QDialogButtonBox *bb = new QDialogButtonBox(QDialogButtonBox::Ok | | |
180 QDialogButtonBox::Cancel); | |
181 vbox->addWidget(bb); | |
182 connect(bb, SIGNAL(accepted()), this, SLOT(accept())); | |
183 connect(bb, SIGNAL(rejected()), this, SLOT(reject())); | |
184 | |
185 connect(m_timestamps, SIGNAL(toggled(bool)), | |
186 this, SLOT(timestampsToggled(bool))); | |
187 | |
188 setLayout(vbox); | |
189 } | |
190 | |
191 void | |
192 CSVExportDialog::timestampsToggled(bool on) | |
193 { | |
194 m_seconds->setEnabled(on); | |
195 m_frames->setEnabled(on); | |
196 } | |
197 | |
198 QString | |
199 CSVExportDialog::getDelimiter() const | |
200 { | |
201 return m_separatorCombo->currentData().toChar(); | |
202 } | |
203 | |
204 bool | |
205 CSVExportDialog::shouldIncludeHeader() const | |
206 { | |
207 return m_header && m_header->isChecked(); | |
208 } | |
209 | |
210 bool | |
211 CSVExportDialog::shouldIncludeTimestamps() const | |
212 { | |
213 return m_timestamps && m_timestamps->isChecked(); | |
214 } | |
215 | |
216 bool | |
217 CSVExportDialog::shouldWriteTimeInFrames() const | |
218 { | |
219 return shouldIncludeTimestamps() && m_frames && m_frames->isChecked(); | |
220 } | |
221 | |
222 bool | |
223 CSVExportDialog::shouldConstrainToViewHeight() const | |
224 { | |
225 return m_viewOnly && m_viewOnly->isChecked(); | |
226 } | |
227 | |
228 bool | |
229 CSVExportDialog::shouldConstrainToSelection() const | |
230 { | |
231 return m_selectionOnly && m_selectionOnly->isChecked(); | |
232 } | |
233 |