| 437 | } |
| 438 | |
| 439 | void |
| 440 | LayoutViewBase::shutdown () |
| 441 | { |
| 442 | // detach all observers |
| 443 | // This is to prevent signals to partially destroyed observers that own a LayoutViewBase |
| 444 | layer_list_changed_event.clear (); |
| 445 | layer_list_deleted_event.clear (); |
| 446 | layer_list_inserted_event.clear (); |
| 447 | current_layer_list_changed_event.clear (); |
| 448 | cell_visibility_changed_event.clear (); |
| 449 | cellviews_about_to_change_event.clear (); |
| 450 | cellview_about_to_change_event.clear (); |
| 451 | cellviews_changed_event.clear (); |
| 452 | cellview_changed_event.clear (); |
| 453 | rdb_list_changed_event.clear (); |
| 454 | l2ndb_list_changed_event.clear (); |
| 455 | file_open_event.clear (); |
| 456 | hier_changed_event.clear (); |
| 457 | geom_changed_event.clear (); |
| 458 | annotations_changed_event.clear (); |
| 459 | |
| 460 | // detach ourselves from any observed objects to prevent signals while destroying |
| 461 | tl::Object::detach_from_all_events (); |
| 462 | |
| 463 | // remove all rdb's |
| 464 | while (num_rdbs () > 0) { |
| 465 | remove_rdb (0); |
| 466 | } |
| 467 | |
| 468 | // remove all L2N DB's |
| 469 | while (num_l2ndbs () > 0) { |
| 470 | remove_l2ndb (0); |
| 471 | } |
| 472 | |
| 473 | // delete layer lists |
| 474 | std::vector<LayerPropertiesList *> layer_properties_lists; |
| 475 | layer_properties_lists.swap (m_layer_properties_lists); |
| 476 | for (std::vector<LayerPropertiesList *>::iterator l = layer_properties_lists.begin (); l != layer_properties_lists.end (); ++l) { |
| 477 | if (*l) { |
| 478 | delete *l; |
| 479 | } |
| 480 | } |
| 481 | |
| 482 | // NOTE: this must happen before the services are deleted |
| 483 | mp_move_service = 0; |
| 484 | mp_selection_service = 0; |
| 485 | mp_tracker = 0; |
| 486 | mp_zoom_service = 0; |
| 487 | |
| 488 | // delete all plugins |
| 489 | std::vector<lay::Plugin *> plugins; |
| 490 | plugins.swap (mp_plugins); |
| 491 | for (std::vector<lay::Plugin *>::iterator p = plugins.begin (); p != plugins.end (); ++p) { |
| 492 | delete *p; |
| 493 | } |
| 494 | |
| 495 | // detach from the manager, so we can safely delete the manager |
| 496 | manager (0); |