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 This file copyright 2007 QMUL.
8
9 This program is free software; you can redistribute it and/or
10 modify it under the terms of the GNU General Public License as
11 published by the Free Software Foundation; either version 2 of the
12 License, or (at your option) any later version. See the file
13 COPYING included with this distribution for more information.
14 */
15
16 #include "ImageDialog.h"
17
18 #include <QLineEdit>
19 #include <QGridLayout>
20 #include <QLabel>
21 #include <QDialogButtonBox>
22 #include <QPushButton>
23 #include <QGroupBox>
24 #include <QDesktopWidget>
25 #include <QApplication>
26 #include <QUrl>
27 #include <QMessageBox>
28
29 #include "ProgressDialog.h"
30
31 #include "data/fileio/FileSource.h"
32 #include "InteractiveFileFinder.h"
33
34 #include <iostream>
35
ImageDialog(QString title,QString image,QString label,QWidget * parent)36 ImageDialog::ImageDialog(QString title,
37 QString image,
38 QString label,
39 QWidget *parent) :
40 QDialog(parent),
41 m_imagePreview(nullptr),
42 m_remoteFile(nullptr)
43 {
44 setWindowTitle(title);
45
46 QGridLayout *grid = new QGridLayout;
47 setLayout(grid);
48
49 QGroupBox *databox = new QGroupBox(tr("Image"));
50
51 QGridLayout *subgrid = new QGridLayout;
52 databox->setLayout(subgrid);
53
54 int row = 0;
55
56 subgrid->addWidget(new QLabel(tr("Label:")), row, 0);
57
58 m_labelEdit = new QLineEdit;
59 subgrid->addWidget(m_labelEdit, row, 1, 1, 2);
60
61 ++row;
62
63 subgrid->addWidget(new QLabel(tr("File or URL:")), row, 0);
64
65 m_imageEdit = new QLineEdit;
66 subgrid->addWidget(m_imageEdit, row, 1, 1, 1);
67
68 connect(m_imageEdit, SIGNAL(textEdited(const QString &)),
69 this, SLOT(imageEditEdited(const QString &)));
70 connect(m_imageEdit, SIGNAL(editingFinished()),
71 this, SLOT(imageEditEdited()));
72
73 QPushButton *browse = new QPushButton(tr("Browse..."));
74 connect(browse, SIGNAL(clicked()), this, SLOT(browseClicked()));
75 subgrid->addWidget(browse, row, 2, 1, 1);
76
77 ++row;
78
79 QGroupBox *previewbox = new QGroupBox(tr("Preview"));
80
81 subgrid = new QGridLayout;
82 previewbox->setLayout(subgrid);
83
84 m_imagePreview = new QLabel;
85 m_imagePreview->setAlignment(Qt::AlignCenter);
86 subgrid->addWidget(m_imagePreview, 0, 0);
87
88 m_imagePreview->setMinimumSize(QSize(100, 100));
89
90 QDesktopWidget *desktop = QApplication::desktop();
91 m_imagePreview->setMaximumSize(QSize((desktop->width() * 2) / 3,
92 (desktop->height() * 2) / 3));
93
94 grid->addWidget(databox, 0, 0);
95 grid->addWidget(previewbox, 1, 0);
96
97 grid->setRowStretch(1, 10);
98
99 QDialogButtonBox *bb = new QDialogButtonBox(QDialogButtonBox::Ok |
100 QDialogButtonBox::Cancel);
101 grid->addWidget(bb, 2, 0, 1, 1);
102 connect(bb, SIGNAL(accepted()), this, SLOT(accept()));
103 connect(bb, SIGNAL(rejected()), this, SLOT(reject()));
104
105 m_okButton = bb->button(QDialogButtonBox::Ok);
106 m_okButton->setEnabled(false);
107
108 if (image != "") setImage(image);
109 if (label != "") setLabel(label);
110 }
111
~ImageDialog()112 ImageDialog::~ImageDialog()
113 {
114 delete m_remoteFile;
115 }
116
117 QString
getImage()118 ImageDialog::getImage()
119 {
120 return m_loadedImageFile;
121 }
122
123 QPixmap
getPixmap()124 ImageDialog::getPixmap()
125 {
126 return m_loadedImage;
127 }
128
129 QString
getLabel()130 ImageDialog::getLabel()
131 {
132 return m_labelEdit->text();
133 }
134
135 void
setImage(QString image)136 ImageDialog::setImage(QString image)
137 {
138 m_imageEdit->setText(image);
139 updatePreview();
140 }
141
142 void
setLabel(QString label)143 ImageDialog::setLabel(QString label)
144 {
145 m_labelEdit->setText(label);
146 }
147
148 void
resizeEvent(QResizeEvent *)149 ImageDialog::resizeEvent(QResizeEvent *)
150 {
151 updatePreview();
152 }
153
154 void
imageEditEdited(const QString & s)155 ImageDialog::imageEditEdited(const QString &s)
156 {
157 if (s.startsWith("http:") || s.startsWith("ftp:")) {
158 return;
159 }
160 updatePreview();
161 }
162
163 void
imageEditEdited()164 ImageDialog::imageEditEdited()
165 {
166 updatePreview();
167 }
168
169 void
updatePreview()170 ImageDialog::updatePreview()
171 {
172 if (!m_imagePreview) return;
173
174 QString img = m_imageEdit->text();
175
176 m_okButton->setEnabled(img != "");
177
178 if (img != m_loadedImageFile) {
179
180 QString fileName = img;
181 delete m_remoteFile;
182 m_remoteFile = nullptr;
183
184 if (FileSource::isRemote(fileName)) {
185 QUrl url(fileName);
186 if (!FileSource::canHandleScheme(url)) {
187 QMessageBox::critical(this, tr("Unsupported scheme in URL"),
188 tr("The URL scheme \"%1\" is not supported")
189 .arg(url.scheme()));
190 } else {
191
192 ProgressDialog dialog(tr("Opening image URL..."), true, 2000);
193 m_remoteFile = new FileSource(url, &dialog);
194 m_remoteFile->waitForData();
195 if (!m_remoteFile->isOK()) {
196 QMessageBox::critical(this, tr("File download failed"),
197 tr("Failed to download URL \"%1\": %2")
198 .arg(url.toString()).arg(m_remoteFile->getErrorString()));
199 delete m_remoteFile;
200 m_remoteFile = nullptr;
201 } else {
202 fileName = m_remoteFile->getLocalFilename();
203 }
204 }
205 }
206
207 // cerr << "image filename: \"" << fileName << "\"" << endl;
208
209 m_loadedImage = QPixmap(fileName);
210 m_loadedImageFile = img;
211 }
212
213 QSize sz(m_imagePreview->size());
214 int m = m_imagePreview->margin() * 2;
215 sz -= QSize(m, m);
216
217 if (m_loadedImage.isNull()) {
218 m_imagePreview->setPixmap(QPixmap());
219 } else {
220 m_imagePreview->setPixmap(m_loadedImage.scaled
221 (sz,
222 Qt::KeepAspectRatio,
223 Qt::SmoothTransformation));
224 }
225 }
226
227 void
browseClicked()228 ImageDialog::browseClicked()
229 {
230 QString file =
231 InteractiveFileFinder::getInstance()->getOpenFileName(FileFinder::ImageFile);
232
233 if (file != "") {
234 setImage(file);
235 emit imageChanged(file);
236 }
237 }
238
239
240
241