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.

292 lines
8.7 KiB
C++

/*=========================================================================
Program: Visualization Toolkit
Module: vtkBorderRepresentation.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 vtkBorderRepresentation
* @brief represent a vtkBorderWidget
*
* This class is used to represent and render a vtBorderWidget. To
* use this class, you need to specify the two corners of a rectangular
* region.
*
* The class is typically subclassed so that specialized representations can
* be created. The class defines an API and a default implementation that
* the vtkBorderRepresentation interacts with to render itself in the scene.
*
* @warning
* The separation of the widget event handling (e.g., vtkBorderWidget) from
* the representation (vtkBorderRepresentation) enables users and developers
* to create new appearances for the widget. It also facilitates parallel
* processing, where the client application handles events, and remote
* representations of the widget are slaves to the client (and do not handle
* events).
*
* @sa
* vtkBorderWidget vtkTextWidget
*/
#ifndef vtkBorderRepresentation_h
#define vtkBorderRepresentation_h
#include "vtkCoordinate.h" //Because of the viewport coordinate macro
#include "vtkInteractionWidgetsModule.h" // For export macro
#include "vtkWidgetRepresentation.h"
class vtkPoints;
class vtkPolyData;
class vtkTransform;
class vtkTransformPolyDataFilter;
class vtkPolyDataMapper2D;
class vtkActor2D;
class vtkProperty2D;
class VTKINTERACTIONWIDGETS_EXPORT vtkBorderRepresentation : public vtkWidgetRepresentation
{
public:
/**
* Instantiate this class.
*/
static vtkBorderRepresentation* New();
//@{
/**
* Define standard methods.
*/
vtkTypeMacro(vtkBorderRepresentation, vtkWidgetRepresentation);
void PrintSelf(ostream& os, vtkIndent indent) override;
//@}
//@{
/**
* Specify opposite corners of the box defining the boundary of the
* widget. By default, these coordinates are in the normalized viewport
* coordinate system, with Position the lower left of the outline, and
* Position2 relative to Position. Note that using these methods are
* affected by the ProportionalResize flag. That is, if the aspect ratio of
* the representation is to be preserved (e.g., ProportionalResize is on),
* then the rectangle (Position,Position2) is a bounding rectangle.
*/
vtkViewportCoordinateMacro(Position);
vtkViewportCoordinateMacro(Position2);
//@}
enum
{
BORDER_OFF = 0,
BORDER_ON,
BORDER_ACTIVE
};
//@{
/**
* Specify when and if the border should appear. If ShowBorder is "on",
* then the border will always appear. If ShowBorder is "off" then the
* border will never appear. If ShowBorder is "active" then the border
* will appear when the mouse pointer enters the region bounded by the
* border widget.
* This method is provided as conveniency to set both horizontal and
* vertical borders.
* BORDER_ON by default.
* See Also: SetShowHorizontalBorder(), SetShowVerticalBorder()
*/
virtual void SetShowBorder(int border);
virtual int GetShowBorderMinValue();
virtual int GetShowBorderMaxValue();
virtual int GetShowBorder();
void SetShowBorderToOff() { this->SetShowBorder(BORDER_OFF); }
void SetShowBorderToOn() { this->SetShowBorder(BORDER_ON); }
void SetShowBorderToActive() { this->SetShowBorder(BORDER_ACTIVE); }
//@}
//@{
/**
* Specify when and if the vertical border should appear.
* See Also: SetShowBorder(), SetShowHorizontalBorder()
*/
vtkSetClampMacro(ShowVerticalBorder, int, BORDER_OFF, BORDER_ACTIVE);
vtkGetMacro(ShowVerticalBorder, int);
//@}
//@{
/**
* Specify when and if the horizontal border should appear.
* See Also: SetShowBorder(), SetShowVerticalBorder()
*/
vtkSetClampMacro(ShowHorizontalBorder, int, BORDER_OFF, BORDER_ACTIVE);
vtkGetMacro(ShowHorizontalBorder, int);
//@}
//@{
/**
* Specify the properties of the border.
*/
vtkGetObjectMacro(BorderProperty, vtkProperty2D);
//@}
//@{
/**
* Indicate whether resizing operations should keep the x-y directions
* proportional to one another. Also, if ProportionalResize is on, then
* the rectangle (Position,Position2) is a bounding rectangle, and the
* representation will be placed in the rectangle in such a way as to
* preserve the aspect ratio of the representation.
*/
vtkSetMacro(ProportionalResize, vtkTypeBool);
vtkGetMacro(ProportionalResize, vtkTypeBool);
vtkBooleanMacro(ProportionalResize, vtkTypeBool);
//@}
//@{
/**
* Specify a minimum and/or maximum size (in pixels) that this representation
* can take. These methods require two values: size values in the x and y
* directions, respectively.
*/
vtkSetVector2Macro(MinimumSize, int);
vtkGetVector2Macro(MinimumSize, int);
vtkSetVector2Macro(MaximumSize, int);
vtkGetVector2Macro(MaximumSize, int);
//@}
//@{
/**
* The tolerance representing the distance to the widget (in pixels)
* in which the cursor is considered to be on the widget, or on a
* widget feature (e.g., a corner point or edge).
*/
vtkSetClampMacro(Tolerance, int, 1, 10);
vtkGetMacro(Tolerance, int);
//@}
//@{
/**
* After a selection event within the region interior to the border; the
* normalized selection coordinates may be obtained.
*/
vtkGetVectorMacro(SelectionPoint, double, 2);
//@}
//@{
/**
* This is a modifier of the interaction state. When set, widget interaction
* allows the border (and stuff inside of it) to be translated with mouse
* motion.
*/
vtkSetMacro(Moving, vtkTypeBool);
vtkGetMacro(Moving, vtkTypeBool);
vtkBooleanMacro(Moving, vtkTypeBool);
//@}
/**
* Define the various states that the representation can be in.
*/
enum _InteractionState
{
Outside = 0,
Inside,
AdjustingP0,
AdjustingP1,
AdjustingP2,
AdjustingP3,
AdjustingE0,
AdjustingE1,
AdjustingE2,
AdjustingE3
};
/**
* Return the MTime of this object. It takes into account MTimes
* of position coordinates and border's property.
*/
vtkMTimeType GetMTime() override;
//@{
/**
* Subclasses should implement these methods. See the superclasses'
* documentation for more information.
*/
void BuildRepresentation() override;
void StartWidgetInteraction(double eventPos[2]) override;
void WidgetInteraction(double eventPos[2]) override;
virtual void GetSize(double size[2])
{
size[0] = 1.0;
size[1] = 1.0;
}
int ComputeInteractionState(int X, int Y, int modify = 0) override;
//@}
//@{
/**
* These methods are necessary to make this representation behave as
* a vtkProp.
*/
void GetActors2D(vtkPropCollection*) override;
void ReleaseGraphicsResources(vtkWindow*) override;
int RenderOverlay(vtkViewport*) override;
int RenderOpaqueGeometry(vtkViewport*) override;
int RenderTranslucentPolygonalGeometry(vtkViewport*) override;
vtkTypeBool HasTranslucentPolygonalGeometry() override;
//@}
protected:
vtkBorderRepresentation();
~vtkBorderRepresentation() override;
// Ivars
int ShowVerticalBorder;
int ShowHorizontalBorder;
vtkProperty2D* BorderProperty;
vtkTypeBool ProportionalResize;
int Tolerance;
vtkTypeBool Moving;
double SelectionPoint[2];
// Layout (position of lower left and upper right corners of border)
vtkCoordinate* PositionCoordinate;
vtkCoordinate* Position2Coordinate;
// Sometimes subclasses must negotiate with their superclasses
// to achieve the correct layout.
int Negotiated;
virtual void NegotiateLayout();
// Update the border visibility based on InteractionState.
// See Also: SetShowHorizontalBorder(), SetShowHorizontalBorder(),
// ComputeInteractionState()
virtual void UpdateShowBorder();
// Keep track of start position when moving border
double StartPosition[2];
// Border representation. Subclasses may use the BWTransform class
// to transform their geometry into the region surrounded by the border.
vtkPoints* BWPoints;
vtkPolyData* BWPolyData;
vtkTransform* BWTransform;
vtkTransformPolyDataFilter* BWTransformFilter;
vtkPolyDataMapper2D* BWMapper;
vtkActor2D* BWActor;
// Constraints on size
int MinimumSize[2];
int MaximumSize[2];
private:
vtkBorderRepresentation(const vtkBorderRepresentation&) = delete;
void operator=(const vtkBorderRepresentation&) = delete;
};
#endif