From ff68fe73090f8bb95e88b8d1f7d03ffc6d1a7672 Mon Sep 17 00:00:00 2001 From: giumas Date: Sun, 21 Jan 2024 18:22:48 +0100 Subject: [PATCH] moved apps under app sub-folder --- .../app/gui}/soundspeedmanager/__init__.py | 0 .../app/gui}/soundspeedmanager/__main__.py | 0 .../soundspeedmanager/dialogs/__init__.py | 0 .../dialogs/automate_dialog.py | 0 .../dialogs/buttons_dialog.py | 0 .../dialogs/common_metadata_dialog.py | 0 .../constant_gradient_profile_dialog.py | 0 .../gui}/soundspeedmanager/dialogs/dialog.py | 0 .../dialogs/export_multi_profile_dialog.py | 628 +++++++++--------- .../dialogs/export_profile_metadata_dialog.py | 0 .../export_profile_metadata_fields_dialog.py | 0 .../dialogs/export_single_profile_dialog.py | 544 +++++++-------- .../dialogs/flaggable_input_dialog.py | 0 .../dialogs/formatted_input_dialog.py | 0 .../dialogs/import_data_dialog.py | 0 .../dialogs/import_multi_profile_dialog.py | 0 .../dialogs/import_single_profile_dialog.py | 0 .../dialogs/metadata_dialog.py | 0 .../dialogs/multi_selection_dialog.py | 0 .../dialogs/output_folders_dialog.py | 0 .../dialogs/plot_multi_profile_dialog.py | 0 .../dialogs/plot_profiles_dialog.py | 0 .../dialogs/proc_data_model.py | 0 .../dialogs/project_new_dialog.py | 0 .../dialogs/project_rename_dialog.py | 0 .../dialogs/project_switch_dialog.py | 0 .../dialogs/raw_data_model.py | 0 .../dialogs/reference_dialog.py | 0 .../gui}/soundspeedmanager/dialogs/seacat.py | 0 .../dialogs/seacat_dialog.py | 0 .../dialogs/sis_data_model.py | 0 .../dialogs/spreadsheet_dialog.py | 0 .../soundspeedmanager/dialogs/text_editor.py | 0 .../dialogs/text_editor_dialog.py | 0 .../app/gui}/soundspeedmanager/gui.py | 0 .../app/gui}/soundspeedmanager/mainwin.py | 0 .../app/gui}/soundspeedmanager/media/LICENSE | 0 .../media/SoundSpeedManager.ico | Bin .../gui}/soundspeedmanager/media/app_icon.png | Bin .../gui}/soundspeedmanager/media/authors.png | Bin .../app/gui}/soundspeedmanager/media/back.png | Bin .../soundspeedmanager/media/bias_plots.png | Bin .../app/gui}/soundspeedmanager/media/ccom.png | Bin .../gui}/soundspeedmanager/media/clear.png | Bin .../gui}/soundspeedmanager/media/close.png | Bin .../media/constant_gradient.png | Bin .../gui}/soundspeedmanager/media/database.png | Bin .../gui}/soundspeedmanager/media/db_load.png | Bin .../gui}/soundspeedmanager/media/db_save.png | Bin .../gui}/soundspeedmanager/media/delete.png | Bin .../gui}/soundspeedmanager/media/editor.png | Bin .../gui}/soundspeedmanager/media/export.png | Bin .../media/export_profile.png | Bin .../gui}/soundspeedmanager/media/extend.png | Bin .../gui}/soundspeedmanager/media/favicon.png | Bin .../gui}/soundspeedmanager/media/filesave.png | Bin .../gui}/soundspeedmanager/media/filter.png | Bin .../app/gui}/soundspeedmanager/media/flag.png | Bin .../gui}/soundspeedmanager/media/flagged.png | Bin .../gui}/soundspeedmanager/media/forward.png | Bin .../soundspeedmanager/media/grab_cursor.png | Bin .../app/gui}/soundspeedmanager/media/grid.png | Bin .../app/gui}/soundspeedmanager/media/home.png | Bin .../app/gui}/soundspeedmanager/media/html.png | Bin .../app/gui}/soundspeedmanager/media/hyo.png | Bin .../gui}/soundspeedmanager/media/import.png | Bin .../app/gui}/soundspeedmanager/media/info.png | Bin .../gui}/soundspeedmanager/media/input.png | Bin .../gui}/soundspeedmanager/media/insert.png | Bin .../gui}/soundspeedmanager/media/license.png | Bin .../soundspeedmanager/media/load_profile.png | Bin .../app/gui}/soundspeedmanager/media/lock.png | Bin .../gui}/soundspeedmanager/media/manual.pdf | Bin .../app/gui}/soundspeedmanager/media/map.png | Bin .../gui}/soundspeedmanager/media/metadata.png | Bin .../media/metadata_profile.png | Bin .../app/gui}/soundspeedmanager/media/move.png | Bin .../app/gui}/soundspeedmanager/media/noaa.png | Bin .../soundspeedmanager/media/noaa_ccom.png | Bin .../media/noaa_ccom_small.png | Bin .../soundspeedmanager/media/offline_docs.png | Bin .../soundspeedmanager/media/online_docs.png | Bin .../soundspeedmanager/media/pan_cursor.png | Bin .../media/plot_comparison.png | Bin .../soundspeedmanager/media/plot_grid.png | Bin .../soundspeedmanager/media/plot_legend.png | Bin .../app/gui}/soundspeedmanager/media/qa.png | Bin .../media/qt5_editor_options.png | Bin .../media/raytracing_comparison.png | Bin .../gui}/soundspeedmanager/media/receive.png | Bin .../app/gui}/soundspeedmanager/media/ref.png | Bin .../soundspeedmanager/media/refraction.png | Bin .../gui}/soundspeedmanager/media/restart.png | Bin .../app/gui}/soundspeedmanager/media/sal.png | Bin .../app/gui}/soundspeedmanager/media/save.png | Bin .../gui}/soundspeedmanager/media/scale.png | Bin .../gui}/soundspeedmanager/media/seacat.png | Bin .../gui}/soundspeedmanager/media/server.png | Bin .../gui}/soundspeedmanager/media/settings.png | Bin .../gui}/soundspeedmanager/media/smartmap.png | Bin .../gui}/soundspeedmanager/media/stats.png | Bin .../gui}/soundspeedmanager/media/subplots.png | Bin .../media/surveydatamonitor.png | Bin .../gui}/soundspeedmanager/media/temp_sal.png | Bin .../app/gui}/soundspeedmanager/media/text.png | Bin .../gui}/soundspeedmanager/media/thinning.png | Bin .../gui}/soundspeedmanager/media/transmit.png | Bin .../app/gui}/soundspeedmanager/media/tss.png | Bin .../gui}/soundspeedmanager/media/undock.png | Bin .../gui}/soundspeedmanager/media/unflag.png | Bin .../app/gui}/soundspeedmanager/media/unh.png | Bin .../gui}/soundspeedmanager/media/unlock.png | Bin .../soundspeedmanager/media/zoom_to_rect.png | Bin .../gui}/soundspeedmanager/media/zoomin.png | Bin .../gui}/soundspeedmanager/media/zoomout.png | Bin .../gui}/soundspeedmanager/qt_callbacks.py | 0 .../soundspeedmanager/widgets/__init__.py | 0 .../soundspeedmanager/widgets/database.py | 0 .../soundspeedmanager/widgets/dataplots.py | 0 .../gui}/soundspeedmanager/widgets/editor.py | 0 .../soundspeedmanager/widgets/navtoolbar.py | 0 .../soundspeedmanager/widgets/refraction.py | 0 .../gui}/soundspeedmanager/widgets/server.py | 0 .../soundspeedmanager/widgets/settings.py | 0 .../gui}/soundspeedmanager/widgets/widget.py | 0 .../app/gui}/soundspeedsettings/__init__.py | 0 .../app/gui}/soundspeedsettings/__main__.py | 0 .../app/gui}/soundspeedsettings/gui.py | 0 .../app/gui}/soundspeedsettings/mainwin.py | 0 .../soundspeedsettings/media/app_icon.png | Bin .../soundspeedsettings/widgets/__init__.py | 0 .../soundspeedsettings/widgets/general.py | 0 .../gui}/soundspeedsettings/widgets/input.py | 0 .../soundspeedsettings/widgets/listeners.py | 0 .../gui}/soundspeedsettings/widgets/main.py | 0 .../gui}/soundspeedsettings/widgets/output.py | 0 .../gui}/soundspeedsettings/widgets/widget.py | 0 hyo2/{ => ssm2/app/gui}/ssm_sis/__init__.py | 0 hyo2/{ => ssm2/app/gui}/ssm_sis/__main__.py | 0 .../app/gui}/ssm_sis/controlpanel.py | 0 hyo2/{ => ssm2/app/gui}/ssm_sis/gui.py | 0 hyo2/{ => ssm2/app/gui}/ssm_sis/mainwin.py | 0 .../app/gui}/ssm_sis/media/small_info.png | Bin .../app/gui}/ssm_sis/media/ssm_sis.png | Bin 144 files changed, 586 insertions(+), 586 deletions(-) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/__init__.py (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/__main__.py (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/dialogs/__init__.py (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/dialogs/automate_dialog.py (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/dialogs/buttons_dialog.py (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/dialogs/common_metadata_dialog.py (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/dialogs/constant_gradient_profile_dialog.py (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/dialogs/dialog.py (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/dialogs/export_multi_profile_dialog.py (97%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/dialogs/export_profile_metadata_dialog.py (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/dialogs/export_profile_metadata_fields_dialog.py (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/dialogs/export_single_profile_dialog.py (97%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/dialogs/flaggable_input_dialog.py (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/dialogs/formatted_input_dialog.py (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/dialogs/import_data_dialog.py (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/dialogs/import_multi_profile_dialog.py (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/dialogs/import_single_profile_dialog.py (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/dialogs/metadata_dialog.py (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/dialogs/multi_selection_dialog.py (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/dialogs/output_folders_dialog.py (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/dialogs/plot_multi_profile_dialog.py (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/dialogs/plot_profiles_dialog.py (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/dialogs/proc_data_model.py (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/dialogs/project_new_dialog.py (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/dialogs/project_rename_dialog.py (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/dialogs/project_switch_dialog.py (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/dialogs/raw_data_model.py (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/dialogs/reference_dialog.py (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/dialogs/seacat.py (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/dialogs/seacat_dialog.py (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/dialogs/sis_data_model.py (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/dialogs/spreadsheet_dialog.py (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/dialogs/text_editor.py (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/dialogs/text_editor_dialog.py (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/gui.py (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/mainwin.py (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/media/LICENSE (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/media/SoundSpeedManager.ico (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/media/app_icon.png (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/media/authors.png (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/media/back.png (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/media/bias_plots.png (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/media/ccom.png (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/media/clear.png (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/media/close.png (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/media/constant_gradient.png (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/media/database.png (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/media/db_load.png (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/media/db_save.png (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/media/delete.png (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/media/editor.png (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/media/export.png (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/media/export_profile.png (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/media/extend.png (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/media/favicon.png (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/media/filesave.png (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/media/filter.png (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/media/flag.png (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/media/flagged.png (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/media/forward.png (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/media/grab_cursor.png (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/media/grid.png (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/media/home.png (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/media/html.png (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/media/hyo.png (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/media/import.png (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/media/info.png (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/media/input.png (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/media/insert.png (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/media/license.png (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/media/load_profile.png (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/media/lock.png (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/media/manual.pdf (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/media/map.png (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/media/metadata.png (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/media/metadata_profile.png (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/media/move.png (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/media/noaa.png (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/media/noaa_ccom.png (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/media/noaa_ccom_small.png (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/media/offline_docs.png (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/media/online_docs.png (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/media/pan_cursor.png (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/media/plot_comparison.png (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/media/plot_grid.png (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/media/plot_legend.png (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/media/qa.png (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/media/qt5_editor_options.png (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/media/raytracing_comparison.png (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/media/receive.png (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/media/ref.png (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/media/refraction.png (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/media/restart.png (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/media/sal.png (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/media/save.png (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/media/scale.png (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/media/seacat.png (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/media/server.png (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/media/settings.png (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/media/smartmap.png (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/media/stats.png (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/media/subplots.png (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/media/surveydatamonitor.png (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/media/temp_sal.png (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/media/text.png (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/media/thinning.png (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/media/transmit.png (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/media/tss.png (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/media/undock.png (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/media/unflag.png (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/media/unh.png (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/media/unlock.png (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/media/zoom_to_rect.png (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/media/zoomin.png (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/media/zoomout.png (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/qt_callbacks.py (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/widgets/__init__.py (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/widgets/database.py (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/widgets/dataplots.py (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/widgets/editor.py (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/widgets/navtoolbar.py (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/widgets/refraction.py (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/widgets/server.py (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/widgets/settings.py (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedmanager/widgets/widget.py (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedsettings/__init__.py (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedsettings/__main__.py (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedsettings/gui.py (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedsettings/mainwin.py (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedsettings/media/app_icon.png (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedsettings/widgets/__init__.py (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedsettings/widgets/general.py (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedsettings/widgets/input.py (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedsettings/widgets/listeners.py (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedsettings/widgets/main.py (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedsettings/widgets/output.py (100%) rename hyo2/{ => ssm2/app/gui}/soundspeedsettings/widgets/widget.py (100%) rename hyo2/{ => ssm2/app/gui}/ssm_sis/__init__.py (100%) rename hyo2/{ => ssm2/app/gui}/ssm_sis/__main__.py (100%) rename hyo2/{ => ssm2/app/gui}/ssm_sis/controlpanel.py (100%) rename hyo2/{ => ssm2/app/gui}/ssm_sis/gui.py (100%) rename hyo2/{ => ssm2/app/gui}/ssm_sis/mainwin.py (100%) rename hyo2/{ => ssm2/app/gui}/ssm_sis/media/small_info.png (100%) rename hyo2/{ => ssm2/app/gui}/ssm_sis/media/ssm_sis.png (100%) diff --git a/hyo2/soundspeedmanager/__init__.py b/hyo2/ssm2/app/gui/soundspeedmanager/__init__.py similarity index 100% rename from hyo2/soundspeedmanager/__init__.py rename to hyo2/ssm2/app/gui/soundspeedmanager/__init__.py diff --git a/hyo2/soundspeedmanager/__main__.py b/hyo2/ssm2/app/gui/soundspeedmanager/__main__.py similarity index 100% rename from hyo2/soundspeedmanager/__main__.py rename to hyo2/ssm2/app/gui/soundspeedmanager/__main__.py diff --git a/hyo2/soundspeedmanager/dialogs/__init__.py b/hyo2/ssm2/app/gui/soundspeedmanager/dialogs/__init__.py similarity index 100% rename from hyo2/soundspeedmanager/dialogs/__init__.py rename to hyo2/ssm2/app/gui/soundspeedmanager/dialogs/__init__.py diff --git a/hyo2/soundspeedmanager/dialogs/automate_dialog.py b/hyo2/ssm2/app/gui/soundspeedmanager/dialogs/automate_dialog.py similarity index 100% rename from hyo2/soundspeedmanager/dialogs/automate_dialog.py rename to hyo2/ssm2/app/gui/soundspeedmanager/dialogs/automate_dialog.py diff --git a/hyo2/soundspeedmanager/dialogs/buttons_dialog.py b/hyo2/ssm2/app/gui/soundspeedmanager/dialogs/buttons_dialog.py similarity index 100% rename from hyo2/soundspeedmanager/dialogs/buttons_dialog.py rename to hyo2/ssm2/app/gui/soundspeedmanager/dialogs/buttons_dialog.py diff --git a/hyo2/soundspeedmanager/dialogs/common_metadata_dialog.py b/hyo2/ssm2/app/gui/soundspeedmanager/dialogs/common_metadata_dialog.py similarity index 100% rename from hyo2/soundspeedmanager/dialogs/common_metadata_dialog.py rename to hyo2/ssm2/app/gui/soundspeedmanager/dialogs/common_metadata_dialog.py diff --git a/hyo2/soundspeedmanager/dialogs/constant_gradient_profile_dialog.py b/hyo2/ssm2/app/gui/soundspeedmanager/dialogs/constant_gradient_profile_dialog.py similarity index 100% rename from hyo2/soundspeedmanager/dialogs/constant_gradient_profile_dialog.py rename to hyo2/ssm2/app/gui/soundspeedmanager/dialogs/constant_gradient_profile_dialog.py diff --git a/hyo2/soundspeedmanager/dialogs/dialog.py b/hyo2/ssm2/app/gui/soundspeedmanager/dialogs/dialog.py similarity index 100% rename from hyo2/soundspeedmanager/dialogs/dialog.py rename to hyo2/ssm2/app/gui/soundspeedmanager/dialogs/dialog.py diff --git a/hyo2/soundspeedmanager/dialogs/export_multi_profile_dialog.py b/hyo2/ssm2/app/gui/soundspeedmanager/dialogs/export_multi_profile_dialog.py similarity index 97% rename from hyo2/soundspeedmanager/dialogs/export_multi_profile_dialog.py rename to hyo2/ssm2/app/gui/soundspeedmanager/dialogs/export_multi_profile_dialog.py index 39d55f57..d13fb04d 100644 --- a/hyo2/soundspeedmanager/dialogs/export_multi_profile_dialog.py +++ b/hyo2/ssm2/app/gui/soundspeedmanager/dialogs/export_multi_profile_dialog.py @@ -1,314 +1,314 @@ -import os -import logging - -from PySide6 import QtCore, QtWidgets - -from hyo2.abc2.lib.helper import Helper -from hyo2.soundspeedmanager.dialogs.dialog import AbstractDialog -from hyo2.soundspeedmanager.dialogs.output_folders_dialog import OutputFoldersDialog -from hyo2.soundspeed.profile.dicts import Dicts - -logger = logging.getLogger(__name__) - - -class ExportMultiProfileDialog(AbstractDialog): - - def __init__(self, main_win, lib, pks, parent=None): - AbstractDialog.__init__(self, main_win=main_win, lib=lib, parent=parent) - - # check the passed primary keys - if type(pks) is not list: - raise RuntimeError("The dialog takes a list of primary keys, not %s" % type(pks)) - if len(pks) < 2: - raise RuntimeError("The dialog takes a list of at least 2 primary keys, not %s" % len(pks)) - self._pks = pks - - # the list of selected writers passed to the library - self.selected_writers = list() - - self.setWindowTitle("Export multiple profiles") - self.setMinimumWidth(160) - - settings = QtCore.QSettings() - - # outline ui - self.mainLayout = QtWidgets.QVBoxLayout() - self.setLayout(self.mainLayout) - - # label - hbox = QtWidgets.QHBoxLayout() - self.mainLayout.addLayout(hbox) - hbox.addStretch() - label = QtWidgets.QLabel("Select output formats:") - hbox.addWidget(label) - hbox.addStretch() - # buttons - hbox = QtWidgets.QHBoxLayout() - self.mainLayout.addLayout(hbox) - hbox.addStretch() - # - fmt layout - self.fmtLayout = QtWidgets.QHBoxLayout() - hbox.addLayout(self.fmtLayout) - # -- left - self.leftButtonBox = QtWidgets.QDialogButtonBox(QtCore.Qt.Vertical) - self.leftButtonBox.setFixedWidth(100) - self.fmtLayout.addWidget(self.leftButtonBox) - # -- right - self.rightButtonBox = QtWidgets.QDialogButtonBox(QtCore.Qt.Vertical) - self.rightButtonBox.setFixedWidth(100) - self.fmtLayout.addWidget(self.rightButtonBox) - hbox.addStretch() - # add buttons (retrieving name, description and extension from the library) - for idx, name in enumerate(self.lib.name_writers): - - if len(self.lib.ext_writers[idx]) == 0: - continue - - btn = QtWidgets.QPushButton("%s" % self.lib.desc_writers[idx]) - btn.setCheckable(True) - btn.setToolTip("Select %s format [*.%s]" % (self.lib.desc_writers[idx], - ", *.".join(self.lib.ext_writers[idx]))) - - btn_settings = settings.value("export_single_%s" % name) - if btn_settings is None: - settings.setValue("export_single_%s" % name, False) - if settings.value("export_single_%s" % name) == 'true': - btn.setChecked(True) - self.selected_writers.append(name) - - if (idx % 2) == 0: - self.leftButtonBox.addButton(btn, QtWidgets.QDialogButtonBox.ActionRole) - else: - self.rightButtonBox.addButton(btn, QtWidgets.QDialogButtonBox.ActionRole) - - # noinspection PyUnresolvedReferences - self.leftButtonBox.clicked.connect(self.on_select_writer_btn) - # noinspection PyUnresolvedReferences - self.rightButtonBox.clicked.connect(self.on_select_writer_btn) - - self.mainLayout.addSpacing(16) - - # option for selecting the output folder - select_output_folder = settings.value("select_output_folder") - if select_output_folder is None: - settings.setValue("select_output_folder", False) - hbox = QtWidgets.QHBoxLayout() - self.mainLayout.addLayout(hbox) - hbox.addStretch() - self.selectFolder = QtWidgets.QCheckBox('Select output folder', self) - self.selectFolder.setChecked(settings.value("select_output_folder") == 'true') - hbox.addWidget(self.selectFolder) - hbox.addStretch() - - # option for opening the output folder - export_open_folder = settings.value("export_open_folder") - if export_open_folder is None: - settings.setValue("export_open_folder", True) - hbox = QtWidgets.QHBoxLayout() - self.mainLayout.addLayout(hbox) - hbox.addStretch() - self.openFolder = QtWidgets.QCheckBox('Open output folder', self) - self.openFolder.setChecked(settings.value("export_open_folder") == 'true') - hbox.addWidget(self.openFolder) - hbox.addStretch() - - # export - hbox = QtWidgets.QHBoxLayout() - self.mainLayout.addLayout(hbox) - hbox.addStretch() - btn = QtWidgets.QPushButton("Export profiles") - btn.setMinimumHeight(32) - hbox.addWidget(btn) - # noinspection PyUnresolvedReferences - btn.clicked.connect(self.on_export_profile_btn) - hbox.addStretch() - - def on_select_writer_btn(self, btn): - """Update the list of writers to pass to the library""" - logger.debug("%s -> %s" % (btn.text(), btn.isChecked())) - idx = self.lib.desc_writers.index(btn.text()) - name = self.lib.name_writers[idx] - - settings = QtCore.QSettings() - - if btn.isChecked(): - self.selected_writers.append(name) - settings.setValue("export_single_%s" % name, True) - - else: - settings.setValue("export_single_%s" % name, False) - if name in self.selected_writers: - self.selected_writers.remove(name) - - def on_export_profile_btn(self): - logger.debug("export profiles clicked") - - if len(self.selected_writers) == 0: - msg = "Select output formats before data export!" - # noinspection PyCallByClass,PyArgumentList - QtWidgets.QMessageBox.warning(self, "Export warning", msg, QtWidgets.QMessageBox.Ok) - return - - settings = QtCore.QSettings() - - select_output_folder = self.selectFolder.isChecked() - settings.setValue("select_output_folder", select_output_folder) - output_folders = dict() - # each writer may potentially have is own folder - if select_output_folder: - - dlg = OutputFoldersDialog(main_win=self.main_win, lib=self.lib, writers=self.selected_writers, parent=self) - dlg.exec_() - output_folders = dlg.output_folders - if len(output_folders) == 0: - return - - # case where all the writers will write to the same folder - if len(output_folders) == 0: - for writer in self.selected_writers: - output_folders[writer] = self.lib.outputs_folder - settings.setValue("export_folder", self.lib.outputs_folder) - logger.debug('output folder: %s' % self.lib.outputs_folder) - - # CARIS-specific check for file concatenation - for writer in self.selected_writers: - - if writer == 'caris': - caris_path = os.path.join(output_folders[writer], "CARIS", self.lib.current_project + ".svp") - if os.path.exists(caris_path): - msg = "An existing CARIS file is present in the output folder.\n\n" \ - "Do you want to remove it to avoid possible profile duplications?" - # noinspection PyCallByClass,PyArgumentList - ret = QtWidgets.QMessageBox.question(self, "CARIS export", msg, - QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No) - if ret == QtWidgets.QMessageBox.Yes: - os.remove(caris_path) - break - - # special case for Fugro ISS format - force_writer_instrument_for_next_casts = None - custom_writer_instrument = None - - # actually do the export - current_project = None - format_ok = False - opened_folders = list() - export_open_folder = self.openFolder.isChecked() - settings.setValue("export_open_folder", export_open_folder) - all_exported = True - for pk in self._pks: - - success = self.lib.load_profile(pk, skip_atlas=True) - if not success: - # noinspection PyCallByClass,PyArgumentList - QtWidgets.QMessageBox.warning(self, "Database", "Unable to load profile #%02d!" % pk, - QtWidgets.QMessageBox.Ok) - continue - - # special case: synthetic profile and NCEI - skip_export = False - for writer in self.selected_writers: - - if writer != 'ncei': - continue - - if self.lib.ssp.l[0].meta.sensor_type == Dicts.sensor_types['Synthetic']: - msg = "Attempt to export a synthetic profile in NCEI format!" - # noinspection PyCallByClass,PyArgumentList - QtWidgets.QMessageBox.warning(self, "Export warning", msg, QtWidgets.QMessageBox.Ok) - skip_export = True - continue - - if self.lib.current_project == 'default': - - msg = "The 'default' project cannot be used for NCEI export.\n\n" \ - "Rename the project in the Database tab!" - if self.lib.setup.noaa_tools: - msg += "\n\nRecommend in project_survey format, e.g. OPR-P999-RA-17_H12345" - # noinspection PyCallByClass,PyArgumentList - QtWidgets.QMessageBox.warning(self, "Export warning", msg, QtWidgets.QMessageBox.Ok) - skip_export = True - continue - - if self.lib.setup.noaa_tools and self.lib.not_noaa_project(self.lib.current_project): - if self.lib.not_noaa_project(current_project, format_ok): - current_project, format_ok = self.lib.cb.ask_formatted_text(default=self.lib.noaa_project) - if self.lib.not_noaa_project(current_project, format_ok): - msg = "The project name cannot be used for NCEI export.\n\n" \ - "Rename the project in the Database tab!\n\n" \ - "Recommend \"project_survey\" format, e.g. OPR-P999-RA-17_H12345" - # noinspection PyCallByClass,PyArgumentList - QtWidgets.QMessageBox.warning(self, "Export warning", msg, QtWidgets.QMessageBox.Ok) - skip_export = True - continue - - if not self.lib.ssp.cur.meta.survey or \ - not self.lib.ssp.cur.meta.vessel or \ - not self.lib.ssp.cur.meta.institution: - msg = "Survey, vessel, and institution metadata are mandatory for NCEI export.\n\n" \ - "To fix the issue:\n" \ - "- Load the profile (if not already loaded)\n" \ - "- Set the missing values using the Metadata button on the Editor tool bar\n" - # noinspection PyCallByClass,PyArgumentList - QtWidgets.QMessageBox.warning(self, "Export warning", msg, QtWidgets.QMessageBox.Ok) - skip_export = True - continue - - # special case for Fugro ISS format with NCEI format - if self.lib.ssp.cur.meta.probe_type == Dicts.probe_types['ISS']: - logger.info("special case: NCEI and ISS format") - - if force_writer_instrument_for_next_casts is None: - - msg = "Enter the instrument type and model \n(if you don't know, leave it blank):" - instrument, flag = self.lib.cb.ask_text_with_flag("ISS for NCEI", msg, - flag_label="Apply to all the next profiles") - logger.debug("user input for ISS: %s, %r" % (instrument, flag)) - # if empty, we just use the sensor type - if instrument is None or instrument == "": - instrument = self.lib.ssp.cur.meta.sensor - if flag: # to skip the user dialog for next casts - force_writer_instrument_for_next_casts = instrument - else: - force_writer_instrument_for_next_casts = None - custom_writer_instrument = instrument - - else: # user asked to apply to all the next profiles - custom_writer_instrument = force_writer_instrument_for_next_casts - - if skip_export: - all_exported = False - continue - - self.progress.start(text="Exporting profile #%02d" % pk) - try: - self.progress.update(value=60) - self.lib.export_data(data_paths=output_folders, data_formats=self.selected_writers, - custom_writer_instrument=custom_writer_instrument) - - except RuntimeError as e: - self.progress.end() - msg = "Issue in exporting the data for profile #%02d.\nReason: %s" % (pk, e) - # noinspection PyCallByClass,PyArgumentList - QtWidgets.QMessageBox.critical(self, "Export error", msg, QtWidgets.QMessageBox.Ok) - continue - self.progress.end() - - # opening the output folder - if export_open_folder: - - for output_folder in output_folders.values(): - if output_folder not in opened_folders: - Helper.explore_folder(output_folder) - opened_folders.append(output_folder) - - if all_exported: - msg = "Profiles successfully exported!" - # noinspection PyCallByClass,PyArgumentList - QtWidgets.QMessageBox.information(self, "Export profile", msg, QtWidgets.QMessageBox.Ok) - else: - msg = "At least one profile had issues in being exported!" - # noinspection PyCallByClass,PyArgumentList - QtWidgets.QMessageBox.warning(self, "Export profile", msg, QtWidgets.QMessageBox.Ok) - - self.accept() +import os +import logging + +from PySide6 import QtCore, QtWidgets + +from hyo2.abc2.lib.helper import Helper +from hyo2.soundspeedmanager.dialogs.dialog import AbstractDialog +from hyo2.soundspeedmanager.dialogs.output_folders_dialog import OutputFoldersDialog +from hyo2.soundspeed.profile.dicts import Dicts + +logger = logging.getLogger(__name__) + + +class ExportMultiProfileDialog(AbstractDialog): + + def __init__(self, main_win, lib, pks, parent=None): + AbstractDialog.__init__(self, main_win=main_win, lib=lib, parent=parent) + + # check the passed primary keys + if type(pks) is not list: + raise RuntimeError("The dialog takes a list of primary keys, not %s" % type(pks)) + if len(pks) < 2: + raise RuntimeError("The dialog takes a list of at least 2 primary keys, not %s" % len(pks)) + self._pks = pks + + # the list of selected writers passed to the library + self.selected_writers = list() + + self.setWindowTitle("Export multiple profiles") + self.setMinimumWidth(160) + + settings = QtCore.QSettings() + + # outline ui + self.mainLayout = QtWidgets.QVBoxLayout() + self.setLayout(self.mainLayout) + + # label + hbox = QtWidgets.QHBoxLayout() + self.mainLayout.addLayout(hbox) + hbox.addStretch() + label = QtWidgets.QLabel("Select output formats:") + hbox.addWidget(label) + hbox.addStretch() + # buttons + hbox = QtWidgets.QHBoxLayout() + self.mainLayout.addLayout(hbox) + hbox.addStretch() + # - fmt layout + self.fmtLayout = QtWidgets.QHBoxLayout() + hbox.addLayout(self.fmtLayout) + # -- left + self.leftButtonBox = QtWidgets.QDialogButtonBox(QtCore.Qt.Vertical) + self.leftButtonBox.setFixedWidth(100) + self.fmtLayout.addWidget(self.leftButtonBox) + # -- right + self.rightButtonBox = QtWidgets.QDialogButtonBox(QtCore.Qt.Vertical) + self.rightButtonBox.setFixedWidth(100) + self.fmtLayout.addWidget(self.rightButtonBox) + hbox.addStretch() + # add buttons (retrieving name, description and extension from the library) + for idx, name in enumerate(self.lib.name_writers): + + if len(self.lib.ext_writers[idx]) == 0: + continue + + btn = QtWidgets.QPushButton("%s" % self.lib.desc_writers[idx]) + btn.setCheckable(True) + btn.setToolTip("Select %s format [*.%s]" % (self.lib.desc_writers[idx], + ", *.".join(self.lib.ext_writers[idx]))) + + btn_settings = settings.value("export_single_%s" % name) + if btn_settings is None: + settings.setValue("export_single_%s" % name, False) + if settings.value("export_single_%s" % name) == 'true': + btn.setChecked(True) + self.selected_writers.append(name) + + if (idx % 2) == 0: + self.leftButtonBox.addButton(btn, QtWidgets.QDialogButtonBox.ActionRole) + else: + self.rightButtonBox.addButton(btn, QtWidgets.QDialogButtonBox.ActionRole) + + # noinspection PyUnresolvedReferences + self.leftButtonBox.clicked.connect(self.on_select_writer_btn) + # noinspection PyUnresolvedReferences + self.rightButtonBox.clicked.connect(self.on_select_writer_btn) + + self.mainLayout.addSpacing(16) + + # option for selecting the output folder + select_output_folder = settings.value("select_output_folder") + if select_output_folder is None: + settings.setValue("select_output_folder", False) + hbox = QtWidgets.QHBoxLayout() + self.mainLayout.addLayout(hbox) + hbox.addStretch() + self.selectFolder = QtWidgets.QCheckBox('Select output folder', self) + self.selectFolder.setChecked(settings.value("select_output_folder") == 'true') + hbox.addWidget(self.selectFolder) + hbox.addStretch() + + # option for opening the output folder + export_open_folder = settings.value("export_open_folder") + if export_open_folder is None: + settings.setValue("export_open_folder", True) + hbox = QtWidgets.QHBoxLayout() + self.mainLayout.addLayout(hbox) + hbox.addStretch() + self.openFolder = QtWidgets.QCheckBox('Open output folder', self) + self.openFolder.setChecked(settings.value("export_open_folder") == 'true') + hbox.addWidget(self.openFolder) + hbox.addStretch() + + # export + hbox = QtWidgets.QHBoxLayout() + self.mainLayout.addLayout(hbox) + hbox.addStretch() + btn = QtWidgets.QPushButton("Export profiles") + btn.setMinimumHeight(32) + hbox.addWidget(btn) + # noinspection PyUnresolvedReferences + btn.clicked.connect(self.on_export_profile_btn) + hbox.addStretch() + + def on_select_writer_btn(self, btn): + """Update the list of writers to pass to the library""" + logger.debug("%s -> %s" % (btn.text(), btn.isChecked())) + idx = self.lib.desc_writers.index(btn.text()) + name = self.lib.name_writers[idx] + + settings = QtCore.QSettings() + + if btn.isChecked(): + self.selected_writers.append(name) + settings.setValue("export_single_%s" % name, True) + + else: + settings.setValue("export_single_%s" % name, False) + if name in self.selected_writers: + self.selected_writers.remove(name) + + def on_export_profile_btn(self): + logger.debug("export profiles clicked") + + if len(self.selected_writers) == 0: + msg = "Select output formats before data export!" + # noinspection PyCallByClass,PyArgumentList + QtWidgets.QMessageBox.warning(self, "Export warning", msg, QtWidgets.QMessageBox.Ok) + return + + settings = QtCore.QSettings() + + select_output_folder = self.selectFolder.isChecked() + settings.setValue("select_output_folder", select_output_folder) + output_folders = dict() + # each writer may potentially have is own folder + if select_output_folder: + + dlg = OutputFoldersDialog(main_win=self.main_win, lib=self.lib, writers=self.selected_writers, parent=self) + dlg.exec_() + output_folders = dlg.output_folders + if len(output_folders) == 0: + return + + # case where all the writers will write to the same folder + if len(output_folders) == 0: + for writer in self.selected_writers: + output_folders[writer] = self.lib.outputs_folder + settings.setValue("export_folder", self.lib.outputs_folder) + logger.debug('output folder: %s' % self.lib.outputs_folder) + + # CARIS-specific check for file concatenation + for writer in self.selected_writers: + + if writer == 'caris': + caris_path = os.path.join(output_folders[writer], "CARIS", self.lib.current_project + ".svp") + if os.path.exists(caris_path): + msg = "An existing CARIS file is present in the output folder.\n\n" \ + "Do you want to remove it to avoid possible profile duplications?" + # noinspection PyCallByClass,PyArgumentList + ret = QtWidgets.QMessageBox.question(self, "CARIS export", msg, + QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No) + if ret == QtWidgets.QMessageBox.Yes: + os.remove(caris_path) + break + + # special case for Fugro ISS format + force_writer_instrument_for_next_casts = None + custom_writer_instrument = None + + # actually do the export + current_project = None + format_ok = False + opened_folders = list() + export_open_folder = self.openFolder.isChecked() + settings.setValue("export_open_folder", export_open_folder) + all_exported = True + for pk in self._pks: + + success = self.lib.load_profile(pk, skip_atlas=True) + if not success: + # noinspection PyCallByClass,PyArgumentList + QtWidgets.QMessageBox.warning(self, "Database", "Unable to load profile #%02d!" % pk, + QtWidgets.QMessageBox.Ok) + continue + + # special case: synthetic profile and NCEI + skip_export = False + for writer in self.selected_writers: + + if writer != 'ncei': + continue + + if self.lib.ssp.l[0].meta.sensor_type == Dicts.sensor_types['Synthetic']: + msg = "Attempt to export a synthetic profile in NCEI format!" + # noinspection PyCallByClass,PyArgumentList + QtWidgets.QMessageBox.warning(self, "Export warning", msg, QtWidgets.QMessageBox.Ok) + skip_export = True + continue + + if self.lib.current_project == 'default': + + msg = "The 'default' project cannot be used for NCEI export.\n\n" \ + "Rename the project in the Database tab!" + if self.lib.setup.noaa_tools: + msg += "\n\nRecommend in project_survey format, e.g. OPR-P999-RA-17_H12345" + # noinspection PyCallByClass,PyArgumentList + QtWidgets.QMessageBox.warning(self, "Export warning", msg, QtWidgets.QMessageBox.Ok) + skip_export = True + continue + + if self.lib.setup.noaa_tools and self.lib.not_noaa_project(self.lib.current_project): + if self.lib.not_noaa_project(current_project, format_ok): + current_project, format_ok = self.lib.cb.ask_formatted_text(default=self.lib.noaa_project) + if self.lib.not_noaa_project(current_project, format_ok): + msg = "The project name cannot be used for NCEI export.\n\n" \ + "Rename the project in the Database tab!\n\n" \ + "Recommend \"project_survey\" format, e.g. OPR-P999-RA-17_H12345" + # noinspection PyCallByClass,PyArgumentList + QtWidgets.QMessageBox.warning(self, "Export warning", msg, QtWidgets.QMessageBox.Ok) + skip_export = True + continue + + if not self.lib.ssp.cur.meta.survey or \ + not self.lib.ssp.cur.meta.vessel or \ + not self.lib.ssp.cur.meta.institution: + msg = "Survey, vessel, and institution metadata are mandatory for NCEI export.\n\n" \ + "To fix the issue:\n" \ + "- Load the profile (if not already loaded)\n" \ + "- Set the missing values using the Metadata button on the Editor tool bar\n" + # noinspection PyCallByClass,PyArgumentList + QtWidgets.QMessageBox.warning(self, "Export warning", msg, QtWidgets.QMessageBox.Ok) + skip_export = True + continue + + # special case for Fugro ISS format with NCEI format + if self.lib.ssp.cur.meta.probe_type == Dicts.probe_types['ISS']: + logger.info("special case: NCEI and ISS format") + + if force_writer_instrument_for_next_casts is None: + + msg = "Enter the instrument type and model \n(if you don't know, leave it blank):" + instrument, flag = self.lib.cb.ask_text_with_flag("ISS for NCEI", msg, + flag_label="Apply to all the next profiles") + logger.debug("user input for ISS: %s, %r" % (instrument, flag)) + # if empty, we just use the sensor type + if instrument is None or instrument == "": + instrument = self.lib.ssp.cur.meta.sensor + if flag: # to skip the user dialog for next casts + force_writer_instrument_for_next_casts = instrument + else: + force_writer_instrument_for_next_casts = None + custom_writer_instrument = instrument + + else: # user asked to apply to all the next profiles + custom_writer_instrument = force_writer_instrument_for_next_casts + + if skip_export: + all_exported = False + continue + + self.progress.start(text="Exporting profile #%02d" % pk) + try: + self.progress.update(value=60) + self.lib.export_data(data_paths=output_folders, data_formats=self.selected_writers, + custom_writer_instrument=custom_writer_instrument) + + except RuntimeError as e: + self.progress.end() + msg = "Issue in exporting the data for profile #%02d.\nReason: %s" % (pk, e) + # noinspection PyCallByClass,PyArgumentList + QtWidgets.QMessageBox.critical(self, "Export error", msg, QtWidgets.QMessageBox.Ok) + continue + self.progress.end() + + # opening the output folder + if export_open_folder: + + for output_folder in output_folders.values(): + if output_folder not in opened_folders: + Helper.explore_folder(output_folder) + opened_folders.append(output_folder) + + if all_exported: + msg = "Profiles successfully exported!" + # noinspection PyCallByClass,PyArgumentList + QtWidgets.QMessageBox.information(self, "Export profile", msg, QtWidgets.QMessageBox.Ok) + else: + msg = "At least one profile had issues in being exported!" + # noinspection PyCallByClass,PyArgumentList + QtWidgets.QMessageBox.warning(self, "Export profile", msg, QtWidgets.QMessageBox.Ok) + + self.accept() diff --git a/hyo2/soundspeedmanager/dialogs/export_profile_metadata_dialog.py b/hyo2/ssm2/app/gui/soundspeedmanager/dialogs/export_profile_metadata_dialog.py similarity index 100% rename from hyo2/soundspeedmanager/dialogs/export_profile_metadata_dialog.py rename to hyo2/ssm2/app/gui/soundspeedmanager/dialogs/export_profile_metadata_dialog.py diff --git a/hyo2/soundspeedmanager/dialogs/export_profile_metadata_fields_dialog.py b/hyo2/ssm2/app/gui/soundspeedmanager/dialogs/export_profile_metadata_fields_dialog.py similarity index 100% rename from hyo2/soundspeedmanager/dialogs/export_profile_metadata_fields_dialog.py rename to hyo2/ssm2/app/gui/soundspeedmanager/dialogs/export_profile_metadata_fields_dialog.py diff --git a/hyo2/soundspeedmanager/dialogs/export_single_profile_dialog.py b/hyo2/ssm2/app/gui/soundspeedmanager/dialogs/export_single_profile_dialog.py similarity index 97% rename from hyo2/soundspeedmanager/dialogs/export_single_profile_dialog.py rename to hyo2/ssm2/app/gui/soundspeedmanager/dialogs/export_single_profile_dialog.py index c6e52fb8..ce1a9294 100644 --- a/hyo2/soundspeedmanager/dialogs/export_single_profile_dialog.py +++ b/hyo2/ssm2/app/gui/soundspeedmanager/dialogs/export_single_profile_dialog.py @@ -1,272 +1,272 @@ -from PySide6 import QtCore, QtWidgets - -import logging - -from hyo2.abc2.lib.helper import Helper -from hyo2.soundspeedmanager.dialogs.dialog import AbstractDialog -from hyo2.soundspeedmanager.dialogs.output_folders_dialog import OutputFoldersDialog -from hyo2.soundspeed.profile.dicts import Dicts - -logger = logging.getLogger(__name__) - - -class ExportSingleProfileDialog(AbstractDialog): - - def __init__(self, main_win, lib, parent=None): - AbstractDialog.__init__(self, main_win=main_win, lib=lib, parent=parent) - - # the list of selected writers passed to the library - self.selected_writers = list() - - self.setWindowTitle("Export single profile") - self.setMinimumWidth(160) - - settings = QtCore.QSettings() - - # outline ui - self.mainLayout = QtWidgets.QVBoxLayout() - self.setLayout(self.mainLayout) - - # label - hbox = QtWidgets.QHBoxLayout() - self.mainLayout.addLayout(hbox) - hbox.addStretch() - label = QtWidgets.QLabel("Select output formats:") - hbox.addWidget(label) - hbox.addStretch() - # buttons - hbox = QtWidgets.QHBoxLayout() - self.mainLayout.addLayout(hbox) - hbox.addStretch() - # - fmt layout - self.fmtLayout = QtWidgets.QHBoxLayout() - hbox.addLayout(self.fmtLayout) - # -- left - self.leftButtonBox = QtWidgets.QDialogButtonBox(QtCore.Qt.Vertical) - self.leftButtonBox.setFixedWidth(100) - self.fmtLayout.addWidget(self.leftButtonBox) - # -- right - self.rightButtonBox = QtWidgets.QDialogButtonBox(QtCore.Qt.Vertical) - self.rightButtonBox.setFixedWidth(100) - self.fmtLayout.addWidget(self.rightButtonBox) - hbox.addStretch() - # add buttons (retrieving name, description and extension from the library) - for idx, name in enumerate(self.lib.name_writers): - - if len(self.lib.ext_writers[idx]) == 0: - continue - - btn = QtWidgets.QPushButton("%s" % self.lib.desc_writers[idx]) - btn.setCheckable(True) - btn.setToolTip("Select %s format [*.%s]" % (self.lib.desc_writers[idx], - ", *.".join(self.lib.ext_writers[idx]))) - - btn_settings = settings.value("export_single_%s" % name) - if btn_settings is None: - settings.setValue("export_single_%s" % name, False) - if settings.value("export_single_%s" % name) == 'true': - btn.setChecked(True) - self.selected_writers.append(name) - - if (idx % 2) == 0: - self.leftButtonBox.addButton(btn, QtWidgets.QDialogButtonBox.ActionRole) - else: - self.rightButtonBox.addButton(btn, QtWidgets.QDialogButtonBox.ActionRole) - - # noinspection PyUnresolvedReferences - self.leftButtonBox.clicked.connect(self.on_select_writer_btn) - # noinspection PyUnresolvedReferences - self.rightButtonBox.clicked.connect(self.on_select_writer_btn) - - self.mainLayout.addSpacing(16) - - # option for selecting the output folder - select_output_folder = settings.value("select_output_folder") - if select_output_folder is None: - settings.setValue("select_output_folder", False) - hbox = QtWidgets.QHBoxLayout() - self.mainLayout.addLayout(hbox) - hbox.addStretch() - self.selectFolder = QtWidgets.QCheckBox('Select output folder', self) - self.selectFolder.setChecked(settings.value("select_output_folder") == 'true') - hbox.addWidget(self.selectFolder) - hbox.addStretch() - - # option for opening the output folder - export_open_folder = settings.value("export_open_folder") - if export_open_folder is None: - settings.setValue("export_open_folder", True) - hbox = QtWidgets.QHBoxLayout() - self.mainLayout.addLayout(hbox) - hbox.addStretch() - self.openFolder = QtWidgets.QCheckBox('Open output folder', self) - self.openFolder.setChecked(settings.value("export_open_folder") == 'true') - hbox.addWidget(self.openFolder) - hbox.addStretch() - - # export - hbox = QtWidgets.QHBoxLayout() - self.mainLayout.addLayout(hbox) - hbox.addStretch() - btn = QtWidgets.QPushButton("Export profile") - btn.setMinimumHeight(32) - hbox.addWidget(btn) - # noinspection PyUnresolvedReferences - btn.clicked.connect(self.on_export_profile_btn) - hbox.addStretch() - - def on_select_writer_btn(self, btn): - """Update the list of writers to pass to the library""" - logger.debug("%s -> %s" % (btn.text(), btn.isChecked())) - idx = self.lib.desc_writers.index(btn.text()) - name = self.lib.name_writers[idx] - - settings = QtCore.QSettings() - - if btn.isChecked(): - self.selected_writers.append(name) - settings.setValue("export_single_%s" % name, True) - - else: - settings.setValue("export_single_%s" % name, False) - if name in self.selected_writers: - self.selected_writers.remove(name) - - def on_export_profile_btn(self): - logger.debug("export profile clicked") - - if len(self.selected_writers) == 0: - msg = "Select output formats before data export!" - # noinspection PyCallByClass,PyArgumentList - QtWidgets.QMessageBox.warning(self, "Export warning", msg, QtWidgets.QMessageBox.Ok) - return - - # special case for Fugro ISS format - custom_writer_instrument = None - - # special case: synthetic profile and NCEI - for writer in self.selected_writers: - if writer != 'ncei': - continue - - if self.lib.ssp.l[0].meta.sensor_type == Dicts.sensor_types['Synthetic']: - msg = "Attempt to export a synthetic profile in NCEI format!" - # noinspection PyCallByClass,PyArgumentList - QtWidgets.QMessageBox.warning(self, "Export warning", msg, QtWidgets.QMessageBox.Ok) - return - - if self.lib.current_project == 'default': - msg = "The 'default' project cannot be used for NCEI export.\n\n" \ - "Rename the project in the Database tab!" - if self.lib.setup.noaa_tools: - msg += "\n\nRecommend in project_survey format, e.g. OPR-P999-RA-17_H12345" - # noinspection PyCallByClass,PyArgumentList - QtWidgets.QMessageBox.warning(self, "Export warning", msg, QtWidgets.QMessageBox.Ok) - return - - if self.lib.setup.noaa_tools and self.lib.not_noaa_project(self.lib.current_project): - current_project, format_ok = self.lib.cb.ask_formatted_text(default=self.lib.noaa_project) - if self.lib.not_noaa_project(current_project, format_ok): - msg = "The project name cannot be used for NCEI export.\n\n" \ - "Rename the project in the Database tab!\n\n" \ - "Recommend \"project_survey\" format, e.g. OPR-P999-RA-17_H12345" - # noinspection PyCallByClass,PyArgumentList - QtWidgets.QMessageBox.warning(self, "Export warning", msg, QtWidgets.QMessageBox.Ok) - return - - if not self.lib.ssp.cur.meta.survey or \ - not self.lib.ssp.cur.meta.vessel or \ - not self.lib.ssp.cur.meta.institution: - msg = "Survey, vessel, and institution metadata are mandatory for NCEI export.\n\n" \ - "To fix the issue:\n" \ - "- Load the profile (if not already loaded)\n" \ - "- Set the missing values using the Metadata button on the Editor tool bar\n" - # noinspection PyCallByClass,PyArgumentList - QtWidgets.QMessageBox.warning(self, "Export warning", msg, QtWidgets.QMessageBox.Ok) - return - - # special case for Fugro ISS format with NCEI format - if self.lib.ssp.cur.meta.probe_type == Dicts.probe_types['ISS']: - logger.info("special case: NCEI and ISS format") - - if custom_writer_instrument is None: - - msg = "Enter the instrument type and model \n(if you don't know, leave it blank):" - instrument = self.lib.cb.ask_text("ISS for NCEI", msg) - # if empty, we just use the sensor type - if instrument is None or instrument == "": - instrument = self.lib.ssp.cur.meta.sensor - custom_writer_instrument = instrument - - settings = QtCore.QSettings() - - select_output_folder = self.selectFolder.isChecked() - settings.setValue("select_output_folder", select_output_folder) - output_folders = dict() - # each writer may potentially have is own folder - if select_output_folder: - - dlg = OutputFoldersDialog(main_win=self.main_win, lib=self.lib, writers=self.selected_writers, parent=self) - dlg.exec_() - output_folders = dlg.output_folders - if len(output_folders) == 0: - return - - # case where all the writers will write to the same folder - if len(output_folders) == 0: - for writer in self.selected_writers: - output_folders[writer] = self.lib.outputs_folder - settings.setValue("export_folder", self.lib.outputs_folder) - logger.debug('output folder: %s' % self.lib.outputs_folder) - - # ask user for basename - basenames = dict() - # NCEI has special filename convention - if (len(self.selected_writers) == 1) and (self.selected_writers[0] == 'ncei'): - - pass - - else: - - basename_msg = "Enter output basename (without extension):" - while True: - # noinspection PyCallByClass,PyArgumentList - basename, ok = QtWidgets.QInputDialog.getText(self, "Output basename", basename_msg, - text=self.lib.cur_basename) - if not ok: - return - for writer in self.selected_writers: - basenames[writer] = basename - break - - # actually do the export - self.progress.start() - try: - self.lib.export_data(data_paths=output_folders, data_files=basenames, - data_formats=self.selected_writers, custom_writer_instrument=custom_writer_instrument) - except RuntimeError as e: - self.progress.end() - msg = "Issue in exporting the data.\nReason: %s" % e - # noinspection PyCallByClass,PyArgumentList - QtWidgets.QMessageBox.critical(self, "Export error", msg, QtWidgets.QMessageBox.Ok) - return - - # opening the output folder - export_open_folder = self.openFolder.isChecked() - settings.setValue("export_open_folder", export_open_folder) - if export_open_folder: - - opened_folders = list() - for output_folder in output_folders.values(): - if output_folder not in opened_folders: - Helper.explore_folder(output_folder) # open the output folder - opened_folders.append(output_folder) - self.progress.end() - - else: - self.progress.end() - msg = "Profile successfully exported!" - # noinspection PyCallByClass,PyArgumentList - QtWidgets.QMessageBox.information(self, "Export profile", msg, QtWidgets.QMessageBox.Ok) - - self.accept() +from PySide6 import QtCore, QtWidgets + +import logging + +from hyo2.abc2.lib.helper import Helper +from hyo2.soundspeedmanager.dialogs.dialog import AbstractDialog +from hyo2.soundspeedmanager.dialogs.output_folders_dialog import OutputFoldersDialog +from hyo2.soundspeed.profile.dicts import Dicts + +logger = logging.getLogger(__name__) + + +class ExportSingleProfileDialog(AbstractDialog): + + def __init__(self, main_win, lib, parent=None): + AbstractDialog.__init__(self, main_win=main_win, lib=lib, parent=parent) + + # the list of selected writers passed to the library + self.selected_writers = list() + + self.setWindowTitle("Export single profile") + self.setMinimumWidth(160) + + settings = QtCore.QSettings() + + # outline ui + self.mainLayout = QtWidgets.QVBoxLayout() + self.setLayout(self.mainLayout) + + # label + hbox = QtWidgets.QHBoxLayout() + self.mainLayout.addLayout(hbox) + hbox.addStretch() + label = QtWidgets.QLabel("Select output formats:") + hbox.addWidget(label) + hbox.addStretch() + # buttons + hbox = QtWidgets.QHBoxLayout() + self.mainLayout.addLayout(hbox) + hbox.addStretch() + # - fmt layout + self.fmtLayout = QtWidgets.QHBoxLayout() + hbox.addLayout(self.fmtLayout) + # -- left + self.leftButtonBox = QtWidgets.QDialogButtonBox(QtCore.Qt.Vertical) + self.leftButtonBox.setFixedWidth(100) + self.fmtLayout.addWidget(self.leftButtonBox) + # -- right + self.rightButtonBox = QtWidgets.QDialogButtonBox(QtCore.Qt.Vertical) + self.rightButtonBox.setFixedWidth(100) + self.fmtLayout.addWidget(self.rightButtonBox) + hbox.addStretch() + # add buttons (retrieving name, description and extension from the library) + for idx, name in enumerate(self.lib.name_writers): + + if len(self.lib.ext_writers[idx]) == 0: + continue + + btn = QtWidgets.QPushButton("%s" % self.lib.desc_writers[idx]) + btn.setCheckable(True) + btn.setToolTip("Select %s format [*.%s]" % (self.lib.desc_writers[idx], + ", *.".join(self.lib.ext_writers[idx]))) + + btn_settings = settings.value("export_single_%s" % name) + if btn_settings is None: + settings.setValue("export_single_%s" % name, False) + if settings.value("export_single_%s" % name) == 'true': + btn.setChecked(True) + self.selected_writers.append(name) + + if (idx % 2) == 0: + self.leftButtonBox.addButton(btn, QtWidgets.QDialogButtonBox.ActionRole) + else: + self.rightButtonBox.addButton(btn, QtWidgets.QDialogButtonBox.ActionRole) + + # noinspection PyUnresolvedReferences + self.leftButtonBox.clicked.connect(self.on_select_writer_btn) + # noinspection PyUnresolvedReferences + self.rightButtonBox.clicked.connect(self.on_select_writer_btn) + + self.mainLayout.addSpacing(16) + + # option for selecting the output folder + select_output_folder = settings.value("select_output_folder") + if select_output_folder is None: + settings.setValue("select_output_folder", False) + hbox = QtWidgets.QHBoxLayout() + self.mainLayout.addLayout(hbox) + hbox.addStretch() + self.selectFolder = QtWidgets.QCheckBox('Select output folder', self) + self.selectFolder.setChecked(settings.value("select_output_folder") == 'true') + hbox.addWidget(self.selectFolder) + hbox.addStretch() + + # option for opening the output folder + export_open_folder = settings.value("export_open_folder") + if export_open_folder is None: + settings.setValue("export_open_folder", True) + hbox = QtWidgets.QHBoxLayout() + self.mainLayout.addLayout(hbox) + hbox.addStretch() + self.openFolder = QtWidgets.QCheckBox('Open output folder', self) + self.openFolder.setChecked(settings.value("export_open_folder") == 'true') + hbox.addWidget(self.openFolder) + hbox.addStretch() + + # export + hbox = QtWidgets.QHBoxLayout() + self.mainLayout.addLayout(hbox) + hbox.addStretch() + btn = QtWidgets.QPushButton("Export profile") + btn.setMinimumHeight(32) + hbox.addWidget(btn) + # noinspection PyUnresolvedReferences + btn.clicked.connect(self.on_export_profile_btn) + hbox.addStretch() + + def on_select_writer_btn(self, btn): + """Update the list of writers to pass to the library""" + logger.debug("%s -> %s" % (btn.text(), btn.isChecked())) + idx = self.lib.desc_writers.index(btn.text()) + name = self.lib.name_writers[idx] + + settings = QtCore.QSettings() + + if btn.isChecked(): + self.selected_writers.append(name) + settings.setValue("export_single_%s" % name, True) + + else: + settings.setValue("export_single_%s" % name, False) + if name in self.selected_writers: + self.selected_writers.remove(name) + + def on_export_profile_btn(self): + logger.debug("export profile clicked") + + if len(self.selected_writers) == 0: + msg = "Select output formats before data export!" + # noinspection PyCallByClass,PyArgumentList + QtWidgets.QMessageBox.warning(self, "Export warning", msg, QtWidgets.QMessageBox.Ok) + return + + # special case for Fugro ISS format + custom_writer_instrument = None + + # special case: synthetic profile and NCEI + for writer in self.selected_writers: + if writer != 'ncei': + continue + + if self.lib.ssp.l[0].meta.sensor_type == Dicts.sensor_types['Synthetic']: + msg = "Attempt to export a synthetic profile in NCEI format!" + # noinspection PyCallByClass,PyArgumentList + QtWidgets.QMessageBox.warning(self, "Export warning", msg, QtWidgets.QMessageBox.Ok) + return + + if self.lib.current_project == 'default': + msg = "The 'default' project cannot be used for NCEI export.\n\n" \ + "Rename the project in the Database tab!" + if self.lib.setup.noaa_tools: + msg += "\n\nRecommend in project_survey format, e.g. OPR-P999-RA-17_H12345" + # noinspection PyCallByClass,PyArgumentList + QtWidgets.QMessageBox.warning(self, "Export warning", msg, QtWidgets.QMessageBox.Ok) + return + + if self.lib.setup.noaa_tools and self.lib.not_noaa_project(self.lib.current_project): + current_project, format_ok = self.lib.cb.ask_formatted_text(default=self.lib.noaa_project) + if self.lib.not_noaa_project(current_project, format_ok): + msg = "The project name cannot be used for NCEI export.\n\n" \ + "Rename the project in the Database tab!\n\n" \ + "Recommend \"project_survey\" format, e.g. OPR-P999-RA-17_H12345" + # noinspection PyCallByClass,PyArgumentList + QtWidgets.QMessageBox.warning(self, "Export warning", msg, QtWidgets.QMessageBox.Ok) + return + + if not self.lib.ssp.cur.meta.survey or \ + not self.lib.ssp.cur.meta.vessel or \ + not self.lib.ssp.cur.meta.institution: + msg = "Survey, vessel, and institution metadata are mandatory for NCEI export.\n\n" \ + "To fix the issue:\n" \ + "- Load the profile (if not already loaded)\n" \ + "- Set the missing values using the Metadata button on the Editor tool bar\n" + # noinspection PyCallByClass,PyArgumentList + QtWidgets.QMessageBox.warning(self, "Export warning", msg, QtWidgets.QMessageBox.Ok) + return + + # special case for Fugro ISS format with NCEI format + if self.lib.ssp.cur.meta.probe_type == Dicts.probe_types['ISS']: + logger.info("special case: NCEI and ISS format") + + if custom_writer_instrument is None: + + msg = "Enter the instrument type and model \n(if you don't know, leave it blank):" + instrument = self.lib.cb.ask_text("ISS for NCEI", msg) + # if empty, we just use the sensor type + if instrument is None or instrument == "": + instrument = self.lib.ssp.cur.meta.sensor + custom_writer_instrument = instrument + + settings = QtCore.QSettings() + + select_output_folder = self.selectFolder.isChecked() + settings.setValue("select_output_folder", select_output_folder) + output_folders = dict() + # each writer may potentially have is own folder + if select_output_folder: + + dlg = OutputFoldersDialog(main_win=self.main_win, lib=self.lib, writers=self.selected_writers, parent=self) + dlg.exec_() + output_folders = dlg.output_folders + if len(output_folders) == 0: + return + + # case where all the writers will write to the same folder + if len(output_folders) == 0: + for writer in self.selected_writers: + output_folders[writer] = self.lib.outputs_folder + settings.setValue("export_folder", self.lib.outputs_folder) + logger.debug('output folder: %s' % self.lib.outputs_folder) + + # ask user for basename + basenames = dict() + # NCEI has special filename convention + if (len(self.selected_writers) == 1) and (self.selected_writers[0] == 'ncei'): + + pass + + else: + + basename_msg = "Enter output basename (without extension):" + while True: + # noinspection PyCallByClass,PyArgumentList + basename, ok = QtWidgets.QInputDialog.getText(self, "Output basename", basename_msg, + text=self.lib.cur_basename) + if not ok: + return + for writer in self.selected_writers: + basenames[writer] = basename + break + + # actually do the export + self.progress.start() + try: + self.lib.export_data(data_paths=output_folders, data_files=basenames, + data_formats=self.selected_writers, custom_writer_instrument=custom_writer_instrument) + except RuntimeError as e: + self.progress.end() + msg = "Issue in exporting the data.\nReason: %s" % e + # noinspection PyCallByClass,PyArgumentList + QtWidgets.QMessageBox.critical(self, "Export error", msg, QtWidgets.QMessageBox.Ok) + return + + # opening the output folder + export_open_folder = self.openFolder.isChecked() + settings.setValue("export_open_folder", export_open_folder) + if export_open_folder: + + opened_folders = list() + for output_folder in output_folders.values(): + if output_folder not in opened_folders: + Helper.explore_folder(output_folder) # open the output folder + opened_folders.append(output_folder) + self.progress.end() + + else: + self.progress.end() + msg = "Profile successfully exported!" + # noinspection PyCallByClass,PyArgumentList + QtWidgets.QMessageBox.information(self, "Export profile", msg, QtWidgets.QMessageBox.Ok) + + self.accept() diff --git a/hyo2/soundspeedmanager/dialogs/flaggable_input_dialog.py b/hyo2/ssm2/app/gui/soundspeedmanager/dialogs/flaggable_input_dialog.py similarity index 100% rename from hyo2/soundspeedmanager/dialogs/flaggable_input_dialog.py rename to hyo2/ssm2/app/gui/soundspeedmanager/dialogs/flaggable_input_dialog.py diff --git a/hyo2/soundspeedmanager/dialogs/formatted_input_dialog.py b/hyo2/ssm2/app/gui/soundspeedmanager/dialogs/formatted_input_dialog.py similarity index 100% rename from hyo2/soundspeedmanager/dialogs/formatted_input_dialog.py rename to hyo2/ssm2/app/gui/soundspeedmanager/dialogs/formatted_input_dialog.py diff --git a/hyo2/soundspeedmanager/dialogs/import_data_dialog.py b/hyo2/ssm2/app/gui/soundspeedmanager/dialogs/import_data_dialog.py similarity index 100% rename from hyo2/soundspeedmanager/dialogs/import_data_dialog.py rename to hyo2/ssm2/app/gui/soundspeedmanager/dialogs/import_data_dialog.py diff --git a/hyo2/soundspeedmanager/dialogs/import_multi_profile_dialog.py b/hyo2/ssm2/app/gui/soundspeedmanager/dialogs/import_multi_profile_dialog.py similarity index 100% rename from hyo2/soundspeedmanager/dialogs/import_multi_profile_dialog.py rename to hyo2/ssm2/app/gui/soundspeedmanager/dialogs/import_multi_profile_dialog.py diff --git a/hyo2/soundspeedmanager/dialogs/import_single_profile_dialog.py b/hyo2/ssm2/app/gui/soundspeedmanager/dialogs/import_single_profile_dialog.py similarity index 100% rename from hyo2/soundspeedmanager/dialogs/import_single_profile_dialog.py rename to hyo2/ssm2/app/gui/soundspeedmanager/dialogs/import_single_profile_dialog.py diff --git a/hyo2/soundspeedmanager/dialogs/metadata_dialog.py b/hyo2/ssm2/app/gui/soundspeedmanager/dialogs/metadata_dialog.py similarity index 100% rename from hyo2/soundspeedmanager/dialogs/metadata_dialog.py rename to hyo2/ssm2/app/gui/soundspeedmanager/dialogs/metadata_dialog.py diff --git a/hyo2/soundspeedmanager/dialogs/multi_selection_dialog.py b/hyo2/ssm2/app/gui/soundspeedmanager/dialogs/multi_selection_dialog.py similarity index 100% rename from hyo2/soundspeedmanager/dialogs/multi_selection_dialog.py rename to hyo2/ssm2/app/gui/soundspeedmanager/dialogs/multi_selection_dialog.py diff --git a/hyo2/soundspeedmanager/dialogs/output_folders_dialog.py b/hyo2/ssm2/app/gui/soundspeedmanager/dialogs/output_folders_dialog.py similarity index 100% rename from hyo2/soundspeedmanager/dialogs/output_folders_dialog.py rename to hyo2/ssm2/app/gui/soundspeedmanager/dialogs/output_folders_dialog.py diff --git a/hyo2/soundspeedmanager/dialogs/plot_multi_profile_dialog.py b/hyo2/ssm2/app/gui/soundspeedmanager/dialogs/plot_multi_profile_dialog.py similarity index 100% rename from hyo2/soundspeedmanager/dialogs/plot_multi_profile_dialog.py rename to hyo2/ssm2/app/gui/soundspeedmanager/dialogs/plot_multi_profile_dialog.py diff --git a/hyo2/soundspeedmanager/dialogs/plot_profiles_dialog.py b/hyo2/ssm2/app/gui/soundspeedmanager/dialogs/plot_profiles_dialog.py similarity index 100% rename from hyo2/soundspeedmanager/dialogs/plot_profiles_dialog.py rename to hyo2/ssm2/app/gui/soundspeedmanager/dialogs/plot_profiles_dialog.py diff --git a/hyo2/soundspeedmanager/dialogs/proc_data_model.py b/hyo2/ssm2/app/gui/soundspeedmanager/dialogs/proc_data_model.py similarity index 100% rename from hyo2/soundspeedmanager/dialogs/proc_data_model.py rename to hyo2/ssm2/app/gui/soundspeedmanager/dialogs/proc_data_model.py diff --git a/hyo2/soundspeedmanager/dialogs/project_new_dialog.py b/hyo2/ssm2/app/gui/soundspeedmanager/dialogs/project_new_dialog.py similarity index 100% rename from hyo2/soundspeedmanager/dialogs/project_new_dialog.py rename to hyo2/ssm2/app/gui/soundspeedmanager/dialogs/project_new_dialog.py diff --git a/hyo2/soundspeedmanager/dialogs/project_rename_dialog.py b/hyo2/ssm2/app/gui/soundspeedmanager/dialogs/project_rename_dialog.py similarity index 100% rename from hyo2/soundspeedmanager/dialogs/project_rename_dialog.py rename to hyo2/ssm2/app/gui/soundspeedmanager/dialogs/project_rename_dialog.py diff --git a/hyo2/soundspeedmanager/dialogs/project_switch_dialog.py b/hyo2/ssm2/app/gui/soundspeedmanager/dialogs/project_switch_dialog.py similarity index 100% rename from hyo2/soundspeedmanager/dialogs/project_switch_dialog.py rename to hyo2/ssm2/app/gui/soundspeedmanager/dialogs/project_switch_dialog.py diff --git a/hyo2/soundspeedmanager/dialogs/raw_data_model.py b/hyo2/ssm2/app/gui/soundspeedmanager/dialogs/raw_data_model.py similarity index 100% rename from hyo2/soundspeedmanager/dialogs/raw_data_model.py rename to hyo2/ssm2/app/gui/soundspeedmanager/dialogs/raw_data_model.py diff --git a/hyo2/soundspeedmanager/dialogs/reference_dialog.py b/hyo2/ssm2/app/gui/soundspeedmanager/dialogs/reference_dialog.py similarity index 100% rename from hyo2/soundspeedmanager/dialogs/reference_dialog.py rename to hyo2/ssm2/app/gui/soundspeedmanager/dialogs/reference_dialog.py diff --git a/hyo2/soundspeedmanager/dialogs/seacat.py b/hyo2/ssm2/app/gui/soundspeedmanager/dialogs/seacat.py similarity index 100% rename from hyo2/soundspeedmanager/dialogs/seacat.py rename to hyo2/ssm2/app/gui/soundspeedmanager/dialogs/seacat.py diff --git a/hyo2/soundspeedmanager/dialogs/seacat_dialog.py b/hyo2/ssm2/app/gui/soundspeedmanager/dialogs/seacat_dialog.py similarity index 100% rename from hyo2/soundspeedmanager/dialogs/seacat_dialog.py rename to hyo2/ssm2/app/gui/soundspeedmanager/dialogs/seacat_dialog.py diff --git a/hyo2/soundspeedmanager/dialogs/sis_data_model.py b/hyo2/ssm2/app/gui/soundspeedmanager/dialogs/sis_data_model.py similarity index 100% rename from hyo2/soundspeedmanager/dialogs/sis_data_model.py rename to hyo2/ssm2/app/gui/soundspeedmanager/dialogs/sis_data_model.py diff --git a/hyo2/soundspeedmanager/dialogs/spreadsheet_dialog.py b/hyo2/ssm2/app/gui/soundspeedmanager/dialogs/spreadsheet_dialog.py similarity index 100% rename from hyo2/soundspeedmanager/dialogs/spreadsheet_dialog.py rename to hyo2/ssm2/app/gui/soundspeedmanager/dialogs/spreadsheet_dialog.py diff --git a/hyo2/soundspeedmanager/dialogs/text_editor.py b/hyo2/ssm2/app/gui/soundspeedmanager/dialogs/text_editor.py similarity index 100% rename from hyo2/soundspeedmanager/dialogs/text_editor.py rename to hyo2/ssm2/app/gui/soundspeedmanager/dialogs/text_editor.py diff --git a/hyo2/soundspeedmanager/dialogs/text_editor_dialog.py b/hyo2/ssm2/app/gui/soundspeedmanager/dialogs/text_editor_dialog.py similarity index 100% rename from hyo2/soundspeedmanager/dialogs/text_editor_dialog.py rename to hyo2/ssm2/app/gui/soundspeedmanager/dialogs/text_editor_dialog.py diff --git a/hyo2/soundspeedmanager/gui.py b/hyo2/ssm2/app/gui/soundspeedmanager/gui.py similarity index 100% rename from hyo2/soundspeedmanager/gui.py rename to hyo2/ssm2/app/gui/soundspeedmanager/gui.py diff --git a/hyo2/soundspeedmanager/mainwin.py b/hyo2/ssm2/app/gui/soundspeedmanager/mainwin.py similarity index 100% rename from hyo2/soundspeedmanager/mainwin.py rename to hyo2/ssm2/app/gui/soundspeedmanager/mainwin.py diff --git a/hyo2/soundspeedmanager/media/LICENSE b/hyo2/ssm2/app/gui/soundspeedmanager/media/LICENSE similarity index 100% rename from hyo2/soundspeedmanager/media/LICENSE rename to hyo2/ssm2/app/gui/soundspeedmanager/media/LICENSE diff --git a/hyo2/soundspeedmanager/media/SoundSpeedManager.ico b/hyo2/ssm2/app/gui/soundspeedmanager/media/SoundSpeedManager.ico similarity index 100% rename from hyo2/soundspeedmanager/media/SoundSpeedManager.ico rename to hyo2/ssm2/app/gui/soundspeedmanager/media/SoundSpeedManager.ico diff --git a/hyo2/soundspeedmanager/media/app_icon.png b/hyo2/ssm2/app/gui/soundspeedmanager/media/app_icon.png similarity index 100% rename from hyo2/soundspeedmanager/media/app_icon.png rename to hyo2/ssm2/app/gui/soundspeedmanager/media/app_icon.png diff --git a/hyo2/soundspeedmanager/media/authors.png b/hyo2/ssm2/app/gui/soundspeedmanager/media/authors.png similarity index 100% rename from hyo2/soundspeedmanager/media/authors.png rename to hyo2/ssm2/app/gui/soundspeedmanager/media/authors.png diff --git a/hyo2/soundspeedmanager/media/back.png b/hyo2/ssm2/app/gui/soundspeedmanager/media/back.png similarity index 100% rename from hyo2/soundspeedmanager/media/back.png rename to hyo2/ssm2/app/gui/soundspeedmanager/media/back.png diff --git a/hyo2/soundspeedmanager/media/bias_plots.png b/hyo2/ssm2/app/gui/soundspeedmanager/media/bias_plots.png similarity index 100% rename from hyo2/soundspeedmanager/media/bias_plots.png rename to hyo2/ssm2/app/gui/soundspeedmanager/media/bias_plots.png diff --git a/hyo2/soundspeedmanager/media/ccom.png b/hyo2/ssm2/app/gui/soundspeedmanager/media/ccom.png similarity index 100% rename from hyo2/soundspeedmanager/media/ccom.png rename to hyo2/ssm2/app/gui/soundspeedmanager/media/ccom.png diff --git a/hyo2/soundspeedmanager/media/clear.png b/hyo2/ssm2/app/gui/soundspeedmanager/media/clear.png similarity index 100% rename from hyo2/soundspeedmanager/media/clear.png rename to hyo2/ssm2/app/gui/soundspeedmanager/media/clear.png diff --git a/hyo2/soundspeedmanager/media/close.png b/hyo2/ssm2/app/gui/soundspeedmanager/media/close.png similarity index 100% rename from hyo2/soundspeedmanager/media/close.png rename to hyo2/ssm2/app/gui/soundspeedmanager/media/close.png diff --git a/hyo2/soundspeedmanager/media/constant_gradient.png b/hyo2/ssm2/app/gui/soundspeedmanager/media/constant_gradient.png similarity index 100% rename from hyo2/soundspeedmanager/media/constant_gradient.png rename to hyo2/ssm2/app/gui/soundspeedmanager/media/constant_gradient.png diff --git a/hyo2/soundspeedmanager/media/database.png b/hyo2/ssm2/app/gui/soundspeedmanager/media/database.png similarity index 100% rename from hyo2/soundspeedmanager/media/database.png rename to hyo2/ssm2/app/gui/soundspeedmanager/media/database.png diff --git a/hyo2/soundspeedmanager/media/db_load.png b/hyo2/ssm2/app/gui/soundspeedmanager/media/db_load.png similarity index 100% rename from hyo2/soundspeedmanager/media/db_load.png rename to hyo2/ssm2/app/gui/soundspeedmanager/media/db_load.png diff --git a/hyo2/soundspeedmanager/media/db_save.png b/hyo2/ssm2/app/gui/soundspeedmanager/media/db_save.png similarity index 100% rename from hyo2/soundspeedmanager/media/db_save.png rename to hyo2/ssm2/app/gui/soundspeedmanager/media/db_save.png diff --git a/hyo2/soundspeedmanager/media/delete.png b/hyo2/ssm2/app/gui/soundspeedmanager/media/delete.png similarity index 100% rename from hyo2/soundspeedmanager/media/delete.png rename to hyo2/ssm2/app/gui/soundspeedmanager/media/delete.png diff --git a/hyo2/soundspeedmanager/media/editor.png b/hyo2/ssm2/app/gui/soundspeedmanager/media/editor.png similarity index 100% rename from hyo2/soundspeedmanager/media/editor.png rename to hyo2/ssm2/app/gui/soundspeedmanager/media/editor.png diff --git a/hyo2/soundspeedmanager/media/export.png b/hyo2/ssm2/app/gui/soundspeedmanager/media/export.png similarity index 100% rename from hyo2/soundspeedmanager/media/export.png rename to hyo2/ssm2/app/gui/soundspeedmanager/media/export.png diff --git a/hyo2/soundspeedmanager/media/export_profile.png b/hyo2/ssm2/app/gui/soundspeedmanager/media/export_profile.png similarity index 100% rename from hyo2/soundspeedmanager/media/export_profile.png rename to hyo2/ssm2/app/gui/soundspeedmanager/media/export_profile.png diff --git a/hyo2/soundspeedmanager/media/extend.png b/hyo2/ssm2/app/gui/soundspeedmanager/media/extend.png similarity index 100% rename from hyo2/soundspeedmanager/media/extend.png rename to hyo2/ssm2/app/gui/soundspeedmanager/media/extend.png diff --git a/hyo2/soundspeedmanager/media/favicon.png b/hyo2/ssm2/app/gui/soundspeedmanager/media/favicon.png similarity index 100% rename from hyo2/soundspeedmanager/media/favicon.png rename to hyo2/ssm2/app/gui/soundspeedmanager/media/favicon.png diff --git a/hyo2/soundspeedmanager/media/filesave.png b/hyo2/ssm2/app/gui/soundspeedmanager/media/filesave.png similarity index 100% rename from hyo2/soundspeedmanager/media/filesave.png rename to hyo2/ssm2/app/gui/soundspeedmanager/media/filesave.png diff --git a/hyo2/soundspeedmanager/media/filter.png b/hyo2/ssm2/app/gui/soundspeedmanager/media/filter.png similarity index 100% rename from hyo2/soundspeedmanager/media/filter.png rename to hyo2/ssm2/app/gui/soundspeedmanager/media/filter.png diff --git a/hyo2/soundspeedmanager/media/flag.png b/hyo2/ssm2/app/gui/soundspeedmanager/media/flag.png similarity index 100% rename from hyo2/soundspeedmanager/media/flag.png rename to hyo2/ssm2/app/gui/soundspeedmanager/media/flag.png diff --git a/hyo2/soundspeedmanager/media/flagged.png b/hyo2/ssm2/app/gui/soundspeedmanager/media/flagged.png similarity index 100% rename from hyo2/soundspeedmanager/media/flagged.png rename to hyo2/ssm2/app/gui/soundspeedmanager/media/flagged.png diff --git a/hyo2/soundspeedmanager/media/forward.png b/hyo2/ssm2/app/gui/soundspeedmanager/media/forward.png similarity index 100% rename from hyo2/soundspeedmanager/media/forward.png rename to hyo2/ssm2/app/gui/soundspeedmanager/media/forward.png diff --git a/hyo2/soundspeedmanager/media/grab_cursor.png b/hyo2/ssm2/app/gui/soundspeedmanager/media/grab_cursor.png similarity index 100% rename from hyo2/soundspeedmanager/media/grab_cursor.png rename to hyo2/ssm2/app/gui/soundspeedmanager/media/grab_cursor.png diff --git a/hyo2/soundspeedmanager/media/grid.png b/hyo2/ssm2/app/gui/soundspeedmanager/media/grid.png similarity index 100% rename from hyo2/soundspeedmanager/media/grid.png rename to hyo2/ssm2/app/gui/soundspeedmanager/media/grid.png diff --git a/hyo2/soundspeedmanager/media/home.png b/hyo2/ssm2/app/gui/soundspeedmanager/media/home.png similarity index 100% rename from hyo2/soundspeedmanager/media/home.png rename to hyo2/ssm2/app/gui/soundspeedmanager/media/home.png diff --git a/hyo2/soundspeedmanager/media/html.png b/hyo2/ssm2/app/gui/soundspeedmanager/media/html.png similarity index 100% rename from hyo2/soundspeedmanager/media/html.png rename to hyo2/ssm2/app/gui/soundspeedmanager/media/html.png diff --git a/hyo2/soundspeedmanager/media/hyo.png b/hyo2/ssm2/app/gui/soundspeedmanager/media/hyo.png similarity index 100% rename from hyo2/soundspeedmanager/media/hyo.png rename to hyo2/ssm2/app/gui/soundspeedmanager/media/hyo.png diff --git a/hyo2/soundspeedmanager/media/import.png b/hyo2/ssm2/app/gui/soundspeedmanager/media/import.png similarity index 100% rename from hyo2/soundspeedmanager/media/import.png rename to hyo2/ssm2/app/gui/soundspeedmanager/media/import.png diff --git a/hyo2/soundspeedmanager/media/info.png b/hyo2/ssm2/app/gui/soundspeedmanager/media/info.png similarity index 100% rename from hyo2/soundspeedmanager/media/info.png rename to hyo2/ssm2/app/gui/soundspeedmanager/media/info.png diff --git a/hyo2/soundspeedmanager/media/input.png b/hyo2/ssm2/app/gui/soundspeedmanager/media/input.png similarity index 100% rename from hyo2/soundspeedmanager/media/input.png rename to hyo2/ssm2/app/gui/soundspeedmanager/media/input.png diff --git a/hyo2/soundspeedmanager/media/insert.png b/hyo2/ssm2/app/gui/soundspeedmanager/media/insert.png similarity index 100% rename from hyo2/soundspeedmanager/media/insert.png rename to hyo2/ssm2/app/gui/soundspeedmanager/media/insert.png diff --git a/hyo2/soundspeedmanager/media/license.png b/hyo2/ssm2/app/gui/soundspeedmanager/media/license.png similarity index 100% rename from hyo2/soundspeedmanager/media/license.png rename to hyo2/ssm2/app/gui/soundspeedmanager/media/license.png diff --git a/hyo2/soundspeedmanager/media/load_profile.png b/hyo2/ssm2/app/gui/soundspeedmanager/media/load_profile.png similarity index 100% rename from hyo2/soundspeedmanager/media/load_profile.png rename to hyo2/ssm2/app/gui/soundspeedmanager/media/load_profile.png diff --git a/hyo2/soundspeedmanager/media/lock.png b/hyo2/ssm2/app/gui/soundspeedmanager/media/lock.png similarity index 100% rename from hyo2/soundspeedmanager/media/lock.png rename to hyo2/ssm2/app/gui/soundspeedmanager/media/lock.png diff --git a/hyo2/soundspeedmanager/media/manual.pdf b/hyo2/ssm2/app/gui/soundspeedmanager/media/manual.pdf similarity index 100% rename from hyo2/soundspeedmanager/media/manual.pdf rename to hyo2/ssm2/app/gui/soundspeedmanager/media/manual.pdf diff --git a/hyo2/soundspeedmanager/media/map.png b/hyo2/ssm2/app/gui/soundspeedmanager/media/map.png similarity index 100% rename from hyo2/soundspeedmanager/media/map.png rename to hyo2/ssm2/app/gui/soundspeedmanager/media/map.png diff --git a/hyo2/soundspeedmanager/media/metadata.png b/hyo2/ssm2/app/gui/soundspeedmanager/media/metadata.png similarity index 100% rename from hyo2/soundspeedmanager/media/metadata.png rename to hyo2/ssm2/app/gui/soundspeedmanager/media/metadata.png diff --git a/hyo2/soundspeedmanager/media/metadata_profile.png b/hyo2/ssm2/app/gui/soundspeedmanager/media/metadata_profile.png similarity index 100% rename from hyo2/soundspeedmanager/media/metadata_profile.png rename to hyo2/ssm2/app/gui/soundspeedmanager/media/metadata_profile.png diff --git a/hyo2/soundspeedmanager/media/move.png b/hyo2/ssm2/app/gui/soundspeedmanager/media/move.png similarity index 100% rename from hyo2/soundspeedmanager/media/move.png rename to hyo2/ssm2/app/gui/soundspeedmanager/media/move.png diff --git a/hyo2/soundspeedmanager/media/noaa.png b/hyo2/ssm2/app/gui/soundspeedmanager/media/noaa.png similarity index 100% rename from hyo2/soundspeedmanager/media/noaa.png rename to hyo2/ssm2/app/gui/soundspeedmanager/media/noaa.png diff --git a/hyo2/soundspeedmanager/media/noaa_ccom.png b/hyo2/ssm2/app/gui/soundspeedmanager/media/noaa_ccom.png similarity index 100% rename from hyo2/soundspeedmanager/media/noaa_ccom.png rename to hyo2/ssm2/app/gui/soundspeedmanager/media/noaa_ccom.png diff --git a/hyo2/soundspeedmanager/media/noaa_ccom_small.png b/hyo2/ssm2/app/gui/soundspeedmanager/media/noaa_ccom_small.png similarity index 100% rename from hyo2/soundspeedmanager/media/noaa_ccom_small.png rename to hyo2/ssm2/app/gui/soundspeedmanager/media/noaa_ccom_small.png diff --git a/hyo2/soundspeedmanager/media/offline_docs.png b/hyo2/ssm2/app/gui/soundspeedmanager/media/offline_docs.png similarity index 100% rename from hyo2/soundspeedmanager/media/offline_docs.png rename to hyo2/ssm2/app/gui/soundspeedmanager/media/offline_docs.png diff --git a/hyo2/soundspeedmanager/media/online_docs.png b/hyo2/ssm2/app/gui/soundspeedmanager/media/online_docs.png similarity index 100% rename from hyo2/soundspeedmanager/media/online_docs.png rename to hyo2/ssm2/app/gui/soundspeedmanager/media/online_docs.png diff --git a/hyo2/soundspeedmanager/media/pan_cursor.png b/hyo2/ssm2/app/gui/soundspeedmanager/media/pan_cursor.png similarity index 100% rename from hyo2/soundspeedmanager/media/pan_cursor.png rename to hyo2/ssm2/app/gui/soundspeedmanager/media/pan_cursor.png diff --git a/hyo2/soundspeedmanager/media/plot_comparison.png b/hyo2/ssm2/app/gui/soundspeedmanager/media/plot_comparison.png similarity index 100% rename from hyo2/soundspeedmanager/media/plot_comparison.png rename to hyo2/ssm2/app/gui/soundspeedmanager/media/plot_comparison.png diff --git a/hyo2/soundspeedmanager/media/plot_grid.png b/hyo2/ssm2/app/gui/soundspeedmanager/media/plot_grid.png similarity index 100% rename from hyo2/soundspeedmanager/media/plot_grid.png rename to hyo2/ssm2/app/gui/soundspeedmanager/media/plot_grid.png diff --git a/hyo2/soundspeedmanager/media/plot_legend.png b/hyo2/ssm2/app/gui/soundspeedmanager/media/plot_legend.png similarity index 100% rename from hyo2/soundspeedmanager/media/plot_legend.png rename to hyo2/ssm2/app/gui/soundspeedmanager/media/plot_legend.png diff --git a/hyo2/soundspeedmanager/media/qa.png b/hyo2/ssm2/app/gui/soundspeedmanager/media/qa.png similarity index 100% rename from hyo2/soundspeedmanager/media/qa.png rename to hyo2/ssm2/app/gui/soundspeedmanager/media/qa.png diff --git a/hyo2/soundspeedmanager/media/qt5_editor_options.png b/hyo2/ssm2/app/gui/soundspeedmanager/media/qt5_editor_options.png similarity index 100% rename from hyo2/soundspeedmanager/media/qt5_editor_options.png rename to hyo2/ssm2/app/gui/soundspeedmanager/media/qt5_editor_options.png diff --git a/hyo2/soundspeedmanager/media/raytracing_comparison.png b/hyo2/ssm2/app/gui/soundspeedmanager/media/raytracing_comparison.png similarity index 100% rename from hyo2/soundspeedmanager/media/raytracing_comparison.png rename to hyo2/ssm2/app/gui/soundspeedmanager/media/raytracing_comparison.png diff --git a/hyo2/soundspeedmanager/media/receive.png b/hyo2/ssm2/app/gui/soundspeedmanager/media/receive.png similarity index 100% rename from hyo2/soundspeedmanager/media/receive.png rename to hyo2/ssm2/app/gui/soundspeedmanager/media/receive.png diff --git a/hyo2/soundspeedmanager/media/ref.png b/hyo2/ssm2/app/gui/soundspeedmanager/media/ref.png similarity index 100% rename from hyo2/soundspeedmanager/media/ref.png rename to hyo2/ssm2/app/gui/soundspeedmanager/media/ref.png diff --git a/hyo2/soundspeedmanager/media/refraction.png b/hyo2/ssm2/app/gui/soundspeedmanager/media/refraction.png similarity index 100% rename from hyo2/soundspeedmanager/media/refraction.png rename to hyo2/ssm2/app/gui/soundspeedmanager/media/refraction.png diff --git a/hyo2/soundspeedmanager/media/restart.png b/hyo2/ssm2/app/gui/soundspeedmanager/media/restart.png similarity index 100% rename from hyo2/soundspeedmanager/media/restart.png rename to hyo2/ssm2/app/gui/soundspeedmanager/media/restart.png diff --git a/hyo2/soundspeedmanager/media/sal.png b/hyo2/ssm2/app/gui/soundspeedmanager/media/sal.png similarity index 100% rename from hyo2/soundspeedmanager/media/sal.png rename to hyo2/ssm2/app/gui/soundspeedmanager/media/sal.png diff --git a/hyo2/soundspeedmanager/media/save.png b/hyo2/ssm2/app/gui/soundspeedmanager/media/save.png similarity index 100% rename from hyo2/soundspeedmanager/media/save.png rename to hyo2/ssm2/app/gui/soundspeedmanager/media/save.png diff --git a/hyo2/soundspeedmanager/media/scale.png b/hyo2/ssm2/app/gui/soundspeedmanager/media/scale.png similarity index 100% rename from hyo2/soundspeedmanager/media/scale.png rename to hyo2/ssm2/app/gui/soundspeedmanager/media/scale.png diff --git a/hyo2/soundspeedmanager/media/seacat.png b/hyo2/ssm2/app/gui/soundspeedmanager/media/seacat.png similarity index 100% rename from hyo2/soundspeedmanager/media/seacat.png rename to hyo2/ssm2/app/gui/soundspeedmanager/media/seacat.png diff --git a/hyo2/soundspeedmanager/media/server.png b/hyo2/ssm2/app/gui/soundspeedmanager/media/server.png similarity index 100% rename from hyo2/soundspeedmanager/media/server.png rename to hyo2/ssm2/app/gui/soundspeedmanager/media/server.png diff --git a/hyo2/soundspeedmanager/media/settings.png b/hyo2/ssm2/app/gui/soundspeedmanager/media/settings.png similarity index 100% rename from hyo2/soundspeedmanager/media/settings.png rename to hyo2/ssm2/app/gui/soundspeedmanager/media/settings.png diff --git a/hyo2/soundspeedmanager/media/smartmap.png b/hyo2/ssm2/app/gui/soundspeedmanager/media/smartmap.png similarity index 100% rename from hyo2/soundspeedmanager/media/smartmap.png rename to hyo2/ssm2/app/gui/soundspeedmanager/media/smartmap.png diff --git a/hyo2/soundspeedmanager/media/stats.png b/hyo2/ssm2/app/gui/soundspeedmanager/media/stats.png similarity index 100% rename from hyo2/soundspeedmanager/media/stats.png rename to hyo2/ssm2/app/gui/soundspeedmanager/media/stats.png diff --git a/hyo2/soundspeedmanager/media/subplots.png b/hyo2/ssm2/app/gui/soundspeedmanager/media/subplots.png similarity index 100% rename from hyo2/soundspeedmanager/media/subplots.png rename to hyo2/ssm2/app/gui/soundspeedmanager/media/subplots.png diff --git a/hyo2/soundspeedmanager/media/surveydatamonitor.png b/hyo2/ssm2/app/gui/soundspeedmanager/media/surveydatamonitor.png similarity index 100% rename from hyo2/soundspeedmanager/media/surveydatamonitor.png rename to hyo2/ssm2/app/gui/soundspeedmanager/media/surveydatamonitor.png diff --git a/hyo2/soundspeedmanager/media/temp_sal.png b/hyo2/ssm2/app/gui/soundspeedmanager/media/temp_sal.png similarity index 100% rename from hyo2/soundspeedmanager/media/temp_sal.png rename to hyo2/ssm2/app/gui/soundspeedmanager/media/temp_sal.png diff --git a/hyo2/soundspeedmanager/media/text.png b/hyo2/ssm2/app/gui/soundspeedmanager/media/text.png similarity index 100% rename from hyo2/soundspeedmanager/media/text.png rename to hyo2/ssm2/app/gui/soundspeedmanager/media/text.png diff --git a/hyo2/soundspeedmanager/media/thinning.png b/hyo2/ssm2/app/gui/soundspeedmanager/media/thinning.png similarity index 100% rename from hyo2/soundspeedmanager/media/thinning.png rename to hyo2/ssm2/app/gui/soundspeedmanager/media/thinning.png diff --git a/hyo2/soundspeedmanager/media/transmit.png b/hyo2/ssm2/app/gui/soundspeedmanager/media/transmit.png similarity index 100% rename from hyo2/soundspeedmanager/media/transmit.png rename to hyo2/ssm2/app/gui/soundspeedmanager/media/transmit.png diff --git a/hyo2/soundspeedmanager/media/tss.png b/hyo2/ssm2/app/gui/soundspeedmanager/media/tss.png similarity index 100% rename from hyo2/soundspeedmanager/media/tss.png rename to hyo2/ssm2/app/gui/soundspeedmanager/media/tss.png diff --git a/hyo2/soundspeedmanager/media/undock.png b/hyo2/ssm2/app/gui/soundspeedmanager/media/undock.png similarity index 100% rename from hyo2/soundspeedmanager/media/undock.png rename to hyo2/ssm2/app/gui/soundspeedmanager/media/undock.png diff --git a/hyo2/soundspeedmanager/media/unflag.png b/hyo2/ssm2/app/gui/soundspeedmanager/media/unflag.png similarity index 100% rename from hyo2/soundspeedmanager/media/unflag.png rename to hyo2/ssm2/app/gui/soundspeedmanager/media/unflag.png diff --git a/hyo2/soundspeedmanager/media/unh.png b/hyo2/ssm2/app/gui/soundspeedmanager/media/unh.png similarity index 100% rename from hyo2/soundspeedmanager/media/unh.png rename to hyo2/ssm2/app/gui/soundspeedmanager/media/unh.png diff --git a/hyo2/soundspeedmanager/media/unlock.png b/hyo2/ssm2/app/gui/soundspeedmanager/media/unlock.png similarity index 100% rename from hyo2/soundspeedmanager/media/unlock.png rename to hyo2/ssm2/app/gui/soundspeedmanager/media/unlock.png diff --git a/hyo2/soundspeedmanager/media/zoom_to_rect.png b/hyo2/ssm2/app/gui/soundspeedmanager/media/zoom_to_rect.png similarity index 100% rename from hyo2/soundspeedmanager/media/zoom_to_rect.png rename to hyo2/ssm2/app/gui/soundspeedmanager/media/zoom_to_rect.png diff --git a/hyo2/soundspeedmanager/media/zoomin.png b/hyo2/ssm2/app/gui/soundspeedmanager/media/zoomin.png similarity index 100% rename from hyo2/soundspeedmanager/media/zoomin.png rename to hyo2/ssm2/app/gui/soundspeedmanager/media/zoomin.png diff --git a/hyo2/soundspeedmanager/media/zoomout.png b/hyo2/ssm2/app/gui/soundspeedmanager/media/zoomout.png similarity index 100% rename from hyo2/soundspeedmanager/media/zoomout.png rename to hyo2/ssm2/app/gui/soundspeedmanager/media/zoomout.png diff --git a/hyo2/soundspeedmanager/qt_callbacks.py b/hyo2/ssm2/app/gui/soundspeedmanager/qt_callbacks.py similarity index 100% rename from hyo2/soundspeedmanager/qt_callbacks.py rename to hyo2/ssm2/app/gui/soundspeedmanager/qt_callbacks.py diff --git a/hyo2/soundspeedmanager/widgets/__init__.py b/hyo2/ssm2/app/gui/soundspeedmanager/widgets/__init__.py similarity index 100% rename from hyo2/soundspeedmanager/widgets/__init__.py rename to hyo2/ssm2/app/gui/soundspeedmanager/widgets/__init__.py diff --git a/hyo2/soundspeedmanager/widgets/database.py b/hyo2/ssm2/app/gui/soundspeedmanager/widgets/database.py similarity index 100% rename from hyo2/soundspeedmanager/widgets/database.py rename to hyo2/ssm2/app/gui/soundspeedmanager/widgets/database.py diff --git a/hyo2/soundspeedmanager/widgets/dataplots.py b/hyo2/ssm2/app/gui/soundspeedmanager/widgets/dataplots.py similarity index 100% rename from hyo2/soundspeedmanager/widgets/dataplots.py rename to hyo2/ssm2/app/gui/soundspeedmanager/widgets/dataplots.py diff --git a/hyo2/soundspeedmanager/widgets/editor.py b/hyo2/ssm2/app/gui/soundspeedmanager/widgets/editor.py similarity index 100% rename from hyo2/soundspeedmanager/widgets/editor.py rename to hyo2/ssm2/app/gui/soundspeedmanager/widgets/editor.py diff --git a/hyo2/soundspeedmanager/widgets/navtoolbar.py b/hyo2/ssm2/app/gui/soundspeedmanager/widgets/navtoolbar.py similarity index 100% rename from hyo2/soundspeedmanager/widgets/navtoolbar.py rename to hyo2/ssm2/app/gui/soundspeedmanager/widgets/navtoolbar.py diff --git a/hyo2/soundspeedmanager/widgets/refraction.py b/hyo2/ssm2/app/gui/soundspeedmanager/widgets/refraction.py similarity index 100% rename from hyo2/soundspeedmanager/widgets/refraction.py rename to hyo2/ssm2/app/gui/soundspeedmanager/widgets/refraction.py diff --git a/hyo2/soundspeedmanager/widgets/server.py b/hyo2/ssm2/app/gui/soundspeedmanager/widgets/server.py similarity index 100% rename from hyo2/soundspeedmanager/widgets/server.py rename to hyo2/ssm2/app/gui/soundspeedmanager/widgets/server.py diff --git a/hyo2/soundspeedmanager/widgets/settings.py b/hyo2/ssm2/app/gui/soundspeedmanager/widgets/settings.py similarity index 100% rename from hyo2/soundspeedmanager/widgets/settings.py rename to hyo2/ssm2/app/gui/soundspeedmanager/widgets/settings.py diff --git a/hyo2/soundspeedmanager/widgets/widget.py b/hyo2/ssm2/app/gui/soundspeedmanager/widgets/widget.py similarity index 100% rename from hyo2/soundspeedmanager/widgets/widget.py rename to hyo2/ssm2/app/gui/soundspeedmanager/widgets/widget.py diff --git a/hyo2/soundspeedsettings/__init__.py b/hyo2/ssm2/app/gui/soundspeedsettings/__init__.py similarity index 100% rename from hyo2/soundspeedsettings/__init__.py rename to hyo2/ssm2/app/gui/soundspeedsettings/__init__.py diff --git a/hyo2/soundspeedsettings/__main__.py b/hyo2/ssm2/app/gui/soundspeedsettings/__main__.py similarity index 100% rename from hyo2/soundspeedsettings/__main__.py rename to hyo2/ssm2/app/gui/soundspeedsettings/__main__.py diff --git a/hyo2/soundspeedsettings/gui.py b/hyo2/ssm2/app/gui/soundspeedsettings/gui.py similarity index 100% rename from hyo2/soundspeedsettings/gui.py rename to hyo2/ssm2/app/gui/soundspeedsettings/gui.py diff --git a/hyo2/soundspeedsettings/mainwin.py b/hyo2/ssm2/app/gui/soundspeedsettings/mainwin.py similarity index 100% rename from hyo2/soundspeedsettings/mainwin.py rename to hyo2/ssm2/app/gui/soundspeedsettings/mainwin.py diff --git a/hyo2/soundspeedsettings/media/app_icon.png b/hyo2/ssm2/app/gui/soundspeedsettings/media/app_icon.png similarity index 100% rename from hyo2/soundspeedsettings/media/app_icon.png rename to hyo2/ssm2/app/gui/soundspeedsettings/media/app_icon.png diff --git a/hyo2/soundspeedsettings/widgets/__init__.py b/hyo2/ssm2/app/gui/soundspeedsettings/widgets/__init__.py similarity index 100% rename from hyo2/soundspeedsettings/widgets/__init__.py rename to hyo2/ssm2/app/gui/soundspeedsettings/widgets/__init__.py diff --git a/hyo2/soundspeedsettings/widgets/general.py b/hyo2/ssm2/app/gui/soundspeedsettings/widgets/general.py similarity index 100% rename from hyo2/soundspeedsettings/widgets/general.py rename to hyo2/ssm2/app/gui/soundspeedsettings/widgets/general.py diff --git a/hyo2/soundspeedsettings/widgets/input.py b/hyo2/ssm2/app/gui/soundspeedsettings/widgets/input.py similarity index 100% rename from hyo2/soundspeedsettings/widgets/input.py rename to hyo2/ssm2/app/gui/soundspeedsettings/widgets/input.py diff --git a/hyo2/soundspeedsettings/widgets/listeners.py b/hyo2/ssm2/app/gui/soundspeedsettings/widgets/listeners.py similarity index 100% rename from hyo2/soundspeedsettings/widgets/listeners.py rename to hyo2/ssm2/app/gui/soundspeedsettings/widgets/listeners.py diff --git a/hyo2/soundspeedsettings/widgets/main.py b/hyo2/ssm2/app/gui/soundspeedsettings/widgets/main.py similarity index 100% rename from hyo2/soundspeedsettings/widgets/main.py rename to hyo2/ssm2/app/gui/soundspeedsettings/widgets/main.py diff --git a/hyo2/soundspeedsettings/widgets/output.py b/hyo2/ssm2/app/gui/soundspeedsettings/widgets/output.py similarity index 100% rename from hyo2/soundspeedsettings/widgets/output.py rename to hyo2/ssm2/app/gui/soundspeedsettings/widgets/output.py diff --git a/hyo2/soundspeedsettings/widgets/widget.py b/hyo2/ssm2/app/gui/soundspeedsettings/widgets/widget.py similarity index 100% rename from hyo2/soundspeedsettings/widgets/widget.py rename to hyo2/ssm2/app/gui/soundspeedsettings/widgets/widget.py diff --git a/hyo2/ssm_sis/__init__.py b/hyo2/ssm2/app/gui/ssm_sis/__init__.py similarity index 100% rename from hyo2/ssm_sis/__init__.py rename to hyo2/ssm2/app/gui/ssm_sis/__init__.py diff --git a/hyo2/ssm_sis/__main__.py b/hyo2/ssm2/app/gui/ssm_sis/__main__.py similarity index 100% rename from hyo2/ssm_sis/__main__.py rename to hyo2/ssm2/app/gui/ssm_sis/__main__.py diff --git a/hyo2/ssm_sis/controlpanel.py b/hyo2/ssm2/app/gui/ssm_sis/controlpanel.py similarity index 100% rename from hyo2/ssm_sis/controlpanel.py rename to hyo2/ssm2/app/gui/ssm_sis/controlpanel.py diff --git a/hyo2/ssm_sis/gui.py b/hyo2/ssm2/app/gui/ssm_sis/gui.py similarity index 100% rename from hyo2/ssm_sis/gui.py rename to hyo2/ssm2/app/gui/ssm_sis/gui.py diff --git a/hyo2/ssm_sis/mainwin.py b/hyo2/ssm2/app/gui/ssm_sis/mainwin.py similarity index 100% rename from hyo2/ssm_sis/mainwin.py rename to hyo2/ssm2/app/gui/ssm_sis/mainwin.py diff --git a/hyo2/ssm_sis/media/small_info.png b/hyo2/ssm2/app/gui/ssm_sis/media/small_info.png similarity index 100% rename from hyo2/ssm_sis/media/small_info.png rename to hyo2/ssm2/app/gui/ssm_sis/media/small_info.png diff --git a/hyo2/ssm_sis/media/ssm_sis.png b/hyo2/ssm2/app/gui/ssm_sis/media/ssm_sis.png similarity index 100% rename from hyo2/ssm_sis/media/ssm_sis.png rename to hyo2/ssm2/app/gui/ssm_sis/media/ssm_sis.png