You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
190 lines
6.3 KiB
C++
190 lines
6.3 KiB
C++
/*=========================================================================
|
|
|
|
Program: Visualization Toolkit
|
|
Module: vtkBorderWidget.h
|
|
|
|
Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
|
|
All rights reserved.
|
|
See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
|
|
|
|
This software is distributed WITHOUT ANY WARRANTY; without even
|
|
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
|
PURPOSE. See the above copyright notice for more information.
|
|
|
|
=========================================================================*/
|
|
/**
|
|
* @class vtkBorderWidget
|
|
* @brief place a border around a 2D rectangular region
|
|
*
|
|
* This class is a superclass for 2D widgets that may require a rectangular
|
|
* border. Besides drawing a border, the widget provides methods for resizing
|
|
* and moving the rectangular region (and associated border). The widget
|
|
* provides methods and internal data members so that subclasses can take
|
|
* advantage of this widgets capabilities, requiring only that the subclass
|
|
* defines a "representation", i.e., some combination of props or actors
|
|
* that can be managed in the 2D rectangular region.
|
|
*
|
|
* The class defines basic positioning functionality, including the ability
|
|
* to size the widget with locked x/y proportions. The area within the border
|
|
* may be made "selectable" as well, meaning that a selection event interior
|
|
* to the widget invokes a virtual SelectRegion() method, which can be used
|
|
* to pick objects or otherwise manipulate data interior to the widget.
|
|
*
|
|
* @par Event Bindings:
|
|
* By default, the widget responds to the following VTK events (i.e., it
|
|
* watches the vtkRenderWindowInteractor for these events):
|
|
* <pre>
|
|
* On the boundary of the widget:
|
|
* LeftButtonPressEvent - select boundary
|
|
* LeftButtonReleaseEvent - deselect boundary
|
|
* MouseMoveEvent - move/resize widget depending on which portion of the
|
|
* boundary was selected.
|
|
* On the interior of the widget:
|
|
* LeftButtonPressEvent - invoke SelectButton() callback (if the ivar
|
|
* Selectable is on)
|
|
* Anywhere on the widget:
|
|
* MiddleButtonPressEvent - move the widget
|
|
* </pre>
|
|
*
|
|
* @par Event Bindings:
|
|
* Note that the event bindings described above can be changed using this
|
|
* class's vtkWidgetEventTranslator. This class translates VTK events
|
|
* into the vtkBorderWidget's widget events:
|
|
* <pre>
|
|
* vtkWidgetEvent::Select -- some part of the widget has been selected
|
|
* vtkWidgetEvent::EndSelect -- the selection process has completed
|
|
* vtkWidgetEvent::Translate -- the widget is to be translated
|
|
* vtkWidgetEvent::Move -- a request for slider motion has been invoked
|
|
* </pre>
|
|
*
|
|
* @par Event Bindings:
|
|
* In turn, when these widget events are processed, this widget invokes the
|
|
* following VTK events on itself (which observers can listen for):
|
|
* <pre>
|
|
* vtkCommand::StartInteractionEvent (on vtkWidgetEvent::Select)
|
|
* vtkCommand::EndInteractionEvent (on vtkWidgetEvent::EndSelect)
|
|
* vtkCommand::InteractionEvent (on vtkWidgetEvent::Move)
|
|
* </pre>
|
|
*
|
|
* @sa
|
|
* vtkInteractorObserver vtkCameraInterpolator
|
|
*/
|
|
|
|
#ifndef vtkBorderWidget_h
|
|
#define vtkBorderWidget_h
|
|
|
|
#include "vtkAbstractWidget.h"
|
|
#include "vtkInteractionWidgetsModule.h" // For export macro
|
|
|
|
class vtkBorderRepresentation;
|
|
|
|
class VTKINTERACTIONWIDGETS_EXPORT vtkBorderWidget : public vtkAbstractWidget
|
|
{
|
|
public:
|
|
/**
|
|
* Method to instantiate class.
|
|
*/
|
|
static vtkBorderWidget* New();
|
|
|
|
//@{
|
|
/**
|
|
* Standard methods for class.
|
|
*/
|
|
vtkTypeMacro(vtkBorderWidget, vtkAbstractWidget);
|
|
void PrintSelf(ostream& os, vtkIndent indent) override;
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* Indicate whether the interior region of the widget can be selected or
|
|
* not. If not, then events (such as left mouse down) allow the user to
|
|
* "move" the widget, and no selection is possible. Otherwise the
|
|
* SelectRegion() method is invoked.
|
|
*/
|
|
vtkSetMacro(Selectable, vtkTypeBool);
|
|
vtkGetMacro(Selectable, vtkTypeBool);
|
|
vtkBooleanMacro(Selectable, vtkTypeBool);
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* Indicate whether the boundary of the widget can be resized.
|
|
* If not, the cursor will not change to "resize" type when mouse
|
|
* over the boundary.
|
|
*/
|
|
vtkSetMacro(Resizable, vtkTypeBool);
|
|
vtkGetMacro(Resizable, vtkTypeBool);
|
|
vtkBooleanMacro(Resizable, vtkTypeBool);
|
|
//@}
|
|
|
|
/**
|
|
* Specify an instance of vtkWidgetRepresentation used to represent this
|
|
* widget in the scene. Note that the representation is a subclass of vtkProp
|
|
* so it can be added to the renderer independent of the widget.
|
|
*/
|
|
void SetRepresentation(vtkBorderRepresentation* r)
|
|
{
|
|
this->Superclass::SetWidgetRepresentation(reinterpret_cast<vtkWidgetRepresentation*>(r));
|
|
}
|
|
|
|
/**
|
|
* Return the representation as a vtkBorderRepresentation.
|
|
*/
|
|
vtkBorderRepresentation* GetBorderRepresentation()
|
|
{
|
|
return reinterpret_cast<vtkBorderRepresentation*>(this->WidgetRep);
|
|
}
|
|
|
|
/**
|
|
* Create the default widget representation if one is not set.
|
|
*/
|
|
void CreateDefaultRepresentation() override;
|
|
|
|
protected:
|
|
vtkBorderWidget();
|
|
~vtkBorderWidget() override;
|
|
|
|
/**
|
|
* Subclasses generally implement this method. The SelectRegion() method
|
|
* offers a subclass the chance to do something special if the interior
|
|
* of the widget is selected.
|
|
*/
|
|
virtual void SelectRegion(double eventPos[2]);
|
|
|
|
// enable the selection of the region interior to the widget
|
|
vtkTypeBool Selectable;
|
|
vtkTypeBool Resizable;
|
|
|
|
// processes the registered events
|
|
static void SelectAction(vtkAbstractWidget*);
|
|
static void TranslateAction(vtkAbstractWidget*);
|
|
static void EndSelectAction(vtkAbstractWidget*);
|
|
static void MoveAction(vtkAbstractWidget*);
|
|
|
|
// Special internal methods to support subclasses handling events.
|
|
// If a non-zero value is returned, the subclass is handling the event.
|
|
virtual int SubclassSelectAction() { return 0; }
|
|
virtual int SubclassTranslateAction() { return 0; }
|
|
virtual int SubclassEndSelectAction() { return 0; }
|
|
virtual int SubclassMoveAction() { return 0; }
|
|
|
|
// helper methods for cursoe management
|
|
void SetCursor(int State) override;
|
|
|
|
// widget state
|
|
int WidgetState;
|
|
enum _WidgetState
|
|
{
|
|
Start = 0,
|
|
Define,
|
|
Manipulate,
|
|
Selected
|
|
};
|
|
|
|
private:
|
|
vtkBorderWidget(const vtkBorderWidget&) = delete;
|
|
void operator=(const vtkBorderWidget&) = delete;
|
|
};
|
|
|
|
#endif
|