diff --git a/Modules/Core/src/Controllers/mitkStepper.cpp b/Modules/Core/src/Controllers/mitkStepper.cpp index 24099f682a..57acf82314 100644 --- a/Modules/Core/src/Controllers/mitkStepper.cpp +++ b/Modules/Core/src/Controllers/mitkStepper.cpp @@ -1,205 +1,212 @@ /*============================================================================ The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center (DKFZ) All rights reserved. Use of this source code is governed by a 3-clause BSD license that can be found in the LICENSE file. ============================================================================*/ #include "mitkStepper.h" mitk::Stepper::Stepper() : m_Pos(0), m_Steps(0), m_AutoRepeat(false), m_PingPong(false), m_InverseDirection(false), m_RangeMin(0.0), m_RangeMax(-1.0), m_RangeValid(false), m_HasRange(false), m_HasUnitName(false) { } mitk::Stepper::~Stepper() { } void mitk::Stepper::SetRange(ScalarType min, ScalarType max) { m_RangeMin = min; m_RangeMax = max; m_HasRange = true; m_RangeValid = true; this->Modified(); } void mitk::Stepper::InvalidateRange() { m_HasRange = true; m_RangeValid = false; this->Modified(); } mitk::ScalarType mitk::Stepper::GetRangeMin() const { return m_RangeMin; } mitk::ScalarType mitk::Stepper::GetRangeMax() const { return m_RangeMax; } void mitk::Stepper::RemoveRange() { m_HasRange = false; this->Modified(); } bool mitk::Stepper::HasValidRange() const { return (m_HasRange && m_RangeValid); } bool mitk::Stepper::HasRange() const { return m_HasRange; } void mitk::Stepper::SetUnitName(const char *unitName) { m_UnitName = std::string(unitName); m_HasUnitName = true; this->Modified(); } const char *mitk::Stepper::GetUnitName() const { return m_UnitName.c_str(); } void mitk::Stepper::RemoveUnitName() { m_HasUnitName = false; this->Modified(); } bool mitk::Stepper::HasUnitName() const { return m_HasUnitName; } void mitk::Stepper::Increase() { if (this->GetPos() < this->GetSteps() - 1) { this->SetPos(this->GetPos() + 1); } else if (m_AutoRepeat) { if (!m_PingPong) { this->SetPos(0); } else { m_InverseDirection = true; if (this->GetPos() > 0) { this->SetPos(this->GetPos() - 1); } } } } void mitk::Stepper::Decrease() { if (this->GetPos() > 0) { this->SetPos(this->GetPos() - 1); } else if (m_AutoRepeat) { if (!m_PingPong) { this->SetPos(this->GetSteps() - 1); } else { m_InverseDirection = false; if (this->GetPos() < this->GetSteps() - 1) { this->SetPos(this->GetPos() + 1); } } } } void mitk::Stepper::Next() { if (!m_InverseDirection) { this->Increase(); } else { this->Decrease(); } } void mitk::Stepper::Previous() { if (!m_InverseDirection) { this->Decrease(); } else { this->Increase(); } } void mitk::Stepper::MoveSlice(int sliceDelta) { - int newPosition = this->GetPos() + sliceDelta; - // if auto repeat is on, increasing continues at the first slice if the last slice was reached and vice versa int maxSlices = this->GetSteps(); + if (0 == maxSlices) + { + // cannot move slice if no slices available (no image loaded) + return; + } + + int newPosition = this->GetPos() + sliceDelta; + if (m_AutoRepeat) { + // if auto repeat is on, increasing continues at the first slice if the last slice was reached and vice versa while (newPosition < 0) { newPosition += maxSlices; } while (newPosition >= maxSlices) { newPosition -= maxSlices; } } else { // if the new slice is below 0 we still show slice 0 // due to the stepper using unsigned int we have to do this ourselves if (newPosition < 1) { newPosition = 0; } } this->SetPos(newPosition); } void mitk::Stepper::First() { this->SetPos(0); } void mitk::Stepper::Last() { this->SetPos(this->GetSteps() - 1); }