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.
372 lines
9.0 KiB
C++
372 lines
9.0 KiB
C++
/*=========================================================================
|
|
|
|
Program: Visualization Toolkit
|
|
Module: vtkContextScene.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 vtkContextScene
|
|
* @brief Provides a 2D scene for vtkContextItem objects.
|
|
*
|
|
*
|
|
* Provides a 2D scene that vtkContextItem objects can be added to. Manages the
|
|
* items, ensures that they are rendered at the right times and passes on mouse
|
|
* events.
|
|
*/
|
|
|
|
#ifndef vtkContextScene_h
|
|
#define vtkContextScene_h
|
|
|
|
#include "vtkObject.h"
|
|
#include "vtkRenderingContext2DModule.h" // For export macro
|
|
#include "vtkVector.h" // For vtkVector return type.
|
|
#include "vtkWeakPointer.h" // Needed for weak pointer to the window.
|
|
|
|
class vtkContext2D;
|
|
class vtkAbstractContextItem;
|
|
class vtkTransform2D;
|
|
class vtkContextMouseEvent;
|
|
class vtkContextKeyEvent;
|
|
class vtkContextScenePrivate;
|
|
class vtkContextInteractorStyle;
|
|
|
|
class vtkAnnotationLink;
|
|
|
|
class vtkRenderer;
|
|
class vtkAbstractContextBufferId;
|
|
|
|
class VTKRENDERINGCONTEXT2D_EXPORT vtkContextScene : public vtkObject
|
|
{
|
|
public:
|
|
vtkTypeMacro(vtkContextScene, vtkObject);
|
|
void PrintSelf(ostream& os, vtkIndent indent) override;
|
|
|
|
/**
|
|
* Creates a 2D Painter object.
|
|
*/
|
|
static vtkContextScene* New();
|
|
|
|
/**
|
|
* Paint event for the chart, called whenever the chart needs to be drawn
|
|
*/
|
|
virtual bool Paint(vtkContext2D* painter);
|
|
|
|
/**
|
|
* Add child items to this item. Increments reference count of item.
|
|
* \return the index of the child item.
|
|
*/
|
|
unsigned int AddItem(vtkAbstractContextItem* item);
|
|
|
|
/**
|
|
* Remove child item from this item. Decrements reference count of item.
|
|
* \param item the item to be removed.
|
|
* \return true on success, false otherwise.
|
|
*/
|
|
bool RemoveItem(vtkAbstractContextItem* item);
|
|
|
|
/**
|
|
* Remove child item from this item. Decrements reference count of item.
|
|
* \param index of the item to be removed.
|
|
* \return true on success, false otherwise.
|
|
*/
|
|
bool RemoveItem(unsigned int index);
|
|
|
|
/**
|
|
* Get the item at the specified index.
|
|
* \return the item at the specified index (null if index is invalid).
|
|
*/
|
|
vtkAbstractContextItem* GetItem(unsigned int index);
|
|
|
|
/**
|
|
* Get the number of child items.
|
|
*/
|
|
unsigned int GetNumberOfItems();
|
|
|
|
/**
|
|
* Remove all child items from this item.
|
|
*/
|
|
void ClearItems();
|
|
|
|
/**
|
|
* Set the vtkAnnotationLink for the chart.
|
|
*/
|
|
virtual void SetAnnotationLink(vtkAnnotationLink* link);
|
|
|
|
//@{
|
|
/**
|
|
* Get the vtkAnnotationLink for the chart.
|
|
*/
|
|
vtkGetObjectMacro(AnnotationLink, vtkAnnotationLink);
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* Set the width and height of the scene in pixels.
|
|
*/
|
|
vtkSetVector2Macro(Geometry, int);
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* Get the width and height of the scene in pixels.
|
|
*/
|
|
vtkGetVector2Macro(Geometry, int);
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* Set whether the scene should use the color buffer. Default is true.
|
|
*/
|
|
vtkSetMacro(UseBufferId, bool);
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* Get whether the scene is using the color buffer. Default is true.
|
|
*/
|
|
vtkGetMacro(UseBufferId, bool);
|
|
//@}
|
|
|
|
/**
|
|
* Get the width of the view
|
|
*/
|
|
virtual int GetViewWidth();
|
|
|
|
/**
|
|
* Get the height of the view
|
|
*/
|
|
virtual int GetViewHeight();
|
|
|
|
/**
|
|
* Get the width of the scene.
|
|
*/
|
|
int GetSceneWidth();
|
|
|
|
/**
|
|
* Get the height of the scene.
|
|
*/
|
|
int GetSceneHeight();
|
|
|
|
//@{
|
|
/**
|
|
* Whether to scale the scene transform when tiling, for example when
|
|
* using vtkWindowToImageFilter to take a large screenshot.
|
|
* The default is true.
|
|
*/
|
|
vtkSetMacro(ScaleTiles, bool);
|
|
vtkGetMacro(ScaleTiles, bool);
|
|
vtkBooleanMacro(ScaleTiles, bool);
|
|
//@}
|
|
|
|
/**
|
|
* The tile scale of the target vtkRenderWindow. Hardcoded pixel offsets, etc
|
|
* should properly account for these <x, y> scale factors. This will simply
|
|
* return vtkVector2i(1, 1) if ScaleTiles is false or if this->Renderer is
|
|
* NULL.
|
|
*/
|
|
vtkVector2i GetLogicalTileScale();
|
|
|
|
//@{
|
|
/**
|
|
* This should not be necessary as the context view should take care of
|
|
* rendering.
|
|
*/
|
|
virtual void SetRenderer(vtkRenderer* renderer);
|
|
virtual vtkRenderer* GetRenderer();
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* Inform the scene that something changed that requires a repaint of the
|
|
* scene. This should only be used by the vtkContextItem derived objects in
|
|
* a scene in their event handlers.
|
|
*/
|
|
void SetDirty(bool isDirty);
|
|
bool GetDirty() const;
|
|
//@}
|
|
|
|
/**
|
|
* Release graphics resources hold by the scene.
|
|
*/
|
|
void ReleaseGraphicsResources();
|
|
|
|
/**
|
|
* Last painter used.
|
|
* Not part of the end-user API. Can be used by context items to
|
|
* create their own colorbuffer id (when a context item is a container).
|
|
*/
|
|
vtkWeakPointer<vtkContext2D> GetLastPainter();
|
|
|
|
/**
|
|
* Return buffer id.
|
|
* Not part of the end-user API. Can be used by context items to
|
|
* initialize their own colorbuffer id (when a context item is a container).
|
|
*/
|
|
vtkAbstractContextBufferId* GetBufferId();
|
|
|
|
/**
|
|
* Set the transform for the scene.
|
|
*/
|
|
virtual void SetTransform(vtkTransform2D* transform);
|
|
|
|
/**
|
|
* Get the transform for the scene.
|
|
*/
|
|
vtkTransform2D* GetTransform();
|
|
|
|
/**
|
|
* Check whether the scene has a transform.
|
|
*/
|
|
bool HasTransform() { return this->Transform != nullptr; }
|
|
|
|
/**
|
|
* Enum of valid selection modes for charts in the scene
|
|
*/
|
|
enum
|
|
{
|
|
SELECTION_NONE = 0,
|
|
SELECTION_DEFAULT,
|
|
SELECTION_ADDITION,
|
|
SELECTION_SUBTRACTION,
|
|
SELECTION_TOGGLE
|
|
};
|
|
|
|
protected:
|
|
vtkContextScene();
|
|
~vtkContextScene() override;
|
|
|
|
/**
|
|
* Process a rubber band selection event.
|
|
*/
|
|
virtual bool ProcessSelectionEvent(unsigned int rect[5]);
|
|
|
|
/**
|
|
* Process a mouse move event.
|
|
*/
|
|
virtual bool MouseMoveEvent(const vtkContextMouseEvent& event);
|
|
|
|
/**
|
|
* Process a mouse button press event.
|
|
*/
|
|
virtual bool ButtonPressEvent(const vtkContextMouseEvent& event);
|
|
|
|
/**
|
|
* Process a mouse button release event.
|
|
*/
|
|
virtual bool ButtonReleaseEvent(const vtkContextMouseEvent& event);
|
|
|
|
/**
|
|
* Process a mouse button double click event.
|
|
*/
|
|
virtual bool DoubleClickEvent(const vtkContextMouseEvent& event);
|
|
|
|
/**
|
|
* Process a mouse wheel event where delta is the movement forward or back.
|
|
*/
|
|
virtual bool MouseWheelEvent(int delta, const vtkContextMouseEvent& event);
|
|
|
|
/**
|
|
* Process a key press event.
|
|
*/
|
|
virtual bool KeyPressEvent(const vtkContextKeyEvent& keyEvent);
|
|
|
|
/**
|
|
* Process a key release event.
|
|
*/
|
|
virtual bool KeyReleaseEvent(const vtkContextKeyEvent& keyEvent);
|
|
|
|
/**
|
|
* Paint the scene in a special mode to build a cache for picking.
|
|
* Use internally.
|
|
*/
|
|
virtual void PaintIds();
|
|
|
|
/**
|
|
* Test if BufferId is supported by the OpenGL context.
|
|
*/
|
|
void TestBufferIdSupport();
|
|
|
|
/**
|
|
* Return the item id under mouse cursor at position (x,y).
|
|
* Return -1 if there is no item under the mouse cursor.
|
|
* \post valid_result: result>=-1 && result<this->GetNumberOfItems()
|
|
*/
|
|
vtkIdType GetPickedItem(int x, int y);
|
|
|
|
/**
|
|
* Return the item under the mouse.
|
|
* If no item is under the mouse, the method returns a null pointer.
|
|
*/
|
|
vtkAbstractContextItem* GetPickedItem();
|
|
|
|
/**
|
|
* Make sure the buffer id used for picking is up-to-date.
|
|
*/
|
|
void UpdateBufferId();
|
|
|
|
vtkAnnotationLink* AnnotationLink;
|
|
|
|
// Store the chart dimensions - width, height of scene in pixels
|
|
int Geometry[2];
|
|
|
|
/**
|
|
* The vtkContextInteractorStyle class delegates all of the events to the
|
|
* scene, accessing protected API.
|
|
*/
|
|
friend class vtkContextInteractorStyle;
|
|
|
|
//@{
|
|
/**
|
|
* Private storage object - where we hide all of our STL objects...
|
|
*/
|
|
class Private;
|
|
Private* Storage;
|
|
//@}
|
|
|
|
/**
|
|
* This structure provides a list of children, along with convenience
|
|
* functions to paint the children etc. It is derived from
|
|
* std::vector<vtkAbstractContextItem>, defined in a private header.
|
|
*/
|
|
vtkContextScenePrivate* Children;
|
|
|
|
vtkWeakPointer<vtkContext2D> LastPainter;
|
|
|
|
vtkWeakPointer<vtkRenderer> Renderer;
|
|
|
|
vtkAbstractContextBufferId* BufferId;
|
|
bool BufferIdDirty;
|
|
|
|
bool UseBufferId;
|
|
|
|
bool BufferIdSupportTested;
|
|
bool BufferIdSupported;
|
|
|
|
bool ScaleTiles;
|
|
|
|
/**
|
|
* The scene level transform.
|
|
*/
|
|
vtkTransform2D* Transform;
|
|
|
|
private:
|
|
vtkContextScene(const vtkContextScene&) = delete;
|
|
void operator=(const vtkContextScene&) = delete;
|
|
|
|
typedef bool (vtkAbstractContextItem::*MouseEvents)(const vtkContextMouseEvent&);
|
|
bool ProcessItem(
|
|
vtkAbstractContextItem* cur, const vtkContextMouseEvent& event, MouseEvents eventPtr);
|
|
void EventCopy(const vtkContextMouseEvent& event);
|
|
};
|
|
|
|
#endif // vtkContextScene_h
|