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 }