diff --git a/src/octoprint/server.py b/src/octoprint/server.py index 0bf86796..beb21f78 100644 --- a/src/octoprint/server.py +++ b/src/octoprint/server.py @@ -665,7 +665,7 @@ def getSettings(): "feature": { "gcodeViewer": s.getBoolean(["feature", "gCodeVisualizer"]), "temperatureGraph": s.getBoolean(["feature", "temperatureGraph"]), - "invertZ": s.getBoolean(["feature", "invertZ"]), + "invertAxes": s.get(["feature", "invertAxes"]), "waitForStart": s.getBoolean(["feature", "waitForStartOnConnect"]), "alwaysSendChecksum": s.getBoolean(["feature", "alwaysSendChecksum"]), "sdSupport": s.getBoolean(["feature", "sdSupport"]), @@ -737,7 +737,7 @@ def setSettings(): if "feature" in data.keys(): if "gcodeViewer" in data["feature"].keys(): s.setBoolean(["feature", "gCodeVisualizer"], data["feature"]["gcodeViewer"]) if "temperatureGraph" in data["feature"].keys(): s.setBoolean(["feature", "temperatureGraph"], data["feature"]["temperatureGraph"]) - if "invertZ" in data["feature"].keys(): s.setBoolean(["feature", "invertZ"], data["feature"]["invertZ"]) + if "invertAxes" in data["feature"].keys(): s.set(["feature", "invertAxes"], data["feature"]["invertAxes"]) if "waitForStart" in data["feature"].keys(): s.setBoolean(["feature", "waitForStartOnConnect"], data["feature"]["waitForStart"]) if "alwaysSendChecksum" in data["feature"].keys(): s.setBoolean(["feature", "alwaysSendChecksum"], data["feature"]["alwaysSendChecksum"]) if "sdSupport" in data["feature"].keys(): s.setBoolean(["feature", "sdSupport"], data["feature"]["sdSupport"]) diff --git a/src/octoprint/settings.py b/src/octoprint/settings.py index 9853800b..1b7486e7 100644 --- a/src/octoprint/settings.py +++ b/src/octoprint/settings.py @@ -56,7 +56,7 @@ default_settings = { "feature": { "gCodeVisualizer": True, "temperatureGraph": True, - "invertZ": False, + "invertAxes": "", "waitForStartOnConnect": False, "alwaysSendChecksum": False, "sdSupport": True, diff --git a/src/octoprint/static/js/app/viewmodels/control.js b/src/octoprint/static/js/app/viewmodels/control.js index 97d66600..1298a329 100644 --- a/src/octoprint/static/js/app/viewmodels/control.js +++ b/src/octoprint/static/js/app/viewmodels/control.js @@ -81,7 +81,7 @@ function ControlViewModel(loginStateViewModel, settingsViewModel) { if (typeof distance === "undefined") distance = $('#jog_distance button.active').data('distance'); - if (axis == "z" && self.settings.feature_invertZ()) { + if (self.settings.getFeature_InvertAxis(axis)) { multiplier *= -1; } diff --git a/src/octoprint/static/js/app/viewmodels/settings.js b/src/octoprint/static/js/app/viewmodels/settings.js index 4bbcee8f..5d8bccf8 100644 --- a/src/octoprint/static/js/app/viewmodels/settings.js +++ b/src/octoprint/static/js/app/viewmodels/settings.js @@ -28,7 +28,7 @@ function SettingsViewModel(loginStateViewModel, usersViewModel) { self.feature_gcodeViewer = ko.observable(undefined); self.feature_temperatureGraph = ko.observable(undefined); - self.feature_invertZ = ko.observable(undefined); + self.feature_invertAxes = ko.observable(undefined); self.feature_waitForStart = ko.observable(undefined); self.feature_alwaysSendChecksum = ko.observable(undefined); self.feature_sdSupport = ko.observable(undefined); @@ -75,6 +75,29 @@ function SettingsViewModel(loginStateViewModel, usersViewModel) { self.terminalFilters.remove(filter); }; + self.getFeature_InvertAxis = function(axis) { + return (self.feature_invertAxes() || "").indexOf(axis) != -1; + }; + + self.setFeature_InvertAxis = function(axis, value) { + var currInvert = self.feature_invertAxes() || ""; + var currValue = self.getFeature_InvertAxis(axis); + if (value && !currValue) + self.feature_invertAxes(currInvert + axis); + else if (!value && currValue) + self.feature_invertAxes(currInvert.replace(axis, "")); + }; + + self.koInvertAxis = function (axis) { return ko.computed({ + read: function () { return self.getFeature_InvertAxis(axis); }, + write: function (value) { self.setFeature_InvertAxis(axis, value); }, + owner: self + })}; + + self.feature_invertX = self.koInvertAxis('x'); + self.feature_invertY = self.koInvertAxis('y'); + self.feature_invertZ = self.koInvertAxis('z'); + self.requestData = function() { $.ajax({ url: AJAX_BASEURL + "settings", @@ -106,7 +129,7 @@ function SettingsViewModel(loginStateViewModel, usersViewModel) { self.feature_gcodeViewer(response.feature.gcodeViewer); self.feature_temperatureGraph(response.feature.temperatureGraph); - self.feature_invertZ(response.feature.invertZ); + self.feature_invertAxes(response.feature.invertAxes); self.feature_waitForStart(response.feature.waitForStart); self.feature_alwaysSendChecksum(response.feature.alwaysSendChecksum); self.feature_sdSupport(response.feature.sdSupport); @@ -166,7 +189,7 @@ function SettingsViewModel(loginStateViewModel, usersViewModel) { "feature": { "gcodeViewer": self.feature_gcodeViewer(), "temperatureGraph": self.feature_temperatureGraph(), - "invertZ": self.feature_invertZ(), + "invertAxes": self.feature_invertAxes(), "waitForStart": self.feature_waitForStart(), "alwaysSendChecksum": self.feature_alwaysSendChecksum(), "sdSupport": self.feature_sdSupport(), diff --git a/src/octoprint/templates/settings.jinja2 b/src/octoprint/templates/settings.jinja2 index d9316fc2..25affec6 100644 --- a/src/octoprint/templates/settings.jinja2 +++ b/src/octoprint/templates/settings.jinja2 @@ -185,8 +185,15 @@
+ Invert controls + +