@3cr/viewer-browser 0.0.62 → 0.0.86

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. package/components.d.ts +0 -2
  2. package/coverage/3cr-viewer-browser/index.html +116 -0
  3. package/coverage/3cr-viewer-browser/index.ts.html +199 -0
  4. package/coverage/3cr-viewer-browser/src/App.vue.html +316 -0
  5. package/coverage/3cr-viewer-browser/src/components/WebGL3DR.vue.html +442 -0
  6. package/coverage/3cr-viewer-browser/src/components/icons/index.html +116 -0
  7. package/coverage/3cr-viewer-browser/src/components/icons/liver.vue.html +148 -0
  8. package/coverage/3cr-viewer-browser/src/components/index.html +116 -0
  9. package/coverage/3cr-viewer-browser/src/components/loading/LoadingSpinner.vue.html +622 -0
  10. package/coverage/3cr-viewer-browser/src/components/loading/index.html +116 -0
  11. package/coverage/3cr-viewer-browser/src/components/modal/MftpWebGL3DRModal.vue.html +3241 -0
  12. package/coverage/3cr-viewer-browser/src/components/modal/index.html +116 -0
  13. package/coverage/3cr-viewer-browser/src/components/selectors/ValueSelector.vue.html +358 -0
  14. package/coverage/3cr-viewer-browser/src/components/selectors/index.html +116 -0
  15. package/coverage/3cr-viewer-browser/src/components/sliders/DoubleSliderSelector.vue.html +487 -0
  16. package/coverage/3cr-viewer-browser/src/components/sliders/VerticalSliderSelector.vue.html +358 -0
  17. package/coverage/3cr-viewer-browser/src/components/sliders/index.html +131 -0
  18. package/coverage/3cr-viewer-browser/src/dataLayer/iconData.ts.html +118 -0
  19. package/coverage/3cr-viewer-browser/src/dataLayer/index.html +146 -0
  20. package/coverage/3cr-viewer-browser/src/dataLayer/payloadHandler.ts.html +352 -0
  21. package/coverage/3cr-viewer-browser/src/dataLayer/scanState.ts.html +628 -0
  22. package/coverage/3cr-viewer-browser/src/helpers/index.html +146 -0
  23. package/coverage/3cr-viewer-browser/src/helpers/layoutOverlayStyle.ts.html +406 -0
  24. package/coverage/3cr-viewer-browser/src/helpers/modelHelper.ts.html +412 -0
  25. package/coverage/3cr-viewer-browser/src/helpers/utils.ts.html +133 -0
  26. package/coverage/3cr-viewer-browser/src/index.html +131 -0
  27. package/coverage/3cr-viewer-browser/src/main.ts.html +124 -0
  28. package/coverage/3cr-viewer-browser/src/models/LoadViewerOptions.ts.html +166 -0
  29. package/coverage/3cr-viewer-browser/src/models/index.html +116 -0
  30. package/coverage/3cr-viewer-browser/src/notifications/index.html +116 -0
  31. package/coverage/3cr-viewer-browser/src/notifications/notification.ts.html +229 -0
  32. package/coverage/3cr-viewer-browser/src/plugins/index.html +131 -0
  33. package/coverage/3cr-viewer-browser/src/plugins/index.ts.html +136 -0
  34. package/coverage/3cr-viewer-browser/src/plugins/vuetify.ts.html +220 -0
  35. package/coverage/base.css +224 -0
  36. package/coverage/block-navigation.js +87 -0
  37. package/coverage/favicon.png +0 -0
  38. package/coverage/index.html +296 -0
  39. package/coverage/prettify.css +1 -0
  40. package/coverage/prettify.js +2 -0
  41. package/coverage/sort-arrow-sprite.png +0 -0
  42. package/coverage/sorter.js +196 -0
  43. package/dist/Viewer3CR.js +12 -12
  44. package/dist/Viewer3CR.mjs +10109 -10142
  45. package/dist/Viewer3CR.umd.js +12 -12
  46. package/index.ts +7 -42
  47. package/package.json +1 -1
  48. package/src/App.vue +6 -2
  49. package/src/components/modal/MftpWebGL3DRModal.vue +133 -495
  50. package/src/components/modal/__tests__/mftp-webgl-3dr-modal.spec.ts +79 -84
  51. package/src/components/selectors/ValueSelector.vue +4 -0
  52. package/src/components/selectors/__tests__/value-selector.spec.ts +18 -0
  53. package/src/components/sliders/DoubleSliderSelector.vue +10 -4
  54. package/src/components/sliders/__tests__/double-slider-selector.spec.ts +32 -0
  55. package/src/dataLayer/__tests__/payload-handler.spec.ts +98 -0
  56. package/src/dataLayer/iconData.ts +11 -0
  57. package/src/dataLayer/payloadHandler.ts +89 -0
  58. package/src/dataLayer/scanState.ts +181 -0
  59. package/src/demo/options.ts +93 -0
  60. package/src/models/Callbacks.ts +2 -0
  61. package/src/models/LoadViewerOptions.ts +27 -0
  62. package/src/models/LoadViewerPayload.ts +8 -0
  63. package/src/notifications/notification.ts +48 -0
  64. package/vitest.config.mts +1 -0
  65. package/coverage/.tmp/coverage-100.json +0 -1
  66. package/coverage/.tmp/coverage-101.json +0 -1
  67. package/coverage/.tmp/coverage-102.json +0 -1
  68. package/coverage/.tmp/coverage-103.json +0 -1
  69. package/coverage/.tmp/coverage-104.json +0 -1
  70. package/coverage/.tmp/coverage-105.json +0 -1
  71. package/coverage/.tmp/coverage-106.json +0 -1
  72. package/coverage/.tmp/coverage-107.json +0 -1
  73. package/coverage/.tmp/coverage-108.json +0 -1
  74. package/coverage/.tmp/coverage-109.json +0 -1
  75. package/coverage/.tmp/coverage-110.json +0 -1
  76. package/coverage/.tmp/coverage-98.json +0 -1
  77. package/coverage/.tmp/coverage-99.json +0 -1
  78. /package/src/{components/modal → demo}/DemoModal.vue +0 -0
  79. /package/src/{components/modal → demo}/DemoPatientModal.vue +0 -0
@@ -329,7 +329,7 @@
329
329
  />
330
330
  <v-card-actions class="py-3">
331
331
  <v-select
332
- :value="getCurrentGreyscalePreset()"
332
+ :value="currentGreyscalePreset"
333
333
  :items="initialScanState.GreyscalePresets"
334
334
  label="Greyscale Preset"
335
335
  item-text="Name"
@@ -491,8 +491,12 @@
491
491
  color="transparent"
492
492
  :icon="true"
493
493
  @click="
494
- viewSelection('vs_05');
495
- viewSelection('vs_06');
494
+ payloadHandler.viewSelection(
495
+ ViewSelectionActions.vs06
496
+ );
497
+ payloadHandler.viewSelection(
498
+ ViewSelectionActions.vs05
499
+ );
496
500
  "
497
501
  ><v-icon color="white">home</v-icon></v-btn
498
502
  >
@@ -590,7 +594,7 @@
590
594
  <v-btn
591
595
  color="primary"
592
596
  @click="
593
- rotateByDeg(
597
+ payloadHandler.rotateByDeg(
594
598
  getCurrentActiveView(layout),
595
599
  rotationDeg
596
600
  )
@@ -667,38 +671,55 @@ import VerticalSliderSelector from "@/components/sliders/VerticalSliderSelector.
667
671
  import { generateDivStyleForLayout } from "@/helpers/layoutOverlayStyle";
668
672
 
669
673
  import {
670
- inflateInitialScanState,
671
- inflateScanState,
672
- } from "@/helpers/modelHelper";
673
- import {
674
- SlidersActions,
675
- PresetsActions,
676
- ScanMovementActions,
677
- ScanOrientationActions,
678
674
  FileManagementActions,
679
675
  FrontEndInterfaces,
680
- AnchorPoint,
681
- ColourPresetData,
682
- CurrentScanState,
683
- InitialScanState,
684
676
  PositionData,
677
+ PresetsActions,
678
+ ScanMovementActions,
685
679
  ScanView,
686
- InteractivityActions,
687
- NotificationsActions,
688
- NotificationPayload,
680
+ SlidersActions,
681
+ ViewSelectionActions,
689
682
  } from "@3cr/types-ts";
683
+ import { defineEmits, nextTick, ref, unref, watch, WatchSource } from "vue";
690
684
 
691
- import { toNumber } from "@/helpers/utils";
692
- import { computed, ref, unref, watch, defineEmits, nextTick } from "vue";
693
685
  import {
694
- defaultOptions,
686
+ checkIsDemo,
687
+ demoType,
688
+ executeDemoOption,
689
+ isDemo,
690
+ m_demo,
691
+ m_demoPatient,
692
+ } from "@/demo/options";
693
+ import { handleNotification } from "@/notifications/notification";
694
+ import DemoPatientModal from "@/demo/DemoPatientModal.vue";
695
+ import DemoModal from "@/demo/DemoModal.vue";
696
+ import { LoadViewerPayload } from "@/models/LoadViewerPayload";
697
+ import {
698
+ defaultLoadViewerOptions,
695
699
  LoadViewerOptions,
696
- LoadViewerPayload,
697
- } from "../../../index";
698
-
699
- import { useNotification } from "@kyvg/vue3-notification";
700
-
701
- const { notify } = useNotification();
700
+ } from "@/models/LoadViewerOptions";
701
+ import { PayloadHandler, sendPayload } from "@/dataLayer/payloadHandler";
702
+ import {
703
+ cMinMax,
704
+ cSlider,
705
+ currentColourPreset,
706
+ currentGreyscalePreset,
707
+ huMinMax,
708
+ initialScanState,
709
+ isLayout1x3,
710
+ isLayout2x2,
711
+ scanState,
712
+ setInitialScanStateFromPayload,
713
+ setScanStateFromPayload,
714
+ sMinMax,
715
+ sSlider,
716
+ thresholdSlider,
717
+ tMinMax,
718
+ transactionStarted,
719
+ tSlider,
720
+ windowSlider,
721
+ } from "@/dataLayer/scanState";
722
+ import { getIconForPreset } from "@/dataLayer/iconData";
702
723
 
703
724
  const emit = defineEmits<{
704
725
  instanceLoaded: [void];
@@ -718,92 +739,15 @@ const props = withDefaults(defineProps<Props>(), {
718
739
  Key: "OWjSMiL/ewUV1V6fGybhKcTyiysTPsIMp2DjdVoOUGI=",
719
740
  },
720
741
  }),
721
- options: () => defaultOptions,
742
+ options: () => defaultLoadViewerOptions,
722
743
  });
723
- const isDemo = ref<boolean>(false);
724
- let m_demo = ref<boolean>(false);
725
- let m_demoPatient = ref<boolean>(false);
726
-
727
- const demoLicenceOptions: LoadViewerOptions = {
728
- OnClosePopup: () => Promise.resolve(),
729
- OnExitViewer: () => {
730
- m_demo.value = true;
731
- },
732
- OnLoadNewDicomSeries: () => {
733
- m_demo.value = true;
734
- },
735
- OnDownloadDicomSeries: () => {
736
- m_demo.value = true;
737
- },
738
- OnLoadSavedSession: () => {
739
- m_demo.value = true;
740
- },
741
- OnSaveSession: () => {
742
- m_demo.value = true;
743
- },
744
- OnSendTo3rdParty: () => {
745
- m_demo.value = true;
746
- },
747
- OnShareToMobile: () => {
748
- m_demo.value = true;
749
- },
750
- OnShare: () => {
751
- m_demo.value = true;
752
- },
753
- OnScreenshot: () => {
754
- m_demo.value = true;
755
- },
756
- };
757
-
758
- const demoPatientOptions: LoadViewerOptions = {
759
- OnClosePopup: () => Promise.resolve(),
760
- OnExitViewer: () => {
761
- m_demoPatient.value = true;
762
- },
763
- OnLoadNewDicomSeries: () => {
764
- m_demoPatient.value = true;
765
- },
766
- OnDownloadDicomSeries: () => {
767
- m_demoPatient.value = true;
768
- },
769
- OnLoadSavedSession: () => {
770
- m_demoPatient.value = true;
771
- },
772
- OnSaveSession: () => {
773
- m_demoPatient.value = true;
774
- },
775
- OnSendTo3rdParty: () => {
776
- m_demoPatient.value = true;
777
- },
778
- OnShareToMobile: () => {
779
- m_demoPatient.value = true;
780
- },
781
- OnShare: () => {
782
- m_demoPatient.value = true;
783
- },
784
- OnScreenshot: () => {
785
- m_demoPatient.value = true;
786
- },
787
- };
788
744
 
789
- const demoType = computed(() => {
790
- const urlParams = new URLSearchParams(window.location.search);
791
- return urlParams.get("demoType") || "licence";
792
- });
745
+ const web_gl = ref<typeof WebGL3DR | null>(null);
746
+ const payloadHandler = new PayloadHandler(web_gl);
793
747
 
794
748
  function executeOption(key: keyof LoadViewerOptions) {
795
749
  if (unref(isDemo)) {
796
- if (unref(demoType) === "licence") {
797
- const functionToExecute = demoLicenceOptions[key];
798
- if (functionToExecute !== undefined) {
799
- functionToExecute();
800
- }
801
- } else if (unref(demoType) === "patient") {
802
- const functionToExecute = demoPatientOptions[key];
803
- if (functionToExecute !== undefined) {
804
- functionToExecute();
805
- }
806
- }
750
+ executeDemoOption(key);
807
751
  } else {
808
752
  const functionToExecute = unref(props.options)[key];
809
753
  if (functionToExecute !== undefined) {
@@ -819,9 +763,6 @@ const drawer = ref<boolean>(true);
819
763
  const drawerCollapsed = ref<boolean>(true);
820
764
  const scanLoading = ref<boolean>(true);
821
765
  const instanceLoaded = ref<boolean>(true);
822
- const scanState = ref<CurrentScanState>(inflateScanState());
823
- const initialScanState = ref<InitialScanState>(inflateInitialScanState());
824
- const currentColourPreset = ref<ColourPresetData | undefined>(undefined);
825
766
  const openPanels = ref<number>(0);
826
767
  const previousLayout = ref<string>("lo_02");
827
768
  const footerItems = ref([
@@ -830,9 +771,8 @@ const footerItems = ref([
830
771
  icon: "refresh",
831
772
  color: "red",
832
773
  click: async () => {
833
- console.log("Reset Scan");
834
- await viewSelection("vs_05");
835
- await viewSelection("vs_06");
774
+ await payloadHandler.viewSelection(ViewSelectionActions.vs05);
775
+ await payloadHandler.viewSelection(ViewSelectionActions.vs06);
836
776
  },
837
777
  },
838
778
  {
@@ -862,238 +802,69 @@ const miniMenu = ref([
862
802
  tooltip:
863
803
  "Tissue Density - Change the view of density within the scan, allowing you to see through a certain density of particles",
864
804
  },
865
- // { icon: 'display_settings', text: 'Display', tooltip: 'Display - Alter the view of the current scan' },
866
805
  ]);
867
806
 
868
- const huMinMax = ref({
869
- min: -999999,
870
- max: 999999,
871
- });
872
-
873
- const tMinMax = ref({
874
- min: 0,
875
- max: 999999,
876
- });
877
- const sMinMax = ref({
878
- min: 0,
879
- max: 999999,
880
- });
881
- const cMinMax = ref({
882
- min: 0,
883
- max: 999999,
884
- });
885
807
  const rotationDeg = ref<number>(0);
886
- const scanStateIncoming = ref<string>("");
887
- const transactionStarted = ref<boolean>(false);
888
808
  const stateOverlay = ref<boolean>(false);
889
809
  const m_closeDialog = ref<boolean>(false);
890
810
 
891
- const windowSlider = computed({
892
- get() {
893
- return [
894
- unref(scanState).Display.WindowLower,
895
- unref(scanState).Display.WindowUpper,
896
- ];
897
- },
898
- set(value: Array<number>) {
899
- scanState.value.Display.WindowLower = value[0];
900
- scanState.value.Display.WindowUpper = value[1];
901
- },
902
- });
903
- const thresholdSlider = computed({
904
- get() {
905
- return [
906
- Math.trunc(unref(scanState).Display.ThresholdLower),
907
- Math.trunc(unref(scanState).Display.ThresholdUpper),
908
- ];
909
- },
910
- set(value: Array<number>) {
911
- scanState.value.Display.ThresholdLower = value[0];
912
- scanState.value.Display.ThresholdUpper = value[1];
913
- },
914
- });
915
- const tSlider = computed({
916
- get() {
917
- return [
918
- Math.trunc(unref(scanState).Slice.TransverseLower),
919
- Math.trunc(unref(scanState).Slice.TransverseUpper),
920
- ];
921
- },
922
- set(value: Array<number>) {
923
- scanState.value.Slice.TransverseLower = value[0];
924
- scanState.value.Slice.TransverseLower = value[1];
925
- },
926
- });
927
- const sSlider = computed({
928
- get() {
929
- return [
930
- Math.trunc(unref(scanState).Slice.SagittalLower),
931
- Math.trunc(unref(scanState).Slice.SagittalUpper),
932
- ];
933
- },
934
- set(value: Array<number>) {
935
- scanState.value.Slice.SagittalLower = value[0];
936
- scanState.value.Slice.SagittalUpper = value[1];
937
- },
938
- });
811
+ type WatchSlidersType = { [key in SlidersActions]: WatchSource<number> };
812
+ const watchSliders: WatchSlidersType = {
813
+ [SlidersActions.sl01]: () => scanState.value.Display.Brightness,
814
+ [SlidersActions.sl02]: () => scanState.value.Display.Contrast,
815
+ [SlidersActions.sl03]: () => scanState.value.Display.Opacity,
816
+ [SlidersActions.sl04]: () => scanState.value.Display.WindowLower,
817
+ [SlidersActions.sl05]: () => scanState.value.Display.WindowUpper,
818
+ [SlidersActions.sl06]: () => scanState.value.Display.ThresholdLower,
819
+ [SlidersActions.sl07]: () => scanState.value.Display.ThresholdUpper,
820
+ [SlidersActions.sl08]: () => scanState.value.Slice.TransverseLower,
821
+ [SlidersActions.sl09]: () => scanState.value.Orientations.Transverse.Slice,
822
+ [SlidersActions.sl10]: () => scanState.value.Slice.TransverseUpper,
823
+ [SlidersActions.sl11]: () => scanState.value.Slice.SagittalLower,
824
+ [SlidersActions.sl12]: () => scanState.value.Orientations.Sagittal.Slice,
825
+ [SlidersActions.sl13]: () => scanState.value.Slice.SagittalUpper,
826
+ [SlidersActions.sl14]: () => scanState.value.Slice.CoronalLower,
827
+ [SlidersActions.sl15]: () => scanState.value.Orientations.Coronal.Slice,
828
+ [SlidersActions.sl16]: () => scanState.value.Slice.CoronalUpper,
829
+ };
939
830
 
940
- const cSlider = computed({
941
- get() {
942
- return [
943
- Math.trunc(unref(scanState).Slice.CoronalLower),
944
- Math.trunc(unref(scanState).Slice.CoronalUpper),
945
- ];
946
- },
947
- set(value: Array<number>) {
948
- scanState.value.Slice.CoronalLower = value[0];
949
- scanState.value.Slice.CoronalUpper = value[1];
950
- },
951
- });
952
- const web_gl = ref<typeof WebGL3DR | null>(null);
831
+ for (const slider of Object.keys(watchSliders)) {
832
+ watch(
833
+ watchSliders[slider as keyof WatchSlidersType],
834
+ async (value: number) => {
835
+ await payloadHandler.sliderHandler(slider as SlidersActions, value);
836
+ }
837
+ );
838
+ }
953
839
 
954
- watch(
955
- () => scanState.value.Display.Brightness,
956
- async (value: number) => {
957
- await sliderHandler(SlidersActions.sl01, value);
958
- }
959
- );
960
- watch(
961
- () => scanState.value.Display.Contrast,
962
- async (value: number) => {
963
- await sliderHandler(SlidersActions.sl02, value);
964
- }
965
- );
966
- watch(
967
- () => scanState.value.Display.Opacity,
968
- async (value: number) => {
969
- await sliderHandler(SlidersActions.sl03, value);
970
- }
971
- );
972
- watch(
973
- () => scanState.value.Display.WindowLower,
974
- async (value: number) => {
975
- await sliderHandler(SlidersActions.sl04, value);
976
- }
977
- );
978
- watch(
979
- () => scanState.value.Display.WindowUpper,
980
- async (value: number) => {
981
- await sliderHandler(SlidersActions.sl05, value);
982
- }
983
- );
984
- watch(
985
- () => scanState.value.Display.ThresholdLower,
986
- async (value: number) => {
987
- await sliderHandler(SlidersActions.sl06, value);
988
- }
989
- );
990
- watch(
991
- () => scanState.value.Display.ThresholdUpper,
992
- async (value: number) => {
993
- await sliderHandler(SlidersActions.sl07, value);
994
- }
995
- );
996
- watch(
997
- () => scanState.value.Slice.TransverseLower,
998
- async (value: number) => {
999
- await sliderHandler(SlidersActions.sl08, value);
1000
- }
1001
- );
1002
- watch(
1003
- () => scanState.value.Orientations.Transverse.Slice,
1004
- async (value: number) => {
1005
- await sliderHandler(SlidersActions.sl09, value);
1006
- }
1007
- );
1008
- watch(
1009
- () => scanState.value.Slice.TransverseUpper,
1010
- async (value: number) => {
1011
- await sliderHandler(SlidersActions.sl10, value);
1012
- }
1013
- );
1014
- watch(
1015
- () => scanState.value.Slice.SagittalLower,
1016
- async (value: number) => {
1017
- await sliderHandler(SlidersActions.sl11, value);
1018
- }
1019
- );
1020
- watch(
1021
- () => scanState.value.Orientations.Sagittal.Slice,
1022
- async (value: number) => {
1023
- await sliderHandler(SlidersActions.sl12, value);
1024
- }
1025
- );
1026
- watch(
1027
- () => scanState.value.Slice.SagittalUpper,
1028
- async (value: number) => {
1029
- await sliderHandler(SlidersActions.sl13, value);
1030
- }
1031
- );
1032
- watch(
1033
- () => scanState.value.Slice.CoronalLower,
1034
- async (value: number) => {
1035
- await sliderHandler(SlidersActions.sl14, value);
1036
- }
1037
- );
1038
- watch(
1039
- () => scanState.value.Orientations.Coronal.Slice,
1040
- async (value: number) => {
1041
- await sliderHandler(SlidersActions.sl15, value);
1042
- }
1043
- );
1044
- watch(
1045
- () => scanState.value.Slice.CoronalUpper,
1046
- async (value: number) => {
1047
- await sliderHandler(SlidersActions.sl16, value);
1048
- }
1049
- );
1050
- watch(
1051
- () => scanState.value.InteractionSettings.PanSensivitity,
1052
- async (value: number) => {
1053
- await scanMovementHandler(ScanMovementActions.sm05, value);
1054
- }
1055
- );
1056
- watch(
1057
- () => scanState.value.InteractionSettings.ZoomSensitivity,
1058
- async (value: number) => {
1059
- await scanMovementHandler(ScanMovementActions.sm08, value);
1060
- }
1061
- );
1062
- watch(
1063
- () => scanState.value.InteractionSettings.RotateSensitivity,
1064
- async (value: number) => {
1065
- await scanMovementHandler(ScanMovementActions.sm10, value);
1066
- }
1067
- );
1068
- watch(
1069
- () => scanState.value.InteractionSettings.CameraRotateSensitivity,
1070
- async (value: number) => {
1071
- await scanMovementHandler(ScanMovementActions.sm12, value);
1072
- }
1073
- );
840
+ type WatchScanMovementType = {
841
+ [key in ScanMovementActions]: WatchSource<number>;
842
+ };
1074
843
 
1075
- function getIconForPreset(presetName: string): string | undefined {
1076
- if (presetName === "Bone") return "fa:fas fa-bone";
1077
- if (presetName === "Brain") return "fa:fas fa-brain";
1078
- if (presetName === "Liver") return "custom:liver_icon";
1079
- if (presetName === "Lungs") return "fa:fas fa-lungs";
1080
- if (presetName === "Muscle") return "custom:muscle_icon";
1081
- if (presetName === "Temporal Bones") return "custom:temporal_bones_icon";
1082
- if (presetName === "Soft Tissue") return "custom:torso_icon";
1083
- if (presetName === "Skin") return "custom:skin_icon";
1084
- return undefined;
1085
- }
1086
- async function rotateByDeg(view: ScanView, deg: number) {
1087
- await sendPayload(
1088
- FrontEndInterfaces.scan_orientation,
1089
- ScanOrientationActions.so01,
1090
- {
1091
- Version: "0.0.1",
1092
- View: view,
1093
- Angle: deg,
844
+ //@ts-ignore
845
+ const watchScanMovement: WatchScanMovementType = {
846
+ [ScanMovementActions.sm05]: () =>
847
+ scanState.value.InteractionSettings.PanSensivitity,
848
+ [ScanMovementActions.sm08]: () =>
849
+ scanState.value.InteractionSettings.ZoomSensitivity,
850
+ [ScanMovementActions.sm10]: () =>
851
+ scanState.value.InteractionSettings.RotateSensitivity,
852
+ [ScanMovementActions.sm12]: () =>
853
+ scanState.value.InteractionSettings.CameraRotateSensitivity,
854
+ };
855
+
856
+ for (const scanMovement of Object.keys(watchScanMovement)) {
857
+ watch(
858
+ watchScanMovement[scanMovement as keyof typeof watchScanMovement],
859
+ async (value: number) => {
860
+ await payloadHandler.scanMovementHandler(
861
+ scanMovement as ScanMovementActions,
862
+ value
863
+ );
1094
864
  }
1095
865
  );
1096
866
  }
867
+
1097
868
  function getCurrentActiveView(position: PositionData): ScanView {
1098
869
  return unref(scanState).Layout.PositionData.length !== 1
1099
870
  ? position.DefaultView
@@ -1109,16 +880,16 @@ function getViewName(index: number) {
1109
880
  }
1110
881
  async function fullscreenLayout(view: ScanView) {
1111
882
  await layouts("lo_01");
1112
- await viewSelection(`vs_0${view + 1}`);
1113
- }
1114
- async function scanMovementHandler(action: string, value: number) {
1115
- if (unref(transactionStarted)) return;
1116
- await scanMovement(action, value);
1117
- }
1118
- async function sliderHandler(action: string, value: number) {
1119
- if (unref(transactionStarted)) return;
1120
- await slider(action, value);
883
+ await payloadHandler.viewSelection(`vs_0${view + 1}` as ViewSelectionActions);
1121
884
  }
885
+ // async function scanMovementHandler(action: string, value: number) {
886
+ // if (unref(transactionStarted)) return;
887
+ // await scanMovement(action, value);
888
+ // }
889
+ // async function sliderHandler(action: string, value: number) {
890
+ // if (unref(transactionStarted)) return;
891
+ // await slider(action, value);
892
+ // }
1122
893
 
1123
894
  function closeModal() {
1124
895
  m_closeDialog.value = false;
@@ -1130,181 +901,52 @@ function alterValue(val: boolean) {
1130
901
  m_closeDialog.value = true;
1131
902
  return;
1132
903
  } else {
1133
- isDemo.value =
1134
- props.payload.Url ===
1135
- "https://webgl-3dr.singular.health/test_scans/01440d4e-8b04-4b90-bb2c-698535ce16d6/CHEST.3vxl";
904
+ checkIsDemo(props.payload);
1136
905
  }
1137
906
 
1138
907
  value.value = val;
1139
908
  }
1140
- async function sendPayload(
1141
- interfaceType: string,
1142
- actionType: string,
1143
- message: any
1144
- ) {
1145
- await unref(web_gl)?.sendPayload(
1146
- JSON.stringify({
1147
- Version: "0.0.1",
1148
- Interface: interfaceType,
1149
- Action: actionType,
1150
- Message: JSON.stringify(message),
1151
- })
1152
- );
1153
- }
1154
909
  async function load() {
1155
910
  instanceLoaded.value = true;
1156
911
  scanLoading.value = true;
1157
- await sendPayload("file_management", "fm_01", props.payload);
1158
- }
1159
- async function viewSelection(action: string) {
1160
- await sendPayload(FrontEndInterfaces.view_selection, action, emptyPayload);
912
+ await sendPayload(web_gl, "file_management", "fm_01", props.payload);
1161
913
  }
914
+
1162
915
  async function layouts(action: string) {
1163
916
  if (action !== "lo_01") previousLayout.value = action;
1164
- await sendPayload(FrontEndInterfaces.layout, action, emptyPayload);
917
+ await sendPayload(web_gl, FrontEndInterfaces.layout, action, emptyPayload);
1165
918
  }
1166
919
  async function snap() {
1167
920
  emit("snap");
1168
921
  }
1169
922
 
1170
923
  async function setPreset(action: PresetsActions, preset: any) {
1171
- await sendPayload("presets", action, preset);
924
+ await sendPayload(web_gl, "presets", action, preset);
1172
925
  if (action === PresetsActions.pr02) {
1173
926
  currentColourPreset.value = preset;
1174
927
  }
1175
928
  }
1176
- async function slider(action: string, value: number) {
1177
- await sendPayload("sliders", action, {
1178
- Version: "0.0.1",
1179
- Value: toNumber(value),
1180
- });
1181
- }
1182
- async function scanMovement(action: string, value: number) {
1183
- await sendPayload(FrontEndInterfaces.scan_movement, action, {
1184
- Version: "0.0.1",
1185
- Value: toNumber(value),
1186
- });
1187
- }
929
+
1188
930
  async function hoverOverCanvas(isHovering: boolean) {
1189
- await sendPayload("interactivity", "in_01", {
931
+ await sendPayload(web_gl, "interactivity", "in_01", {
1190
932
  Version: "0.0.1",
1191
933
  Value: isHovering,
1192
934
  });
1193
- await sendPayload("interactivity", "in_02", {
935
+ await sendPayload(web_gl, "interactivity", "in_02", {
1194
936
  Version: "0.0.1",
1195
937
  Value: isHovering,
1196
938
  });
1197
939
  }
1198
- async function i_scanState(_: string, message: string) {
1199
- transactionStarted.value = true;
1200
- scanStateIncoming.value = JSON.stringify(JSON.parse(message), null, 2);
1201
-
1202
- setScanState(message);
1203
- await nextTick();
1204
- transactionStarted.value = false;
1205
- }
1206
940
  async function i_fileManagement(action: string, message: string) {
1207
- if (action !== FileManagementActions.fm02) return;
1208
- transactionStarted.value = true;
1209
-
1210
- scanStateIncoming.value = JSON.stringify(JSON.parse(message), null, 2);
1211
- const obj = JSON.parse(unref(scanStateIncoming)) as InitialScanState;
1212
-
1213
- setScanState(JSON.stringify(obj.DefaultDisplaySettings, null, 2));
1214
- initialScanState.value = obj;
1215
- huMinMax.value.max = obj.HuUpper;
1216
- huMinMax.value.min = obj.HuLower;
1217
- sMinMax.value.max = obj.XSlices;
1218
- cMinMax.value.max = obj.YSlices;
1219
- tMinMax.value.max = obj.ZSlices;
1220
- currentColourPreset.value = obj.ColourPresets[0];
1221
-
1222
- await nextTick();
1223
- transactionStarted.value = false;
1224
- scanLoading.value = false;
1225
- drawerCollapsed.value = false;
1226
- await hoverOverCanvas(false);
1227
- }
1228
-
1229
- async function i_notifications(action: string, message: string) {
1230
- const notification = JSON.parse(message) as NotificationPayload;
941
+ if (action === FileManagementActions.fm02) {
942
+ await setInitialScanStateFromPayload(action, message);
1231
943
 
1232
- switch (notification.Action) {
1233
- case InteractivityActions.in01:
1234
- case InteractivityActions.in02:
1235
- case InteractivityActions.in03:
1236
- case InteractivityActions.in04:
1237
- return;
1238
- default:
944
+ await nextTick();
945
+ transactionStarted.value = false;
946
+ scanLoading.value = false;
947
+ drawerCollapsed.value = false;
948
+ await hoverOverCanvas(false);
1239
949
  }
1240
- if (notification.Action.startsWith("sl")) return;
1241
-
1242
- let type = "success";
1243
- switch (action) {
1244
- // Muting no01
1245
- case NotificationsActions.no01:
1246
- type = "success";
1247
- return;
1248
-
1249
- case NotificationsActions.no02:
1250
- type = "warn";
1251
- break;
1252
-
1253
- case NotificationsActions.no03:
1254
- type = "error";
1255
- break;
1256
-
1257
- // Muting no04
1258
- case NotificationsActions.no04:
1259
- type = "info";
1260
- return;
1261
- }
1262
-
1263
- notify({
1264
- title: notification.Code,
1265
- text: notification.Action,
1266
- type,
1267
- });
1268
- }
1269
- const isLayout2x2 = computed(() => {
1270
- return (
1271
- unref(scanState).Layout.PositionData.length > 1 &&
1272
- unref(scanState).Layout.PositionData[0].Anchor === AnchorPoint.TOP_LEFT &&
1273
- unref(scanState).Layout.PositionData[1].Anchor === AnchorPoint.TOP_RIGHT &&
1274
- unref(scanState).Layout.PositionData[2].Anchor ===
1275
- AnchorPoint.BOTTOM_LEFT &&
1276
- unref(scanState).Layout.PositionData[3].Anchor === AnchorPoint.BOTTOM_RIGHT
1277
- );
1278
- });
1279
- const isLayout1x3 = computed(() => {
1280
- return (
1281
- unref(scanState).Layout.PositionData.length > 1 &&
1282
- unref(scanState).Layout.PositionData[0].Anchor === AnchorPoint.CENTER &&
1283
- unref(scanState).Layout.PositionData[1].Anchor === AnchorPoint.TOP_RIGHT &&
1284
- unref(scanState).Layout.PositionData[2].Anchor === AnchorPoint.RIGHT &&
1285
- unref(scanState).Layout.PositionData[3].Anchor === AnchorPoint.BOTTOM_RIGHT
1286
- );
1287
- });
1288
-
1289
- function getCurrentGreyscalePreset() {
1290
- for (const preset of unref(initialScanState).GreyscalePresets) {
1291
- if (
1292
- (unref(scanState).Display.WindowLower === preset.Lower ||
1293
- (preset.Lower < unref(initialScanState).HuLower &&
1294
- unref(scanState).Display.WindowLower ===
1295
- unref(initialScanState).HuLower)) &&
1296
- (unref(scanState).Display.WindowUpper === preset.Upper ||
1297
- (preset.Upper > unref(initialScanState).HuUpper &&
1298
- unref(scanState).Display.WindowUpper ===
1299
- unref(initialScanState).HuUpper))
1300
- ) {
1301
- return preset.Name;
1302
- }
1303
- }
1304
- return undefined;
1305
- }
1306
- function setScanState(message: string) {
1307
- scanState.value = JSON.parse(message) as CurrentScanState;
1308
950
  }
1309
951
 
1310
952
  function handleOnPayload(
@@ -1313,13 +955,13 @@ function handleOnPayload(
1313
955
  message: string
1314
956
  ) {
1315
957
  if (interfaceSet === FrontEndInterfaces.scan_state) {
1316
- i_scanState(actionSet, message);
958
+ setScanStateFromPayload(actionSet, message);
1317
959
  }
1318
960
  if (interfaceSet === FrontEndInterfaces.file_management) {
1319
961
  i_fileManagement(actionSet, message);
1320
962
  }
1321
963
  if (interfaceSet === FrontEndInterfaces.notifications) {
1322
- i_notifications(actionSet, message);
964
+ handleNotification(actionSet, message);
1323
965
  }
1324
966
  }
1325
967
 
@@ -1327,7 +969,6 @@ defineExpose({
1327
969
  alterValue,
1328
970
  load,
1329
971
  handleOnPayload,
1330
- setScanState,
1331
972
  sendPayload,
1332
973
  getIconForPreset,
1333
974
  cSlider,
@@ -1335,16 +976,13 @@ defineExpose({
1335
976
  tSlider,
1336
977
  thresholdSlider,
1337
978
  windowSlider,
1338
- isLayout2x2,
1339
- isLayout1x3,
1340
979
  m_closeDialog,
1341
- getCurrentGreyscalePreset,
1342
980
  closeModal,
1343
981
  snap,
1344
982
  scanState,
1345
983
  initialScanState,
1346
984
  footerItems,
1347
- rotateByDeg,
985
+ // rotateByDeg,
1348
986
  getCurrentActiveView,
1349
987
  getViewName,
1350
988
  fullscreenLayout,