1 #include "ImageTreeWidget.h"     6 #include <QApplication>    10 #include <QProgressBar>    19 #include "ImageList.h"    20 #include "ImageTreeWidgetItem.h"    21 #include "ProgressBar.h"    33     m_queuedSelectionChanged = 
false;
    34     m_directory = directory;
    38     ImageTreeWidgetItem::TreeColumn col = ImageTreeWidgetItem::NameColumn;
    39     while(col < ImageTreeWidgetItem::BlankColumn) {
    40       header << ImageTreeWidgetItem::treeColumnToString(col);
    41       col = (ImageTreeWidgetItem::TreeColumn)(col + 1);
    44     setHeaderLabels(header);
    46     hideColumn(ImageTreeWidgetItem::ImageColumn);
    47     hideColumn(ImageTreeWidgetItem::LabelColumn);
    48     hideColumn(ImageTreeWidgetItem::ResolutionColumn);
    49     hideColumn(ImageTreeWidgetItem::EmissionAngleColumn);
    50     hideColumn(ImageTreeWidgetItem::IncidenceAngleColumn);
    51     hideColumn(ImageTreeWidgetItem::PhaseAngleColumn);
    52     hideColumn(ImageTreeWidgetItem::AspectRatioColumn);
    53     hideColumn(ImageTreeWidgetItem::SampleResolutionColumn);
    54     hideColumn(ImageTreeWidgetItem::LineResolutionColumn);
    55     hideColumn(ImageTreeWidgetItem::NorthAzimuthColumn);
    56     hideColumn(ImageTreeWidgetItem::BlankColumn);
    60         FileName(QString(
"$HOME/.Isis/%1/fileList.config").arg(QApplication::applicationName()))
    62         QSettings::NativeFormat);
    63     settings.beginGroup(
"ColumnsVisible");
    65     col = ImageTreeWidgetItem::FootprintColumn;
    66     while(col < ImageTreeWidgetItem::BlankColumn) {
    67       bool visible = !isColumnHidden(col);
    69       if (settings.value(QString(
"%1Visible").arg(ImageTreeWidgetItem::treeColumnToString(col)),
    70                          visible).toBool() != visible) {
    77       col = (ImageTreeWidgetItem::TreeColumn)(col + 1);
    81     setContextMenuPolicy(Qt::DefaultContextMenu);
    83     setSortingEnabled(
true);
    84     sortItems(ImageTreeWidgetItem::NameColumn, Qt::AscendingOrder);
    88     connect(
this, SIGNAL(itemSelectionChanged()),
    89             this, SLOT(onSelectionChanged()));
    93     connect(
this, SIGNAL(queueSelectionChanged()),
    94             this, SLOT(onQueuedSelectionChanged()), Qt::QueuedConnection);
    97     connect(
this, SIGNAL(queueReadDisplayProperties()),
    98             this, SLOT(onQueuedReadDisplayProperties()), Qt::QueuedConnection);
   100     setSelectionMode(QAbstractItemView::ExtendedSelection);
   101     setDragDropOverwriteMode(
false);
   105   ImageTreeWidget::~ImageTreeWidget() {
   107     foreach(contextAction, actions()) {
   108       removeAction(contextAction);
   116     if (!m_setFileListColsAct) {
   117       m_setFileListColsAct = 
new QAction(
"Set Current File List &Columns as Default", 
this);
   118       m_setFileListColsAct->setWhatsThis(tr(
"Use the currently visible columns in the file list as "   119             "the default when no project has been opened"));
   120       connect(m_setFileListColsAct, SIGNAL(triggered(
bool)),
   121               this, SLOT(setDefaultFileListCols()));
   123     results.append(m_setFileListColsAct);
   136     verticalScrollBar()->setMaximum(verticalScrollBar()->maximum() + 25);
   144       imageListItem = invisibleRootItem();
   146     if (groupName.isEmpty()) {
   147       groupName = QString(
"Group %1").arg(imageListItem->childCount() + 1);
   151     result->setText(0, groupName);
   152     result->setFlags(Qt::ItemIsEditable |
   153                     Qt::ItemIsUserCheckable |
   155                     Qt::ItemIsSelectable |
   156                     Qt::ItemIsDragEnabled |
   157                     Qt::ItemIsDropEnabled);
   158     result->setData(0, Qt::UserRole, ImageGroupType);
   161       index = imageListItem->childCount();
   164     imageListItem->insertChild(index, result);
   167     result->setExpanded(
true);
   173   QTreeWidgetItem *ImageTreeWidget::createImageListNameItem(QString name) {
   175     result->setText(0, name);
   176     result->setData(0, Qt::UserRole, ImageListNameType);
   177     result->setExpanded(
true);
   183   void ImageTreeWidget::refit() {
   184     ImageTreeWidgetItem::TreeColumn col = ImageTreeWidgetItem::NameColumn;
   185     while(col < ImageTreeWidgetItem::BlankColumn) {
   187       if (col == ImageTreeWidgetItem::NameColumn) {
   189         for (
int groupIndex = 0; groupIndex < topLevelItemCount(); groupIndex++) {
   190           expandedStates.append(topLevelItem(groupIndex)->isExpanded());
   191           topLevelItem(groupIndex)->setExpanded(
true);
   194         resizeColumnToContents(col);
   196         for (
int groupIndex = 0; groupIndex < topLevelItemCount(); groupIndex++) {
   197           topLevelItem(groupIndex)->setExpanded(expandedStates[groupIndex]);
   201         resizeColumnToContents(col);
   204       col = (ImageTreeWidgetItem::TreeColumn)(col + 1);
   209   void ImageTreeWidget::disableSort() {
   210     sortItems(ImageTreeWidgetItem::BlankColumn, Qt::AscendingOrder);
   214   void ImageTreeWidget::enqueueReadDisplayProperties(ImageTreeWidgetItem *item) {
   215     m_queuedReadDisplayPropertiesItems.append(item);
   217     if (m_queuedReadDisplayPropertiesItems.count() == 1) {
   218       emit queueReadDisplayProperties();
   224     if (m_viewActs.empty()) {
   225       ImageTreeWidgetItem::TreeColumn col =
   226           ImageTreeWidgetItem::FootprintColumn;
   228       while(col < ImageTreeWidgetItem::BlankColumn) {
   230         showHide->setData(col);
   232         connect(showHide, SIGNAL(triggered()),
   233                 this, SLOT(toggleColumnVisible()));
   235         m_viewActs.append(showHide);
   237         col = (ImageTreeWidgetItem::TreeColumn)(col + 1);
   247   void ImageTreeWidget::updateViewActs() {
   248     if (!m_viewActs.empty()) {
   249       int viewActIndex = 0;
   250       ImageTreeWidgetItem::TreeColumn col =
   251           ImageTreeWidgetItem::FootprintColumn;
   253       while(col < ImageTreeWidgetItem::BlankColumn) {
   254         bool visible = !isColumnHidden(col);
   255         QAction *showHide = m_viewActs[viewActIndex];
   258           showHide->setText(
"Show " +
   259               ImageTreeWidgetItem::treeColumnToString(col) + 
" Column");
   262           showHide->setText(
"Hide " +
   263               ImageTreeWidgetItem::treeColumnToString(col) + 
" Column");
   266         col = (ImageTreeWidgetItem::TreeColumn)(col + 1);
   276   void ImageTreeWidget::setDefaultFileListCols() {
   279           QString(
"$HOME/.Isis/%1/fileList.config").arg(QApplication::applicationName()))
   281         QSettings::NativeFormat);
   282     settings.beginGroup(
"ColumnsVisible");
   284     ImageTreeWidgetItem::TreeColumn col =
   285         ImageTreeWidgetItem::FootprintColumn;
   287     while(col < ImageTreeWidgetItem::BlankColumn) {
   288       bool visible = !isColumnHidden(col);
   290       settings.setValue(QString(
"%1Visible").arg(ImageTreeWidgetItem::treeColumnToString(col)),
   293       col = (ImageTreeWidgetItem::TreeColumn)(col + 1);
   300   ImageTreeWidgetItem *ImageTreeWidget::prepCube(ImageList *imageList, Image *image) {
   302       ImageTreeWidgetItem *item = 
new ImageTreeWidgetItem(imageList, image);
   304       connect(image->displayProperties(), SIGNAL(destroyed(
QObject *)),
   305               this, SLOT(imageDeleted(
QObject *)));
   306       connect(image->displayProperties(), SIGNAL(propertyChanged(DisplayProperties *)),
   307               this, SLOT(propertiesChanged(DisplayProperties *)));
   309       m_displayPropsToTreeItemLookup[image->displayProperties()] = item;
   313     catch(IException &e) {
   321   ImageList ImageTreeWidget::imagesInView() {
   324     QTreeWidgetItemIterator it(
this, QTreeWidgetItemIterator::UserFlag);
   329       if (item->type() == QTreeWidgetItem::UserType) {
   330         ImageTreeWidgetItem *mosItem = (ImageTreeWidgetItem *)item;
   331         results.append(mosItem->image());
   341   ImageTreeWidget::ImagePosition::ImagePosition() {
   346   ImageTreeWidget::ImagePosition::ImagePosition(
int outerIndex, 
int innerIndex) {
   349     setPosition(outerIndex, innerIndex);
   353   ImageTreeWidget::ImagePosition::ImagePosition(
const ImagePosition &other) :
   354       m_group(other.m_group), m_index(other.m_index) {
   358   ImageTreeWidget::ImagePosition::~ImagePosition() {
   363   void ImageTreeWidget::ImagePosition::setPosition(
int group, 
int index) {
   364     if (group >= 0 && index >= 0) {
   374   int ImageTreeWidget::ImagePosition::group()
 const {
   379   int ImageTreeWidget::ImagePosition::index()
 const {
   384   bool ImageTreeWidget::ImagePosition::isValid()
 const {
   385     return (m_group != -1 && m_index != -1);
   389   void ImageTreeWidget::ImagePosition::swap(ImagePosition &other) {
   390     std::swap(m_group, other.m_group);
   391     std::swap(m_index, other.m_index);
   395   bool ImageTreeWidget::ImagePosition::operator<(
const ImagePosition &rhs) {
   396     bool lessThan = 
false;
   397     if (group() < rhs.group()) {
   400     else if (group() == rhs.group() && index() < rhs.index()) {
   408   ImageTreeWidget::ImagePosition &ImageTreeWidget::ImagePosition::operator=(
   409       const ImagePosition &rhs) {
   410     ImagePosition copy(rhs);
   417   void ImageTreeWidget::ImagePosition::init() {
   422   void ImageTreeWidget::dropEvent(QDropEvent *event) {
   429       if(droppedAtGroup->type() != QTreeWidgetItem::Type)
   430         droppedAtGroup = droppedAtItem->parent();
   432       bool draggedGroup = groupInList(selectedItems());
   433       bool draggedItem = mosaicItemInList(selectedItems());
   436       if(draggedItem && !draggedGroup) {
   437         int insertPosition = 0;
   439         if(droppedAtGroup != droppedAtItem) {
   440           insertPosition = droppedAtGroup->indexOfChild(droppedAtItem) + 1;
   444         foreach(toBeMoved, selectedItems()) {
   445           if(toBeMoved != droppedAtItem) {
   450             int childOrigIndex = parent->indexOfChild(toBeMoved);
   452             parent->takeChild(childOrigIndex);
   454             int actualInsertPos = insertPosition;
   456             if(parent == droppedAtGroup && childOrigIndex < insertPosition)
   459             droppedAtGroup->insertChild(actualInsertPos, toBeMoved);
   462             if(insertPosition != droppedAtGroup->childCount())
   467       else if(!draggedItem && draggedGroup) {
   470         foreach(toBeMoved, selectedItems()) {
   471           if(toBeMoved != droppedAtGroup) {
   472             int dropPosition = indexOfTopLevelItem(droppedAtGroup);
   474             takeTopLevelItem(indexOfTopLevelItem(toBeMoved));
   475             insertTopLevelItem(dropPosition, toBeMoved);
   598     switch(event->type()) {
   599       case QEvent::MouseButtonPress: {
   600         if (event->button() == Qt::RightButton &&
   601            itemAt(event->pos()) == NULL) {
   602           setCurrentItem(NULL);
   611     QTreeWidget::mousePressEvent(event);
   615   void ImageTreeWidget::contextMenuEvent(QContextMenuEvent *event) {
   616     ImageList selectedCubes = selectedDisplays();
   618     bool selectedGroup = groupInList(selectedItems());
   619     bool selectedCube = mosaicItemInList(selectedItems());
   624       project = m_directory->
project();
   629       supportedActions.append(NULL);
   634     foreach(
QAction *action, supportedActions) {
   636         menu.addAction(action);
   643     if (!selectedCube && selectedGroup) {
   644       if (selectedItems().size() == 1 && selectedItems()[0]->childCount()) {
   645         QAction *close = menu.addAction(
"Close Cubes in Group");
   646         connect(close, SIGNAL(triggered()),
   647                 this, SLOT(requestCloseSelected()));
   650       if (selectedItems().size() == 1) {
   651         QAction *rename = menu.addAction(
"Rename Group");
   652         connect(rename, SIGNAL(triggered()),
   653                 this, SLOT(renameSelectedGroup()));
   655         QAction *group = menu.addAction(
"Insert Group");
   656         connect(group, SIGNAL(triggered()),
   662       if (selectedItems().size() == 1)
   663         removeGroup = menu.addAction(
"Delete Group");
   665         removeGroup = menu.addAction(
"Delete Groups");
   667       connect(removeGroup, SIGNAL(triggered()),
   668               this, SLOT(deleteSelectedGroups()));
   671     if (selectedCube && !selectedGroup) {
   674       if (selectedItems().size() == 1)
   675         close = menu.addAction(
"Close Cube");
   677         close = menu.addAction(
"Close Cubes");
   679       connect(close, SIGNAL(triggered()),
   680               this, SLOT(requestCloseSelected()));
   683     if (!selectedCube && !selectedGroup) {
   684       QAction *group = menu.addAction(
"Add Group");
   686       connect(group, SIGNAL(triggered()),
   690     menu.exec(event->globalPos());
   704     QString newGroupParentText = 
"";
   706     if (selectedItems().size() == 1) {
   707       if (selectedItems()[0]->data(0, Qt::UserRole).
toInt() == ImageGroupType) {
   708         newGroupParent = selectedItems()[0]->parent();
   709         if (newGroupParent) {
   710           index = newGroupParent->indexOfChild(selectedItems()[0]);
   713           newGroupParent = invisibleRootItem();
   714           index = indexOfTopLevelItem(selectedItems()[0]);
   717       else if (selectedItems()[0]->data(0, Qt::UserRole).
toInt() == ImageListNameType) {
   718         newGroupParent = selectedItems()[0];
   722     if (newGroupParent) {
   723       newGroupParentText = newGroupParent->text(0);
   725     return addGroup(newGroupParentText, 
"", index);
   729   void ImageTreeWidget::deleteSelectedGroups() {
   731     requestCloseSelected();
   734     foreach(toBeDeleted, selectedItems()) {
   735       if (toBeDeleted->type() == QTreeWidgetItem::Type) {
   742   void ImageTreeWidget::imageDeleted(
QObject *imageObj) {
   743     ImageDisplayProperties *imagedisp = (ImageDisplayProperties *)imageObj;
   744     ImageTreeWidgetItem *item = treeItem(imagedisp);
   746     if (item && item->parent()) {
   747       m_displayPropsToTreeItemLookup.remove(imagedisp);
   750       delete item->parent()->takeChild( item->parent()->indexOfChild(item) );
   756     if (item->type() == QTreeWidgetItem::UserType) {
   757       ((ImageTreeWidgetItem *)item)->update(
true);
   762   void ImageTreeWidget::onSelectionChanged() {
   763     if (!m_queuedSelectionChanged) {
   764       emit queueSelectionChanged();
   765       m_queuedSelectionChanged = 
true;
   770   void ImageTreeWidget::onQueuedReadDisplayProperties() {
   773     foreach (ImageTreeWidgetItem *item, m_queuedReadDisplayPropertiesItems) {
   774       bool wasSelected = item->isSelected();
   777       if (!wasSelected && item->isSelected()) {
   778         newlySelectedItem = item;
   782     if (newlySelectedItem) {
   783       scrollToItem(newlySelectedItem);
   786     m_queuedReadDisplayPropertiesItems.clear();
   790   void ImageTreeWidget::onQueuedSelectionChanged() {
   793     m_queuedSelectionChanged = 
false;
   795     QTreeWidgetItemIterator it(
this, QTreeWidgetItemIterator::UserFlag);
   800       if (item->type() == QTreeWidgetItem::UserType) {
   801         ImageTreeWidgetItem *imageItem = (ImageTreeWidgetItem *)item;
   802         imageItem->update(
true);
   808     updateDragAndDropability();
   812   void ImageTreeWidget::propertiesChanged(DisplayProperties *changed) {
   813     enqueueReadDisplayProperties(treeItem(changed));
   817   void ImageTreeWidget::renameSelectedGroup() {
   818     if (selectedItems().size() == 1 &&
   819        selectedItems()[0]->type() == QTreeWidgetItem::Type) {
   821       editItem(groupToEdit);
   826   void ImageTreeWidget::requestCloseSelected() {
   827     QTreeWidgetItemIterator it(
this, QTreeWidgetItemIterator::UserFlag);
   833       if (item->type() == QTreeWidgetItem::UserType) {
   834         if (item->isSelected() || item->parent()->isSelected()) {
   835           ImageTreeWidgetItem *mosItem = (ImageTreeWidgetItem *)item;
   836           mosItem->image()->deleteLater();
   845   void ImageTreeWidget::toggleColumnVisible() {
   846     int column = ((
QAction *)sender())->data().toInt();
   847     setColumnHidden(column, !isColumnHidden(column));
   849     if (!m_viewActs.empty())
   856   void ImageTreeWidget::updateDragAndDropability() {
   858     bool selectedGroup = groupInList(selected);
   859     bool selectedItem = mosaicItemInList(selected);
   861     if (selectedGroup && selectedItem) {
   862       setDragDropMode(QAbstractItemView::NoDragDrop);
   865       setDragDropMode(QAbstractItemView::DragDrop);
   871     QListIterator<QTreeWidgetItem *> it(items);
   873     while (it.hasNext()) {
   876       if (item->type() == QTreeWidgetItem::Type)
   885     QListIterator<QTreeWidgetItem *> it(items);
   887     while (it.hasNext()) {
   890       if (item->type() == QTreeWidgetItem::UserType)
   897   ImageList ImageTreeWidget::selectedDisplays() {
   899     QTreeWidgetItemIterator it(
this, QTreeWidgetItemIterator::UserFlag);
   905       if (item->type() == QTreeWidgetItem::UserType) {
   906         ImageTreeWidgetItem *mosItem = (ImageTreeWidgetItem *)item;
   907         if (mosItem->isSelected() || mosItem->parent()->isSelected()) {
   908           selected.append(mosItem->image());
   930     if (imageListName.isEmpty()) {
   931       result = invisibleRootItem();
   934       QTreeWidgetItemIterator it(
this);
   936       while(*it && !result) {
   939         if (item->data(0, Qt::UserRole).toInt() == ImageListNameType) {
   940           if (item->text(0) == imageListName) {
   950       result = createImageListNameItem(imageListName);
   951       addTopLevelItem(result);
   959     return m_displayPropsToTreeItemLookup[displayProps];
   963   ImageTreeWidgetItem *ImageTreeWidget::treeItem(Image *image) {
   964     return treeItem(image->displayProperties());
 Internalizes a list of images and allows for operations on the entire list. 
 
The main project for ipce. 
 
QList< QAction * > supportedActions(DataType data)
Returns a list of supported actions for a WorkOrder. 
 
File name manipulation and expansion. 
 
int toInt(const QString &string)
Global function to convert from a string to an integer. 
 
QList< QAction * > supportedActions(Project *project=NULL)
Gets a list of pre-connected actions that have to do with display. 
 
Namespace for ISIS/Bullet specific routines. 
 
Project * project() const
Gets the Project for this directory.