Skip to content
This repository was archived by the owner on May 15, 2018. It is now read-only.

Commit

Permalink
Merge pull request #7 from mholden8/SignalsSlots
Browse files Browse the repository at this point in the history
Fix widget updating
  • Loading branch information
matthewsholden committed Dec 11, 2014
2 parents bff3e4c + 47edbf1 commit 2ab865b
Show file tree
Hide file tree
Showing 4 changed files with 80 additions and 79 deletions.
18 changes: 4 additions & 14 deletions Widgets/qSlicerWorkflowSegmentationRecorderControlsWidget.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -63,8 +63,9 @@ ::setupUi(qSlicerWorkflowSegmentationRecorderControlsWidget* widget)

//-----------------------------------------------------------------------------
qSlicerWorkflowSegmentationRecorderControlsWidget
::qSlicerWorkflowSegmentationRecorderControlsWidget(QWidget* parentWidget) : Superclass( parentWidget ) , d_ptr( new qSlicerWorkflowSegmentationRecorderControlsWidgetPrivate(*this) )
::qSlicerWorkflowSegmentationRecorderControlsWidget(QWidget* parentWidget) : qSlicerRecorderControlsWidget( parentWidget ) , d_ptr( new qSlicerWorkflowSegmentationRecorderControlsWidgetPrivate(*this) )
{
this->WorkflowSegmentationLogic = vtkSlicerWorkflowSegmentationLogic::SafeDownCast( qSlicerTransformBufferWidgetHelper::GetSlicerModuleLogic( "WorkflowSegmentation" ) );
}


Expand All @@ -73,24 +74,13 @@ qSlicerWorkflowSegmentationRecorderControlsWidget
{
}


qSlicerWorkflowSegmentationRecorderControlsWidget* qSlicerWorkflowSegmentationRecorderControlsWidget
::New( qSlicerTransformBufferWidget* newBufferWidget, vtkSlicerWorkflowSegmentationLogic* newWorkflowSegmentationLogic )
{
qSlicerWorkflowSegmentationRecorderControlsWidget* newRecorderControlsWidget = new qSlicerWorkflowSegmentationRecorderControlsWidget();
newRecorderControlsWidget->BufferWidget = newBufferWidget;
newRecorderControlsWidget->WorkflowSegmentationLogic = newWorkflowSegmentationLogic;
newRecorderControlsWidget->setup();
return newRecorderControlsWidget;
}


void qSlicerWorkflowSegmentationRecorderControlsWidget
::onClearButtonClicked()
{
Q_D(qSlicerWorkflowSegmentationRecorderControlsWidget);

this->BufferWidget->TransformRecorderLogic->ClearTransforms( this->BufferWidget->GetBufferNode() );
//this->WorkflowSegmentationLogic->ResetWorkflowAlgorithms();
this->TransformRecorderLogic->ClearTransforms( this->BufferHelper->GetTransformBufferNode() );
this->WorkflowSegmentationLogic->ResetWorkflowAlgorithms();

this->updateWidget();
Expand Down
7 changes: 1 addition & 6 deletions Widgets/qSlicerWorkflowSegmentationRecorderControlsWidget.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,7 @@
#include "qSlicerWidget.h"
#include "qSlicerWorkflowSegmentationModuleWidgetsExport.h"

#include "vtkSlicerTransformRecorderLogic.h"
#include "vtkSlicerWorkflowSegmentationLogic.h"
#include "vtkMRMLTransformBufferNode.h"
#include "qSlicerRecorderControlsWidget.h"

class qSlicerWorkflowSegmentationRecorderControlsWidgetPrivate;
Expand All @@ -38,11 +36,10 @@ qSlicerWorkflowSegmentationRecorderControlsWidget : public qSlicerRecorderContro
{
Q_OBJECT
public:
typedef qSlicerRecorderControlsWidget Superclass;
qSlicerWorkflowSegmentationRecorderControlsWidget(QWidget *parent=0);
virtual ~qSlicerWorkflowSegmentationRecorderControlsWidget();

static qSlicerWorkflowSegmentationRecorderControlsWidget* New( qSlicerTransformBufferWidget* newBufferWidget, vtkSlicerWorkflowSegmentationLogic* newWorkflowSegmentationLogic );
vtkSlicerWorkflowSegmentationLogic* WorkflowSegmentationLogic;

protected slots:

Expand All @@ -55,8 +52,6 @@ protected slots:
Q_DECLARE_PRIVATE(qSlicerWorkflowSegmentationRecorderControlsWidget);
Q_DISABLE_COPY(qSlicerWorkflowSegmentationRecorderControlsWidget);

vtkSlicerWorkflowSegmentationLogic* WorkflowSegmentationLogic;

};

#endif
120 changes: 68 additions & 52 deletions qSlicerWorkflowSegmentationModuleWidget.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -100,24 +100,45 @@ qSlicerWorkflowSegmentationModuleWidget::~qSlicerWorkflowSegmentationModuleWidge
}


void qSlicerWorkflowSegmentationModuleWidget
::setupEmbeddedWidgets()
{
Q_D(qSlicerWorkflowSegmentationModuleWidget);

// Adding embedded widgets
d->TransformBufferWidget = new qSlicerTransformBufferWidget();
d->BufferGroupBox->layout()->addWidget( d->TransformBufferWidget );
d->TransformBufferWidget->setMRMLScene( NULL );
d->TransformBufferWidget->setMRMLScene( d->logic()->GetMRMLScene() );

d->RecorderControlsWidget = new qSlicerWorkflowSegmentationRecorderControlsWidget();
d->ControlsGroupBox->layout()->addWidget( d->RecorderControlsWidget );
d->RecorderControlsWidget->setMRMLScene( NULL );
d->RecorderControlsWidget->setMRMLScene( d->logic()->GetMRMLScene() );

d->MessagesWidget = new qSlicerMessagesWidget();
d->MessagesGroupBox->layout()->addWidget( d->MessagesWidget );
d->MessagesWidget->setMRMLScene( NULL );
d->MessagesWidget->setMRMLScene( d->logic()->GetMRMLScene() );

// Setting up connections for embedded widgets
// Connect the child widget to the transform buffer node change event (they already observe the modified event)
connect( d->TransformBufferWidget, SIGNAL( transformBufferNodeChanged( vtkMRMLTransformBufferNode* ) ), d->RecorderControlsWidget->BufferHelper, SLOT( SetTransformBufferNode( vtkMRMLTransformBufferNode* ) ) );
connect( d->TransformBufferWidget, SIGNAL( transformBufferNodeChanged( vtkMRMLTransformBufferNode* ) ), d->MessagesWidget->BufferHelper, SLOT( SetTransformBufferNode( vtkMRMLTransformBufferNode* ) ) );

}


void qSlicerWorkflowSegmentationModuleWidget::setup()
{
Q_D(qSlicerWorkflowSegmentationModuleWidget);

d->setupUi(this);
d->TransformBufferWidget = qSlicerTransformBufferWidget::New( d->logic()->TransformRecorderLogic );
d->BufferGroupBox->layout()->addWidget( d->TransformBufferWidget );
d->MessagesWidget = qSlicerMessagesWidget::New( d->TransformBufferWidget );
d->MessagesGroupBox->layout()->addWidget( d->MessagesWidget );
d->RecorderControlsWidget = qSlicerWorkflowSegmentationRecorderControlsWidget::New( d->TransformBufferWidget, d->logic() );
d->ControlsGroupBox->layout()->addWidget( d->RecorderControlsWidget );
this->Superclass::setup();

this->BufferStatus = d->TransformBufferWidget->BufferStatus;
// Add the embedded widgets
this->setupEmbeddedWidgets();

// Module node selection
d->ModuleComboBox->setNoneEnabled( true );
connect( d->ModuleComboBox, SIGNAL( currentNodeChanged( vtkMRMLNode* ) ), this, SLOT( onModuleNodeSelected() ) );

// Import parameters and files
Expand All @@ -132,11 +153,11 @@ void qSlicerWorkflowSegmentationModuleWidget::setup()
// Setup the display of instructions
this->setupInstructions();

// GUI refresh: updates every 10ms
QTimer *t = new QTimer( this );
connect( t, SIGNAL( timeout() ), this, SLOT( updateWidget() ) );
t->start(10);
// If the transform buffer node is changed, reset everything
connect( d->TransformBufferWidget, SIGNAL( transformBufferNodeChanged( vtkMRMLTransformBufferNode* ) ), this, SLOT( resetWidget() ) );
connect( d->TransformBufferWidget, SIGNAL( transformBufferNodeModified() ), this, SLOT( updateWidget() ) );

this->updateWidget();
}


Expand Down Expand Up @@ -225,7 +246,7 @@ ::onWorkflowTrainingButtonClicked()

if ( fileName.isEmpty() == false )
{
d->logic()->ImportWorkflowTraining( fileName.toStdString() );
d->logic()->ImportWorkflowTraining( fileName.toStdString() );
d->logic()->ResetWorkflowAlgorithms();
}

Expand All @@ -252,7 +273,7 @@ ::onWorkflowTrainingFilesButtonClicked()
dialog.setValue( 10 );

// Add the buffers from each of the files to the workflow algorithms.
d->logic()->ResetWorkflowAlgorithms();
d->logic()->ResetWorkflowAlgorithms();
for( int i = 0; i < files.size(); i++ )
{
d->logic()->AddTrainingBuffer( files.at(i).toStdString() );
Expand Down Expand Up @@ -285,7 +306,7 @@ ::onTrainButtonClicked()

if ( fileName.isEmpty() == false )
{
d->logic()->SaveWorkflowTraining( fileName.toStdString() );
d->logic()->SaveWorkflowTraining( fileName.toStdString() );
}
d->logic()->ResetWorkflowAlgorithms();

Expand All @@ -300,7 +321,7 @@ void qSlicerWorkflowSegmentationModuleWidget::setupInstructions()
qSlicerApplication::application()->layoutManager()->threeDWidget( 0 );
this->InstructionLabel = new QLabel( "" );
this->InstructionLabel->setAlignment( Qt::AlignCenter );
this->InstructionLabel->setStyleSheet("QLabel { background-color : white; color : black; font-size : 24px }");
this->InstructionLabel->setStyleSheet("QLabel { background-color : white; color : black; font-size : 24px }"); // TODO: Follow style guide
qSlicerApplication::application()->layoutManager()->threeDWidget( 0 )->layout()->addWidget( this->InstructionLabel );
}

Expand All @@ -312,21 +333,21 @@ void qSlicerWorkflowSegmentationModuleWidget::enableButtons()
// Disabling node selector widgets if there is no module node to reference input nodes.
if ( d->logic()->GetModuleNode() == NULL )
{
d->WorkflowProcedureButton->setEnabled( false );
d->WorkflowInputButton->setEnabled( false );
d->WorkflowTrainingButton->setEnabled( false );
d->WorkflowProcedureButton->setEnabled( false );
d->WorkflowInputButton->setEnabled( false );
d->WorkflowTrainingButton->setEnabled( false );

d->WorkflowTrainingFilesButton->setEnabled( false );
d->TrainButton->setEnabled( false );
d->WorkflowTrainingFilesButton->setEnabled( false );
d->TrainButton->setEnabled( false );

d->ToolsAvailableTableWidget->setRowCount( 0 );
d->ToolsAvailableTableWidget->setColumnCount( 1 );

return;
return;
}
else
{
d->WorkflowProcedureButton->setEnabled( true );
d->WorkflowProcedureButton->setEnabled( true );
}

// If the algorithms are procedure defined
Expand All @@ -343,48 +364,43 @@ void qSlicerWorkflowSegmentationModuleWidget::enableButtons()
if ( ! d->logic()->GetWorkflowAlgorithmsInputted() )
{
d->WorkflowTrainingButton->setEnabled( false );
d->WorkflowTrainingFilesButton->setEnabled( false );
d->TrainButton->setEnabled( false );
d->WorkflowTrainingFilesButton->setEnabled( false );
d->TrainButton->setEnabled( false );
}
else
{
d->WorkflowTrainingButton->setEnabled( true );
d->WorkflowTrainingFilesButton->setEnabled( true );
d->TrainButton->setEnabled( true );
d->WorkflowTrainingFilesButton->setEnabled( true );
d->TrainButton->setEnabled( true );
}

}


void qSlicerWorkflowSegmentationModuleWidget::resetWidget()
{
Q_D( qSlicerWorkflowSegmentationModuleWidget );

d->logic()->ResetWorkflowAlgorithms();
}


void qSlicerWorkflowSegmentationModuleWidget::updateWidget()
{
Q_D( qSlicerWorkflowSegmentationModuleWidget );

// All the other things are taken care of by the TransformRecord logic/widgets
enableButtons();
this->enableButtons();

if ( d->logic() == NULL || d->logic()->GetModuleNode() == NULL )
{
return;
}

if ( this->BufferStatus != d->TransformBufferWidget->BufferStatus )
{
d->logic()->ResetWorkflowAlgorithms();
}

if ( this->BufferStatus == d->TransformBufferWidget->BufferStatus && this->BufferTransformsStatus == d->TransformBufferWidget->BufferTransformsStatus )
{
return;
}
this->BufferStatus = d->TransformBufferWidget->BufferStatus;
this->BufferTransformsStatus = d->TransformBufferWidget->BufferStatus;

// This updates the tasks
d->logic()->Update( d->TransformBufferWidget->GetBufferNode() );
d->logic()->Update( d->TransformBufferWidget->BufferHelper->GetTransformBufferNode() );

this->InstructionLabel->setText( d->logic()->GetToolInstructions( d->TransformBufferWidget->GetBufferNode() ).c_str() );
this->InstructionLabel->setText( d->logic()->GetToolInstructions( d->TransformBufferWidget->BufferHelper->GetTransformBufferNode() ).c_str() );

d->ToolsAvailableTableWidget->setRowCount( 0 );
d->ToolsAvailableTableWidget->setColumnCount( 1 );
Expand All @@ -399,19 +415,19 @@ void qSlicerWorkflowSegmentationModuleWidget::updateWidget()
std::string currentString = "";

currentString += currentTool->Name + " (";
if ( ! currentTool->Inputted )
{
if ( ! currentTool->Inputted )
{
currentString += "Not ";
}
}
currentString += "Inputted, ";
if ( ! currentTool->Trained )
{
if ( ! currentTool->Trained )
{
currentString += "Not ";
}
currentString += "Trained)";
}
currentString += "Trained)";

QTableWidgetItem* toolWidget = new QTableWidgetItem( QString::fromStdString( currentString ) );
d->ToolsAvailableTableWidget->setItem( i, 0, toolWidget );
QTableWidgetItem* toolWidget = new QTableWidgetItem( QString::fromStdString( currentString ) );
d->ToolsAvailableTableWidget->setItem( i, 0, toolWidget );
}

d->ToolsAvailableTableWidget->horizontalHeader()->hide();
Expand Down
14 changes: 7 additions & 7 deletions qSlicerWorkflowSegmentationModuleWidget.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,9 @@
#include "qSlicerAbstractModuleWidget.h"
#include <QtGui>
#include "qSlicerWorkflowSegmentationModuleExport.h"

#include "qSlicerMessagesWidget.h"
#include "qSlicerTransformBufferWidget.h"
#include "qSlicerWorkflowSegmentationRecorderControlsWidget.h"

class qSlicerWorkflowSegmentationModuleWidgetPrivate;
Expand All @@ -26,16 +28,12 @@ class Q_SLICER_QTMODULES_WORKFLOWSEGMENTATION_EXPORT qSlicerWorkflowSegmentation
qSlicerWorkflowSegmentationModuleWidget(QWidget *parent=0);
virtual ~qSlicerWorkflowSegmentationModuleWidget();

// This widget will keep track if the buffer is changed
unsigned long BufferStatus;
// These quantities might be repeated by different buffers, so we still need the above
unsigned long BufferTransformsStatus;


protected:
QScopedPointer<qSlicerWorkflowSegmentationModuleWidgetPrivate> d_ptr;

virtual void setup();
virtual void setupEmbeddedWidgets();

virtual void enter();
virtual void exit();

Expand All @@ -50,8 +48,10 @@ protected slots:
void onTrainButtonClicked();

void setupInstructions();
void enableButtons();
void enableButtons();

void updateWidget();
void resetWidget();

private:
Q_DECLARE_PRIVATE(qSlicerWorkflowSegmentationModuleWidget);
Expand Down

0 comments on commit 2ab865b

Please sign in to comment.