Difference between revisions of "Documentation/Nightly/Developers/Layouts"

From Slicer Wiki
Jump to: navigation, search
Line 32: Line 32:
  
 
== Example ==
 
== Example ==
 +
 +
Example of CustomLayout
 +
 +
<pre>
 +
#ifndef __qSlicerAstroVolumeLayoutSliceViewFactory_h
 +
#define __qSlicerAstroVolumeLayoutSliceViewFactory_h
 +
 +
// SlicerQt includes
 +
#include "qMRMLLayoutManager.h"
 +
#include "qMRMLLayoutManager_p.h"
 +
 +
// VTK includes
 +
#include <vtkWeakPointer.h>
 +
 +
#include "qSlicerAstroVolumeModuleExport.h"
 +
 +
class qSlicerAstroVolumeLayoutSliceViewFactoryPrivate;
 +
 +
/// \ingroup Slicer_QtModules_AstroVolume
 +
class Q_SLICER_QTMODULES_ASTROVOLUME_EXPORT qSlicerAstroVolumeLayoutSliceViewFactory
 +
: public qMRMLLayoutSliceViewFactory
 +
{
 +
  Q_OBJECT
 +
public:
 +
  typedef qMRMLLayoutSliceViewFactory Superclass;
 +
  qSlicerAstroVolumeLayoutSliceViewFactory(QObject* parent);
 +
  virtual ~qSlicerAstroVolumeLayoutSliceViewFactory();
 +
 +
  virtual QString viewClassName()const;
 +
 +
protected:
 +
 +
  virtual QWidget* createViewFromNode(vtkMRMLAbstractViewNode* viewNode);
 +
  virtual void deleteView(vtkMRMLAbstractViewNode* viewNode);
 +
 +
private:
 +
  Q_DECLARE_PRIVATE(qSlicerAstroVolumeLayoutSliceViewFactory);
 +
  Q_DISABLE_COPY(qSlicerAstroVolumeLayoutSliceViewFactory);
 +
};
 +
 +
#endif
 +
</pre>
 +
 +
//-----------------------------------------------------------------------------
 +
qSlicerAstroVolumeLayoutSliceViewFactory::qSlicerAstroVolumeLayoutSliceViewFactory(QObject* _parent)
 +
  : Superclass(_parent)
 +
{
 +
}
 +
 +
//-----------------------------------------------------------------------------
 +
qSlicerAstroVolumeLayoutSliceViewFactory::~qSlicerAstroVolumeLayoutSliceViewFactory()
 +
{
 +
}
 +
 +
//-----------------------------------------------------------------------------
 +
QWidget* qSlicerAstroVolumeLayoutSliceViewFactory::createViewFromNode(vtkMRMLAbstractViewNode* viewNode)
 +
{
 +
  if (!this->layoutManager() || !viewNode)
 +
    {// can't create a slice widget if there is no parent widget
 +
    Q_ASSERT(viewNode);
 +
    return 0;
 +
    }
 +
 +
  // there is a unique slice widget per node
 +
  Q_ASSERT(!this->viewWidget(viewNode));
 +
 +
  qMRMLSliceAstroWidget * sliceWidget = new qMRMLSliceAstroWidget(this->layoutManager()->viewport());
 +
  sliceWidget->sliceController()->setControllerButtonGroup(this->SliceControllerButtonGroup);
 +
  QString sliceLayoutName(viewNode->GetLayoutName());
 +
  QString sliceViewLabel(viewNode->GetLayoutLabel());
 +
  vtkMRMLSliceNode* sliceNode = vtkMRMLSliceNode::SafeDownCast(viewNode);
 +
  QColor sliceLayoutColor = QColor::fromRgbF(sliceNode->GetLayoutColor()[0],
 +
                                            sliceNode->GetLayoutColor()[1],
 +
                                            sliceNode->GetLayoutColor()[2]);
 +
  sliceWidget->setSliceViewName(sliceLayoutName);
 +
  sliceWidget->setObjectName(QString("qMRMLSliceWidget" + sliceLayoutName));
 +
  sliceWidget->setSliceViewLabel(sliceViewLabel);
 +
  sliceWidget->setSliceViewColor(sliceLayoutColor);
 +
  sliceWidget->setMRMLScene(this->mrmlScene());
 +
  sliceWidget->setMRMLSliceNode(sliceNode);
 +
  sliceWidget->setSliceLogics(this->sliceLogics());
 +
 +
  this->sliceLogics()->AddItem(sliceWidget->sliceLogic());
 +
 +
  return sliceWidget;
 +
}
 +
 +
void qSlicerAstroVolumeLayoutSliceViewFactory::deleteView(vtkMRMLAbstractViewNode *viewNode)
 +
{
 +
  qMRMLSliceAstroWidget* sliceWidget =
 +
    qobject_cast<qMRMLSliceAstroWidget*>(this->viewWidget(viewNode));
 +
  if (sliceWidget)
 +
    {
 +
    this->sliceLogics()->RemoveItem(sliceWidget->sliceLogic());
 +
    }
 +
  this->Superclass::deleteView(viewNode);
 +
}
 +
 +
QString qSlicerAstroVolumeLayoutSliceViewFactory::viewClassName() const
 +
{
 +
  return "vtkMRMLSliceNode";
 +
}
 +
 +
<pre>
 +
 +
</pre>

Revision as of 20:01, 8 June 2016

Home < Documentation < Nightly < Developers < Layouts


For the latest Slicer documentation, visit the read-the-docs.


Layout

Main classes

Layout mechanism

How to change the layout ?

How to register a new layout ?

  qMRMLLayoutSliceViewFactory* mrmlSliceViewFactory =
    qobject_cast<qMRMLLayoutSliceViewFactory*>(
    d->app->layoutManager()->mrmlViewFactory("vtkMRMLSliceNode"));

  qSlicerCustomLayoutSliceViewFactory* customSliceViewFactory =
    new qSlicerCustomLayoutSliceViewFactory(d->app->layoutManager());
  customSliceViewFactory->setSliceLogics(mrmlSliceViewFactory->sliceLogics());

  d->app->layoutManager()->unregisterViewFactory(mrmlSliceViewFactory);
  d->app->layoutManager()->registerViewFactory(customSliceViewFactory);

View XML elements

Example

Example of CustomLayout

#ifndef __qSlicerAstroVolumeLayoutSliceViewFactory_h
#define __qSlicerAstroVolumeLayoutSliceViewFactory_h

// SlicerQt includes
#include "qMRMLLayoutManager.h"
#include "qMRMLLayoutManager_p.h"

// VTK includes
#include <vtkWeakPointer.h>

#include "qSlicerAstroVolumeModuleExport.h"

class qSlicerAstroVolumeLayoutSliceViewFactoryPrivate;

/// \ingroup Slicer_QtModules_AstroVolume
class Q_SLICER_QTMODULES_ASTROVOLUME_EXPORT qSlicerAstroVolumeLayoutSliceViewFactory
 : public qMRMLLayoutSliceViewFactory
{
  Q_OBJECT
public:
  typedef qMRMLLayoutSliceViewFactory Superclass;
  qSlicerAstroVolumeLayoutSliceViewFactory(QObject* parent);
  virtual ~qSlicerAstroVolumeLayoutSliceViewFactory();

  virtual QString viewClassName()const;

protected:

  virtual QWidget* createViewFromNode(vtkMRMLAbstractViewNode* viewNode);
  virtual void deleteView(vtkMRMLAbstractViewNode* viewNode);

private:
  Q_DECLARE_PRIVATE(qSlicerAstroVolumeLayoutSliceViewFactory);
  Q_DISABLE_COPY(qSlicerAstroVolumeLayoutSliceViewFactory);
};

#endif

//----------------------------------------------------------------------------- qSlicerAstroVolumeLayoutSliceViewFactory::qSlicerAstroVolumeLayoutSliceViewFactory(QObject* _parent)

 : Superclass(_parent)

{ }

//----------------------------------------------------------------------------- qSlicerAstroVolumeLayoutSliceViewFactory::~qSlicerAstroVolumeLayoutSliceViewFactory() { }

//----------------------------------------------------------------------------- QWidget* qSlicerAstroVolumeLayoutSliceViewFactory::createViewFromNode(vtkMRMLAbstractViewNode* viewNode) {

 if (!this->layoutManager() || !viewNode)
   {// can't create a slice widget if there is no parent widget
   Q_ASSERT(viewNode);
   return 0;
   }
 // there is a unique slice widget per node
 Q_ASSERT(!this->viewWidget(viewNode));
 qMRMLSliceAstroWidget * sliceWidget = new qMRMLSliceAstroWidget(this->layoutManager()->viewport());
 sliceWidget->sliceController()->setControllerButtonGroup(this->SliceControllerButtonGroup);
 QString sliceLayoutName(viewNode->GetLayoutName());
 QString sliceViewLabel(viewNode->GetLayoutLabel());
 vtkMRMLSliceNode* sliceNode = vtkMRMLSliceNode::SafeDownCast(viewNode);
 QColor sliceLayoutColor = QColor::fromRgbF(sliceNode->GetLayoutColor()[0],
                                            sliceNode->GetLayoutColor()[1],
                                            sliceNode->GetLayoutColor()[2]);
 sliceWidget->setSliceViewName(sliceLayoutName);
 sliceWidget->setObjectName(QString("qMRMLSliceWidget" + sliceLayoutName));
 sliceWidget->setSliceViewLabel(sliceViewLabel);
 sliceWidget->setSliceViewColor(sliceLayoutColor);
 sliceWidget->setMRMLScene(this->mrmlScene());
 sliceWidget->setMRMLSliceNode(sliceNode);
 sliceWidget->setSliceLogics(this->sliceLogics());
 this->sliceLogics()->AddItem(sliceWidget->sliceLogic());
 return sliceWidget;

}

void qSlicerAstroVolumeLayoutSliceViewFactory::deleteView(vtkMRMLAbstractViewNode *viewNode) {

 qMRMLSliceAstroWidget* sliceWidget =
   qobject_cast<qMRMLSliceAstroWidget*>(this->viewWidget(viewNode));
 if (sliceWidget)
   {
   this->sliceLogics()->RemoveItem(sliceWidget->sliceLogic());
   }
 this->Superclass::deleteView(viewNode);

}

QString qSlicerAstroVolumeLayoutSliceViewFactory::viewClassName() const {

 return "vtkMRMLSliceNode";

}