1#include "ImageReader.h"
7#include <QFutureWatcher>
10#include <QProgressBar>
13#include <QtConcurrentMap>
16#include "IException.h"
21#include "ProgressBar.h"
39 m_cameraMutex = cameraMutex;
40 m_requireFootprints = requireFootprints;
47 connect(m_watcher, SIGNAL(resultReadyAt(
int)),
48 this, SLOT(imageReady(
int)));
49 connect(m_watcher, SIGNAL(finished()),
50 this, SLOT(mappedFinished()));
52 m_safeFileOpen =
false;
56 m_mappedRunning =
false;
70 m_watcher->waitForFinished();
87 if (!m_safeFileOpenAct) {
88 m_safeFileOpenAct =
new QAction(tr(
"&Safe File Open"),
this);
89 m_safeFileOpenAct->setCheckable(
true);
90 m_safeFileOpenAct->setChecked(m_safeFileOpen);
91 m_safeFileOpenAct->setWhatsThis(tr(
"This lowers the number of "
92 "simulataneously open files drastically in order to stay under the "
93 "operating system limit. Only use this if you are having trouble "
94 "loading large numbers of images."));
95 connect(m_safeFileOpenAct, SIGNAL(toggled(
bool)),
96 this, SLOT(setSafeFileOpen(
bool)));
99 results.append(m_safeFileOpenAct);
102 if (!m_openFilledAct) {
103 m_openFilledAct =
new QAction(tr(
"Default Images &Filled"),
this);
104 m_openFilledAct->setCheckable(
true);
105 m_openFilledAct->setChecked(m_openFilled);
106 m_openFilledAct->setWhatsThis(tr(
"When this is enabled, images will be overlayed with "
108 connect(m_openFilledAct, SIGNAL(toggled(
bool)),
109 this, SLOT(setOpenFilled(
bool)));
112 results.append(m_openFilledAct);
117 m_askAlphaAct =
new QAction(tr(
"Set Default &Transparency"),
this);
119 this, SLOT(askDefaultAlpha()));
129 QProgressBar *ImageReader::progress() {
133 void ImageReader::setQtVersion(
int qtVersion) {
134 m_qtVersion = qtVersion;
138 void ImageReader::askDefaultAlpha() {
140 int alpha = QInputDialog::getInt(NULL, tr(
"Transparency Value"),
141 tr(
"Set the default transparency value\n"
142 "Values are 0 (invisible) to 255 (solid)"),
143 m_defaultAlpha, 0, 255, 1, &ok);
146 m_defaultAlpha = alpha;
151 void ImageReader::read(PvlObject imagesObject) {
152 read(imagesObject.beginObject(), imagesObject.endObject());
160 read(cubeNames.begin(), cubeNames.end());
164 void ImageReader::setOpenFilled(
bool openFilled) {
165 m_openFilled = openFilled;
166 if (m_openFilledAct) {
167 m_openFilledAct->setChecked(m_openFilled);
172 void ImageReader::setSafeFileOpen(
bool safeFileOpen) {
173 m_safeFileOpen = safeFileOpen;
174 if (m_safeFileOpen) {
175 m_safeFileOpenAct->setChecked(m_safeFileOpen);
180 void ImageReader::initProgress() {
181 m_progress->setVisible(
false);
182 m_progress->setRange(0, 0);
183 m_progress->setValue(0);
187 void ImageReader::start() {
188 if (!m_backlog.isEmpty() && !m_mappedRunning) {
189 m_progress->setVisible(
true);
191 int maxOpenImages = m_safeFileOpen? 20 : 400;
192 QList<QVariant> culledBacklog = m_backlog.mid(0, maxOpenImages);
193 m_backlog = m_backlog.mid(maxOpenImages);
195 QFuture< Image * > images = QtConcurrent::mapped(
198 m_openFilled, m_defaultAlpha, m_qtVersion));
200 m_watcher->setFuture(images);
201 m_mappedRunning =
true;
206 void ImageReader::readSettings() {
208 FileName(
"$HOME/.Isis/" + QApplication::applicationName() +
"/Image Reader.config")
210 QSettings::NativeFormat);
212 m_safeFileOpen = settings.value(
"safeFileOpen", m_safeFileOpen).toBool();
213 m_openFilled = settings.value(
"openFilled", m_openFilled).toBool();
214 m_defaultAlpha = settings.value(
"defaultAlpha", m_defaultAlpha).toInt();
218 void ImageReader::writeSettings() {
220 FileName(
"$HOME/.Isis/" + QApplication::applicationName() +
"/Image Reader.config")
222 QSettings::NativeFormat);
224 settings.setValue(
"safeFileOpen", m_safeFileOpen);
225 settings.setValue(
"openFilled", m_openFilled);
226 settings.setValue(
"defaultAlpha", m_defaultAlpha);
230 void ImageReader::imageReady(
int index) {
231 m_progress->setValue(m_progress->value() + 1);
235 void ImageReader::mappedFinished() {
236 ImageList images(m_watcher->future().results());
241 foreach (Image *image, images) {
243 images.removeAll(image);
247 emit imagesReady(images);
249 m_mappedRunning =
false;
250 if (!m_backlog.isEmpty()) {
265 QMutex *cameraMutex,
bool requireFootprints,
QThread *targetThread,
bool openFilled,
266 int defaultAlpha,
int qtVersion) {
267 m_mutex = cameraMutex;
268 m_targetThread = targetThread;
269 m_openFilled = openFilled;
270 m_defaultAlpha = defaultAlpha;
271 m_requireFootprints = requireFootprints;
272 m_qtVersion = qtVersion;
284 const QVariant &imageData) {
285 Image *result = NULL;
289 if (imageData.canConvert<QString>()) {
290 fileName = imageData.value<QString>();
292 result =
new Image(FileName(fileName).expanded());
297 newColor.setAlpha(m_defaultAlpha);
301 else if (imageData.canConvert<PvlObject>()) {
302 PvlObject imageObj = imageData.value<PvlObject>();
303 fileName = ((IString)imageObj[
"FileName"][0]).ToQt();
304 result =
new Image(FileName(fileName).expanded());
305 PvlObject &displayProps = imageObj.findObject(
"DisplayProperties");
306 displayProps += PvlKeyword(
"QtVersion", QString::number(m_qtVersion));
310 if (m_requireFootprints) {
314 catch (IException &) {
319 result->moveToThread(m_targetThread);
321 catch(IException &e) {
QVariant getValue(int property) const
Get a property's associated data.
This is the GUI communication mechanism for cubes.
void setShowFill(bool)
Change the visibility of the fill area associated with this cube.
Property
This is a list of properties and actions that are possible.
@ ShowFill
True if the cube should show a fill area if possible (bool)
@ Color
The color of the cube, default randomized (QColor)
void setColor(QColor newColor)
Change the color associated with this cube.
This represents a cube in a project-based GUI interface.
void fromPvl(const PvlObject &pvl)
Read the image settings from a Pvl.
bool initFootprint(QMutex *cameraMutex)
Calculate a footprint for this image.
Converts from file name or project representation to Image *.
VariantToImageFunctor(QMutex *cameraMutex, bool requireFootprints, QThread *targetThread, bool openFilled, int defaultAlpha, int qtVersion)
Create a functor for converting from QVariant to an Image *.
Image * operator()(const QVariant &)
Read the QString filename and make an Image from it.
QPointer< QAction > m_askAlphaAct
Variant Internal Format: (QString|PvlObject).
ImageReader(QMutex *cameraMutex, bool requireFootprints=true, QObject *parent=NULL)
MosaicWidget constructor.
virtual ~ImageReader()
Free the allocated memory by this object.
This is free and unencumbered software released into the public domain.
This is free and unencumbered software released into the public domain.
This is free and unencumbered software released into the public domain.