Isis 3 Programmer Reference
ImageFileListWidget.cpp
1#include "ImageFileListWidget.h"
2
3#include <iostream>
4
5#include <QAction>
6#include <QApplication>
7#include <QContextMenuEvent>
8#include <QDebug>
9#include <QFileDialog>
10#include <QInputDialog>
11#include <QHBoxLayout>
12#include <QLabel>
13#include <QMenu>
14#include <QPoint>
15#include <QPushButton>
16#include <QScrollArea>
17#include <QSettings>
18#include <QSize>
19#include <QToolBar>
20#include <QVBoxLayout>
21#include <QXmlStreamWriter>
22
23#include "Directory.h"
24#include "FileName.h"
25#include "IException.h"
26#include "Image.h"
27#include "ImageTreeWidget.h"
28#include "ImageTreeWidgetItem.h"
29#include "IString.h"
30#include "ProgressBar.h"
31#include "Project.h"
32#include "PvlObject.h"
33#include "Shape.h"
34#include "TextFile.h"
35
36namespace Isis {
37
46 QWidget *parent) : QWidget(parent) {
47 QWidget *treeWidget = new QWidget();
48 m_directory = directory;
49 QHBoxLayout *layout = new QHBoxLayout();
50
51 m_tree = new ImageTreeWidget(directory);
52 m_tree->setObjectName("Tree");
53 layout->addWidget(m_tree);
54
55 layout->setContentsMargins(0, 0, 0, 0);
56
57 setWhatsThis("This is the image file list. Opened "
58 "cubes show up here. You can arrange your cubes into groups (that you "
59 "name) to help keep track of them. Also, you can configure multiple "
60 "files at once. Finally, you can sort your files by any of the visible "
61 "columns (use the view menu to show/hide columns of data).");
62
63 treeWidget->setLayout(layout);
64
66 m_progress->setVisible(false);
67
68 m_searchToolbar = new QToolBar("Search Tool", this);
69 m_searchToolbar->setObjectName("Search Tool");
70 m_searchToolbar->setWhatsThis("This contains all the fields for searching the active file list");
71
72 m_searchLineEdit = new QLineEdit();
73 QPushButton *okButton = new QPushButton("Search");
74 connect(okButton, SIGNAL(clicked()), this, SLOT(filterFileList()));
75 QPushButton *clearButton = new QPushButton("Clear");
76 connect(clearButton, SIGNAL(clicked()), this, SLOT(clear()));
77 QHBoxLayout *actionLayout = new QHBoxLayout();
78 m_fileCount = new QLabel("File Matches: 0");
79 actionLayout->addWidget(m_searchLineEdit);
80 actionLayout->addWidget(okButton);
81 actionLayout->addWidget(clearButton);
82 actionLayout->addWidget(m_fileCount);
83 actionLayout->addStretch(1);
84 actionLayout->setMargin(0);
85 QWidget *toolBarWidget = new QWidget;
86 toolBarWidget->setLayout(actionLayout);
87 m_searchToolbar->addWidget(toolBarWidget);
88 QVBoxLayout *fileListWidgetLayout = new QVBoxLayout();
89 fileListWidgetLayout->addWidget(m_searchToolbar);
90 fileListWidgetLayout->addWidget(treeWidget);
91 setLayout(fileListWidgetLayout);
92 }
93
101
110
119 if (pvl.name() == "ImageFileList") {
120 m_serialized.reset(new PvlObject(pvl));
121 ImageTreeWidgetItem::TreeColumn col =
122 ImageTreeWidgetItem::FootprintColumn;
123 while (col < ImageTreeWidgetItem::BlankColumn) {
124 IString key = ImageTreeWidgetItem::treeColumnToString(col) + "Visible";
125 key = key.Convert(" ", '_');
126
127 if (pvl.hasKeyword(key.ToQt())) {
128 bool visible = toBool(pvl[key.ToQt()][0]);
129
130 if (visible) {
131 m_tree->showColumn(col);
132 }
133 else {
134 m_tree->hideColumn(col);
135 }
136 }
137
138 col = (ImageTreeWidgetItem::TreeColumn)(col + 1);
139 }
140
141 m_tree->updateViewActs();
142 m_tree->sortItems(pvl["SortColumn"], Qt::AscendingOrder);
143
145
146 // Take all of the cubes out of the tree
147 while (m_tree->topLevelItemCount() > 0) {
148 QTreeWidgetItem *group = m_tree->takeTopLevelItem(0);
149 allCubes.append(group->takeChildren());
150
151 delete group;
152 group = NULL;
153 }
154
155 // Now re-build the tree items
156 for (int cubeGrp = 0; cubeGrp < pvl.objects(); cubeGrp ++) {
157 PvlObject &cubes = pvl.object(cubeGrp);
158
159 QTreeWidgetItem *newCubeGrp = m_tree->addGroup("", cubes.name());
160
161 if (cubes.hasKeyword("Expanded")) {
162 bool expanded = (cubes["Expanded"][0] != "No");
163 newCubeGrp->setExpanded(expanded);
164 }
165 }
166
167 if (allCubes.size()) {
168 m_tree->addGroup("", "Unknown")->addChildren(allCubes);
169 }
170 }
171 else {
172 throw IException(IException::Io, "Unable to read image file's "
173 "list widget settings from Pvl", _FILEINFO_);
174 }
175 }
176
183 PvlObject output("ImageFileList");
184
185 ImageTreeWidgetItem::TreeColumn col =
186 ImageTreeWidgetItem::FootprintColumn;
187 while (col < ImageTreeWidgetItem::BlankColumn) {
188 IString key = ImageTreeWidgetItem::treeColumnToString(col) + "Visible";
189 key = key.Convert(" ", '_');
190 bool visible = !m_tree->isColumnHidden(col);
191
192 output += PvlKeyword(key.ToQt(), toString((int)visible));
193 col = (ImageTreeWidgetItem::TreeColumn)(col + 1);
194 }
195
196 output += PvlKeyword("SortColumn", toString(m_tree->sortColumn()));
197
198 // Now store groups and the cubes that are in those groups
199 for (int i = 0; i < m_tree->topLevelItemCount(); i++) {
200 QTreeWidgetItem *group = m_tree->topLevelItem(i);
201 PvlObject cubeGroup(
202 group->text(ImageTreeWidgetItem::NameColumn));
203 cubeGroup += PvlKeyword("Expanded", group->isExpanded() ? "Yes" : "No");
204
205 for (int j = 0; j < group->childCount(); j++) {
206 QTreeWidgetItem *item = group->child(j);
207
208 if (item->type() == QTreeWidgetItem::UserType) {
209 ImageTreeWidgetItem *cubeItem = (ImageTreeWidgetItem *)item;
210
211 cubeGroup += PvlKeyword("Image", cubeItem->image()->id());
212 }
213 }
214
215 output += cubeGroup;
216 }
217
218 return output;
219 }
220
230 return m_tree->actions();
231 }
232
240 return m_tree->getViewActions();
241 }
242
250 QList<QAction *> exportActs;
251
252 QAction *saveList = new QAction(this);
253 saveList->setText(
254 "Save Entire Cube List (ordered by &file list/groups)...");
255 connect(saveList, SIGNAL(triggered()), this, SLOT(saveList()));
256
257 exportActs.append(saveList);
258
259 return exportActs;
260 }
261
268 QScrollArea *longHelpWidgetScrollArea = new QScrollArea;
269
270 QWidget *longHelpWidget = new QWidget;
271 longHelpWidgetScrollArea->setWidget(longHelpWidget);
272
273 QVBoxLayout *longHelpLayout = new QVBoxLayout;
274 longHelpLayout->setSizeConstraint(QLayout::SetFixedSize);
275 longHelpWidget->setLayout(longHelpLayout);
276
277 QLabel *title = new QLabel("<h2>Image File List</h2>");
278 longHelpLayout->addWidget(title);
279
280 QPixmap preview;
281 if (!fileListContainer) {
282// QWeakPointer<ImageFileListWidget> tmp = new ImageFileListWidget;
283// tmp.data()->resize(QSize(500, 200));
284// preview = tmp.data().grab();
285// delete tmp.data();
287 tmp->resize(QSize(500, 200));
288 preview = tmp->grab();
289 delete tmp;
290 }
291 else {
292 QPixmap previewPixmap = fileListContainer->grab().scaled(
293 QSize(500, 200), Qt::KeepAspectRatio, Qt::SmoothTransformation);
294
295 QLabel *previewWrapper = new QLabel;
296 previewWrapper->setPixmap(previewPixmap);
297 longHelpLayout->addWidget(previewWrapper);
298 }
299
300 QLabel *previewWrapper = new QLabel;
301 previewWrapper->setPixmap(preview);
302 longHelpLayout->addWidget(previewWrapper);
303
304 QLabel *overview = new QLabel(tr("The mosaic file list is designed to help "
305 "to organize your files within the %1 project. The file list supports changing multiple "
306 "files simultaneously using the right-click menus after selecting "
307 "several images or groups.<br>"
308 "<h3>Groups</h3>"
309 "<p>Every cube must be inside of a group. These groups can be "
310 "renamed by double clicking on them. To move a cube between groups, "
311 "click and drag it to the group you want it in. This works "
312 "for multiple cubes also. You can change all of the cubes in a "
313 "group by right clicking on the group name. You can add a group "
314 "by right clicking in the white space below the last cube or on "
315 "an existing group.</p>"
316 "<h3>Columns</h3>"
317 "Show and hide columns by using the view menu. These "
318 "columns show relevant data about the cube, including statistical "
319 "information. Some of this information will be blank if you do "
320 "not run the application, <i>camstats</i>, before opening the cube."
321 "<h3>Sorting</h3>"
322 "Sort cubes within each group in ascending or descending order "
323 "by clicking on the column "
324 "title of the column that you want to sort on. Clicking on the "
325 "title again will reverse the sorting order. You can also drag and "
326 "drop a cube between two other cubes to change where it is in the "
327 "list.").arg(QApplication::applicationName()));
328 overview->setWordWrap(true);
329
330 longHelpLayout->addWidget(overview);
331 longHelpLayout->addStretch();
332
333 return longHelpWidgetScrollArea;
334 }
335
342 m_progress->setText("Loading file list");
343 m_progress->setRange(0, images->size() - 1);
344 m_progress->setValue(0);
345 m_progress->setVisible(true);
346
347 QList<QTreeWidgetItem *> selected = m_tree->selectedItems();
348
349 ImageList alreadyViewedImages = m_tree->imagesInView();
350
351
352 // Expanded states are forgotten when removed from the tree; hence the bool.
354
355
356 // It's very slow to add/insertChild() on tree items when they are in the tree, so let's
357 // take them out of the tree, call add/insertChild() over and over, then give the
358 // groups (tree items) back to the tree. Expanded states are lost... so save/restore them
359 QVariant expandedStates = saveExpandedStates(m_tree->invisibleRootItem());
360 while (m_tree->topLevelItemCount()) {
361 groups.append(m_tree->takeTopLevelItem(0));
362 }
363
364 QTreeWidgetItem *selectedGroup = NULL;
365
366 foreach (Image *image, *images) {
367 if (alreadyViewedImages.indexOf(image) == -1) {
369
370 if (!m_serialized.isNull()) {
371 pos = find(image);
372 }
373
374 QTreeWidgetItem *newImageItem = m_tree->prepCube(images, image);
375
376 if (!pos.isValid()) {
377 if (m_tree->groupInList(selected)) {
378 QListIterator<QTreeWidgetItem *> it(selected);
379 while (it.hasNext() && !selectedGroup) {
380 QTreeWidgetItem *item = it.next();
381 if (item->data(0, Qt::UserRole).toInt() == ImageTreeWidget::ImageGroupType) {
382 selectedGroup = item;
383 }
384 }
385 }
386
387 if (!selectedGroup) {
388 QTreeWidgetItem *imageListNameItem = NULL;
389 QString groupName;
390
391 if (images->name().isEmpty()) {
392 imageListNameItem = m_tree->invisibleRootItem();
393 groupName = QString("Group %1").arg(groups.count() + 1);
394 }
395 else {
396 for (int i = 0; !imageListNameItem && i < groups.count(); i++) {
397 QTreeWidgetItem *group = groups[i];
398 if (group->data(0, Qt::UserRole).toInt() == ImageTreeWidget::ImageListNameType &&
399 group->text(0) == images->name()) {
400 imageListNameItem = group;
401 }
402 }
403
404 if (!imageListNameItem) {
405 imageListNameItem = m_tree->createImageListNameItem(images->name());
406 groups.append(imageListNameItem);
407 }
408 }
409
410 selectedGroup = m_tree->createGroup(imageListNameItem, groupName);
411 }
412
413 selectedGroup->addChild(newImageItem);
414 }
415 else {
416 QTreeWidgetItem *groupItem = groups[pos.group()];
417 if (groupItem->childCount() < pos.index())
418 groupItem->addChild(newImageItem);
419 else
420 groupItem->insertChild(pos.index(), newImageItem);
421 }
422 }
423
424 m_progress->setValue(m_progress->value() + 1);
425 }
426
427 foreach (QTreeWidgetItem *group, groups) {
428 m_tree->addTopLevelItem(group);
429 }
430 restoreExpandedStates(expandedStates, m_tree->invisibleRootItem());
431
432 if (selectedGroup)
433 selectedGroup->setSelected(true);
434
435 m_tree->refit();
436 m_progress->setVisible(false);
437 }
438
446 foreach (Image* image, *images) {
447
448 for (int i = 0; i < m_tree->topLevelItemCount(); i++) {
449 QTreeWidgetItem *group = m_tree->topLevelItem(i);
450
451 for (int j = 0; j < group->childCount(); j++) {
452 QTreeWidgetItem *item = group->child(j);
453
454 if (item->type() == QTreeWidgetItem::UserType && !item->isHidden()) {
455 ImageTreeWidgetItem *cubeItem = (ImageTreeWidgetItem *)item;
456 if (cubeItem->image() == image){
457 item->setHidden(true);
458 }
459 }
460 }
461 }
462 }
463 m_tree->repaint();
464 }
465
466
473 void ImageFileListWidget::contextMenuEvent(QContextMenuEvent *event) {
474 QMenu menu;
475
476 QList<QAction *> actions = m_tree->getViewActions();
477
478 foreach (QAction *act, actions) {
479 if (act) {
480 menu.addAction(act);
481 }
482 else {
483 menu.addSeparator();
484 }
485 }
486
487 menu.exec(event->globalPos());
488 }
489
494 QString output =
495 QFileDialog::getSaveFileName((QWidget *)parent(),
496 "Choose output file",
497 QDir::currentPath() + "/files.lis",
498 QString("List File (*.lis);;Text File (*.txt);;All Files (*.*)"));
499 if (output.isEmpty()) return;
500
501 TextFile file(output, "overwrite");
502
503 for (int i = 0; i < m_tree->topLevelItemCount(); i++) {
504 QTreeWidgetItem *group = m_tree->topLevelItem(i);
505
506 for (int j = 0; j < group->childCount(); j++) {
507 QTreeWidgetItem *item = group->child(j);
508
509 if (item->type() == QTreeWidgetItem::UserType) {
510 ImageTreeWidgetItem *cubeItem = (ImageTreeWidgetItem *)item;
511 file.PutLine(cubeItem->image()->fileName());
512 }
513 }
514 }
515 }
516
525 QString id = image->id();
526
528 for (int objIndex = 0; !result.isValid() && objIndex < m_serialized->objects(); objIndex++) {
529 PvlObject &obj = m_serialized->object(objIndex);
530
531 int imageKeyOffset = 0;
532 for (int fileKeyIndex = 0;
533 !result.isValid() && fileKeyIndex < obj.keywords();
534 fileKeyIndex++) {
535 PvlKeyword &key = obj[fileKeyIndex];
536
537 if (key.isNamed("Image")) {
538 if (key[0] == id) {
539 result = ImageTreeWidget::ImagePosition(objIndex, imageKeyOffset);
540 }
541 else {
542 imageKeyOffset++;
543 }
544 }
545 }
546 }
547
548 return result;
549 }
550
557 void ImageFileListWidget::restoreExpandedStates(QVariant expandedStates, QTreeWidgetItem *item) {
558 QMap<QString, QVariant> states = expandedStates.toMap();
559
560 if (states.contains("Expanded")) {
561 item->setExpanded(states["Expanded"].toBool());
562 }
563 else {
564 item->setExpanded(true);
565 }
566
567 QList<QVariant> childrenStates = states["Children"].toList();
568
569 int i = 0;
570 while (i < item->childCount() && i < childrenStates.count()) {
571 restoreExpandedStates(childrenStates[i], item->child(i));
572 i++;
573 }
574
575 while (i < item->childCount()) {
576 restoreExpandedStates(QVariant(), item->child(i));
577 i++;
578 }
579 }
580
590
591 result["Expanded"] = item->isExpanded();
592
593 if (item->childCount()) {
594 QList<QVariant> childrenStates;
595
596 for (int i = 0; i < item->childCount(); i++) {
597 childrenStates.append(saveExpandedStates(item->child(i)));
598 }
599
600 result["Children"] = childrenStates;
601 }
602
603 return result;
604 }
605
606
615 void ImageFileListWidget::save(QXmlStreamWriter &stream, Project *project,
616 FileName newProjectRoot) const {
617
618 stream.writeStartElement("imageFileList");
619 stream.writeAttribute("objectName", objectName());
620
621 // Write QSettings
622// stream.writeStartElement("widgetGeometry");
623// QString geom = saveGeometry();
624// //qDebug()<<"ImageFileListWidget::save geometry = "<<geom;
625// stream.writeAttribute("value", saveGeometry());
626// stream.writeEndElement();
627
628// stream.writeStartElement("geometry");
629// //qDebug()<<"ImageFileListWidget::save Geometry = "<<geometry();
630// //qDebug()<<"ImageFileListWidget::save saveGeometry = "<<saveGeometry();
631// stream.writeAttribute("x", QString::number(pos().x()));
632// stream.writeAttribute("y", QString::number(pos().y()));
633// stream.writeEndElement();
634//
635// stream.writeStartElement("position");
636// //qDebug()<<"ImageFileListWidget::save Position = "<<QVariant(pos()).toString();
637// stream.writeAttribute("x", QString::number(pos().x()));
638// stream.writeAttribute("y", QString::number(pos().y()));
639// stream.writeEndElement();
640//
641// stream.writeStartElement("size");
642// //qDebug()<<"ImageFileListWidget::save Size = "<<size();
643// stream.writeAttribute("width", QString::number(size().width()));
644// stream.writeAttribute("height", QString::number(size().height()));
645// stream.writeEndElement();
646// stream.writeEndElement();
647
648
649 ImageTreeWidgetItem::TreeColumn col =
650 ImageTreeWidgetItem::FootprintColumn;
651 while (col < ImageTreeWidgetItem::BlankColumn) {
652 bool visible = !m_tree->isColumnHidden(col);
653 bool sorted = (m_tree->sortColumn() == col);
654
655 stream.writeStartElement("column");
656 stream.writeAttribute("name", ImageTreeWidgetItem::treeColumnToString(col));
657 stream.writeAttribute("visible", (visible? "true" : "false"));
658 stream.writeAttribute("sorted", (sorted? "true" : "false"));
659 stream.writeEndElement();
660
661 col = (ImageTreeWidgetItem::TreeColumn)(col + 1);
662 }
663
664 // Now store groups and the cubes that are in those groups
665 save(stream, NULL);
666
667 stream.writeEndElement();
668 }
669
670
678 void ImageFileListWidget::save(QXmlStreamWriter &stream, QTreeWidgetItem *itemToWrite) const {
679 bool done = false;
680
681 // Start the element - image or group with attributes
682 if (!itemToWrite) {
683 stream.writeStartElement("treeLayout");
684 }
685 else if (itemToWrite->type() == QTreeWidgetItem::UserType) {
686 ImageTreeWidgetItem *imageItemToWrite = (ImageTreeWidgetItem *)itemToWrite;
687
688 stream.writeStartElement("image");
689 stream.writeAttribute("id", imageItemToWrite->image()->id());
690 }
691 else {
692 bool groupIsImageList =
693 (itemToWrite->data(0, Qt::UserRole).toInt() == ImageTreeWidget::ImageListNameType);
694
695 stream.writeStartElement("group");
696 stream.writeAttribute("name", itemToWrite->text(ImageTreeWidgetItem::NameColumn));
697 stream.writeAttribute("expanded", itemToWrite->isExpanded() ? "true" : "false");
698 stream.writeAttribute("isImageList", groupIsImageList? "true" : "false");
699 }
700
701 // Write any child XML elements (groups in groups)
702 int i = 0;
703 while (!done) {
704 QTreeWidgetItem *childItemToWrite = NULL;
705
706 if (itemToWrite == NULL && i < m_tree->topLevelItemCount()) {
707 childItemToWrite = m_tree->topLevelItem(i);
708 }
709 else if (itemToWrite != NULL && i < itemToWrite->childCount()) {
710 childItemToWrite = itemToWrite->child(i);
711 }
712
713 if (childItemToWrite) {
714 save(stream, childItemToWrite);
715 }
716
717 done = (childItemToWrite == NULL);
718 i++;
719 }
720
721 // Close the initial image or group element
722 stream.writeEndElement();
723 }
724
725
726 void ImageFileListWidget::filterFileList() {
727 QString filterString = m_searchLineEdit->text();
728 int numMatches = 0;
729
730 for (int i = 0; i < m_tree->topLevelItemCount(); i++) {
731 QTreeWidgetItem *group = m_tree->topLevelItem(i);
732
733 for (int j = 0; j < group->childCount(); j++) {
734 QTreeWidgetItem *item = group->child(j);
735 group->setSelected(false);
736 if (item->type() == QTreeWidgetItem::UserType) {
737
738 ImageTreeWidgetItem *cubeItem = (ImageTreeWidgetItem *)item;
739 if (cubeItem->image()->fileName().contains(filterString)){
740 cubeItem->setSelected(true);
741 m_tree->scrollToItem(cubeItem);
742 numMatches++;
743 }
744 else {
745 cubeItem->setSelected(false);
746 }
747 }
748 }
749 }
750 m_fileCount->setText("File Matches: " + QString::number(numMatches));
751 }
752
753
754 void ImageFileListWidget::clear() {
755 m_searchLineEdit->setText("");
756 m_fileCount->setText("File Matches: 0");
757
758 for (int i = 0; i < m_tree->topLevelItemCount(); i++) {
759 QTreeWidgetItem *group = m_tree->topLevelItem(i);
760
761 for (int j = 0; j < group->childCount(); j++) {
762 QTreeWidgetItem *item = group->child(j);
763 group->setSelected(false);
764 if (item->type() == QTreeWidgetItem::UserType) {
765 item->setSelected(false);
766 }
767 }
768 }
769 }
770}
File name manipulation and expansion.
Definition FileName.h:100
Isis exception class.
Definition IException.h:91
@ Io
A type of error that occurred when performing an actual I/O operation.
Definition IException.h:155
Adds specific functionality to C++ strings.
Definition IString.h:165
IString Convert(const std::string &listofchars, const char &to)
Returns the string with all occurrences of any character in the "from" argument converted to the "to"...
Definition IString.cpp:1196
QString ToQt() const
Retuns the object string as a QString.
Definition IString.cpp:869
QToolBar * m_searchToolbar
Tool bar for the FileList widget to search.
void restoreExpandedStates(QVariant expandedStates, QTreeWidgetItem *item)
This method returns the QTreeWidgetItem to it's expanded state.
virtual ~ImageFileListWidget()
Destructor.
void addImages(ImageList *images)
This method adds the new images to the tree.
QList< QAction * > actions()
This method calls ImageTreeWidget::actions() which sets up a QAction that sets a default for the file...
ImageTreeWidget::ImagePosition find(const Image *image) const
This method takes an image and finds it's position.
QPointer< ProgressBar > m_progress
The ProgressBar of the ImageFileListWidget Serialized (file) version of this object.
void saveList()
This method saves the list to the choosen output file.
QVariant saveExpandedStates(QTreeWidgetItem *item)
This method saves the the expanded state of item.
void removeImages(ImageList *images)
Removes an imagelist from the FileListWidget.
void contextMenuEvent(QContextMenuEvent *event)
This method takes an event and gets all of the FootprintColumns, adds them to the menu,...
PvlObject toPvl() const
This method writes the state of this class to a pvl.
static QWidget * getLongHelp(QWidget *fileListContainer=NULL)
This method creates a QWidget that displays a long help message explaining the tool.
QList< QAction * > getViewActions()
This method calls ImageTreeWidget::getViewActions() which returns a list of FootprintColumns.
ImageTreeWidget * m_tree
Tree item associated with this mosaic item.
ImageFileListWidget(Directory *directory=0, QWidget *parent=0)
Constructor.
Directory * m_directory
The directory of the project.
QProgressBar * getProgress()
This method returns the progress bar.
void fromPvl(PvlObject &pvl)
This method loads the state of this class from the pvl.
void save(QXmlStreamWriter &stream, Project *project, FileName newProjectRoot) const
This method saves the FootprintColumns in the project and the settings associated with every column.
QList< QAction * > getExportActions()
This method creates a new QAction which is connected and when triggered will save the cube list.
This represents a cube in a project-based GUI interface.
Definition Image.h:105
QString fileName() const
Get the file name of the cube that this image represents.
Definition Image.cpp:315
QString id() const
Get a unique, identifying string associated with this image.
Definition Image.cpp:420
Internalizes a list of images and allows for operations on the entire list.
Definition ImageList.h:53
QString name() const
Get the human-readable name of this image list.
The main project for ipce.
Definition Project.h:287
int keywords() const
Returns the number of keywords contained in the PvlContainer.
QString name() const
Returns the container name.
A single keyword-value pair.
Definition PvlKeyword.h:87
bool isNamed(QString name) const
Determines whether two PvlKeywords have the same name or not.
Definition PvlKeyword.h:115
Contains Pvl Groups and Pvl Objects.
Definition PvlObject.h:61
bool hasKeyword(const QString &kname, FindOptions opts) const
See if a keyword is in the current PvlObject, or deeper inside other PvlObjects and Pvlgroups within ...
int objects() const
Returns the number of objects.
Definition PvlObject.h:219
PvlObject & object(const int index)
Return the object at the specified index.
Provides access to sequential ASCII stream I/O.
Definition TextFile.h:38
void PutLine(const QString &line)
Writes string to file and appends a 'newline' string.
Definition TextFile.cpp:508
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.
Definition Apollo.h:16
QString toString(bool boolToConvert)
Global function to convert a boolean to a string.
Definition IString.cpp:211
int toInt(const QString &string)
Global function to convert from a string to an integer.
Definition IString.cpp:93
bool toBool(const QString &string)
Global function to convert from a string to a boolean.
Definition IString.cpp:38