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.

161 lines
4.5 KiB
C

/*=========================================================================
Program: Visualization Toolkit
Module: vtkRangeHandlesItem.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 vtkRangeHandlesItem
* @brief item to show and control the range of a vtkColorTransferFunction
*
* vtkRangeHandlesItem provides range handles painting and management
* for a provided vtkColorTransferFunction.
* Handles can be moved by clicking on them.
* The range is shown when hovering or moving the handles.
* It emits a StartInteractionEvent when starting to interact with a handle,
* an InteractionEvent when interacting with a handle and an EndInteractionEvent
* when releasing a handle.
* It emits a LeftMouseButtonDoubleClickEvent when double clicked.
*
* @sa
* vtkControlPointsItem
* vtkScalarsToColorsItem
* vtkColorTransferFunctionItem
*/
#ifndef vtkRangeHandlesItem_h
#define vtkRangeHandlesItem_h
#include "vtkChartsCoreModule.h" // For export macro
#include "vtkCommand.h" // For vtkCommand enum
#include "vtkPlot.h"
class vtkColorTransferFunction;
class vtkBrush;
class VTKCHARTSCORE_EXPORT vtkRangeHandlesItem : public vtkPlot
{
public:
vtkTypeMacro(vtkRangeHandlesItem, vtkPlot);
void PrintSelf(ostream& os, vtkIndent indent) override;
static vtkRangeHandlesItem* New();
enum Handle
{
NO_HANDLE = -1,
LEFT_HANDLE = 0,
RIGHT_HANDLE = 1
};
/**
* Paint both handles and the range if
* a handle is active or hovered
*/
bool Paint(vtkContext2D* painter) override;
/**
* Recover the bounds of the item
*/
void GetBounds(double bounds[4]) override;
/**
* Recover the range currently set by the handles
* Use this method by observing EndInteractionEvent
*/
virtual void GetHandlesRange(double range[2]);
//@{
/**
* Get/set the color transfer function to interact with.
*/
void SetColorTransferFunction(vtkColorTransferFunction* ctf);
vtkGetObjectMacro(ColorTransferFunction, vtkColorTransferFunction);
//@}
//@{
/**
* Set/Get the handles width in pixels.
* Default is 2.
*/
vtkSetMacro(HandleWidth, float);
vtkGetMacro(HandleWidth, float);
//@}
/**
* Compute the handles draw range by using the handle width and the transfer function
*/
void ComputeHandlesDrawRange();
protected:
vtkRangeHandlesItem();
~vtkRangeHandlesItem() override;
/**
* Returns true if the supplied x, y coordinate is around a handle
*/
bool Hit(const vtkContextMouseEvent& mouse) override;
//@{
/**
* Interaction methods to interact with the handles.
*/
bool MouseButtonPressEvent(const vtkContextMouseEvent& mouse) override;
bool MouseButtonReleaseEvent(const vtkContextMouseEvent& mouse) override;
bool MouseMoveEvent(const vtkContextMouseEvent& mouse) override;
bool MouseEnterEvent(const vtkContextMouseEvent& mouse) override;
bool MouseLeaveEvent(const vtkContextMouseEvent& mouse) override;
bool MouseDoubleClickEvent(const vtkContextMouseEvent& mouse) override;
//@}
/**
* Returns the handle the provided point is over with a provided tolerance,
* it can be NO_HANDLE, LEFT_HANDLE or RIGHT_HANDLE
*/
virtual int FindRangeHandle(const vtkVector2f& point, const vtkVector2f& tolerance);
/**
* Internal method to set the ActiveHandlePosition
* and compute the ActiveHandleRangeValue accordingly
*/
void SetActiveHandlePosition(double position);
/**
* Internal method to check if the active handle have
* actually been moved.
*/
bool IsActiveHandleMoved(double tolerance);
/**
* Set the cursor shape
*/
void SetCursor(int cursor);
private:
vtkRangeHandlesItem(const vtkRangeHandlesItem&) = delete;
void operator=(const vtkRangeHandlesItem&) = delete;
vtkColorTransferFunction* ColorTransferFunction = nullptr;
float HandleWidth = 2;
float HandleDelta = 0;
float LeftHandleDrawRange[2] = { 0, 0 };
float RightHandleDrawRange[2] = { 0, 0 };
int ActiveHandle = NO_HANDLE;
int HoveredHandle = NO_HANDLE;
double ActiveHandlePosition = 0;
double ActiveHandleRangeValue = 0;
vtkNew<vtkBrush> HighlightBrush;
vtkNew<vtkBrush> RangeLabelBrush;
};
#endif // vtkRangeHandlesItem_h