comparison Applications/StoneWebViewer/WebAssembly/StoneWebViewer.cpp @ 1579:c476b0d5e59c

skeleton for cross-hair tool
author Sebastien Jodogne <s.jodogne@gmail.com>
date Wed, 30 Sep 2020 19:09:03 +0200
parents 1f812f4c95be
children c6b29bf58914
comparison
equal deleted inserted replaced
1578:1f812f4c95be 1579:c476b0d5e59c
103 DisplayedFrameQuality_Low, 103 DisplayedFrameQuality_Low,
104 DisplayedFrameQuality_High 104 DisplayedFrameQuality_High
105 }; 105 };
106 106
107 107
108 enum EMSCRIPTEN_KEEPALIVE MouseAction 108 enum EMSCRIPTEN_KEEPALIVE WebViewerAction
109 { 109 {
110 MouseAction_GrayscaleWindowing, 110 WebViewerAction_GrayscaleWindowing,
111 MouseAction_Zoom, 111 WebViewerAction_Zoom,
112 MouseAction_Pan, 112 WebViewerAction_Pan,
113 MouseAction_Rotate 113 WebViewerAction_Rotate,
114 WebViewerAction_Crosshair
114 }; 115 };
115 116
117
118
119 static OrthancStone::MouseAction ConvertWebViewerAction(int action)
120 {
121 switch (action)
122 {
123 case WebViewerAction_GrayscaleWindowing:
124 return OrthancStone::MouseAction_GrayscaleWindowing;
125
126 case WebViewerAction_Zoom:
127 return OrthancStone::MouseAction_Zoom;
128
129 case WebViewerAction_Pan:
130 return OrthancStone::MouseAction_Pan;
131
132 case WebViewerAction_Rotate:
133 return OrthancStone::MouseAction_Rotate;
134
135 case WebViewerAction_Crosshair:
136 return OrthancStone::MouseAction_None;
137
138 default:
139 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange);
140 }
141 }
142
116 143
117 144
118 static const int PRIORITY_HIGH = -100; 145 static const int PRIORITY_HIGH = -100;
119 static const int PRIORITY_LOW = 100; 146 static const int PRIORITY_LOW = 100;
120 static const int PRIORITY_NORMAL = 0; 147 static const int PRIORITY_NORMAL = 0;
1890 lock->Invalidate(); 1917 lock->Invalidate();
1891 } 1918 }
1892 } 1919 }
1893 } 1920 }
1894 1921
1895 void SetMouseButtonActions(OrthancStone::MouseAction leftAction, 1922
1896 OrthancStone::MouseAction middleAction, 1923
1897 OrthancStone::MouseAction rightAction) 1924 class Interactor : public OrthancStone::DefaultViewportInteractor
1898 { 1925 {
1899 std::unique_ptr<OrthancStone::DefaultViewportInteractor> interactor( 1926 private:
1900 new OrthancStone::DefaultViewportInteractor); 1927 WebViewerAction leftAction_;
1901 1928 WebViewerAction middleAction_;
1902 interactor->SetLeftButtonAction(leftAction); 1929 WebViewerAction rightAction_;
1903 interactor->SetMiddleButtonAction(middleAction); 1930
1904 interactor->SetRightButtonAction(rightAction); 1931 bool IsAction(const OrthancStone::PointerEvent& event,
1905 1932 WebViewerAction action)
1933 {
1934 switch (event.GetMouseButton())
1935 {
1936 case OrthancStone::MouseButton_Left:
1937 return (leftAction_ == action);
1938
1939 case OrthancStone::MouseButton_Middle:
1940 return (middleAction_ == action);
1941
1942 case OrthancStone::MouseButton_Right:
1943 return (rightAction_ == action);
1944
1945 default:
1946 return false;
1947 }
1948 }
1949
1950 public:
1951 Interactor(WebViewerAction leftAction,
1952 WebViewerAction middleAction,
1953 WebViewerAction rightAction) :
1954 leftAction_(leftAction),
1955 middleAction_(middleAction),
1956 rightAction_(rightAction)
1957 {
1958 SetLeftButtonAction(ConvertWebViewerAction(leftAction));
1959 SetMiddleButtonAction(ConvertWebViewerAction(middleAction));
1960 SetRightButtonAction(ConvertWebViewerAction(rightAction));
1961 }
1962
1963 virtual OrthancStone::IFlexiblePointerTracker* CreateTracker(
1964 boost::shared_ptr<OrthancStone::IViewport> viewport,
1965 const OrthancStone::PointerEvent& event,
1966 unsigned int viewportWidth,
1967 unsigned int viewportHeight) ORTHANC_OVERRIDE
1968 {
1969 if (IsAction(event, WebViewerAction_Crosshair))
1970 {
1971 printf("CROSS-HAIR!\n");
1972 return NULL;
1973 }
1974 else
1975 {
1976 return DefaultViewportInteractor::CreateTracker(
1977 viewport, event, viewportWidth, viewportHeight);
1978 }
1979 }
1980 };
1981
1982
1983 void SetMouseButtonActions(WebViewerAction leftAction,
1984 WebViewerAction middleAction,
1985 WebViewerAction rightAction)
1986 {
1906 assert(viewport_ != NULL); 1987 assert(viewport_ != NULL);
1907 viewport_->AcquireInteractor(interactor.release()); 1988 viewport_->AcquireInteractor(new Interactor(leftAction, middleAction, rightAction));
1908 } 1989 }
1909 1990
1910 void FitForPrint() 1991 void FitForPrint()
1911 { 1992 {
1912 viewport_->FitForPrint(); 1993 viewport_->FitForPrint();
2017 static OrthancStone::DicomSource source_; 2098 static OrthancStone::DicomSource source_;
2018 static boost::shared_ptr<FramesCache> cache_; 2099 static boost::shared_ptr<FramesCache> cache_;
2019 static boost::shared_ptr<OrthancStone::WebAssemblyLoadersContext> context_; 2100 static boost::shared_ptr<OrthancStone::WebAssemblyLoadersContext> context_;
2020 static std::string stringBuffer_; 2101 static std::string stringBuffer_;
2021 static bool softwareRendering_ = false; 2102 static bool softwareRendering_ = false;
2022 static OrthancStone::MouseAction leftButtonAction_ = OrthancStone::MouseAction_GrayscaleWindowing; 2103 static WebViewerAction leftButtonAction_ = WebViewerAction_GrayscaleWindowing;
2023 static OrthancStone::MouseAction middleButtonAction_ = OrthancStone::MouseAction_Pan; 2104 static WebViewerAction middleButtonAction_ = WebViewerAction_Pan;
2024 static OrthancStone::MouseAction rightButtonAction_ = OrthancStone::MouseAction_Zoom; 2105 static WebViewerAction rightButtonAction_ = WebViewerAction_Zoom;
2025 2106
2026 2107
2027 static void FormatTags(std::string& target, 2108 static void FormatTags(std::string& target,
2028 const Orthanc::DicomMap& tags) 2109 const Orthanc::DicomMap& tags)
2029 { 2110 {
2075 else 2156 else
2076 { 2157 {
2077 return found->second; 2158 return found->second;
2078 } 2159 }
2079 } 2160 }
2080
2081
2082
2083 static OrthancStone::MouseAction ConvertMouseAction(int action)
2084 {
2085 switch (action)
2086 {
2087 case MouseAction_GrayscaleWindowing:
2088 return OrthancStone::MouseAction_GrayscaleWindowing;
2089
2090 case MouseAction_Zoom:
2091 return OrthancStone::MouseAction_Zoom;
2092
2093 case MouseAction_Pan:
2094 return OrthancStone::MouseAction_Pan;
2095
2096 case MouseAction_Rotate:
2097 return OrthancStone::MouseAction_Rotate;
2098
2099 default:
2100 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange);
2101 }
2102 }
2103
2104 2161
2105 2162
2106 extern "C" 2163 extern "C"
2107 { 2164 {
2108 int main(int argc, char const *argv[]) 2165 int main(int argc, char const *argv[])
2449 int middleAction, 2506 int middleAction,
2450 int rightAction) 2507 int rightAction)
2451 { 2508 {
2452 try 2509 try
2453 { 2510 {
2454 leftButtonAction_ = ConvertMouseAction(leftAction); 2511 leftButtonAction_ = static_cast<WebViewerAction>(leftAction);
2455 middleButtonAction_ = ConvertMouseAction(middleAction); 2512 middleButtonAction_ = static_cast<WebViewerAction>(middleAction);
2456 rightButtonAction_ = ConvertMouseAction(rightAction); 2513 rightButtonAction_ = static_cast<WebViewerAction>(rightAction);
2457 2514
2458 for (Viewports::iterator it = allViewports_.begin(); it != allViewports_.end(); ++it) 2515 for (Viewports::iterator it = allViewports_.begin(); it != allViewports_.end(); ++it)
2459 { 2516 {
2460 assert(it->second != NULL); 2517 assert(it->second != NULL);
2461 it->second->SetMouseButtonActions(leftButtonAction_, middleButtonAction_, rightButtonAction_); 2518 it->second->SetMouseButtonActions(leftButtonAction_, middleButtonAction_, rightButtonAction_);