From 19b57235fec16741835339878ce3f4193bfb32f4 Mon Sep 17 00:00:00 2001 From: Declan Freeman-Gleason Date: Fri, 31 Jul 2020 13:50:50 -0700 Subject: [PATCH] UI bug fixes and feature refinements (#59) * Rework settings page; touch up contour, output, and 3D tabs; font sizing No stream placeholder; driver mode refined; cameras page Make settings snackbar work Lint fix Fix settings page padding Actually hide settings fields if unsupported * Make toggle buttons less confusing; fix driver toggle; form validation * Make eyedropper work and make input/select styling more consistent * Fix color picker and tabbing bugs * Set up camera and settings pages to talk to the backend * Add auto reconnect * Add lots of tooltips and improve related thematic consistency * Only show output stream while color picking * Unbreak robot offset * Increase tooltip delay and refactor tooltip label into a component * Remove toggle button switching behavior * Fix PnP tab and add a flag to disable FOV configuration * Move FPS indicator * Make GPU acceleration status use one value in the store * Only allow IPv4 static IPs and remove accidentally committed index --- photon-client/package-lock.json | 5 +- photon-client/package.json | 2 +- photon-client/src/App.vue | 102 +++++- photon-client/src/assets/eyedropper.svg | 68 ++++ photon-client/src/assets/noStream.jpg | Bin 0 -> 49594 bytes .../src/components/common/cv-image.vue | 31 +- .../src/components/common/cv-input.vue | 24 +- .../src/components/common/cv-number-input.vue | 19 +- .../src/components/common/cv-range-slider.vue | 25 +- .../src/components/common/cv-select.vue | 16 +- .../src/components/common/cv-slider.vue | 13 +- .../src/components/common/cv-switch.vue | 41 ++- .../components/common/cv-tooltipped-label.vue | 26 ++ .../src/components/pipeline/3D/MiniMap.vue | 9 +- .../pipeline/CameraAndPipelineSelect.vue | 20 +- .../pipeline/OutputTab/DualCalibration.vue | 21 +- .../pipeline/OutputTab/SingleCalibration.vue | 12 +- photon-client/src/main.js | 9 +- photon-client/src/plugins/ColorPicker.js | 12 +- photon-client/src/router.js | 5 + photon-client/src/store/index.js | 42 ++- .../Cameras.vue => CamerasView.vue} | 313 ++++++++++-------- photon-client/src/views/PipelineView.vue | 113 +++++-- .../src/views/PipelineViews/ContoursTab.vue | 24 +- .../src/views/PipelineViews/InputTab.vue | 6 + .../src/views/PipelineViews/OutputTab.vue | 32 +- .../src/views/PipelineViews/PnPTab.vue | 8 +- .../src/views/PipelineViews/TargetsTab.vue | 19 +- .../src/views/PipelineViews/ThresholdTab.vue | 118 ++++--- photon-client/src/views/SettingsView.vue | 124 ++++--- .../src/views/SettingsViews/General.vue | 260 ++++++--------- .../src/views/SettingsViews/Lighting.vue | 37 +++ .../src/views/SettingsViews/Networking.vue | 107 ++++++ .../src/main/resources/web/index.html | 2 +- 34 files changed, 1099 insertions(+), 566 deletions(-) create mode 100644 photon-client/src/assets/eyedropper.svg create mode 100644 photon-client/src/assets/noStream.jpg create mode 100644 photon-client/src/components/common/cv-tooltipped-label.vue rename photon-client/src/views/{SettingsViews/Cameras.vue => CamerasView.vue} (58%) create mode 100644 photon-client/src/views/SettingsViews/Lighting.vue create mode 100644 photon-client/src/views/SettingsViews/Networking.vue diff --git a/photon-client/package-lock.json b/photon-client/package-lock.json index f5f9bbaa8..7d9e8eaca 100644 --- a/photon-client/package-lock.json +++ b/photon-client/package-lock.json @@ -12282,9 +12282,8 @@ } }, "vue-native-websocket": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/vue-native-websocket/-/vue-native-websocket-2.0.14.tgz", - "integrity": "sha512-oK8+xG1gmqRs4JngHGwEc4zWoRjsdMB20Sz8pemkh4lW2Vr2676/cDRtd30aGnO2xF7Oxf003wS5JO0kypUsCw==", + "version": "git+https://github.com/PhotonVision/vue-native-websocket.git#7a327918e03b215b6899b0d648c5130ece1fa912", + "from": "git+https://github.com/PhotonVision/vue-native-websocket.git#7a32791", "dependencies": { "abbrev": { "version": "1.0.9", diff --git a/photon-client/package.json b/photon-client/package.json index 3acef2efc..eb03563c0 100644 --- a/photon-client/package.json +++ b/photon-client/package.json @@ -17,7 +17,7 @@ "msgpack5": "^4.2.1", "vue": "^2.6.11", "vue-axios": "^2.1.5", - "vue-native-websocket": "^2.0.14", + "vue-native-websocket": "git+https://github.com/PhotonVision/vue-native-websocket.git#7a32791", "vue-router": "^3.3.2", "vuetify": "^2.2.34", "vuex": "^3.4.0" diff --git a/photon-client/src/App.vue b/photon-client/src/App.vue index 71b073edf..a0411a0a0 100644 --- a/photon-client/src/App.vue +++ b/photon-client/src/App.vue @@ -25,11 +25,10 @@ - - mdi-view-dashboard @@ -38,11 +37,22 @@ Dashboard + + + mdi-camera + + + Cameras + + - mdi-settings @@ -79,6 +89,24 @@ Advanced Mode + + + + + mdi-wifi + + + mdi-wifi-off + + + + {{ $store.state.backendConnected ? "Connected" : "Trying to connect..." }} + + @@ -123,6 +151,8 @@ logView }, data: () => ({ + // Used so that we can switch back to the previously selected pipeline after camera calibration + previouslySelectedIndex: null, timer: undefined, isLogger: false, log: "", @@ -138,11 +168,16 @@ }, compact: { get() { - return this.$store.state.compactMode === undefined ? this.$vuetify.breakpoint.smAndDown : this.$store.state.compactMode || this.$vuetify.breakpoint.smAndDown; + if (this.$store.state.compactMode === undefined) { + return this.$vuetify.breakpoint.smAndDown; + } else { + return this.$store.state.compactMode || this.$vuetify.breakpoint.smAndDown; + } }, set(value) { // compactMode is the user's preference for compact mode; it overrides screen size this.$store.commit("compactMode", value); + localStorage.setItem("compactMode", value); }, } }, @@ -165,6 +200,7 @@ } }); + this.$options.sockets.onmessage = (data) => { try { let message = this.$msgPack.decode(data.data); @@ -176,13 +212,24 @@ } catch (error) { console.error('error: ' + data.data + " , " + error); } + }; + this.$options.sockets.onopen = () => { + this.$store.state.backendConnected = true; + }; + + let closed = () => { + this.$store.state.backendConnected = false; } + this.$options.sockets.onclose = closed; + this.$options.sockets.onerror = closed; + + this.$connect(); }, methods: { handleMessage(key, value) { if (key === "logMessage") { - console.log(value) - this.logMessage(value, 0) + console.log("[FROM BACKEND]" + value); + this.logMessage(value, 0); } else if (key === "updatePipelineResult") { this.$store.commit('mutatePipelineResults', value) } else if (this.$store.state.hasOwnProperty(key)) { @@ -192,7 +239,7 @@ } else { switch (key) { default: { - console.log(value); + console.error("Unknown message from backend: " + value); } } } @@ -215,6 +262,16 @@ const colors = ["\u001b[31m", "\u001b[32m", "\u001b[33m", "\u001b[34m"] const reset = "\u001b[0m" this.log += `${colors[level]}${message}${reset}\n` + }, + switchToDriverMode() { + this.previouslySelectedIndex = this.$store.getters.currentPipelineIndex; + this.handleInputWithIndex('currentPipeline', -1) + }, + rollbackPipelineIndex() { + if (this.previouslySelectedIndex !== null) { + this.handleInputWithIndex('currentPipeline', this.previouslySelectedIndex) + } + this.previouslySelectedIndex = null; } } }; @@ -225,6 +282,21 @@ + + \ No newline at end of file diff --git a/photon-client/src/assets/eyedropper.svg b/photon-client/src/assets/eyedropper.svg new file mode 100644 index 000000000..1736213b9 --- /dev/null +++ b/photon-client/src/assets/eyedropper.svg @@ -0,0 +1,68 @@ + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/photon-client/src/assets/noStream.jpg b/photon-client/src/assets/noStream.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b3b4f09b2a4aceb3d4ae511f13436a31e54c1973 GIT binary patch literal 49594 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 literal 0 HcmV?d00001 diff --git a/photon-client/src/components/common/cv-image.vue b/photon-client/src/components/common/cv-image.vue index 199665297..a044a3563 100644 --- a/photon-client/src/components/common/cv-image.vue +++ b/photon-client/src/components/common/cv-image.vue @@ -1,8 +1,9 @@ s - \ No newline at end of file diff --git a/photon-client/src/components/common/cv-number-input.vue b/photon-client/src/components/common/cv-number-input.vue index f0bbc39d2..efbbfe43d 100644 --- a/photon-client/src/components/common/cv-number-input.vue +++ b/photon-client/src/components/common/cv-number-input.vue @@ -4,8 +4,11 @@ dense align="center" > - - {{ name }} + + @@ -24,13 +29,15 @@ \ No newline at end of file diff --git a/photon-client/src/views/SettingsViews/General.vue b/photon-client/src/views/SettingsViews/General.vue index cb128429b..3aa0f2006 100644 --- a/photon-client/src/views/SettingsViews/General.vue +++ b/photon-client/src/views/SettingsViews/General.vue @@ -1,86 +1,55 @@ - \ No newline at end of file diff --git a/photon-client/src/views/SettingsViews/Lighting.vue b/photon-client/src/views/SettingsViews/Lighting.vue new file mode 100644 index 000000000..960e3d16a --- /dev/null +++ b/photon-client/src/views/SettingsViews/Lighting.vue @@ -0,0 +1,37 @@ + + + + + \ No newline at end of file diff --git a/photon-client/src/views/SettingsViews/Networking.vue b/photon-client/src/views/SettingsViews/Networking.vue new file mode 100644 index 000000000..3de8e1e07 --- /dev/null +++ b/photon-client/src/views/SettingsViews/Networking.vue @@ -0,0 +1,107 @@ + + + + + diff --git a/photon-server/src/main/resources/web/index.html b/photon-server/src/main/resources/web/index.html index f008dfd12..988f55e6a 100644 --- a/photon-server/src/main/resources/web/index.html +++ b/photon-server/src/main/resources/web/index.html @@ -1 +1 @@ -

UI has not been copied!

\ No newline at end of file +

UI has not been copied!