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.

181 lines
5.1 KiB
C++

/*=========================================================================
Program: Visualization Toolkit
Module: vtkContextInteractorStyle.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 vtkContextInteractorStyle
* @brief An interactor for chart views.
*
*
* It observes the user events (mouse events) and propagates them
* to the scene. If the scene doesn't eat the event, it is propagated
* to the interactor style superclass.
*/
#ifndef vtkContextInteractorStyle_h
#define vtkContextInteractorStyle_h
#include "vtkInteractorStyle.h"
#include "vtkNew.h" // For ivars
#include "vtkViewsContext2DModule.h" // For export macro
#include "vtkWeakPointer.h" // For ivars
class vtkContextMouseEvent;
class vtkContextScene;
class VTKVIEWSCONTEXT2D_EXPORT vtkContextInteractorStyle : public vtkInteractorStyle
{
public:
static vtkContextInteractorStyle* New();
vtkTypeMacro(vtkContextInteractorStyle, vtkInteractorStyle);
void PrintSelf(ostream& os, vtkIndent indent) override;
/**
* Set the scene to forward user events to.
* Refresh the view when the scene is dirty and no event is being processed.
* The scene is observed (vtkCommand::ModifiedEvent) and a refresh on the
* view is called appropriately: scene is dirty and no event is being
* processed.
*/
void SetScene(vtkContextScene* scene);
/**
* Return the observed scene.
*/
vtkContextScene* GetScene();
/**
* Called when the scene is modified. Refresh the scene if needed.
*/
virtual void OnSceneModified();
/**
* Called when the user moves the mouse
* Default behavior forwards the event to the observed scene.
*/
void OnMouseMove() override;
/**
* Called when the user clicks the mouse left button.
* Default behavior forwards the event to the observed scene.
*/
void OnLeftButtonDown() override;
/**
* Called when the user releases the mouse left button.
* Default behavior forwards the event to the observed scene.
*/
void OnLeftButtonUp() override;
/**
* Called when the user clicks the mouse middle button.
* Default behavior forwards the event to the observed scene.
*/
void OnMiddleButtonDown() override;
/**
* Called when the user releases the mouse middle button.
* Default behavior forwards the event to the observed scene.
*/
void OnMiddleButtonUp() override;
/**
* Called when the user clicks the mouse right button.
* Default behavior forwards the event to the observed scene.
*/
void OnRightButtonDown() override;
/**
* Called when the user releases the mouse right button.
* Default behavior forwards the event to the observed scene.
*/
void OnRightButtonUp() override;
/**
* Called when the user moves the mouse wheel forward.
* Default behavior forwards the event to the observed scene.
*/
void OnMouseWheelForward() override;
/**
* Called when the user moves the mouse wheel backward.
* Default behavior forwards the event to the observed scene.
*/
void OnMouseWheelBackward() override;
/**
* Place holder for future implementation.
* Default behavior forwards the event to the observed scene.
*/
virtual void OnSelection(unsigned int rect[5]);
/**
* Handle key presses.
*/
void OnChar() override;
/**
* Called when the user presses a key.
*/
void OnKeyPress() override;
/**
* Called when the user releases a key.
*/
void OnKeyRelease() override;
protected:
vtkContextInteractorStyle();
~vtkContextInteractorStyle() override;
static void ProcessSceneEvents(
vtkObject* object, unsigned long event, void* clientdata, void* calldata);
static void ProcessInteractorEvents(
vtkObject* object, unsigned long event, void* clientdata, void* calldata);
virtual void RenderNow();
/**
* Inform the interactor style that an event is being processed.
* That way is knows to not refresh the view (the view will eventually be
* refreshed at the end.
*/
void BeginProcessingEvent();
/**
* Inform the interactor style that an event is finished to be processed.
* If no other event is being processed it check if the scene needs to be
* rendered (scene is dirty)
*/
void EndProcessingEvent();
vtkWeakPointer<vtkContextScene> Scene;
vtkNew<vtkCallbackCommand> SceneCallbackCommand;
vtkNew<vtkCallbackCommand> InteractorCallbackCommand;
int ProcessingEvents;
vtkMTimeType LastSceneRepaintMTime;
int SceneTimerId;
bool TimerCallbackInitialized;
private:
vtkContextInteractorStyle(const vtkContextInteractorStyle&) = delete;
void operator=(const vtkContextInteractorStyle&) = delete;
void ConstructMouseEvent(vtkContextMouseEvent& event, int button);
bool ProcessMousePress(const vtkContextMouseEvent& event);
};
#endif