Mercurial > hg > orthanc-stone
comparison Framework/Widgets/LayerWidget.cpp @ 300:b4abaeb783b1 am-callable-and-promise
messaging refactoring almost complete: works fine in native
author | am@osimis.io |
---|---|
date | Tue, 18 Sep 2018 15:23:21 +0200 |
parents | 3897f9f28cfa |
children | 14ef1227120f |
comparison
equal
deleted
inserted
replaced
299:3897f9f28cfa | 300:b4abaeb783b1 |
---|---|
384 { | 384 { |
385 delete layers_[i]; | 385 delete layers_[i]; |
386 } | 386 } |
387 } | 387 } |
388 | 388 |
389 void LayerWidget::ObserveLayer(ILayerSource& layer) | |
390 { | |
391 layer.RegisterObserverCallback(new Callable<LayerWidget, ILayerSource::GeometryReadyMessage>(*this, &LayerWidget::OnGeometryReady)); | |
392 // currently ignore errors layer->RegisterObserverCallback(new Callable<LayerWidget, ILayerSource::GeometryErrorMessage>(*this, &LayerWidget::...)); | |
393 layer.RegisterObserverCallback(new Callable<LayerWidget, ILayerSource::SliceChangedMessage>(*this, &LayerWidget::OnSliceChanged)); | |
394 layer.RegisterObserverCallback(new Callable<LayerWidget, ILayerSource::ContentChangedMessage>(*this, &LayerWidget::OnContentChanged)); | |
395 layer.RegisterObserverCallback(new Callable<LayerWidget, ILayerSource::LayerReadyMessage>(*this, &LayerWidget::OnLayerReady)); | |
396 } | |
397 | |
389 | 398 |
390 size_t LayerWidget::AddLayer(ILayerSource* layer) // Takes ownership | 399 size_t LayerWidget::AddLayer(ILayerSource* layer) // Takes ownership |
391 { | 400 { |
392 if (layer == NULL) | 401 if (layer == NULL) |
393 { | 402 { |
398 layers_.push_back(layer); | 407 layers_.push_back(layer); |
399 styles_.push_back(RenderStyle()); | 408 styles_.push_back(RenderStyle()); |
400 layersIndex_[layer] = index; | 409 layersIndex_[layer] = index; |
401 | 410 |
402 ResetPendingScene(); | 411 ResetPendingScene(); |
403 // layer->RegisterObserver(*this); | 412 |
413 ObserveLayer(*layer); | |
404 | 414 |
405 ResetChangedLayers(); | 415 ResetChangedLayers(); |
406 | 416 |
407 return index; | 417 return index; |
408 } | 418 } |
422 delete layers_[index]; | 432 delete layers_[index]; |
423 layers_[index] = layer; | 433 layers_[index] = layer; |
424 layersIndex_[layer] = index; | 434 layersIndex_[layer] = index; |
425 | 435 |
426 ResetPendingScene(); | 436 ResetPendingScene(); |
427 // layer->RegisterObserver(*this); | 437 |
438 ObserveLayer(*layer); | |
428 | 439 |
429 InvalidateLayer(index); | 440 InvalidateLayer(index); |
430 } | 441 } |
431 | 442 |
432 | 443 |
489 | 500 |
490 InvalidateAllLayers(); // TODO Removing this line avoid loading twice the image in WASM | 501 InvalidateAllLayers(); // TODO Removing this line avoid loading twice the image in WASM |
491 } | 502 } |
492 } | 503 } |
493 | 504 |
494 void LayerWidget::HandleMessage(IObservable& from, const IMessage& message) | 505 void LayerWidget::OnGeometryReady(const ILayerSource::GeometryReadyMessage& message) |
495 { | |
496 switch (message.GetType()) { | |
497 case MessageType_LayerSource_GeometryReady: | |
498 OnGeometryReady(dynamic_cast<const ILayerSource&>(from)); | |
499 break; | |
500 case MessageType_LayerSource_GeometryError: | |
501 LOG(ERROR) << "Cannot get geometry"; | |
502 break; | |
503 case MessageType_LayerSource_ContentChanged: | |
504 OnContentChanged(dynamic_cast<const ILayerSource&>(from)); | |
505 break; | |
506 case MessageType_LayerSource_SliceChanged: | |
507 OnSliceChanged(dynamic_cast<const ILayerSource&>(from), dynamic_cast<const ILayerSource::SliceChangedMessage&>(message).slice_); | |
508 break; | |
509 case MessageType_LayerSource_LayerReady: | |
510 { | |
511 const ILayerSource::LayerReadyMessage& layerReadyMessage = dynamic_cast<const ILayerSource::LayerReadyMessage&>(message); | |
512 OnLayerReady(layerReadyMessage.layer_, | |
513 dynamic_cast<const ILayerSource&>(from), | |
514 layerReadyMessage.slice_, | |
515 layerReadyMessage.isError_); | |
516 }; break; | |
517 default: | |
518 throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); | |
519 } | |
520 } | |
521 | |
522 void LayerWidget::OnGeometryReady(const ILayerSource& source) | |
523 { | 506 { |
524 size_t i; | 507 size_t i; |
525 if (LookupLayer(i, source)) | 508 if (LookupLayer(i, message.origin_)) |
526 { | 509 { |
527 LOG(INFO) << ": Geometry ready for layer " << i << " in " << GetName(); | 510 LOG(INFO) << ": Geometry ready for layer " << i << " in " << GetName(); |
528 | 511 |
529 changedLayers_[i] = true; | 512 changedLayers_[i] = true; |
530 //layers_[i]->ScheduleLayerCreation(slice_); | 513 //layers_[i]->ScheduleLayerCreation(slice_); |
556 | 539 |
557 //layers_[layer]->ScheduleLayerCreation(slice_); | 540 //layers_[layer]->ScheduleLayerCreation(slice_); |
558 } | 541 } |
559 | 542 |
560 | 543 |
561 void LayerWidget::OnContentChanged(const ILayerSource& source) | 544 void LayerWidget::OnContentChanged(const ILayerSource::ContentChangedMessage& message) |
562 { | 545 { |
563 size_t index; | 546 size_t index; |
564 if (LookupLayer(index, source)) | 547 if (LookupLayer(index, message.origin_)) |
565 { | 548 { |
566 InvalidateLayer(index); | 549 InvalidateLayer(index); |
567 } | 550 } |
568 } | 551 } |
569 | 552 |
570 | 553 |
571 void LayerWidget::OnSliceChanged(const ILayerSource& source, | 554 void LayerWidget::OnSliceChanged(const ILayerSource::SliceChangedMessage& message) |
572 const Slice& slice) | 555 { |
573 { | 556 if (message.slice_.ContainsPlane(slice_)) |
574 if (slice.ContainsPlane(slice_)) | |
575 { | 557 { |
576 size_t index; | 558 size_t index; |
577 if (LookupLayer(index, source)) | 559 if (LookupLayer(index, message.origin_)) |
578 { | 560 { |
579 InvalidateLayer(index); | 561 InvalidateLayer(index); |
580 } | 562 } |
581 } | 563 } |
582 } | 564 } |
583 | 565 |
584 | 566 |
585 void LayerWidget::OnLayerReady(std::auto_ptr<ILayerRenderer>& renderer, | 567 void LayerWidget::OnLayerReady(const ILayerSource::LayerReadyMessage& message) |
586 const ILayerSource& source, | |
587 const CoordinateSystem3D& slice, | |
588 bool isError) | |
589 { | 568 { |
590 size_t index; | 569 size_t index; |
591 if (LookupLayer(index, source)) | 570 if (LookupLayer(index, message.origin_)) |
592 { | 571 { |
593 if (isError) | 572 if (message.isError_) |
594 { | 573 { |
595 LOG(ERROR) << "Using error renderer on layer " << index; | 574 LOG(ERROR) << "Using error renderer on layer " << index; |
596 } | 575 } |
597 else | 576 else |
598 { | 577 { |
599 LOG(INFO) << "Renderer ready for layer " << index; | 578 LOG(INFO) << "Renderer ready for layer " << index; |
600 } | 579 } |
601 | 580 |
602 if (renderer.get() != NULL) | 581 if (message.renderer_.get() != NULL) |
603 { | 582 { |
604 UpdateLayer(index, renderer.release(), slice); | 583 UpdateLayer(index, message.renderer_.release(), message.slice_); |
605 } | 584 } |
606 else if (isError) | 585 else if (message.isError_) |
607 { | 586 { |
608 // TODO | 587 // TODO |
609 //UpdateLayer(index, new SliceOutlineRenderer(slice), slice); | 588 //UpdateLayer(index, new SliceOutlineRenderer(slice), slice); |
610 } | 589 } |
611 } | 590 } |