00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include <QmitkLevelWindowWidgetContextMenu.h>
00019 #include "QmitkLevelWindowPresetDefinitionDialog.h"
00020 #include "QmitkLevelWindowRangeChangeDialog.h"
00021 #include <QCursor>
00022 #include <mitkRenderingManager.h>
00023
00024 QmitkLevelWindowWidgetContextMenu::QmitkLevelWindowWidgetContextMenu(QWidget * parent, Qt::WindowFlags f )
00025 : QWidget( parent, f )
00026 {
00027 m_LevelWindowPreset = mitk::LevelWindowPreset::New();
00028 m_LevelWindowPreset->LoadPreset();
00029 }
00030
00031 QmitkLevelWindowWidgetContextMenu::~QmitkLevelWindowWidgetContextMenu()
00032 {
00033 m_LevelWindowPreset->Delete();
00034 }
00035
00036 void QmitkLevelWindowWidgetContextMenu::setPreset(QAction* presetAction)
00037 {
00038 QString item = presetAction->text();
00039 if (!(presetAction == m_PresetAction))
00040 {
00041 double dlevel = m_LevelWindowPreset->getLevel(item.toStdString());
00042 double dwindow = m_LevelWindowPreset->getWindow(item.toStdString());
00043 if ((dlevel + dwindow/2) > m_LevelWindow.GetRangeMax())
00044 {
00045 double lowerBound = (dlevel - dwindow/2);
00046 if (!(lowerBound > m_LevelWindow.GetRangeMax()))
00047 {
00048 dwindow = m_LevelWindow.GetRangeMax() - lowerBound;
00049 dlevel = lowerBound + dwindow/2;
00050 }
00051 else
00052 {
00053 dlevel = m_LevelWindow.GetRangeMax() - 1;
00054 dwindow = 2;
00055 }
00056 }
00057 else if ((dlevel - dwindow/2) < m_LevelWindow.GetRangeMin())
00058 {
00059 double upperBound = (dlevel + dwindow/2);
00060 if (!(upperBound < m_LevelWindow.GetRangeMin()))
00061 {
00062 dwindow = m_LevelWindow.GetRangeMin() + upperBound;
00063 dlevel = upperBound - dwindow/2;
00064 }
00065 else
00066 {
00067 dlevel = m_LevelWindow.GetRangeMin() + 1;
00068 dwindow = 2;
00069 }
00070 }
00071 m_LevelWindow.SetLevelWindow(dlevel, dwindow);
00072 m_Manager->SetLevelWindow(m_LevelWindow);
00073 mitk::RenderingManager::GetInstance()->RequestUpdateAll();
00074 }
00075 }
00076
00077 void QmitkLevelWindowWidgetContextMenu::setLevelWindowManager(mitk::LevelWindowManager* levelWindowManager)
00078 {
00079 m_Manager = levelWindowManager;
00080 }
00081
00082 void QmitkLevelWindowWidgetContextMenu::addPreset()
00083 {
00084 QmitkLevelWindowPresetDefinitionDialog addPreset(this);
00085 addPreset.setPresets(m_LevelWindowPreset->getLevelPresets(), m_LevelWindowPreset->getWindowPresets(), QString::number( (int) m_LevelWindow.GetLevel() ), QString::number( (int) m_LevelWindow.GetWindow() ));
00086 if(addPreset.exec())
00087 {
00088 m_LevelWindowPreset->newPresets(addPreset.getLevelPresets(), addPreset.getWindowPresets());
00089 }
00090 }
00091
00092 void QmitkLevelWindowWidgetContextMenu::setFixed()
00093 {
00094 m_LevelWindow.SetFixed(!m_LevelWindow.GetFixed());
00095 m_Manager->SetLevelWindow(m_LevelWindow);
00096 }
00097
00098 void QmitkLevelWindowWidgetContextMenu::useAllGreyvaluesFromImage()
00099 {
00100 m_LevelWindow.SetAuto(m_Manager->GetCurrentImage(), true, false);
00101 m_Manager->SetLevelWindow(m_LevelWindow);
00102 mitk::RenderingManager::GetInstance()->RequestUpdateAll();
00103 }
00104
00105 void QmitkLevelWindowWidgetContextMenu::setDefaultLevelWindow()
00106 {
00107 m_LevelWindow.ResetDefaultLevelWindow();
00108 m_Manager->SetLevelWindow(m_LevelWindow);
00109 mitk::RenderingManager::GetInstance()->RequestUpdateAll();
00110 }
00111
00112 void QmitkLevelWindowWidgetContextMenu::setMaximumWindow()
00113 {
00114 m_LevelWindow.SetToMaxWindowSize();
00115 m_Manager->SetLevelWindow(m_LevelWindow);
00116 mitk::RenderingManager::GetInstance()->RequestUpdateAll();
00117 }
00118
00119 void QmitkLevelWindowWidgetContextMenu::setDefaultScaleRange()
00120 {
00121 m_LevelWindow.ResetDefaultRangeMinMax();
00122 m_LevelWindow.SetLevelWindow(m_LevelWindow.GetLevel(), m_LevelWindow.GetWindow());
00123 m_Manager->SetLevelWindow(m_LevelWindow);
00124 mitk::RenderingManager::GetInstance()->RequestUpdateAll();
00125 }
00126
00127 void QmitkLevelWindowWidgetContextMenu::changeScaleRange()
00128 {
00129 QmitkLevelWindowRangeChangeDialog changeRange(this);
00130 changeRange.setLowerLimit((int)m_LevelWindow.GetRangeMin());
00131 changeRange.setUpperLimit((int)m_LevelWindow.GetRangeMax());
00132 if(changeRange.exec())
00133 {
00134 m_LevelWindow.SetRangeMinMax(changeRange.getLowerLimit(), changeRange.getUpperLimit());
00135 m_LevelWindow.SetLevelWindow(m_LevelWindow.GetLevel(), m_LevelWindow.GetWindow());
00136 m_Manager->SetLevelWindow(m_LevelWindow);
00137 mitk::RenderingManager::GetInstance()->RequestUpdateAll();
00138 }
00139 }
00140
00141 void QmitkLevelWindowWidgetContextMenu::setImage(QAction* imageAction)
00142 {
00143 if (imageAction == m_ImageAction)
00144 if ( m_Manager->isAutoTopMost() == false)
00145 m_Manager->SetAutoTopMostImage(true);
00146 else
00147 m_Manager->SetAutoTopMostImage(false);
00148 else
00149 m_Manager->SetLevelWindowProperty(m_Images[imageAction]);
00150 }
00151
00152 void QmitkLevelWindowWidgetContextMenu::getContextMenu(QMenu* contextmenu)
00153 {
00154 try
00155 {
00156 m_LevelWindow = m_Manager->GetLevelWindow();
00157
00158 QMenu* contextMenu = contextmenu;
00159 Q_CHECK_PTR( contextMenu );
00160
00161 QAction* sliderFixed = contextMenu->addAction(tr("Set Slider Fixed"), this, SLOT(setFixed()));
00162 sliderFixed->setCheckable(true);
00163 sliderFixed->setChecked(m_LevelWindow.IsFixed());
00164 contextMenu->addSeparator();
00165 contextMenu->addAction(tr("Use Whole Image Greyvalues"), this, SLOT(useAllGreyvaluesFromImage()));
00166 contextMenu->addSeparator();
00167 contextMenu->addAction(tr("Set Maximum Window"), this, SLOT(setMaximumWindow()));
00168 contextMenu->addAction(tr("Default Level/Window"), this, SLOT(setDefaultLevelWindow()));
00169 contextMenu->addSeparator();
00170 contextMenu->addAction(tr("Change Scale Range"), this, SLOT(changeScaleRange()));
00171 contextMenu->addAction(tr("Default Scale Range"), this, SLOT(setDefaultScaleRange()));
00172 contextMenu->addSeparator();
00173
00174 m_PresetSubmenu = new QMenu( this );
00175 Q_CHECK_PTR( m_PresetSubmenu );
00176 m_PresetSubmenu->setTitle("Presets");
00177 m_PresetAction = m_PresetSubmenu->addAction(tr("Preset Definition"), this, SLOT(addPreset()));
00178 m_PresetSubmenu->addSeparator();
00179 std::map<std::string, double> preset = m_LevelWindowPreset->getLevelPresets();
00180 for( std::map<std::string, double>::iterator iter = preset.begin(); iter != preset.end(); iter++ ) {
00181 QString item = ((*iter).first.c_str());
00182 m_PresetSubmenu->addAction(item);
00183 }
00184 connect(m_PresetSubmenu, SIGNAL(triggered(QAction*)), this, SLOT(setPreset(QAction*)));
00185 contextMenu->addMenu(m_PresetSubmenu);
00186 contextMenu->addSeparator();
00187
00188 m_ImageSubmenu = new QMenu( this );
00189 m_ImageSubmenu->setTitle("Images");
00190
00191 m_ImageAction = m_ImageSubmenu->addAction(tr("Set Topmost Image"));
00192 m_ImageAction->setCheckable(true);
00193 if (m_Manager->isAutoTopMost())
00194 m_ImageAction->setChecked(true);
00195 m_ImageSubmenu->addSeparator();
00196 Q_CHECK_PTR( m_ImageSubmenu );
00197 mitk::DataStorage::SetOfObjects::ConstPointer allObjects = m_Manager->GetRelevantNodes();
00198 for ( mitk::DataStorage::SetOfObjects::ConstIterator objectIter = allObjects->Begin(); objectIter != allObjects->End(); ++objectIter)
00199 {
00200 mitk::DataNode* node = objectIter->Value();
00201 if (node)
00202 {
00203 if (node->IsVisible(NULL) == false)
00204 continue;
00205 mitk::LevelWindowProperty::Pointer levelWindowProperty = dynamic_cast<mitk::LevelWindowProperty*>(node->GetProperty("levelwindow"));
00206 if (levelWindowProperty.IsNotNull())
00207 {
00208 std::string name;
00209 node->GetName(name);
00210 QString item = name.c_str();
00211 QAction* id = m_ImageSubmenu->addAction(item);
00212 id->setCheckable(true);
00213 m_Images[id] = levelWindowProperty;
00214 if (levelWindowProperty == m_Manager->GetLevelWindowProperty())
00215 {
00216 id->setChecked(true);
00217 }
00218 }
00219 }
00220 }
00221 connect(m_ImageSubmenu, SIGNAL(triggered(QAction*)), this, SLOT(setImage(QAction*)));
00222 contextMenu->addMenu( m_ImageSubmenu );
00223
00224 contextMenu->exec( QCursor::pos() );
00225 delete contextMenu;
00226 }
00227 catch(...)
00228 {
00229 }
00230 }
00231
00232 void QmitkLevelWindowWidgetContextMenu::getContextMenu()
00233 {
00234 try
00235 {
00236 m_LevelWindow = m_Manager->GetLevelWindow();
00237
00238 QMenu* contextMenu = new QMenu( this );
00239 Q_CHECK_PTR( contextMenu );
00240
00241 QAction* sliderFixed = contextMenu->addAction(tr("Set Slider Fixed"), this, SLOT(setFixed()));
00242 sliderFixed->setCheckable(true);
00243 sliderFixed->setChecked(m_LevelWindow.IsFixed());
00244 contextMenu->addSeparator();
00245 contextMenu->addAction(tr("Use Whole Image Greyvalues"), this, SLOT(useAllGreyvaluesFromImage()));
00246 contextMenu->addSeparator();
00247 contextMenu->addAction(tr("Set Maximum Window"), this, SLOT(setMaximumWindow()));
00248 contextMenu->addAction(tr("Default Level/Window"), this, SLOT(setDefaultLevelWindow()));
00249 contextMenu->addSeparator();
00250 contextMenu->addAction(tr("Change Scale Range"), this, SLOT(changeScaleRange()));
00251 contextMenu->addAction(tr("Default Scale Range"), this, SLOT(setDefaultScaleRange()));
00252 contextMenu->addSeparator();
00253
00254 m_PresetSubmenu = new QMenu( this );
00255 Q_CHECK_PTR( m_PresetSubmenu );
00256 m_PresetSubmenu->setTitle("Presets");
00257 m_PresetAction = m_PresetSubmenu->addAction(tr("Preset Definition"), this, SLOT(addPreset()));
00258 m_PresetSubmenu->addSeparator();
00259 std::map<std::string, double> preset = m_LevelWindowPreset->getLevelPresets();
00260 for( std::map<std::string, double>::iterator iter = preset.begin(); iter != preset.end(); iter++ ) {
00261 QString item = ((*iter).first.c_str());
00262 m_PresetSubmenu->addAction(item);
00263 }
00264 connect(m_PresetSubmenu, SIGNAL(triggered(QAction*)), this, SLOT(setPreset(QAction*)));
00265 contextMenu->addMenu( m_PresetSubmenu );
00266 contextMenu->addSeparator();
00267
00268 m_ImageSubmenu = new QMenu( this );
00269 m_ImageSubmenu->setTitle("Images");
00270
00271 m_ImageAction = m_ImageSubmenu->addAction(tr("Set Topmost Image"));
00272 m_ImageAction->setCheckable(true);
00273 if (m_Manager->isAutoTopMost())
00274 m_ImageAction->setChecked(true);
00275 m_ImageSubmenu->addSeparator();
00276 Q_CHECK_PTR( m_ImageSubmenu );
00277 mitk::DataStorage::SetOfObjects::ConstPointer allObjects = m_Manager->GetRelevantNodes();
00278 for ( mitk::DataStorage::SetOfObjects::ConstIterator objectIter = allObjects->Begin(); objectIter != allObjects->End(); ++objectIter)
00279 {
00280 mitk::DataNode* node = objectIter->Value();
00281 if (node)
00282 {
00283 mitk::LevelWindowProperty::Pointer levelWindowProperty = dynamic_cast<mitk::LevelWindowProperty*>(node->GetProperty("levelwindow"));
00284 if (levelWindowProperty.IsNotNull())
00285 {
00286 std::string name;
00287 node->GetName(name);
00288 QString item = name.c_str();
00289 QAction* id = m_ImageSubmenu->addAction(item);
00290 id->setCheckable(true);
00291 m_Images[id] = levelWindowProperty;
00292 if (levelWindowProperty == m_Manager->GetLevelWindowProperty())
00293 {
00294 id->setChecked(true);
00295 }
00296 }
00297 }
00298 }
00299 connect(m_ImageSubmenu, SIGNAL(activated(int)), this, SLOT(setImage(int)));
00300 contextMenu->addMenu( m_ImageSubmenu );
00301
00302 contextMenu->exec( QCursor::pos() );
00303 delete contextMenu;
00304 }
00305 catch(...)
00306 {
00307 }
00308 }