From 09849ce0640985dddfc090544137b26e53ce3ce8 Mon Sep 17 00:00:00 2001 From: Joel Collins Date: Tue, 27 Oct 2020 14:04:55 +0000 Subject: [PATCH 1/9] Explicit JPEG thumbnail on capture --- openflexure_microscope/camera/pi.py | 2 ++ openflexure_microscope/microscope.py | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/openflexure_microscope/camera/pi.py b/openflexure_microscope/camera/pi.py index 4ea5e691..d49af7e9 100644 --- a/openflexure_microscope/camera/pi.py +++ b/openflexure_microscope/camera/pi.py @@ -484,6 +484,7 @@ class PiCameraStreamer(BaseCamera): use_video_port: bool = False, resize: Tuple[int, int] = None, bayer: bool = True, + thumbnail: tuple = None ): """ Capture a still image to a StreamObject. @@ -515,6 +516,7 @@ class PiCameraStreamer(BaseCamera): resize=resize, bayer=(not use_video_port) and bayer, use_video_port=use_video_port, + thumbnail=thumbnail ) # Set resolution and start stream recording if necessary diff --git a/openflexure_microscope/microscope.py b/openflexure_microscope/microscope.py index 824ce971..f68ca1d9 100644 --- a/openflexure_microscope/microscope.py +++ b/openflexure_microscope/microscope.py @@ -384,6 +384,9 @@ class Microscope: ) # Capture to output object + extras = {} + if fmt == "jpeg": + extras["thumbnail"] = (200,150,85) logging.info("Starting microscope capture %s", output.file) self.camera.capture( output, @@ -391,6 +394,7 @@ class Microscope: resize=resize, bayer=bayer, fmt=fmt, + **extras ) output.put_and_save(tags, annotations, full_metadata) From 10d264c526aaaaffcaf0884cd99a68a5f3e8de02 Mon Sep 17 00:00:00 2001 From: Joel Collins Date: Tue, 27 Oct 2020 14:05:24 +0000 Subject: [PATCH 2/9] Always use builtin JPEG thumbnails --- openflexure_microscope/captures/capture.py | 25 ++++++---------------- 1 file changed, 6 insertions(+), 19 deletions(-) diff --git a/openflexure_microscope/captures/capture.py b/openflexure_microscope/captures/capture.py index 2c2812f5..2550c59d 100644 --- a/openflexure_microscope/captures/capture.py +++ b/openflexure_microscope/captures/capture.py @@ -16,7 +16,6 @@ from openflexure_microscope.config import JSONEncoder PIL_FORMATS = ["JPG", "JPEG", "PNG", "TIF", "TIFF"] EXIF_FORMATS = ["JPG", "JPEG", "TIF", "TIFF"] -THUMBNAIL_SIZE = (200, 150) def pull_usercomment_dict(filepath): @@ -145,9 +144,6 @@ class CaptureObject(object): # List for storing tags self.tags = [] - # Thumbnail (populated only for PIL captures) - self.thumb_bytes = None - def write(self, s): logging.debug("Writing to %s", self) self.stream.write(s) @@ -349,21 +345,12 @@ class CaptureObject(object): """ Returns a thumbnail of the capture data, for supported image formats. """ - # If no thumbnail exists, try and make one - if not self.thumb_bytes: - logging.info("Building thumbnail") - self.thumb_bytes = io.BytesIO() - if self.format.upper() in PIL_FORMATS: - im = Image.open(self.data) - im.thumbnail(THUMBNAIL_SIZE) - im.save(self.thumb_bytes, self.format) - self.thumb_bytes.seek(0) - else: - self.thumb_bytes.seek(0) - - # Copy the buffer, to avoid closing the file - data = io.BytesIO(self.thumb_bytes.getbuffer()) - return data + exif_dict = piexif.load(self.file) + thumbnail = exif_dict.pop("thumbnail") + if thumbnail: + return io.BytesIO(thumbnail) + # If no thumbnail exists, serve the full image + return self.data.getvalue() def save(self) -> None: """Write stream to file, and save/update metadata file""" From 13b4c84783a726ab65c9f70c50d534e8ef8f166e Mon Sep 17 00:00:00 2001 From: Joel Collins Date: Tue, 27 Oct 2020 14:12:41 +0000 Subject: [PATCH 3/9] Fixed node_modules exclusion from Black --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 4bedf683..29a62813 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -60,7 +60,7 @@ pylint = "^2.3" black = {version = "^18.3-alpha.0",allow-prereleases = true} [tool.black] -exclude = '(\.eggs|\.git|\.venv)' +exclude = '(\.eggs|\.git|\.venv|node_modules/)' [tool.isort] multi_line_output = 3 From 250fd07e9a6331d9aaa9429166f56d526fc193fa Mon Sep 17 00:00:00 2001 From: Joel Collins Date: Tue, 27 Oct 2020 14:14:59 +0000 Subject: [PATCH 4/9] Code formatting and linting --- openflexure_microscope/camera/pi.py | 4 ++-- openflexure_microscope/captures/capture.py | 2 -- openflexure_microscope/microscope.py | 4 ++-- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/openflexure_microscope/camera/pi.py b/openflexure_microscope/camera/pi.py index d49af7e9..65fd8c35 100644 --- a/openflexure_microscope/camera/pi.py +++ b/openflexure_microscope/camera/pi.py @@ -484,7 +484,7 @@ class PiCameraStreamer(BaseCamera): use_video_port: bool = False, resize: Tuple[int, int] = None, bayer: bool = True, - thumbnail: tuple = None + thumbnail: tuple = None, ): """ Capture a still image to a StreamObject. @@ -516,7 +516,7 @@ class PiCameraStreamer(BaseCamera): resize=resize, bayer=(not use_video_port) and bayer, use_video_port=use_video_port, - thumbnail=thumbnail + thumbnail=thumbnail, ) # Set resolution and start stream recording if necessary diff --git a/openflexure_microscope/captures/capture.py b/openflexure_microscope/captures/capture.py index 2550c59d..ecee9462 100644 --- a/openflexure_microscope/captures/capture.py +++ b/openflexure_microscope/captures/capture.py @@ -8,13 +8,11 @@ import uuid from collections import OrderedDict import dateutil.parser -from PIL import Image from openflexure_microscope.camera import piexif from openflexure_microscope.camera.piexif._exceptions import InvalidImageDataError from openflexure_microscope.config import JSONEncoder -PIL_FORMATS = ["JPG", "JPEG", "PNG", "TIF", "TIFF"] EXIF_FORMATS = ["JPG", "JPEG", "TIF", "TIFF"] diff --git a/openflexure_microscope/microscope.py b/openflexure_microscope/microscope.py index f68ca1d9..22824815 100644 --- a/openflexure_microscope/microscope.py +++ b/openflexure_microscope/microscope.py @@ -386,7 +386,7 @@ class Microscope: # Capture to output object extras = {} if fmt == "jpeg": - extras["thumbnail"] = (200,150,85) + extras["thumbnail"] = (200, 150, 85) logging.info("Starting microscope capture %s", output.file) self.camera.capture( output, @@ -394,7 +394,7 @@ class Microscope: resize=resize, bayer=bayer, fmt=fmt, - **extras + **extras, ) output.put_and_save(tags, annotations, full_metadata) From eff03bfa2c08709056d76b3168729f3d7acb1146 Mon Sep 17 00:00:00 2001 From: Joel Collins Date: Tue, 27 Oct 2020 14:52:27 +0000 Subject: [PATCH 5/9] Rearranged main components --- .../api/static/package-lock.json | 196 ++++----- .../miniStreamDisplay.vue | 0 .../genericComponents/taskSubmitter.vue | 4 +- .../static/src/components/loadingContent.vue | 2 +- .../modalComponents/calibrationModal.vue | 6 +- .../aboutComponents}/devTools.vue | 0 .../aboutComponents}/statusPane.vue | 0 .../tabContentComponents/aboutContent.vue | 4 +- .../captureComponents}/paneCapture.vue | 6 +- .../tabContentComponents/captureContent.vue | 4 +- .../tabContentComponents/extensionContent.vue | 14 +- .../galleryComponents/captureCard.vue | 0 .../galleryComponents/scanCard.vue | 0 .../galleryComponents/zipDownloader.vue | 0 .../tabContentComponents/galleryContent.vue | 405 ++++++++++++++++- .../navigateComponents}/paneNavigate.vue | 2 +- .../tabContentComponents/navigateContent.vue | 4 +- .../settingsComponents/CSMSettings.vue | 2 +- .../CSMCalibrationSettings.vue | 0 .../settingsComponents/appSettings.vue | 0 .../settingsComponents/cameraSettings.vue | 2 +- .../cameraCalibrationSettings.vue | 0 .../settingsComponents/featuresSettings.vue | 0 .../settingsComponents/microscopeSettings.vue | 0 .../settingsComponents/stageSettings.vue | 0 .../settingsComponents/streamSettings.vue | 0 .../tabContentComponents/settingsContent.vue | 212 ++++++++- .../slideScanComponents}/paneSlideScan.vue | 2 +- .../tabContentComponents/slideScanContent.vue | 4 +- .../streamContent.vue} | 0 .../tabContentComponents/viewContent.vue | 2 +- .../connectComponents/hostCard.vue | 168 ------- .../viewComponents/galleryDisplay.vue | 409 ------------------ .../viewComponents/settingsDisplay.vue | 224 ---------- 34 files changed, 734 insertions(+), 938 deletions(-) rename openflexure_microscope/api/static/src/components/{viewComponents => genericComponents}/miniStreamDisplay.vue (100%) rename openflexure_microscope/api/static/src/components/{controlComponents => tabContentComponents/aboutComponents}/devTools.vue (100%) rename openflexure_microscope/api/static/src/components/{viewComponents => tabContentComponents/aboutComponents}/statusPane.vue (100%) rename openflexure_microscope/api/static/src/components/{controlComponents => tabContentComponents/captureComponents}/paneCapture.vue (98%) rename openflexure_microscope/api/static/src/components/{viewComponents => tabContentComponents}/galleryComponents/captureCard.vue (100%) rename openflexure_microscope/api/static/src/components/{viewComponents => tabContentComponents}/galleryComponents/scanCard.vue (100%) rename openflexure_microscope/api/static/src/components/{viewComponents => tabContentComponents}/galleryComponents/zipDownloader.vue (100%) rename openflexure_microscope/api/static/src/components/{controlComponents => tabContentComponents/navigateComponents}/paneNavigate.vue (99%) rename openflexure_microscope/api/static/src/components/{viewComponents => tabContentComponents}/settingsComponents/CSMSettings.vue (98%) rename openflexure_microscope/api/static/src/components/{viewComponents => tabContentComponents}/settingsComponents/CSMSettingsComponents/CSMCalibrationSettings.vue (100%) rename openflexure_microscope/api/static/src/components/{viewComponents => tabContentComponents}/settingsComponents/appSettings.vue (100%) rename openflexure_microscope/api/static/src/components/{viewComponents => tabContentComponents}/settingsComponents/cameraSettings.vue (97%) rename openflexure_microscope/api/static/src/components/{viewComponents => tabContentComponents}/settingsComponents/cameraSettingsComponents/cameraCalibrationSettings.vue (100%) rename openflexure_microscope/api/static/src/components/{viewComponents => tabContentComponents}/settingsComponents/featuresSettings.vue (100%) rename openflexure_microscope/api/static/src/components/{viewComponents => tabContentComponents}/settingsComponents/microscopeSettings.vue (100%) rename openflexure_microscope/api/static/src/components/{viewComponents => tabContentComponents}/settingsComponents/stageSettings.vue (100%) rename openflexure_microscope/api/static/src/components/{viewComponents => tabContentComponents}/settingsComponents/streamSettings.vue (100%) rename openflexure_microscope/api/static/src/components/{controlComponents => tabContentComponents/slideScanComponents}/paneSlideScan.vue (99%) rename openflexure_microscope/api/static/src/components/{viewComponents/streamDisplay.vue => tabContentComponents/streamContent.vue} (100%) delete mode 100644 openflexure_microscope/api/static/src/components/viewComponents/connectComponents/hostCard.vue delete mode 100644 openflexure_microscope/api/static/src/components/viewComponents/galleryDisplay.vue delete mode 100644 openflexure_microscope/api/static/src/components/viewComponents/settingsDisplay.vue diff --git a/openflexure_microscope/api/static/package-lock.json b/openflexure_microscope/api/static/package-lock.json index a7705d27..0d939672 100644 --- a/openflexure_microscope/api/static/package-lock.json +++ b/openflexure_microscope/api/static/package-lock.json @@ -2828,6 +2828,16 @@ "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", "dev": true }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "optional": true, + "requires": { + "color-convert": "^2.0.1" + } + }, "browserslist": { "version": "4.14.3", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.14.3.tgz", @@ -2872,12 +2882,36 @@ "integrity": "sha512-ziNcheTGTHlu9g34EVoHQdIu5g4foc8EsxMGC7Xkokmvw0dqNtX8BS8RgCgFBaAiSp2IdjvBxNdh0ssib28eVQ==", "dev": true }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "optional": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "optional": true + }, "electron-to-chromium": { "version": "1.3.570", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.570.tgz", "integrity": "sha512-Y6OCoVQgFQBP5py6A/06+yWxUZHDlNr/gNDGatjH8AZqXl8X0tE4LfjLJsXGz/JmWJz8a6K7bR1k+QzZ+k//fg==", "dev": true }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true, + "optional": true + }, "fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -2911,6 +2945,35 @@ "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", "dev": true }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "optional": true + }, + "json5": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", + "dev": true, + "optional": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "dev": true, + "optional": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, "locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -3053,6 +3116,16 @@ "ansi-regex": "^5.0.0" } }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "optional": true, + "requires": { + "has-flag": "^4.0.0" + } + }, "terser-webpack-plugin": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-2.3.8.tgz", @@ -3079,6 +3152,31 @@ "psl": "^1.1.28", "punycode": "^2.1.1" } + }, + "vue-loader-v16": { + "version": "npm:vue-loader@16.0.0-beta.8", + "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-16.0.0-beta.8.tgz", + "integrity": "sha512-oouKUQWWHbSihqSD7mhymGPX1OQ4hedzAHyvm8RdyHh6m3oIvoRF+NM45i/bhNOlo8jCnuJhaSUf/6oDjv978g==", + "dev": true, + "optional": true, + "requires": { + "chalk": "^4.1.0", + "hash-sum": "^2.0.0", + "loader-utils": "^2.0.0" + }, + "dependencies": { + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "optional": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + } + } } } }, @@ -13291,104 +13389,6 @@ } } }, - "vue-loader-v16": { - "version": "npm:vue-loader@16.0.0-beta.8", - "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-16.0.0-beta.8.tgz", - "integrity": "sha512-oouKUQWWHbSihqSD7mhymGPX1OQ4hedzAHyvm8RdyHh6m3oIvoRF+NM45i/bhNOlo8jCnuJhaSUf/6oDjv978g==", - "dev": true, - "optional": true, - "requires": { - "chalk": "^4.1.0", - "hash-sum": "^2.0.0", - "loader-utils": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "optional": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "optional": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "optional": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "optional": true - }, - "emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "dev": true, - "optional": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "optional": true - }, - "json5": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", - "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", - "dev": true, - "optional": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "loader-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", - "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", - "dev": true, - "optional": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "optional": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, "vue-observe-visibility": { "version": "0.4.6", "resolved": "https://registry.npmjs.org/vue-observe-visibility/-/vue-observe-visibility-0.4.6.tgz", diff --git a/openflexure_microscope/api/static/src/components/viewComponents/miniStreamDisplay.vue b/openflexure_microscope/api/static/src/components/genericComponents/miniStreamDisplay.vue similarity index 100% rename from openflexure_microscope/api/static/src/components/viewComponents/miniStreamDisplay.vue rename to openflexure_microscope/api/static/src/components/genericComponents/miniStreamDisplay.vue diff --git a/openflexure_microscope/api/static/src/components/genericComponents/taskSubmitter.vue b/openflexure_microscope/api/static/src/components/genericComponents/taskSubmitter.vue index 78c6d780..a0d8161f 100644 --- a/openflexure_microscope/api/static/src/components/genericComponents/taskSubmitter.vue +++ b/openflexure_microscope/api/static/src/components/genericComponents/taskSubmitter.vue @@ -200,13 +200,13 @@ export default { // If task ends with an error else if (result == "error") { // Pass the error string back with reject - console.log("Rejecting pollTask due to error") + console.log("Rejecting pollTask due to error"); reject(new Error(response.data.output)); } // If task ends with termination else if (result == "cancelled") { // Pass a generic termination error back with reject - console.log("Rejecting pollTask due to cancellation") + console.log("Rejecting pollTask due to cancellation"); reject(new Error("Task cancelled")); } else { // Since the task is still running, we can update the progress bar diff --git a/openflexure_microscope/api/static/src/components/loadingContent.vue b/openflexure_microscope/api/static/src/components/loadingContent.vue index 5bd92b3a..2d12c99f 100644 --- a/openflexure_microscope/api/static/src/components/loadingContent.vue +++ b/openflexure_microscope/api/static/src/components/loadingContent.vue @@ -17,7 +17,7 @@ + + diff --git a/openflexure_microscope/api/static/src/components/controlComponents/paneNavigate.vue b/openflexure_microscope/api/static/src/components/tabContentComponents/navigateComponents/paneNavigate.vue similarity index 99% rename from openflexure_microscope/api/static/src/components/controlComponents/paneNavigate.vue rename to openflexure_microscope/api/static/src/components/tabContentComponents/navigateComponents/paneNavigate.vue index 0810cfe1..d8c53fbc 100644 --- a/openflexure_microscope/api/static/src/components/controlComponents/paneNavigate.vue +++ b/openflexure_microscope/api/static/src/components/tabContentComponents/navigateComponents/paneNavigate.vue @@ -158,7 +158,7 @@ + + diff --git a/openflexure_microscope/api/static/src/components/controlComponents/paneSlideScan.vue b/openflexure_microscope/api/static/src/components/tabContentComponents/slideScanComponents/paneSlideScan.vue similarity index 99% rename from openflexure_microscope/api/static/src/components/controlComponents/paneSlideScan.vue rename to openflexure_microscope/api/static/src/components/tabContentComponents/slideScanComponents/paneSlideScan.vue index 78738a6d..7ce7a0b3 100644 --- a/openflexure_microscope/api/static/src/components/controlComponents/paneSlideScan.vue +++ b/openflexure_microscope/api/static/src/components/tabContentComponents/slideScanComponents/paneSlideScan.vue @@ -135,7 +135,7 @@ - - diff --git a/openflexure_microscope/api/static/src/components/viewComponents/galleryDisplay.vue b/openflexure_microscope/api/static/src/components/viewComponents/galleryDisplay.vue deleted file mode 100644 index c33407d8..00000000 --- a/openflexure_microscope/api/static/src/components/viewComponents/galleryDisplay.vue +++ /dev/null @@ -1,409 +0,0 @@ - - - - - diff --git a/openflexure_microscope/api/static/src/components/viewComponents/settingsDisplay.vue b/openflexure_microscope/api/static/src/components/viewComponents/settingsDisplay.vue deleted file mode 100644 index c78a9729..00000000 --- a/openflexure_microscope/api/static/src/components/viewComponents/settingsDisplay.vue +++ /dev/null @@ -1,224 +0,0 @@ - - - - - From 89b1f9dac9dda076a36aebce62d5d1306402338c Mon Sep 17 00:00:00 2001 From: Joel Collins Date: Tue, 27 Oct 2020 16:36:30 +0000 Subject: [PATCH 6/9] Fixed incorrect import --- .../src/components/tabContentComponents/extensionContent.vue | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openflexure_microscope/api/static/src/components/tabContentComponents/extensionContent.vue b/openflexure_microscope/api/static/src/components/tabContentComponents/extensionContent.vue index 10a8931f..28a72c07 100644 --- a/openflexure_microscope/api/static/src/components/tabContentComponents/extensionContent.vue +++ b/openflexure_microscope/api/static/src/components/tabContentComponents/extensionContent.vue @@ -39,8 +39,8 @@ import JsonForm from "../pluginComponents/JsonForm"; import WebComponentLoader from "../pluginComponents/WebComponentLoader"; import streamDisplay from "./streamContent.vue"; -import galleryDisplay from "../tabContentComponents/galleryContent.vue"; -import settingsDisplay from "../tabContentComponents/settingsContent.vue"; +import galleryContent from "../tabContentComponents/galleryContent.vue"; +import settingsContent from "../tabContentComponents/settingsContent.vue"; export default { name: "ExtensionContent", From e3a45b84d8bb8b343b63915298d71e7493e1bd67 Mon Sep 17 00:00:00 2001 From: Joel Collins Date: Tue, 27 Oct 2020 16:36:40 +0000 Subject: [PATCH 7/9] Fixed gallery overflow --- openflexure_microscope/api/static/src/components/appContent.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openflexure_microscope/api/static/src/components/appContent.vue b/openflexure_microscope/api/static/src/components/appContent.vue index 122adca7..3fa5e57f 100644 --- a/openflexure_microscope/api/static/src/components/appContent.vue +++ b/openflexure_microscope/api/static/src/components/appContent.vue @@ -349,7 +349,7 @@ export default { } #container-left { - overflow: hidden; + overflow: auto; background-color: rgba(180, 180, 180, 0.025); width: 100%; height: 100%; From e1cca30deb4cf6059b276377ef43e3178bbc7609 Mon Sep 17 00:00:00 2001 From: Joel Collins Date: Tue, 27 Oct 2020 16:37:11 +0000 Subject: [PATCH 8/9] Added pagination to gallery --- .../api/static/package-lock.json | 202 +++++++++--------- .../api/static/package.json | 1 + .../galleryComponents/captureCard.vue | 5 +- .../galleryComponents/scanCard.vue | 58 +++-- .../tabContentComponents/galleryContent.vue | 63 ++++-- 5 files changed, 177 insertions(+), 152 deletions(-) diff --git a/openflexure_microscope/api/static/package-lock.json b/openflexure_microscope/api/static/package-lock.json index 0d939672..459ca460 100644 --- a/openflexure_microscope/api/static/package-lock.json +++ b/openflexure_microscope/api/static/package-lock.json @@ -2828,16 +2828,6 @@ "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", "dev": true }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "optional": true, - "requires": { - "color-convert": "^2.0.1" - } - }, "browserslist": { "version": "4.14.3", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.14.3.tgz", @@ -2882,36 +2872,12 @@ "integrity": "sha512-ziNcheTGTHlu9g34EVoHQdIu5g4foc8EsxMGC7Xkokmvw0dqNtX8BS8RgCgFBaAiSp2IdjvBxNdh0ssib28eVQ==", "dev": true }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "optional": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "optional": true - }, "electron-to-chromium": { "version": "1.3.570", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.570.tgz", "integrity": "sha512-Y6OCoVQgFQBP5py6A/06+yWxUZHDlNr/gNDGatjH8AZqXl8X0tE4LfjLJsXGz/JmWJz8a6K7bR1k+QzZ+k//fg==", "dev": true }, - "emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "dev": true, - "optional": true - }, "fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -2945,35 +2911,6 @@ "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", "dev": true }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "optional": true - }, - "json5": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", - "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", - "dev": true, - "optional": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "loader-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", - "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", - "dev": true, - "optional": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - } - }, "locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -3116,16 +3053,6 @@ "ansi-regex": "^5.0.0" } }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "optional": true, - "requires": { - "has-flag": "^4.0.0" - } - }, "terser-webpack-plugin": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-2.3.8.tgz", @@ -3152,31 +3079,6 @@ "psl": "^1.1.28", "punycode": "^2.1.1" } - }, - "vue-loader-v16": { - "version": "npm:vue-loader@16.0.0-beta.8", - "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-16.0.0-beta.8.tgz", - "integrity": "sha512-oouKUQWWHbSihqSD7mhymGPX1OQ4hedzAHyvm8RdyHh6m3oIvoRF+NM45i/bhNOlo8jCnuJhaSUf/6oDjv978g==", - "dev": true, - "optional": true, - "requires": { - "chalk": "^4.1.0", - "hash-sum": "^2.0.0", - "loader-utils": "^2.0.0" - }, - "dependencies": { - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "optional": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } - } } } }, @@ -13389,6 +13291,104 @@ } } }, + "vue-loader-v16": { + "version": "npm:vue-loader@16.0.0-beta.9", + "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-16.0.0-beta.9.tgz", + "integrity": "sha512-mu9pg6554GbXDSO8LlxkQM6qUJzUkb/A0FJc9LgRqnU9MCnhzEXwCt1Zx5NObvFpzs2mH2dH/uUCDwL8Qaz9sA==", + "dev": true, + "optional": true, + "requires": { + "chalk": "^4.1.0", + "hash-sum": "^2.0.0", + "loader-utils": "^2.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "optional": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "optional": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "optional": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "optional": true + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true, + "optional": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "optional": true + }, + "json5": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", + "dev": true, + "optional": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "dev": true, + "optional": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "optional": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, "vue-observe-visibility": { "version": "0.4.6", "resolved": "https://registry.npmjs.org/vue-observe-visibility/-/vue-observe-visibility-0.4.6.tgz", @@ -13446,6 +13446,12 @@ "vue": "^2.6.10" } }, + "vuejs-paginate": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/vuejs-paginate/-/vuejs-paginate-2.1.0.tgz", + "integrity": "sha512-gnwyXlmCiDOu9MLWxN5UJ4PGijKGNOMpHG8ujsrynCzTJljn/rp7Jq0WiDGDAMi5/u0AHuYIHhced+tUW4jblA==", + "dev": true + }, "vuex": { "version": "3.5.1", "resolved": "https://registry.npmjs.org/vuex/-/vuex-3.5.1.tgz", diff --git a/openflexure_microscope/api/static/package.json b/openflexure_microscope/api/static/package.json index 09c2e756..0ab3d092 100644 --- a/openflexure_microscope/api/static/package.json +++ b/openflexure_microscope/api/static/package.json @@ -36,6 +36,7 @@ "vue-plugin-load-script": "^1.3.2", "vue-template-compiler": "^2.6.12", "vue-tour": "^1.5.0", + "vuejs-paginate": "^2.1.0", "vuex": "^3.5.1" }, "postcss": { diff --git a/openflexure_microscope/api/static/src/components/tabContentComponents/galleryComponents/captureCard.vue b/openflexure_microscope/api/static/src/components/tabContentComponents/galleryComponents/captureCard.vue index be3ccfdb..42730f07 100644 --- a/openflexure_microscope/api/static/src/components/tabContentComponents/galleryComponents/captureCard.vue +++ b/openflexure_microscope/api/static/src/components/tabContentComponents/galleryComponents/captureCard.vue @@ -212,8 +212,9 @@ export default { }, created: function() { - this.getTagRequest(); - this.getAnnotationsRequest(); + // Get initial metadata from prop + this.tags = this.captureState.metadata.image.tags; + this.annotations = this.captureState.metadata.annotations; }, methods: { diff --git a/openflexure_microscope/api/static/src/components/tabContentComponents/galleryComponents/scanCard.vue b/openflexure_microscope/api/static/src/components/tabContentComponents/galleryComponents/scanCard.vue index 7432709f..163f2861 100644 --- a/openflexure_microscope/api/static/src/components/tabContentComponents/galleryComponents/scanCard.vue +++ b/openflexure_microscope/api/static/src/components/tabContentComponents/galleryComponents/scanCard.vue @@ -6,12 +6,12 @@ @@ -22,7 +22,8 @@ uk-grid >
- {{ metadata.type || "Dataset" }}: {{ metadata.image.name }} + {{ scanState.metadata.type || "Dataset" }}: + {{ scanState.metadata.image.name }}
@@ -34,7 +35,7 @@
- +
@@ -56,13 +57,16 @@
-

{{ metadata.image.name }}

-

Time: {{ metadata.image.acquisitionDate }}

-

ID: {{ metadata.image.id }}

+

{{ scanState.metadata.image.name }}

+

Time: {{ scanState.metadata.image.acquisitionDate }}

+

ID: {{ scanState.metadata.image.id }}


-
+

{{ key }}: {{ value }}

@@ -80,17 +84,9 @@ export default { name: "ScanCard", props: { - metadata: { + scanState: { type: Object, required: true - }, - thumbnail: { - type: String, - required: true - }, - captures: { - type: Array, - required: true } }, @@ -109,7 +105,7 @@ export default { }, allURLs: function() { var urls = []; - for (var capture of this.captures) { + for (var capture of this.scanState.captures) { urls.push(capture.links.self.href); } return urls; @@ -117,8 +113,12 @@ export default { }, methods: { + onClick: function() { + this.$emit("selectFolder", this.scanState.metadata.image.id); + }, + makeModalName: function(prefix) { - return prefix + this.metadata.image.id; + return prefix + this.scanState.metadata.image.id; }, delAllConfirm: function() { @@ -131,18 +131,10 @@ export default { }, deleteAll: function() { - axios - .all(this.allURLs.map(l => axios.delete(l))) - .then - //axios.spread(function(...res) { - // all requests are now complete - //console.log(res); - //}) - () - .then(() => { - // Emit signal to update capture list - this.$root.$emit("globalUpdateCaptures"); - }); + axios.all(this.allURLs.map(l => axios.delete(l))).then(() => { + // Emit signal to update capture list + this.$root.$emit("globalUpdateCaptures"); + }); } } }; diff --git a/openflexure_microscope/api/static/src/components/tabContentComponents/galleryContent.vue b/openflexure_microscope/api/static/src/components/tabContentComponents/galleryContent.vue index 9c128f55..5e4269cb 100644 --- a/openflexure_microscope/api/static/src/components/tabContentComponents/galleryContent.vue +++ b/openflexure_microscope/api/static/src/components/tabContentComponents/galleryContent.vue @@ -85,11 +85,7 @@ v-if="galleryFolder" class="gallery-folder-heading uk-flex uk-flex-middle" > -
+ arrow_back
@@ -102,25 +98,38 @@