1#include "MosaicController.h" 
    8#include <QFutureWatcher> 
    9#include <QGraphicsScene> 
   10#include <QGraphicsView> 
   11#include <QInputDialog> 
   14#include <QProgressBar> 
   17#include <QtConcurrentMap> 
   19#include "ControlNet.h" 
   21#include "DisplayProperties.h" 
   23#include "IException.h" 
   24#include "ImageFileListWidget.h" 
   25#include "ImageReader.h" 
   26#include "MosaicSceneWidget.h" 
   27#include "ProgressBar.h" 
   54    connect(m_imageReader, SIGNAL(imagesReady(
ImageList)), 
this, SLOT(imagesReady(
ImageList)));
 
   64    connect(m_scene, SIGNAL(projectionChanged(
Projection *)),
 
   65            m_worldScene, SLOT(setProjection(
Projection *)));
 
   66    connect(m_scene, SIGNAL(visibleRectChanged(QRectF)),
 
   67            m_worldScene, SLOT(setOutlineRect(QRectF)));
 
   69    settings.beginGroup(
"MosaicController");
 
   70    m_maxThreads = settings.value(
"maxThreads", 0).toInt();
 
   73    applyMaxThreadCount();
 
 
   92    QList<QAction *> exportActions = m_scene->getExportActions();
 
   94    foreach (
QAction * exportAct, exportActions) {
 
   95      fileMenu.addAction(exportAct);
 
   98    exportActions = m_fileList->getExportActions();
 
  100    foreach (
QAction * exportAct, exportActions) {
 
  101      fileMenu.addAction(exportAct);
 
 
  110    return m_imageReader->progress();
 
  114  void MosaicController::saveProject(QString projFileName) {
 
  117    PvlObject imageProps(
"Images");
 
  119    foreach (Image *image, m_images) {
 
  120      imageProps += image->toPvl();
 
  123    projFile += imageProps;
 
  124    projFile += m_fileList->toPvl();
 
  125    projFile += m_scene->toPvl();
 
  127    projFile.write(projFileName);
 
  131  QList<QAction *> MosaicController::getSettingsActions() {
 
  132    QList<QAction *> settingsActs;
 
  135    settingsActs.append(m_fileList->actions());
 
  138    connect(setThreads, SIGNAL(triggered(
bool)),
 
  139            this, SLOT(changeMaxThreads()));
 
  140    settingsActs.append(setThreads);
 
  146  void MosaicController::saveSettings(QSettings &settings) {
 
  147    settings.beginGroup(
"MosaicController");
 
  148    settings.setValue(
"maxThreads", m_maxThreads);
 
  158    m_imageReader->read(cubeNames);
 
 
  162  void MosaicController::openProjectImages(
PvlObject projectImages) {
 
  163    m_imageReader->read(projectImages);
 
  167  void MosaicController::imagesReady(ImageList images) {
 
  170    foreach (Image *image, images) {
 
  171      connect(image, SIGNAL(destroyed(
QObject *)),
 
  179    QMutexLocker lock(m_mutex);
 
  184    foreach (openImage, images) {
 
  185      openImage->closeCube();
 
  190  void MosaicController::changeMaxThreads() {
 
  196    options << tr(
"Use all available");
 
  198    for(
int i = 1; i < 24; i++) {
 
  199      QString option = tr(
"Use %1 threads").arg(i + 1);
 
  202      if(m_maxThreads == i + 1)
 
  206    QString res = QInputDialog::getItem(NULL, tr(
"Concurrency"),
 
  207        tr(
"Set the number of threads to use"),
 
  208        options, current, 
false, &ok);
 
  211      m_maxThreads = options.indexOf(res) + 1;
 
  213      applyMaxThreadCount();
 
  225      ImageList::iterator foundElement;
 
  226      foundElement = qFind(m_images.begin(), m_images.end(), image);
 
  227      m_images.
erase(foundElement);
 
  230        emit allImagesClosed();
 
 
  235  void MosaicController::readProject(QString filename) {
 
  237      Pvl projectPvl(filename);
 
  240      if (projectPvl.hasObject(
"Cubes")) {
 
  244      PvlObject &projImages(projectPvl.findObject(
"Images"));
 
  246      if (projectPvl.hasObject(
"MosaicScene"))
 
  247        m_scene->fromPvl(projectPvl.findObject(
"MosaicScene"));
 
  249      if (projectPvl.hasObject(
"ImageFileList"))
 
  250        m_fileList->fromPvl(projectPvl.findObject(
"ImageFileList"));
 
  252      openProjectImages(projImages);
 
  254    catch(IException &e) {
 
  256                       "Input file is not a valid qmos project", _FILEINFO_);
 
  261  void MosaicController::saveList() {
 
  263        QFileDialog::getSaveFileName((
QWidget *)parent(),
 
  264          "Choose output file",
 
  265          QDir::currentPath() + 
"/files.lis",
 
  266          QString(
"List File (*.lis);;Text File (*.txt);;All Files (*.*)"));
 
  267    if(output.isEmpty()) 
return;
 
  269    TextFile file(output, 
"output");
 
  272    foreach (image, m_images) {
 
  273      file.PutLine( image->fileName() );
 
  278  void MosaicController::applyMaxThreadCount() {
 
  279    if (m_maxThreads <= 1) {
 
  280      QThreadPool::globalInstance()->setMaxThreadCount(QThread::idealThreadCount());
 
  283      QThreadPool::globalInstance()->setMaxThreadCount(m_maxThreads - 1);
 
  302    QMap<QString, QString> imageFileToNewId;
 
  304    for (
int imgObjIndex = 0; imgObjIndex < images.
objects(); imgObjIndex++) {
 
  309      QBuffer idDataBuffer;
 
  310      idDataBuffer.open(QIODevice::ReadWrite);
 
  312      QDataStream idStream(&idDataBuffer);
 
  314      QUuid newId = QUuid::createUuid();
 
  315      QString fileName = image[
"FileName"][0];
 
  318      idDataBuffer.seek(0);
 
  321      image += 
PvlKeyword(
"ID", QString(idDataBuffer.data().toHex()));
 
  323      PvlKeyword oldDisplayPropsValues = image[
"Values"];
 
  326      PvlObject displayProps(
"DisplayProperties");
 
  332        OldDispPropUntransferred1, 
 
  335        OldDispPropShowLabel,
 
  336        OldDispPropShowOutline,
 
  337        OldDispPropUntransferred2, 
 
  338        OldDispPropUntransferred3  
 
  341      QMap<int, QVariant> oldProps;
 
  342      QByteArray oldHexValues(oldDisplayPropsValues[0].toLatin1());
 
  343      QDataStream oldValuesStream(QByteArray::fromHex(oldHexValues));
 
  344      oldValuesStream >> oldProps;
 
  348        V2DispPropShowDNs = 4,
 
  349        V2DispPropShowFill = 8,
 
  350        V2DispPropShowLabel = 16,
 
  351        V2DispPropShowOutline = 32
 
  354      QMap<int, QVariant> newProps;
 
  355      newProps[V2DispPropColor] = oldProps[OldDispPropColor];
 
  356      newProps[V2DispPropShowDNs] = oldProps[OldDispPropShowDNs];
 
  357      newProps[V2DispPropShowFill] = oldProps[OldDispPropShowFill];
 
  358      newProps[V2DispPropShowLabel] = oldProps[OldDispPropShowLabel];
 
  359      newProps[V2DispPropShowOutline] = oldProps[OldDispPropShowOutline];
 
  361      QBuffer newPropsDataBuffer;
 
  362      newPropsDataBuffer.open(QIODevice::ReadWrite);
 
  364      QDataStream newPropsStream(&newPropsDataBuffer);
 
  365      newPropsStream << newProps;
 
  366      newPropsDataBuffer.seek(0);
 
  368      displayProps += 
PvlKeyword(
"Values", newPropsDataBuffer.data().toHex().data());
 
  372      image += displayProps;
 
  374      imageFileToNewId[fileName] = newId.toString().replace(QRegExp(
"[{}]"), 
"");
 
  378    fileListOpts.setName(
"ImageFileList");
 
  380    for (
int fileListIndex = 0; fileListIndex < fileListOpts.objects(); fileListIndex++) {
 
  383      for (
int i = 0; i < fileListOrderObj.keywords(); i++) {
 
  388          key[0] = imageFileToNewId[key[0]];
 
  395    if (sceneOpts.hasObject(
"ZOrdering")) {
 
  399      for (
int i = 0; i < zOrdering.keywords(); i++) {
 
  403          key[0] = imageFileToNewId[key[0]];
 
 
File name manipulation and expansion.
 
@ Unknown
A type of error that cannot be classified as any of the other error types.
 
@ FootprintViewProperties
Every display property for footprint views, provided for convenience.
 
This represents a cube in a project-based GUI interface.
 
Internalizes a list of images and allows for operations on the entire list.
 
iterator erase(iterator pos)
Erases a single image from the image list.
 
void append(Image *const &value)
Appends an image to the image list.
 
void convertV1ToV2(Pvl &project)
This converts qmos project files (no other project files existed) from their original version (file n...
 
MosaicController(QStatusBar *status, QSettings &settings)
MosaicWidget constructor.
 
void openImages(QStringList filenames)
Handle opening cubes by filename.
 
void addExportActions(QMenu &fileMenu)
Add actions that are export-related to the menu.
 
void imageClosed(QObject *image)
An open image is being deleted.
 
void imagesAdded(ImageList images)
Emitted when new images are available.
 
virtual ~MosaicController()
Free the allocated memory by this object.
 
Base class for Map Projections.
 
void setName(const QString &name)
Set the name of the container.
 
void deleteKeyword(const QString &name)
Remove a specified keyword.
 
Container for cube-like labels.
 
A single keyword-value pair.
 
void setName(QString name)
Sets the keyword name.
 
bool isNamed(QString name) const
Determines whether two PvlKeywords have the same name or not.
 
Contains Pvl Groups and Pvl Objects.
 
PvlObjectIterator findObject(const QString &name, PvlObjectIterator beg, PvlObjectIterator end)
Find the index of object with a specified name, between two indexes.
 
int objects() const
Returns the number of objects.
 
PvlObject & object(const int index)
Return the object at the specified index.
 
This is free and unencumbered software released into the public domain.