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.

200 lines
7.4 KiB
C

/*=========================================================================
Program: Visualization Toolkit
Module: vtkAbstractWidget.h,v
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 vtkAbstractWidget
* @brief define the API for widget / widget representation
*
* The vtkAbstractWidget defines an API and implements methods common to all
* widgets using the interaction/representation design. In this design, the
* term interaction means that part of the widget that performs event
* handling, while the representation corresponds to a vtkProp (or the
* subclass vtkWidgetRepresentation) used to represent the
* widget. vtkAbstractWidget also implements some methods common to all
* subclasses.
*
* Note that vtkAbstractWidget provides access to the
* vtkWidgetEventTranslator. This class is responsible for translating VTK
* events (defined in vtkCommand.h) into widget events (defined in
* vtkWidgetEvent.h). This class can be manipulated so that different VTK
* events can be mapped into widget events, thereby allowing the modification
* of event bindings. Each subclass of vtkAbstractWidget defines the events
* to which it responds.
*
* @warning
* Note that the pair ( vtkAbstractWidget / vtkWidgetRepresentation ) is an
* implementation of the second generation VTK Widgets design. In the first
* generation design, widgets were implemented in a single monolithic
* class. This design was problematic because in client-server application
* it was difficult to manage widgets properly. Also, new "representations"
* or look-and-feel, for a widget required a whole new class, with a lot of
* redundant code. The separation of the widget event handling and
* representation 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
* vtkWidgetRepresentation vtkWidgetEventTranslator vtkWidgetCallbackMapper
*/
#ifndef vtkAbstractWidget_h
#define vtkAbstractWidget_h
#include "vtkInteractionWidgetsModule.h" // For export macro
#include "vtkInteractorObserver.h"
class vtkWidgetEventTranslator;
class vtkWidgetCallbackMapper;
class vtkWidgetRepresentation;
class VTKINTERACTIONWIDGETS_EXPORT vtkAbstractWidget : public vtkInteractorObserver
{
public:
//@{
/**
* Standard macros implementing standard VTK methods.
*/
vtkTypeMacro(vtkAbstractWidget, vtkInteractorObserver);
void PrintSelf(ostream& os, vtkIndent indent) override;
//@}
/**
* Methods for activating this widget. Note that the widget representation
* must be specified or the widget will not appear.
* ProcessEvents (On by default) must be On for Enabled widget to respond
* to interaction. If ProcessEvents is Off, enabling/disabling a widget
* merely affects the visibility of the representation.
*/
void SetEnabled(int) override;
//@{
/**
* Methods to change whether the widget responds to interaction.
* Set this to Off to disable interaction. On by default.
* Subclasses must override SetProcessEvents() to make sure
* that they pass on the flag to all component widgets.
*/
vtkSetClampMacro(ProcessEvents, vtkTypeBool, 0, 1);
vtkGetMacro(ProcessEvents, vtkTypeBool);
vtkBooleanMacro(ProcessEvents, vtkTypeBool);
//@}
/**
* Get the event translator. Careful manipulation of this class enables
* the user to override the default event bindings.
*/
vtkWidgetEventTranslator* GetEventTranslator() { return this->EventTranslator; }
/**
* Create the default widget representation if one is not set. The
* representation defines the geometry of the widget (i.e., how it appears)
* as well as providing special methods for manipulting the state and
* appearance of the widget.
*/
virtual void CreateDefaultRepresentation() = 0;
/**
* This method is called by subclasses when a render method is to be
* invoked on the vtkRenderWindowInteractor. This method should be called
* (instead of vtkRenderWindow::Render() because it has built into it
* optimizations for minimizing renders and/or speeding renders.
*/
void Render();
/**
* Specifying a parent to this widget is used when creating composite
* widgets. It is an internal method not meant to be used by the public.
* When a widget has a parent, it defers the rendering to the parent. It
* may also defer managing the cursor (see ManagesCursor ivar).
*/
void SetParent(vtkAbstractWidget* parent) { this->Parent = parent; }
vtkGetObjectMacro(Parent, vtkAbstractWidget);
//@{
/**
* Return an instance of vtkWidgetRepresentation used to represent this
* widget in the scene. Note that the representation is a subclass of
* vtkProp (typically a subclass of vtkWidgetRepresentation) so it can be
* added to the renderer independent of the widget.
*/
vtkWidgetRepresentation* GetRepresentation()
{
this->CreateDefaultRepresentation();
return this->WidgetRep;
}
//@}
//@{
/**
* Turn on or off the management of the cursor. Cursor management is
* typically disabled for subclasses when composite widgets are
* created. For example, vtkHandleWidgets are often used to create
* composite widgets, and the parent widget takes over the cursor
* management.
*/
vtkSetMacro(ManagesCursor, vtkTypeBool);
vtkGetMacro(ManagesCursor, vtkTypeBool);
vtkBooleanMacro(ManagesCursor, vtkTypeBool);
//@}
/**
* Override the superclass method. This will automatically change the
* priority of the widget. Unlike the superclass documentation, no
* methods such as SetInteractor to null and reset it etc. are necessary
*/
void SetPriority(float) override;
protected:
vtkAbstractWidget();
~vtkAbstractWidget() override;
// Handles the events; centralized here for all widgets.
static void ProcessEventsHandler(
vtkObject* object, unsigned long event, void* clientdata, void* calldata);
// The representation for the widget. This is typically called by the
// SetRepresentation() methods particular to each widget (i.e. subclasses
// of this class). This method does the actual work; the SetRepresentation()
// methods constrain the type that can be set.
void SetWidgetRepresentation(vtkWidgetRepresentation* r);
vtkWidgetRepresentation* WidgetRep;
// helper methods for cursor management
vtkTypeBool ManagesCursor;
virtual void SetCursor(int vtkNotUsed(state)) {}
// For translating and invoking events
vtkWidgetEventTranslator* EventTranslator;
vtkWidgetCallbackMapper* CallbackMapper;
// The parent, if any, for this widget
vtkAbstractWidget* Parent;
// Call data which can be retrieved by the widget. This data is set
// by ProcessEvents() if call data is provided during a callback
// sequence.
void* CallData;
// Flag indicating if the widget should handle interaction events.
// On by default.
vtkTypeBool ProcessEvents;
private:
vtkAbstractWidget(const vtkAbstractWidget&) = delete;
void operator=(const vtkAbstractWidget&) = delete;
};
#endif