Commit 12b10239 authored by Makayla Shepherd's avatar Makayla Shepherd
Browse files

Fixed a seg fault that occurs when trying to edit a control net when there is...

Fixed a seg fault that occurs when trying to edit a control net when there is not an active control net set. Fixed a seg fault that occurs when right clicking on a control network when it is the only item on the project tree. Fixes #5048, #5071.

git-svn-id: http://subversion.wr.usgs.gov/repos/prog/isis3/branches/ipce@7945 41f8697f-d340-4b68-9986-7bafba869bb8
parent 5ba7c0d3
Loading
Loading
Loading
Loading
+228 −8
Original line number Diff line number Diff line
@@ -27,26 +27,26 @@
#include <QVBoxLayout>
#include <QWhatsThis>

#include "ControlMeasure.h"
#include "ControlNet.h"
#include "ControlPoint.h"
#include "IException.h"

#include "AbstractMeasureItem.h"
#include "AbstractPointItem.h"
#include "AbstractTreeItem.h"
#include "CnetDisplayProperties.h"
#include "CnetEditorSortConfigDialog.h"
#include "ControlMeasure.h"
#include "ControlNet.h"
#include "ControlPoint.h"
#include "FileName.h"
#include "FilterWidget.h"
#include "IException.h"
#include "ImageImageTreeModel.h"
#include "ImagePointTreeModel.h"
#include "MeasureTableModel.h"
#include "PointMeasureTreeModel.h"
#include "PointTableModel.h"
#include "TableView.h"
#include "TableViewHeader.h"
#include "TreeView.h"
#include "ImageImageTreeModel.h"
#include "FilterWidget.h"
#include "PointMeasureTreeModel.h"
#include "ImagePointTreeModel.h"


namespace Isis {
@@ -62,6 +62,12 @@ namespace Isis {
//**************************************************************


  /**
   * Constructor
   * 
   * @param cNet Control network to work on 
   * @param pathForSettings Where to write the settings
   */
  CnetEditorWidget::CnetEditorWidget(ControlNet *cNet,
      QString pathForSettings) {
    nullify();
@@ -91,6 +97,9 @@ namespace Isis {
  }


  /**
   * Destructor
   */
  CnetEditorWidget::~CnetEditorWidget() {
    writeSettings();

@@ -147,6 +156,9 @@ namespace Isis {
  }


  /**
   * Sets all member variables to NULL
   */ 
  void CnetEditorWidget::nullify() {
    m_pointTreeView = NULL;
    m_imageTreeView = NULL;
@@ -182,6 +194,11 @@ namespace Isis {
  }


  /**
   * Deletes the current models, clears the tree, and rebuilds the models
   * 
   * @param itemsToDelete Tree to clear
   */
  void CnetEditorWidget::rebuildModels(QList<AbstractTreeItem *> itemsToDelete) {
    m_pointModel->stopWorking();
    m_imageModel->stopWorking();
@@ -222,6 +239,9 @@ namespace Isis {
  }


  /**
   * Creates the layout of the widget
   */
  QBoxLayout *CnetEditorWidget::createMainLayout() {
    createPointTreeView();
    createSerialTreeView();
@@ -267,6 +287,9 @@ namespace Isis {
  }


  /**
   * Creates the menus, and options for the widget
   */
  void CnetEditorWidget::createActions() {
    ASSERT(m_menuActions);

@@ -311,6 +334,9 @@ namespace Isis {
  }


  /**
   * Creates the point tree view and adds it to the model
   */
  void CnetEditorWidget::createPointTreeView() {
    m_pointTreeView = new TreeView();
    m_pointTreeView->setTitle("Point View");
@@ -319,6 +345,9 @@ namespace Isis {
  }


  /**
   * Creates the serial tree and adds it to the model
   */
  void CnetEditorWidget::createSerialTreeView() {
    m_imageTreeView = new TreeView();
    m_imageTreeView->setTitle("Cube View");
@@ -327,6 +356,9 @@ namespace Isis {
  }


  /**
   * Creates the connection tree and adds it to the model
   */
  void CnetEditorWidget::createConnectionTreeView() {
    m_connectionTreeView = new TreeView();
    m_connectionTreeView->setTitle("Cube Connection View");
@@ -335,6 +367,9 @@ namespace Isis {
  }


  /**
   * Creates filter widgets
   */
  void CnetEditorWidget::createFilterArea() {
    ASSERT(m_pointModel);
    ASSERT(m_imageModel);
@@ -384,6 +419,9 @@ namespace Isis {
  }


  /**
   * Creates the point table and adds it to the widget
   */
  void CnetEditorWidget::createPointTableView() {
    m_pointTableModel = new PointTableModel(m_pointModel);
    m_pointTableView = new TableView(m_pointTableModel, *m_settingsPath,
@@ -423,6 +461,9 @@ namespace Isis {
  }


  /**
   * Creates the measure table and adds it to the widget
   */
  void CnetEditorWidget::createMeasureTableView() {
    m_measureTableModel = new MeasureTableModel(m_pointModel);
    m_measureTableView = new TableView(m_measureTableModel, *m_settingsPath,
@@ -473,11 +514,17 @@ namespace Isis {
  }


  /**
   * Rebuilds the models
   */
  void CnetEditorWidget::rebuildModels() {
    rebuildModels(QList< AbstractTreeItem * >());
  }


  /**
   * Toggles the point column
   */
  void CnetEditorWidget::pointColToggled() {
    QList< QAction * > actions =
      m_pointTableView->getHorizontalHeader()->actions();
@@ -489,6 +536,9 @@ namespace Isis {
  }


  /**
   * Toggles the measure column
   */
  void CnetEditorWidget::measureColToggled() {
    QList< QAction * > actions =
      m_measureTableView->getHorizontalHeader()->actions();
@@ -497,6 +547,16 @@ namespace Isis {
          actions[i]->isChecked());
  }

  
  /**
   * Handles point table filter changes.
   * 
   * @param visibleRows Number of visible rows
   * @param totalRows Total number of rows
   * 
   * @see handleTableFilterCountsChanged(int visibleRows, int totalRows, QGroupBox *box, 
   *                                     QString initialText)
   */
  void CnetEditorWidget::handlePointTableFilterCountsChanged(
    int visibleRows, int totalRows) {
    handleTableFilterCountsChanged(visibleRows, totalRows, m_pointTableBox,
@@ -504,6 +564,15 @@ namespace Isis {
  }


  /**
   * Handles measure table filter changes
   * 
   * @param visibleRows Number of visible rows
   * @param totalRows Total number of rows
   * 
   * @see handleTableFilterCountsChanged(int visibleRows, int totalRows, QGroupBox *box, 
   *                                     QString initialText)
   */
  void CnetEditorWidget::handleMeasureTableFilterCountsChanged(
    int visibleRows, int totalRows) {
    handleTableFilterCountsChanged(visibleRows, totalRows, m_measureTableBox,
@@ -511,6 +580,14 @@ namespace Isis {
  }


  /**
   * Handles any table filter changes
   * 
   * @param visibleRows Number of visible rows
   * @param totalRows Total number of rows
   * @param box The table box to change
   * @param initialText The initial text at the top of the table
   */
  void CnetEditorWidget::handleTableFilterCountsChanged(
    int visibleRows, int totalRows, QGroupBox *box, QString initialText) {
    if (box) {
@@ -527,6 +604,9 @@ namespace Isis {
  }


  /**
   * Upgrades the working version number
   */
  void CnetEditorWidget::upgradeVersion() {
    if (*m_workingVersion == "") {
      *m_workingVersion = "0.1";
@@ -537,6 +617,9 @@ namespace Isis {
  }


  /**
   * Reads the working version settings stored at the settings path
   */
  void CnetEditorWidget::readSettings() {
    ASSERT(m_workingVersion);
    ASSERT(m_settingsPath);
@@ -578,6 +661,9 @@ namespace Isis {
  }


  /**
   * Writes the configuration settings used
   */
  void CnetEditorWidget::writeSettings() {
    ASSERT(m_mainSplitter);
    ASSERT(m_settingsPath);
@@ -617,58 +703,144 @@ namespace Isis {
        pointTableSortLimit());
  }

  
  /**
   * Returns the point tree view
   * 
   * @return QWidget The point tree view
   */ 
  QWidget *CnetEditorWidget::pointTreeView() {
    return m_pointTreeView;
  }


  /**
   * Returns the serial tree view
   * 
   * @return QWidget The serial tree view
   */
  QWidget *CnetEditorWidget::serialTreeView() {
    return m_imageTreeView;
  }


  /**
   * Returns the connection tree view
   * 
   * @return QWidget The connection tree view
   */
  QWidget *CnetEditorWidget::connectionTreeView() {
    return m_connectionTreeView;
  }


  /**
   * Returns the point filter widget
   * 
   * @return QWidget The point filter widget
   */
  QWidget *CnetEditorWidget::pointFilterWidget() {
    return m_pointFilterWidget;
  }


  /**
   * Returns the serial filter widget
   * 
   * @return QWidget The serial filter widget
   */
  QWidget *CnetEditorWidget::serialFilterWidget() {
    return m_serialFilterWidget;
  }


  /**
   * Returns the connection filter widget
   * 
   * @return QWidget The connection filter widget
   */
  QWidget *CnetEditorWidget::connectionFilterWidget() {
    return m_connectionFilterWidget;
  }
  
  
  /**
   * Returns the point table view
   * 
   * @return TableView The point table view
   */
  TableView *CnetEditorWidget::pointTableView() {
    return m_pointTableView;
  }
  
  
  /**
   * Returns the measure table view
   * 
   * @return TableView The measure table view
   */
  TableView *CnetEditorWidget::measureTableView() {
    return m_measureTableView;
  }


  /**
   * Returns the measure table model
   * 
   * @return AbstractTableModel The measure table model
   */
  AbstractTableModel *CnetEditorWidget::measureTableModel() {
    return m_measureTableModel;
  }


  /**
   * Returns the point table model
   * 
   * @return AbstractTableModel The point table model
   */
  AbstractTableModel *CnetEditorWidget::pointTableModel() {
    return m_pointTableModel;
  }
  
  
  /**
   * Returns the control network
   * 
   * @return ControlNet The control network
   */
  ControlNet *CnetEditorWidget::control() {
    return m_controlNet;
  }


  /**
   * Returns the menu actions
   * 
   * @return QMap< QAction *, QList< QString > > QMap of menu actions
   */
  QMap< QAction *, QList< QString > > CnetEditorWidget::menuActions() {
    ASSERT(m_menuActions);
    return *m_menuActions;
  }


  /**
   * Returns the tool bar actions
   * 
   * @return QMap< QAction *, QList< QString > > QMap of tool bar actions
   */
  QMap< QString, QList< QAction * > > CnetEditorWidget::toolBarActions() {
    ASSERT(m_toolBarActions);
    return *m_toolBarActions;
  }


  /**
   * Returns the filtered control net
   * 
   * @return ControlNet Filtered control network
   */
  ControlNet *CnetEditorWidget::filteredNetwork() const {
    ControlNet *filteredCnet = new ControlNet(*m_controlNet);

@@ -764,46 +936,89 @@ namespace Isis {
  }


  /**
   * Returns true if the measure table can be sorted
   * 
   * @return bool True if sorting is enabled on the measure table
   */
  bool CnetEditorWidget::measureTableSortingEnabled() const {
    return m_measureTableModel->sortingIsEnabled();
  }


  /**
   * Returns the sorting limit for the measure table
   * 
   * @return int The sorting limit for the measure table
   */
  int CnetEditorWidget::measureTableSortLimit() const {
    return m_measureTableModel->sortLimit();
  }


  /**
   * Returns true if the point table can be sorted
   * 
   * @return bool True if sorting is enabled on the point table
   */
  bool CnetEditorWidget::pointTableSortingEnabled() const {
    return m_pointTableModel->sortingIsEnabled();
  }


  /**
   * Returns the sorting limit for the point table
   * 
   * @return int The sorting limit for the point table
   */
  int CnetEditorWidget::pointTableSortLimit() const {
    return m_pointTableModel->sortLimit();
  }


  /**
   * Sets if the measure table can be sorted
   * 
   * @param bool Bool if the table can be sorted or not
   */
  void CnetEditorWidget::setMeasureTableSortingEnabled(bool enabled) {
    m_measureTableModel->setSortingEnabled(enabled);
  }


  /**
   * Sets the measure table sorting limit
   * 
   * @param int Sorting limit
   */
  void CnetEditorWidget::setMeasureTableSortLimit(int limit) {
    m_measureTableModel->setSortLimit(limit);
  }


  /**
   * Sets if the point table can be sorted
   * 
   * @param bool Bool if the table can be sorted or not
   */
  void CnetEditorWidget::setPointTableSortingEnabled(bool enabled) {
    m_pointTableModel->setSortingEnabled(enabled);
  }


  /**
   * Sets the point table sorting limit
   * 
   * @param int Sorting limit
   */
  void CnetEditorWidget::setPointTableSortLimit(int limit) {
    m_pointTableModel->setSortLimit(limit);
  }


  /**
   * Configures the sorting dialog
   */
  void CnetEditorWidget::configSorting() {
    CnetEditorSortConfigDialog *dialog = new CnetEditorSortConfigDialog(this);
    dialog->setAttribute(Qt::WA_DeleteOnClose);
@@ -811,6 +1026,11 @@ namespace Isis {
  }


  /**
   * Sets if the tables are frozen
   * 
   * @param bool Bool that freezes the tables or not
   */
  void CnetEditorWidget::setTablesFrozen(bool freezeTables) {
    if (freezeTables) {
      m_connectionModel->setFrozen(true);
+65 −64
Original line number Diff line number Diff line
@@ -46,6 +46,9 @@ namespace Isis {
   *                           also passed.  This was added for IPCE, for the interaction with other
   *                           views.
   *   @history 2017-07-25 Summer Stapleton - Removed the CnetViz namespace. Fixes #5054.
   *   @history 2017-07-24 Makayla Shepherd - Fixed a seg fault in ipce that occurs when attempting
   *                           to edit a control point when there is not an active control network.
   *                           Fixes #5048.
   */
  class CnetEditorWidget : public QWidget {
      Q_OBJECT
@@ -57,8 +60,6 @@ namespace Isis {
        ConnectionView
      };


    public:
      CnetEditorWidget(ControlNet *, QString);
      virtual ~CnetEditorWidget();
      void readSettings();
@@ -70,6 +71,10 @@ namespace Isis {
      QWidget *pointFilterWidget();
      QWidget *serialFilterWidget();
      QWidget *connectionFilterWidget();
      TableView *pointTableView();
      TableView *measureTableView();
      ControlNet *control();
      

      AbstractTableModel *measureTableModel();
      AbstractTableModel *pointTableModel();
@@ -98,11 +103,20 @@ namespace Isis {

    signals:
      void cnetModified();

      void editControlPoint(ControlPoint *controlPoint, QString serialNumber);

    private slots:
      void rebuildModels(QList< AbstractTreeItem * > itemsToDelete);

      void pointColToggled();
      void measureColToggled();

      void handlePointTableFilterCountsChanged(int visibleRows, int totalRows);
      void handleMeasureTableFilterCountsChanged(int visibleRows,
          int totalRows);

    private: 
      //methods
      void nullify();
      QBoxLayout *createMainLayout();
      void createActions();
@@ -116,55 +130,42 @@ namespace Isis {
      void handleTableFilterCountsChanged(int visibleRows, int totalRows,
                                          QGroupBox *box, QString initialText);
      
      // data
      bool m_updatingSelection;                                 //!< Updates selection
      ControlNet *m_controlNet;                                 //!< Control network for this widget
      QString *m_workingVersion;                                //!< Working version
      static const QString VERSION;                             //!< Version
      
    private slots:
      void rebuildModels(QList< AbstractTreeItem * > itemsToDelete);

      void pointColToggled();
      void measureColToggled();

      void handlePointTableFilterCountsChanged(int visibleRows, int totalRows);
      void handleMeasureTableFilterCountsChanged(int visibleRows,
          int totalRows);


    private: // data
      bool m_updatingSelection;
      ControlNet *m_controlNet;
      QString *m_workingVersion;
      static const QString VERSION;


    private: // widgets
      TreeView *m_pointTreeView;
      TreeView *m_imageTreeView;
      TreeView *m_connectionTreeView;
      //widgets
      TreeView *m_pointTreeView;                       //!< Point tree view
      TreeView *m_imageTreeView;                       //!< Image tree view
      TreeView *m_connectionTreeView;                  //!< Connection tree view

      TableView *m_pointTableView;
      TableView *m_measureTableView;
      TableView *m_pointTableView;                     //!< Point table view
      TableView *m_measureTableView;                   //!< Measure table view

      QGroupBox *m_pointTableBox;
      QGroupBox *m_measureTableBox;
      QGroupBox *m_pointTableBox;                               //!< Point table box
      QGroupBox *m_measureTableBox;                             //!< Measure table box

      QScrollArea *m_filterArea;
      QScrollArea *m_filterArea;                                //!< Scroll area for filters

      QWidget *m_pointFilterWidget;
      QWidget *m_serialFilterWidget;
      QWidget *m_connectionFilterWidget;
      QWidget *m_pointFilterWidget;                             //!< Point filter widget
      QWidget *m_serialFilterWidget;                            //!< Serial filter widget
      QWidget *m_connectionFilterWidget;                        //!< Connection filter widget

      PointMeasureTreeModel *m_pointModel;
      ImagePointTreeModel *m_imageModel;
      ImageImageTreeModel *m_connectionModel;
      PointMeasureTreeModel *m_pointModel;             //!< Point tree model
      ImagePointTreeModel *m_imageModel;               //!< Image tree model
      ImageImageTreeModel *m_connectionModel;          //!< Connection tree model

      PointTableModel *m_pointTableModel;
      MeasureTableModel *m_measureTableModel;
      PointTableModel *m_pointTableModel;              //!< Point table model
      MeasureTableModel *m_measureTableModel;          //!< Measure table model

      QSplitter *m_mainSplitter;
      QSplitter *m_mainSplitter;                                //!< Splitter

      QMap< QAction *, QList< QString > > * m_menuActions;
      QMap< QString, QList< QAction * > > * m_toolBarActions;
      QMap< QAction *, QList< QString > > * m_menuActions;      //!< QMap of menu actions
      QMap< QString, QList< QAction * > > * m_toolBarActions;   //!< QMap of tool bar actions

      QString *m_settingsPath;
      QString *m_settingsPath; //!< Path to read/write settings
  };
}

+48 −3
Original line number Diff line number Diff line
@@ -18,6 +18,13 @@


namespace Isis {  
  /**
    * Constructor
    * 
    * @param someModel The abstract table model to view
    * @param pathForSettings The path to read/write settings to
    * @param objName The name of the object
    */
  TableView::TableView(AbstractTableModel *someModel,
      QString pathForSettings,
      QString objName) {
@@ -106,6 +113,9 @@ namespace Isis {
  }


  /**
    * Destructor
    */
  TableView::~TableView() {
    // save column widths
    ASSERT(objectName().size());
@@ -138,11 +148,22 @@ namespace Isis {
  }


  /**
    * Returns the horizontal header
    * 
    * @return TableViewHeader The horizontal header
    */
  TableViewHeader *TableView::getHorizontalHeader() {
    return m_header;
  }


  /**
    * Sets the specified column visible or invisible
    * 
    * @param column The column to change the visibility of
    * @param visible The visibility setting
    */
  void TableView::setColumnVisible(QString column, bool visible) {
    for (int i = 0; i < m_columns->size(); i++) {
      TableColumn *col = (*m_columns)[i];
@@ -152,11 +173,26 @@ namespace Isis {
  }


  /**
    * Returns the model
    * 
    * @return AbstractTableModel The model
    */
  AbstractTableModel *TableView::getModel() {
    return m_content->getModel();
  }
  
  
  /**
    * Returns the content of the table
    * 
    * @return TableViewContent The content of the table
    */
  TableViewContent *TableView::content() {
    return m_content;
  }


  //   void TableView::setModel(AbstractTableModel * newModel)
  //   {
  //     ASSERT(m_content);
@@ -205,6 +241,11 @@ namespace Isis {
  //   }
  

  /**
    * Displays warnings for a table
    * 
    * @param warning The waarning that will be displayed
    */
  void TableView::displayWarning(AbstractTableModel::Warning warning) {
    switch (warning) {
      case AbstractTableModel::SortingDisabled:
@@ -228,7 +269,9 @@ namespace Isis {
    }
  }


  /**
    * Handles refreshing the content when the model selection is changed.
    */
  void TableView::handleModelSelectionChanged() {
    m_content->refresh();
  }
@@ -240,7 +283,9 @@ namespace Isis {
    m_content->scrollTo(newlySelectedItems);
  }


  /**
    * Sets all member variables to NULL
    */ 
  void TableView::nullify() {
    m_header = NULL;
    m_content = NULL;
+28 −26
Original line number Diff line number Diff line
@@ -10,8 +10,8 @@ template<typename T> class QList;
class QString;

namespace Isis {
  class AbstractTreeItem;
  class AbstractTableModel;
  class AbstractTreeItem;
  class ControlPoint;
  class TableViewContent;
  class TableViewHeader;
@@ -28,6 +28,9 @@ namespace Isis {
    *                           also passed.  This was added for IPCE, for the interaction with
    *                           other views.
    *   @history 2017-07-25 Summer Stapleton - Removed the CnetViz namespace. Fixes #5054.
    *   @history 2017-08-08 Makayla Shepherd - Fixed a seg fault in ipce that occurs when 
    *                           attempting to edit a control point when there is not an active 
    *                           control network. Fixes #5048.
    */
  class TableView : public QWidget {
      Q_OBJECT
@@ -49,6 +52,7 @@ namespace Isis {
      //       void setModel(AbstractTableModel * newModel);
      void readSettings();
      void writeSettings();
      TableViewContent *content();


    public slots:
@@ -67,23 +71,21 @@ namespace Isis {

      void editControlPoint(ControlPoint *, QString);


    private: // disable copying and assigning of this class
    private: 
      // disable copying and assigning of this class
      TableView(const TableView &);
      TableView &operator=(const TableView &other);
      

    private: // methods
      // methods
      void nullify();
      

    private: // data
      TableViewHeader *m_header;
      TableViewContent *m_content;
      TableColumnList *m_columns;
      AbstractTableModel *m_model;
      QString *m_settingsPath;
      QLabel *m_warningLabel;
      // data
      TableViewHeader *m_header;      //!< The table header
      TableViewContent *m_content;    //!< The content of the header
      TableColumnList *m_columns;     //!< The columns of the table
      AbstractTableModel *m_model;    //!< The model of the table
      QString *m_settingsPath;        //!< Path of where to read/write the settings
      QLabel *m_warningLabel;         //!< Label of any warnings
  };
}

+306 −17

File changed.

Preview size limit exceeded, changes collapsed.

Loading