diff --git a/octoprint/server.py b/octoprint/server.py index 4ede4ed..3a619a8 100644 --- a/octoprint/server.py +++ b/octoprint/server.py @@ -432,7 +432,9 @@ def getSettings(): "snapshotUrl": s.get(["webcam", "snapshot"]), "ffmpegPath": s.get(["webcam", "ffmpeg"]), "bitrate": s.get(["webcam", "bitrate"]), - "watermark": s.getBoolean(["webcam", "watermark"]) + "watermark": s.getBoolean(["webcam", "watermark"]), + "flipX": s.getBoolean(["webcam", "flipX"]), + "flipY": s.getBoolean(["webcam", "flipY"]) }, "feature": { "gcodeViewer": s.getBoolean(["feature", "gCodeVisualizer"]), @@ -479,6 +481,8 @@ def setSettings(): if "ffmpegPath" in data["webcam"].keys(): s.set(["webcam", "ffmpeg"], data["webcam"]["ffmpegPath"]) if "bitrate" in data["webcam"].keys(): s.set(["webcam", "bitrate"], data["webcam"]["bitrate"]) if "watermark" in data["webcam"].keys(): s.setBoolean(["webcam", "watermark"], data["webcam"]["watermark"]) + if "flipX" in data["webcam"].keys(): s.setBoolean(["webcam", "flipX"], data["webcam"]["flipX"]) + if "flipY" in data["webcam"].keys(): s.setBoolean(["webcam", "flipY"], data["webcam"]["flipY"]) if "feature" in data.keys(): if "gcodeViewer" in data["feature"].keys(): s.setBoolean(["feature", "gCodeVisualizer"], data["feature"]["gcodeViewer"]) diff --git a/octoprint/settings.py b/octoprint/settings.py index 71251b4..aa7f33f 100644 --- a/octoprint/settings.py +++ b/octoprint/settings.py @@ -36,6 +36,8 @@ default_settings = { "ffmpeg": None, "bitrate": "5000k", "watermark": True + "flipX": False, + "flipY": False }, "feature": { "gCodeVisualizer": True, diff --git a/octoprint/static/js/ui.js b/octoprint/static/js/ui.js index 8ade8a1..c924305 100644 --- a/octoprint/static/js/ui.js +++ b/octoprint/static/js/ui.js @@ -1328,6 +1328,8 @@ function SettingsViewModel(loginStateViewModel, usersViewModel) { self.webcam_ffmpegPath = ko.observable(undefined); self.webcam_bitrate = ko.observable(undefined); self.webcam_watermark = ko.observable(undefined); + self.webcam_flipX = ko.observable(undefined); + self.webcam_flipY = ko.observable(undefined); self.feature_gcodeViewer = ko.observable(undefined); self.feature_waitForStart = ko.observable(undefined); @@ -1375,6 +1377,8 @@ function SettingsViewModel(loginStateViewModel, usersViewModel) { self.webcam_ffmpegPath(response.webcam.ffmpegPath); self.webcam_bitrate(response.webcam.bitrate); self.webcam_watermark(response.webcam.watermark); + self.webcam_flipX(response.webcam.flipX); + self.webcam_flipY(response.webcam.flipY); self.feature_gcodeViewer(response.feature.gcodeViewer); self.feature_waitForStart(response.feature.waitForStart); @@ -1409,7 +1413,9 @@ function SettingsViewModel(loginStateViewModel, usersViewModel) { "snapshotUrl": self.webcam_snapshotUrl(), "ffmpegPath": self.webcam_ffmpegPath(), "bitrate": self.webcam_bitrate(), - "watermark": self.webcam_watermark() + "watermark": self.webcam_watermark(), + "flipX": self.webcam_flipX(), + "flipY": self.webcam_flipY() }, "feature": { "gcodeViewer": self.feature_gcodeViewer(), diff --git a/octoprint/templates/settings.jinja2 b/octoprint/templates/settings.jinja2 index c6a3652..4e55cd2 100644 --- a/octoprint/templates/settings.jinja2 +++ b/octoprint/templates/settings.jinja2 @@ -89,6 +89,18 @@ +
+
+ +
+
+ +
+