Page MenuHomePhabricator

bug3210.diff

Authored By
xplanes
Jan 21 2010, 9:32 AM
Size
12 KB
Referenced Files
None
Subscribers
None

bug3210.diff

Index: Core/Code/Controllers/mitkSlicesCoordinator.cpp
===================================================================
--- Core/Code/Controllers/mitkSlicesCoordinator.cpp (revision 21081)
+++ Core/Code/Controllers/mitkSlicesCoordinator.cpp (working copy)
@@ -19,6 +19,7 @@
#include <mitkApplicationCursor.h>
+#include "mitkBaseRenderer.h"
namespace mitk {
@@ -61,24 +62,35 @@
}
}
-void SlicesCoordinator::ResetMouseCursor()
+void SlicesCoordinator::ResetMouseCursor( BaseRenderer* renderer )
{
if ( m_MouseCursorSet )
{
- ApplicationCursor::GetInstance()->PopCursor();
+ vtkRenderWindow* vtkWindow = NULL;
+ if ( renderer != NULL )
+ {
+ vtkWindow = renderer->GetRenderWindow();
+ }
+ ApplicationCursor::GetInstance( )->PopCursor( vtkWindow );
m_MouseCursorSet = false;
}
}
-void SlicesCoordinator::SetMouseCursor( const char *xpm[], int hotspotX, int hotspotY )
+void SlicesCoordinator::SetMouseCursor( BaseRenderer* renderer, const char *xpm[], int hotspotX, int hotspotY )
{
+ vtkRenderWindow* vtkWindow = NULL;
+ if ( renderer != NULL )
+ {
+ vtkWindow = renderer->GetRenderWindow();
+ }
+
// Remove previously set mouse cursor
if ( m_MouseCursorSet )
{
- ApplicationCursor::GetInstance()->PopCursor();
+ ApplicationCursor::GetInstance( )->PopCursor( vtkWindow );
}
- ApplicationCursor::GetInstance()->PushCursor( xpm, hotspotX, hotspotY );
+ ApplicationCursor::GetInstance( )->PushCursor( vtkWindow, xpm, hotspotX, hotspotY );
m_MouseCursorSet = true;
}
Index: Core/Code/Controllers/mitkSlicesCoordinator.h
===================================================================
--- Core/Code/Controllers/mitkSlicesCoordinator.h (revision 21081)
+++ Core/Code/Controllers/mitkSlicesCoordinator.h (working copy)
@@ -27,6 +27,7 @@
class SliceNavigationController;
class Action;
class StateEvent;
+class BaseRenderer;
/**
* \brief Coordinates a list of SliceNavigationControllers.
@@ -75,7 +76,7 @@
*
* Should be used by subclasses and from external application instead
* of using QmitkApplicationCursor directly to avoid conflicts. */
- void ResetMouseCursor();
+ void ResetMouseCursor( BaseRenderer* renderer );
protected:
@@ -89,7 +90,7 @@
*
* Use this in subclasses instead of using QmitkApplicationCursor directly.
*/
- void SetMouseCursor( const char *xpm[], int hotspotX, int hotspotY );
+ void SetMouseCursor( BaseRenderer* renderer, const char *xpm[], int hotspotX, int hotspotY );
/** for implementation in subclasses */
virtual void OnSliceControllerAdded(SliceNavigationController* snc);
Index: Core/Code/Controllers/mitkSlicesRotator.cpp
===================================================================
--- Core/Code/Controllers/mitkSlicesRotator.cpp (revision 21081)
+++ Core/Code/Controllers/mitkSlicesRotator.cpp (working copy)
@@ -557,12 +557,14 @@
}
case AcROTATESTART:
{
- this->SetMouseCursor( rotate_cursor_xpm, 0, 0 );
+ BaseRenderer* renderer = stateEvent->GetEvent()->GetSender();
+ this->SetMouseCursor( renderer, rotate_cursor_xpm, 0, 0 );
break;
}
case AcROTATEEND:
{
- this->ResetMouseCursor();
+ BaseRenderer* renderer = stateEvent->GetEvent()->GetSender();
+ this->ResetMouseCursor( renderer );
break;
}
default:
Index: Core/Code/DataManagement/mitkApplicationCursor.cpp
===================================================================
--- Core/Code/DataManagement/mitkApplicationCursor.cpp (revision 21081)
+++ Core/Code/DataManagement/mitkApplicationCursor.cpp (working copy)
@@ -20,7 +20,7 @@
#include <iostream>
mitk::ApplicationCursor* mitk::ApplicationCursor::m_Instance = NULL;
-mitk::ApplicationCursorImplementation* mitk::ApplicationCursor::m_Implementation = NULL;
+std::map<vtkRenderWindow*, mitk::ApplicationCursorImplementation*> mitk::ApplicationCursor::m_Win2Instance;
namespace mitk {
@@ -38,42 +38,47 @@
return m_Instance;
}
-void ApplicationCursor::RegisterImplementation(ApplicationCursorImplementation* implementation)
+void ApplicationCursor::RegisterImplementation(
+ vtkRenderWindow *window,
+ ApplicationCursorImplementation* implementation)
{
- m_Implementation = implementation;
+ m_Win2Instance[ window ] = implementation;
}
-void ApplicationCursor::PushCursor(const char* XPM[], int hotspotX, int hotspotY)
+void ApplicationCursor::PushCursor( vtkRenderWindow *window, const char* XPM[], int hotspotX, int hotspotY)
{
- if (m_Implementation)
+ ApplicationCursorImplementation* instance = GetImpl( window );
+ if ( instance )
{
- m_Implementation->PushCursor(XPM, hotspotX, hotspotY);
+ instance->PushCursor(XPM, hotspotX, hotspotY);
}
else
{
- MITK_ERROR << "in mitk::ApplicationCursor::PushCursor(): no implementation registered." << std::endl;
+ MITK_ERROR << "in mitk::ApplicationCursor::GetCursorPosition(): no implementation registered." << std::endl;
throw std::logic_error("No implementation registered for mitk::ApplicationCursor.");
}
}
-void ApplicationCursor::PopCursor()
+void ApplicationCursor::PopCursor( vtkRenderWindow *window )
{
- if (m_Implementation)
+ ApplicationCursorImplementation* instance = GetImpl( window );
+ if (instance)
{
- m_Implementation->PopCursor();
+ instance->PopCursor();
}
else
{
- MITK_ERROR << "in mitk::ApplicationCursor::PopCursor(): no implementation registered." << std::endl;
+ MITK_ERROR << "in mitk::ApplicationCursor::SetCursorPosition(): no implementation registered." << std::endl;
throw std::logic_error("No implementation registered for mitk::ApplicationCursor.");
}
}
-const Point2I ApplicationCursor::GetCursorPosition()
+const Point2I ApplicationCursor::GetCursorPosition( vtkRenderWindow *window )
{
- if (m_Implementation)
+ ApplicationCursorImplementation* instance = GetImpl( window );
+ if (instance)
{
- return m_Implementation->GetCursorPosition();
+ return instance->GetCursorPosition();
}
else
{
@@ -82,11 +87,12 @@
}
}
-void ApplicationCursor::SetCursorPosition(const Point2I& p)
+void ApplicationCursor::SetCursorPosition( vtkRenderWindow *window, const Point2I& p)
{
- if (m_Implementation)
+ ApplicationCursorImplementation* instance = GetImpl( window );
+ if (instance)
{
- m_Implementation->SetCursorPosition(p);
+ instance->SetCursorPosition(p);
}
else
{
@@ -95,5 +101,26 @@
}
}
+ApplicationCursorImplementation* ApplicationCursor::GetImpl( vtkRenderWindow *window )
+{
+ ApplicationCursorImplementation* instance = NULL;
+ std::map<vtkRenderWindow*, mitk::ApplicationCursorImplementation*>::iterator it;
+ it = m_Win2Instance.find( window );
+
+ // When there's only one instance, use always NULL as key
+ // else, use the vtkRenderWindow pointer
+ if ( it == m_Win2Instance.end( ) )
+ {
+ instance = m_Win2Instance[ NULL ];
+ }
+ else
+ {
+ instance = m_Win2Instance[ window ];
+ }
+
+ return instance;
+}
+
} // namespace
+
Index: Core/Code/DataManagement/mitkApplicationCursor.h
===================================================================
--- Core/Code/DataManagement/mitkApplicationCursor.h (revision 21081)
+++ Core/Code/DataManagement/mitkApplicationCursor.h (working copy)
@@ -21,6 +21,8 @@
#include "mitkCommon.h"
#include "mitkVector.h"
+class vtkRenderWindow;
+
namespace mitk
{
@@ -70,31 +72,38 @@
/// This class is a singleton.
static ApplicationCursor* GetInstance();
- /// To be called by a toolkit specific ApplicationCursorImplementation.
- static void RegisterImplementation(ApplicationCursorImplementation* implementation);
+ /** To be called by a toolkit specific ApplicationCursorImplementation.
+ Each window will have its own cursor manager
+ */
+ static void RegisterImplementation(
+ vtkRenderWindow *window,
+ ApplicationCursorImplementation* implementation);
/// Change the current application cursor
- void PushCursor(const char* XPM[], int hotspotX = -1, int hotspotY = -1);
+ void PushCursor( vtkRenderWindow *window, const char* XPM[], int hotspotX = -1, int hotspotY = -1);
/// Restore the previous cursor
- void PopCursor();
+ void PopCursor( vtkRenderWindow *window );
/// Get absolute mouse position on screen
/// \return (-1, -1) if querying mouse position is not possible
- const Point2I GetCursorPosition();
+ const Point2I GetCursorPosition( vtkRenderWindow *window );
/// Set absolute mouse position on screen
- void SetCursorPosition(const Point2I&);
+ void SetCursorPosition( vtkRenderWindow *window, const Point2I&);
protected:
+ ///
+ ApplicationCursorImplementation* GetImpl( vtkRenderWindow *window );
+
/// Purposely hidden - singleton
ApplicationCursor();
private:
- static ApplicationCursorImplementation* m_Implementation;
+ static std::map<vtkRenderWindow*, mitk::ApplicationCursorImplementation*> m_Win2Instance;
static ApplicationCursor* m_Instance;
};
Index: CoreUI/Qmitk/QmitkApplicationCursor.cpp
===================================================================
--- CoreUI/Qmitk/QmitkApplicationCursor.cpp (revision 21081)
+++ CoreUI/Qmitk/QmitkApplicationCursor.cpp (working copy)
@@ -25,7 +25,7 @@
QmitkApplicationCursor::QmitkApplicationCursor()
{
- mitk::ApplicationCursor::RegisterImplementation(this);
+ mitk::ApplicationCursor::RegisterImplementation(NULL, this);
}
void QmitkApplicationCursor::PushCursor(const char* XPM[], int hotspotX, int hotspotY)
Index: CoreUI/Qmitk/QmitkStdMultiWidget.cpp
===================================================================
--- CoreUI/Qmitk/QmitkStdMultiWidget.cpp (revision 21081)
+++ CoreUI/Qmitk/QmitkStdMultiWidget.cpp (working copy)
@@ -1570,12 +1570,12 @@
break;
case PLANE_MODE_ROTATION:
- m_SlicesRotator->ResetMouseCursor();
+ m_SlicesRotator->ResetMouseCursor( NULL );
gi->RemoveListener( m_SlicesRotator );
break;
case PLANE_MODE_SWIVEL:
- m_SlicesSwiveller->ResetMouseCursor();
+ m_SlicesSwiveller->ResetMouseCursor( NULL );
gi->RemoveListener( m_SlicesSwiveller );
break;
}
@@ -1715,7 +1715,7 @@
// Notify MainTemplate GUI that this mode has been deselected
emit WidgetPlaneModeRotation( false );
- m_SlicesRotator->ResetMouseCursor();
+ m_SlicesRotator->ResetMouseCursor( NULL );
gi->RemoveListener( m_SlicesRotator );
break;
@@ -1723,7 +1723,7 @@
// Notify MainTemplate GUI that this mode has been deselected
emit WidgetPlaneModeSwivel( false );
- m_SlicesSwiveller->ResetMouseCursor();
+ m_SlicesSwiveller->ResetMouseCursor( NULL );
gi->RemoveListener( m_SlicesSwiveller );
break;
}
Index: Modules/MitkExt/Interactions/mitkRegionGrowingTool.cpp
===================================================================
--- Modules/MitkExt/Interactions/mitkRegionGrowingTool.cpp (revision 21081)
+++ Modules/MitkExt/Interactions/mitkRegionGrowingTool.cpp (working copy)
@@ -266,7 +266,7 @@
// 3.2.1 Remember Y cursor position and initial seed point
//m_ScreenYPositionAtStart = static_cast<int>(positionEvent->GetDisplayPosition()[1]);
- m_LastScreenPosition = ApplicationCursor::GetInstance()->GetCursorPosition();
+ m_LastScreenPosition = ApplicationCursor::GetInstance()->GetCursorPosition( NULL );
m_ScreenYDifference = 0;
m_SeedPointMemoryOffset = projectedPointIn2D[1] * m_OriginalPicSlice->n[0] + projectedPointIn2D[0];
@@ -335,8 +335,8 @@
{
ApplicationCursor* cursor = ApplicationCursor::GetInstance();
if (!cursor) return false;
- m_ScreenYDifference += cursor->GetCursorPosition()[1] - m_LastScreenPosition[1];
- cursor->SetCursorPosition( m_LastScreenPosition );
+ m_ScreenYDifference += cursor->GetCursorPosition(NULL)[1] - m_LastScreenPosition[1];
+ cursor->SetCursorPosition( NULL, m_LastScreenPosition );
m_LowerThreshold = m_InitialLowerThreshold + static_cast<int>( m_ScreenYDifference * m_MouseDistanceScaleFactor );
if (m_LowerThreshold < 1) m_LowerThreshold = 1;

File Metadata

Mime Type
text/plain
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
409
Default Alt Text
bug3210.diff (12 KB)