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

From Slicer Wiki
Jump to: navigation, search
(Prepend documentation/versioncheck template. See http://na-mic.org/Mantis/view.php?id=2887)
 
(6 intermediate revisions by 2 users not shown)
Line 2: Line 2:
 
=Layout=
 
=Layout=
 
== Main classes ==
 
== Main classes ==
* <code>[http://slicer.org/doc/html/classvtkMRMLLayoutNode.html vtkMRMLLayoutNode]</code>: Node that describes the layout of the views. There is only one layout node in the scene (singleton)
+
* [{{doxygen-class-url|vtkMRMLLayoutNode}}#details vtkMRMLLayoutNode]: Node that describes the layout of the views. There is only one layout node in the scene (singleton)
* <code>[http://slicer.org/doc/html/classvtkMRMLLayoutLogic.html vtkMRMLLayoutLogic]</code>: Control/observe the layout node. Automatically create the view nodes if needed (referenced in the layout node description but not in the scene).   
+
* [{{doxygen-class-url|vtkMRMLLayoutLogic}}#details vtkMRMLLayoutLogic]: Control/observe the layout node. Automatically create the view nodes if needed (referenced in the layout node description but not in the scene).   
* <code>[http://slicer.org/doc/html/classvtkMRMLAbstractViewNode.html vtkMRMLAbstractViewNode]</code>: Abstract class for all the view nodes (such as [http://slicer.org/doc/html/classvtkMRMLSliceNode.html vtkMRMLSliceNode], [http://slicer.org/doc/html/classvtkMRMLViewNode.html vtkMRMLViewNode], [http://slicer.org/doc/html/classvtkMRMLChartViewNode.html vtkMRMLChartViewNode]) that can be into a layout.
+
* [{{doxygen-class-url|vtkMRMLAbstractViewNode}}#details vtkMRMLAbstractViewNode]: Abstract class for all the view nodes (such as [{{doxygen-class-url|vtkMRMLSliceNode}}#details vtkMRMLSliceNode], [{{doxygen-class-url|vtkMRMLViewNode}}#details vtkMRMLViewNode], [{{doxygen-class-url|vtkMRMLChartViewNode}}#details vtkMRMLChartViewNode]) that can be into a layout.
 
* <code>[http://www.commontk.org/docs/html/classctkLayoutManager.html ctkLayoutManager]</code>: Mechanism to convert the layout description (xml) into a Qt layout with Qt widgets.  
 
* <code>[http://www.commontk.org/docs/html/classctkLayoutManager.html ctkLayoutManager]</code>: Mechanism to convert the layout description (xml) into a Qt layout with Qt widgets.  
* <code>[http://slicer.org/doc/html/classqMRMLLayoutManager.html qMRMLLayoutManager]</code>: Specialized version of ctkLayoutManager to handle MRML only views and properties.   
+
* [{{doxygen-class-url|qMRMLLayoutManager}}#details qMRMLLayoutManager]: Specialized version of ctkLayoutManager to handle MRML only views and properties.   
* <code>[http://slicer.org/doc/html/classqSlicerLayoutManager.html qSlicerLayoutManager]</code>: Specialized version of qMRMLLayoutManager to handle Slicer specific behaviors. The Slicer layout manager is accessible from the [http://slicer.org/doc/html/classqSlicerApplication.html qSlicerApplication] singleton.
+
* [{{doxygen-class-url|qSlicerLayoutManager}}#details qSlicerLayoutManager]: Specialized version of qMRMLLayoutManager to handle Slicer specific behaviors. The Slicer layout manager is accessible from the [{{doxygen-class-url|qSlicerApplication}}#details qSlicerApplication] singleton.
  
 
==Layout mechanism==
 
==Layout mechanism==
Line 14: Line 14:
  
 
==How to register a new layout ?==
 
==How to register a new layout ?==
 +
 +
 +
<pre>
 +
  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);
 +
</pre>
  
 
== View XML elements ==
 
== View XML elements ==
 +
 +
<pre>
 +
vtkMRMLLayoutNode* layoutNode =  vtkMRMLLayoutNode::SafeDownCast(
 +
    this->mrmlScene()->GetSingletonNode("vtkMRMLLayoutNode","vtkMRMLLayoutNode"));
 +
std::string layoutDescription = layoutNode->GetLayoutDescription(index);
 +
</pre>
 +
 +
Layout descriptions can be modified using the SetLayoutDescription method
  
 
== Example ==
 
== Example ==
 +
 +
Example of qSlicerCustomLayoutSliceViewFactory:
 +
 +
<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>
 +
 +
 +
<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>

Latest revision as of 20:12, 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

vtkMRMLLayoutNode* layoutNode =  vtkMRMLLayoutNode::SafeDownCast(
    this->mrmlScene()->GetSingletonNode("vtkMRMLLayoutNode","vtkMRMLLayoutNode"));
std::string layoutDescription = layoutNode->GetLayoutDescription(index);

Layout descriptions can be modified using the SetLayoutDescription method

Example

Example of qSlicerCustomLayoutSliceViewFactory:

#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";
}