From 37bb879eecf9a8ce60f5cc71fb5aeb5878c1d645 Mon Sep 17 00:00:00 2001 From: jose guzman Date: Wed, 30 Sep 2015 16:16:32 +0200 Subject: [PATCH] double click example test --- appli/examples/CMakeLists.txt | 1 + appli/examples/example_Test_DoubleClick.cxx | 136 ++++++++++++++++++++ 2 files changed, 137 insertions(+) create mode 100644 appli/examples/example_Test_DoubleClick.cxx diff --git a/appli/examples/CMakeLists.txt b/appli/examples/CMakeLists.txt index a4fb5d7..d7e1579 100644 --- a/appli/examples/CMakeLists.txt +++ b/appli/examples/CMakeLists.txt @@ -34,6 +34,7 @@ ENDFOREACH(prog) SET( NOPLUGINS_EXAMPLES_PROGRAMS example_ContourWidget + example_Test_DoubleClick ## example_ExtractDICOMSeries ## example_ImageGaussianModelEstimator ## example_ReadQuadEdgeMeshWithoutPlugins diff --git a/appli/examples/example_Test_DoubleClick.cxx b/appli/examples/example_Test_DoubleClick.cxx new file mode 100644 index 0000000..bf357d2 --- /dev/null +++ b/appli/examples/example_Test_DoubleClick.cxx @@ -0,0 +1,136 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef WIN32 +#include +#else +#endif + +// Define interaction style +class MouseInteractorStyleDoubleClick : public vtkInteractorStyleTrackballCamera +{ +public: + + static MouseInteractorStyleDoubleClick* New(); + vtkTypeMacro(MouseInteractorStyleDoubleClick, vtkInteractorStyleTrackballCamera); + + MouseInteractorStyleDoubleClick() : NumberOfClicks(0), ResetPixelDistance(5), DoubleClickTolerance(1000) + { + this->PreviousPosition[0] = 0; + this->PreviousPosition[1] = 0; +#ifdef WIN32 + this->DoubleClickTolerance = GetDoubleClickTime(); +#else + // I dont have any idea if this has an equivalent for linux + //this->DoubleClickTolerance = GetDoubleClickTime(); +#endif + } + + virtual void OnLeftButtonDown() + { + //std::cout << "Pressed left mouse button." << std::endl; + this->NumberOfClicks++; + + if (this->NumberOfClicks > 1) + { + this->LastClickTime = this->CurrentClickTime; + this->CurrentClickTime = time(0); + } else + { + this->CurrentClickTime = time(0); + } + + //std::cout << "NumberOfClicks = " << this->NumberOfClicks << std::endl; + int pickPosition[2]; + this->GetInteractor()->GetEventPosition(pickPosition); + + int xdist = pickPosition[0] - this->PreviousPosition[0]; + int ydist = pickPosition[1] - this->PreviousPosition[1]; + + this->PreviousPosition[0] = pickPosition[0]; + this->PreviousPosition[1] = pickPosition[1]; + + int moveDistance = (int)sqrt((double)(xdist*xdist + ydist*ydist)); + + // Reset numClicks - If mouse moved further than resetPixelDistance + if (moveDistance > this->ResetPixelDistance) + { + this->NumberOfClicks = 1; + } + + + if (this->NumberOfClicks == 2) + { + double seconds = difftime(this->CurrentClickTime, this->LastClickTime); + if (seconds * 1000 <= this->DoubleClickTolerance) + { + std::cout << "Double clicked. with " << seconds << " of diference" << std::endl; + this->NumberOfClicks = 0; + } else + { + std::cout << "Too slow to be considered as a double click" << std::endl; + this->NumberOfClicks = 1; + } + + } + // forward events + vtkInteractorStyleTrackballCamera::OnLeftButtonDown(); + } + +private: + unsigned int NumberOfClicks; + int PreviousPosition[2]; + int ResetPixelDistance; + double DoubleClickTolerance; // time in miliseconds + time_t LastClickTime; + time_t CurrentClickTime; +}; +vtkStandardNewMacro(MouseInteractorStyleDoubleClick); + +int main(int, char *[]) +{ + vtkSmartPointer sphereSource = + vtkSmartPointer::New(); + sphereSource->SetCenter(0.0, 0.0, 0.0); + sphereSource->SetRadius(5.0); + sphereSource->Update(); + + vtkSmartPointer mapper = + vtkSmartPointer::New(); + mapper->SetInputConnection(sphereSource->GetOutputPort()); + + vtkSmartPointer actor = + vtkSmartPointer::New(); + actor->SetMapper(mapper); + + vtkSmartPointer renderer = + vtkSmartPointer::New(); + renderer->SetBackground(1, 1, 1); // Background color white + renderer->AddActor(actor); + + vtkSmartPointer renderWindow = + vtkSmartPointer::New(); + renderWindow->AddRenderer(renderer); + + vtkSmartPointer renderWindowInteractor = + vtkSmartPointer::New(); + renderWindowInteractor->SetRenderWindow(renderWindow); + + vtkSmartPointer style = + vtkSmartPointer::New(); + renderWindowInteractor->SetInteractorStyle(style); + + renderWindowInteractor->Initialize(); + renderWindowInteractor->Start(); + + return EXIT_SUCCESS; +} \ No newline at end of file -- 2.47.1