# HG changeset patch # User Alain Mazy # Date 1574962095 -3600 # Node ID 922d2e61aa5d74bb8be701a8b4520561f2085d38 # Parent a34ba19d2060382ab47db0df860ebf62b8c8f7b5 RadiograpyScene: can now remove any layer + new key wrappers for Delete/Backspace diff -r a34ba19d2060 -r 922d2e61aa5d Applications/Qt/QCairoWidget.cpp --- a/Applications/Qt/QCairoWidget.cpp Wed Nov 27 17:56:48 2019 +0100 +++ b/Applications/Qt/QCairoWidget.cpp Thu Nov 28 18:28:15 2019 +0100 @@ -185,6 +185,16 @@ break; } } + else if (keyChar == 127) + { + switch (event->key()) + { + CASE_QT_KEY_TO_ORTHANC(Qt::Key_Delete, KeyboardKeys_Delete); + CASE_QT_KEY_TO_ORTHANC(Qt::Key_Backspace, KeyboardKeys_Backspace); + default: + break; + } + } { OrthancStone::NativeStoneApplicationContext::GlobalMutexLocker locker(*context_); diff -r a34ba19d2060 -r 922d2e61aa5d Applications/Sdl/SdlEngine.cpp --- a/Applications/Sdl/SdlEngine.cpp Wed Nov 27 17:56:48 2019 +0100 +++ b/Applications/Sdl/SdlEngine.cpp Thu Nov 28 18:28:15 2019 +0100 @@ -257,6 +257,10 @@ case SDLK_KP_MINUS: locker.GetCentralViewport().KeyPressed(KeyboardKeys_Generic, '-', modifiers); break; + case SDLK_DELETE: + locker.GetCentralViewport().KeyPressed(KeyboardKeys_Delete, 0, modifiers); break; + case SDLK_BACKSPACE: + locker.GetCentralViewport().KeyPressed(KeyboardKeys_Backspace, 0, modifiers); break; case SDLK_RIGHT: locker.GetCentralViewport().KeyPressed(KeyboardKeys_Right, 0, modifiers); break; case SDLK_LEFT: diff -r a34ba19d2060 -r 922d2e61aa5d Framework/Radiography/RadiographyScene.cpp --- a/Framework/Radiography/RadiographyScene.cpp Wed Nov 27 17:56:48 2019 +0100 +++ b/Framework/Radiography/RadiographyScene.cpp Thu Nov 28 18:28:15 2019 +0100 @@ -136,7 +136,7 @@ // LOG(INFO) << "Registering layer: " << countLayers_; - size_t index = countLayers_++; + size_t index = nextLayerIndex_++; raii->SetIndex(index); layers_[index] = raii.release(); @@ -165,7 +165,7 @@ RadiographyScene::RadiographyScene(MessageBroker& broker) : IObserver(broker), IObservable(broker), - countLayers_(0), + nextLayerIndex_(0), hasWindowing_(false), windowingCenter_(0), // Dummy initialization windowingWidth_(0) // Dummy initialization @@ -221,9 +221,8 @@ delete found->second; layers_.erase(found); - countLayers_--; - LOG(INFO) << "Removing layer, there are now : " << countLayers_ << " layers"; + LOG(INFO) << "Removing layer, there are now : " << layers_.size() << " layers"; BroadcastMessage(RadiographyScene::LayerRemovedMessage(*this, layerIndex)); } @@ -294,7 +293,10 @@ alpha->SetGeometry(*geometry); } - return RegisterLayer(alpha.release()); + RadiographyLayer& registeredLayer = RegisterLayer(alpha.release()); + + BroadcastMessage(RadiographyScene::LayerEditedMessage(*this, registeredLayer)); + return registeredLayer; } @@ -513,7 +515,7 @@ bool applyWindowing) const { // Render layers in the background-to-foreground order - for (size_t index = 0; index < countLayers_; index++) + for (size_t index = 0; index < nextLayerIndex_; index++) { Layers::const_iterator it = layers_.find(index); if (it != layers_.end()) @@ -530,7 +532,7 @@ double y) const { // Render layers in the foreground-to-background order - for (size_t i = countLayers_; i > 0; i--) + for (size_t i = nextLayerIndex_; i > 0; i--) { index = i - 1; Layers::const_iterator it = layers_.find(index); diff -r a34ba19d2060 -r 922d2e61aa5d Framework/Radiography/RadiographyScene.h --- a/Framework/Radiography/RadiographyScene.h Wed Nov 27 17:56:48 2019 +0100 +++ b/Framework/Radiography/RadiographyScene.h Thu Nov 28 18:28:15 2019 +0100 @@ -161,7 +161,7 @@ protected: typedef std::map Layers; - size_t countLayers_; + size_t nextLayerIndex_; bool hasWindowing_; float windowingCenter_; float windowingWidth_; diff -r a34ba19d2060 -r 922d2e61aa5d Framework/Radiography/RadiographyWidget.cpp --- a/Framework/Radiography/RadiographyWidget.cpp Wed Nov 27 17:56:48 2019 +0100 +++ b/Framework/Radiography/RadiographyWidget.cpp Thu Nov 28 18:28:15 2019 +0100 @@ -184,34 +184,6 @@ selectedLayer_ = layer; } - void RadiographyWidget::ClearSelectedLayer() - { - hasSelection_ = false; - } - - bool RadiographyWidget::SelectMaskLayer(size_t index) - { - std::vector layerIndexes; - size_t count = 0; - scene_->GetLayersIndexes(layerIndexes); - - for (size_t i = 0; i < layerIndexes.size(); ++i) - { - const RadiographyMaskLayer* maskLayer = dynamic_cast(&(scene_->GetLayer(layerIndexes[i]))); - if (maskLayer != NULL) - { - if (count == index) - { - Select(layerIndexes[i]); - return true; - } - count++; - } - } - - return false; - } - bool RadiographyWidget::LookupSelectedLayer(size_t& layer) { if (hasSelection_) @@ -244,8 +216,9 @@ size_t removedLayerIndex = message.GetLayerIndex(); if (hasSelection_ && selectedLayer_ == removedLayerIndex) { - ClearSelectedLayer(); + Unselect(); } + NotifyContentChanged(); } void RadiographyWidget::SetInvert(bool invert) diff -r a34ba19d2060 -r 922d2e61aa5d Framework/Radiography/RadiographyWidget.h --- a/Framework/Radiography/RadiographyWidget.h Wed Nov 27 17:56:48 2019 +0100 +++ b/Framework/Radiography/RadiographyWidget.h Thu Nov 28 18:28:15 2019 +0100 @@ -71,16 +71,14 @@ void SetScene(boost::shared_ptr scene); + void Select(size_t layer); + void Unselect() { hasSelection_ = false; } - void Select(size_t layer); - - void ClearSelectedLayer(); - - bool SelectMaskLayer(size_t index = 0); + template bool SelectLayerByType(size_t index = 0); bool LookupSelectedLayer(size_t& layer); @@ -106,4 +104,27 @@ return interpolation_; } }; + + template bool RadiographyWidget::SelectLayerByType(size_t index) + { + std::vector layerIndexes; + size_t count = 0; + scene_->GetLayersIndexes(layerIndexes); + + for (size_t i = 0; i < layerIndexes.size(); ++i) + { + const LayerType* typedLayer = dynamic_cast(&(scene_->GetLayer(layerIndexes[i]))); + if (typedLayer != NULL) + { + if (count == index) + { + Select(layerIndexes[i]); + return true; + } + count++; + } + } + + return false; + } } diff -r a34ba19d2060 -r 922d2e61aa5d Framework/StoneEnumerations.h --- a/Framework/StoneEnumerations.h Wed Nov 27 17:56:48 2019 +0100 +++ b/Framework/StoneEnumerations.h Thu Nov 28 18:28:15 2019 +0100 @@ -95,10 +95,12 @@ KeyboardKeys_Generic = 0, // let's use the same ids as in javascript to avoid some conversion in WASM: https://css-tricks.com/snippets/javascript/javascript-keycodes/ + KeyboardKeys_Backspace = 8, KeyboardKeys_Left = 37, KeyboardKeys_Up = 38, KeyboardKeys_Right = 39, - KeyboardKeys_Down = 40 + KeyboardKeys_Down = 40, + KeyboardKeys_Delete = 46 }; enum SopClassUid