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
144 QList<QTreeWidgetItem *> allCubes;
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
229 QList<QAction *> ImageFileListWidget::actions() {
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.
353 QList<QTreeWidgetItem *> groups;
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
589 QMap<QString, QVariant> result;
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
A colored, grouped cube list.
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 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
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
PvlObject & object(const int index)
Return the object at the specified index.
Provides access to sequential ASCII stream I/O.
Definition TextFile.h:38
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
bool toBool(const QString &string)
Global function to convert from a string to a boolean.
Definition IString.cpp:38