More work on the printer profiles, connection dialog and Settings dialog are now working. GCODE viewer makes trouble

This commit is contained in:
Gina Häußge 2014-12-01 16:26:55 +01:00
parent 93a852e6ea
commit 0203e6da31
9 changed files with 144 additions and 152 deletions

File diff suppressed because one or more lines are too long

View file

@ -236,7 +236,11 @@ function DataUpdater(allViewModels) {
gcodeUploadProgress.removeClass("progress-striped").removeClass("active");
gcodeUploadProgressBar.css("width", "0%");
gcodeUploadProgressBar.text("");
new PNotify({title: gettext("Streaming done"), text: _.sprintf(gettext("Streamed %(local)s to %(remote)s on SD, took %(time).2f seconds"), payload), type: "success"});
new PNotify({
title: gettext("Streaming done"),
text: _.sprintf(gettext("Streamed %(local)s to %(remote)s on SD, took %(time).2f seconds"), payload),
type: "success"
});
gcodeFilesViewModel.requestData(payload.remote, "sdcard");
}
break;

View file

@ -69,11 +69,11 @@ $(function() {
var loginStateViewModel = new LoginStateViewModel();
var printerProfilesViewModel = new PrinterProfilesViewModel();
var usersViewModel = new UsersViewModel(loginStateViewModel);
var settingsViewModel = new SettingsViewModel(loginStateViewModel, usersViewModel, printerProfilesViewModel);
var connectionViewModel = new ConnectionViewModel(loginStateViewModel, settingsViewModel, printerProfilesViewModel);
var timelapseViewModel = new TimelapseViewModel(loginStateViewModel);
var printerStateViewModel = new PrinterStateViewModel(loginStateViewModel, timelapseViewModel);
var appearanceViewModel = new AppearanceViewModel(settingsViewModel);
var settingsViewModel = new SettingsViewModel(loginStateViewModel, usersViewModel, printerProfilesViewModel);
var connectionViewModel = new ConnectionViewModel(loginStateViewModel, settingsViewModel, printerProfilesViewModel);
var appearanceViewModel = new AppearanceViewModel(settingsViewModel, printerStateViewModel);
var temperatureViewModel = new TemperatureViewModel(loginStateViewModel, settingsViewModel);
var controlViewModel = new ControlViewModel(loginStateViewModel, settingsViewModel);
var terminalViewModel = new TerminalViewModel(loginStateViewModel, settingsViewModel);

View file

@ -1,24 +1,31 @@
function AppearanceViewModel(settingsViewModel) {
function AppearanceViewModel(settingsViewModel, printerStateViewModel) {
var self = this;
self.settings = settingsViewModel;
self.printerState = printerStateViewModel;
self.connected = ko.observable(false);
self.printerState.isErrorOrClosed.subscribe(function() {
self.connected(!self.printerState.isErrorOrClosed());
});
self.brand = ko.computed(function() {
if (self.settings.printerProfiles.currentProfileData().name())
if (self.settings.printerProfiles.currentProfileData().name() && self.connected())
return gettext("OctoPrint") + ": " + self.settings.printerProfiles.currentProfileData().name();
else
return gettext("OctoPrint");
});
self.title = ko.computed(function() {
if (self.settings.printerProfiles.currentProfileData().name())
if (self.settings.printerProfiles.currentProfileData().name() && self.connected())
return self.settings.printerProfiles.currentProfileData().name() + " [" + gettext("OctoPrint") + "]";
else
return gettext("OctoPrint");
});
self.color = ko.computed(function() {
if (self.settings.printerProfiles.currentProfileData().color())
if (self.settings.printerProfiles.currentProfileData().color() && self.connected())
return self.settings.printerProfiles.currentProfileData().color();
else
return "default";

View file

@ -1,8 +1,23 @@
function ConnectionViewModel(loginStateViewModel, settingsViewModel) {
function ConnectionViewModel(loginStateViewModel, settingsViewModel, printerProfilesViewModel) {
var self = this;
self.loginState = loginStateViewModel;
self.settings = settingsViewModel;
self.printerProfiles = printerProfilesViewModel;
self.printerProfiles.profiles.items.subscribe(function() {
var allProfiles = self.printerProfiles.profiles.items();
var printerOptions = [];
_.each(allProfiles, function(profile) {
printerOptions.push({id: profile.id, name: profile.name});
});
self.printerOptions(printerOptions);
});
self.printerProfiles.currentProfile.subscribe(function() {
self.selectedPrinter(self.printerProfiles.currentProfile());
});
self.portOptions = ko.observableArray(undefined);
self.baudrateOptions = ko.observableArray(undefined);
@ -44,14 +59,12 @@ function ConnectionViewModel(loginStateViewModel, settingsViewModel) {
self.fromResponse = function(response) {
var ports = response.options.ports;
var baudrates = response.options.baudrates;
var printerProfiles = response.options.printerProfiles;
var portPreference = response.options.portPreference;
var baudratePreference = response.options.baudratePreference;
var printerPreference = response.options.printerProfilePreference;
self.portOptions(ports);
self.baudrateOptions(baudrates);
self.printerOptions(printerProfiles);
if (!self.selectedPort() && ports && ports.indexOf(portPreference) >= 0)
self.selectedPort(portPreference);

View file

@ -101,54 +101,98 @@ function GcodeViewModel(loginStateViewModel, settingsViewModel) {
var currentProfileData = self.settings.printerProfiles.currentProfileData();
if (!currentProfileData) return;
if (currentProfileData.extruder() && currentProfileData.extruder().extruderOffsets()) {
var toolOffsets = self._retrieveToolOffsets(currentProfileData);
if (toolOffsets) {
GCODE.ui.updateOptions({
reader: {
toolOffsets: self.settings.printer_extruderOffsets()
toolOffsets: toolOffsets
}
});
};
if (currentProfileData.volume() && currentProfileData.volume().width() && currentProfileData.volume().depth()) {
}
var bedDimensions = self._retrieveBedDimensions(currentProfileData);
if (toolOffsets) {
GCODE.ui.updateOptions({
renderer: {
bed: bedDimensions
}
});
};
if (currentProfileData.axes()) {
var invertX = false, invertY = false;
if (currentProfileData.axes().x()) {
invertX = currentProfileData.axes().x().inverted();
}
if (currentProfileData.axes().y()) {
invertY = currentProfileData.axes().y().inverted();
}
}
var axesConfiguration = self._retrieveAxesConfiguration(currentProfileData);
if (axesConfiguration) {
GCODE.ui.updateOptions({
renderer: {
invertAxes: {
x: invertX,
y: invertY
}
invertAxes: axesConfiguration
}
});
}
});
self.settings.printer_invertAxes.subscribe(function() {
if (!self.enabled) return;
if (!self.settings.printer_invertAxes()) return;
GCODE.ui.updateOptions({
renderer: {
invertAxes: {
x: self.settings.printer_invertX(),
y: self.settings.printer_invertY()
}
self._retrieveBedDimensions = function(currentProfileData) {
if (currentProfileData == undefined) {
currentProfileData = self.settings.printerProfiles.currentProfileData();
}
if (currentProfileData && currentProfileData.volume && currentProfileData.volume.formFactor() && currentProfileData.volume.width() && currentProfileData.volume.depth()) {
var x = undefined, y = undefined, r = undefined, circular = false;
var formFactor = currentProfileData.volume.formFactor();
if (formFactor == "circular") {
r = currentProfileData.volume.width() / 2;
circular = true;
} else {
x = currentProfileData.volume.width();
y = currentProfileData.volume.depth();
}
});
});
return {
x: x,
y: y,
r: r,
circular: circular
};
} else {
return undefined;
}
};
self._retrieveToolOffsets = function(currentProfileData) {
if (currentProfileData == undefined) {
currentProfileData = self.settings.printerProfiles.currentProfileData();
}
if (currentProfileData && currentProfileData.extruder && currentProfileData.extruder.offsets()) {
return currentProfileData.extruder.offsets();
} else {
return undefined;
}
};
self._retrieveAxesConfiguration = function(currentProfileData) {
if (currentProfileData == undefined) {
currentProfileData = self.settings.printerProfiles.currentProfileData();
}
if (currentProfileData && currentProfileData.axes) {
var invertX = false, invertY = false;
if (currentProfileData.axes.x) {
invertX = currentProfileData.axes.x.inverted();
}
if (currentProfileData.axes.y) {
invertY = currentProfileData.axes.y.inverted();
}
return {
x: invertX,
y: invertY
}
} else {
return undefined;
}
};
self.loadedFilename = undefined;
self.loadedFileDate = undefined;
@ -175,8 +219,9 @@ function GcodeViewModel(loginStateViewModel, settingsViewModel) {
onProgress: self._onProgress,
onModelLoaded: self._onModelLoaded,
onLayerSelected: self._onLayerSelected,
bed: self.settings.printer_bedDimensions(),
toolOffsets: self.settings.printer_extruderOffsets()
bed: self._retrieveBedDimensions(),
toolOffsets: self._retrieveToolOffsets(),
invertAxes: self._retrieveAxesConfiguration()
});
self.synchronizeOptions();
self.enabled = true;

View file

@ -201,6 +201,8 @@ function PrinterProfilesViewModel() {
add = true;
}
self.editorNew(add);
self.editorIdentifier(data.id);
self.editorName(data.name);
self.editorColor(data.color);

View file

@ -305,6 +305,32 @@ table {
}
}
// Printer profiles
&.settings_printerProfiles_profiles_name {
text-overflow: ellipsis;
text-align: left;
}
&.settings_printerProfiles_profiles_model {
text-align: left;
width: 250px;
}
&.settings_printerProfiles_profiles_action {
text-align: center;
width: 80px;
a {
text-decoration: none;
color: #000;
&.disabled {
color: #ccc;
cursor: default;
}
}
}
}
}

View file

@ -8,7 +8,6 @@
<ul class="nav nav-list span4" id="settingsTabs">
<li class="nav-header">{{ _('Printer') }}</li>
<li class="active"><a href="#settings_serialConnection" data-toggle="tab">{{ _('Serial Connection') }}</a></li>
<li><a href="#settings_printerParameters" data-toggle="tab">{{ _('Printer Parameters') }}</a></li>
<li><a href="#settings_printerProfiles" data-toggle="tab">{{ _('Printer Profiles') }}</a></li>
<li><a href="#settings_temperature" data-toggle="tab">{{ _('Temperatures') }}</a></li>
<li><a href="#settings_terminalFilters" data-toggle="tab">{{ _('Terminal filters') }}</a></li>
@ -108,9 +107,7 @@
</form>
</div>
<div class="tab-pane" id="settings_printerProfiles">
<h3>{{ _('Printer Profiles') }}</h3>
<table class="table table-striped table-hover table-condensed table-hover" id="settings_printerProfiles_profiles">
<thead>
<tr>
@ -124,7 +121,7 @@
<td class="settings_printerProfiles_profiles_name"><span class="icon-star" data-bind="invisible: !isdefault()"></span> <span data-bind="text: name"></span></td>
<td class="settings_printerProfiles_profiles_model" data-bind="text: model"></td>
<td class="settings_printerProfiles_profiles_action">
<a href="#" class="icon-pencil" title="{{ _('Edit Profile') }}" data-bind="click: function() { $root.printerProfiles.showEditProfileDialog($data); }"></a>&nbsp;|&nbsp;<a href="#" class="icon-trash" title="{{ _('Delete Profile') }}" data-bind="click: function() { $root.printerProfiles.removeProfile($data); }"></a>
<a href="#" class="icon-star" title="{{ _('Set as default profile') }}" data-bind="click: function() { $root.printerProfiles.makeDefault($data); }"></a>&nbsp;|&nbsp;<a href="#" class="icon-pencil" title="{{ _('Edit Profile') }}" data-bind="click: function() { $root.printerProfiles.showEditProfileDialog($data); }"></a>&nbsp;|&nbsp;<a href="#" class="icon-trash" title="{{ _('Delete Profile') }}" data-bind="click: function() { $root.printerProfiles.removeProfile($data); }"></a>
</td>
</tr>
</tbody>
@ -142,13 +139,13 @@
<div class="control-group">
<label class="control-label">{{ _('Name') }}</label>
<div class="controls">
<input type="text" class="disabled" data-bind="value: printerProfiles.editorIdentifier">
<input type="text" data-bind="value: printerProfiles.editorName">
</div>
</div>
<div class="control-group">
<label class="control-label">{{ _('Name') }}</label>
<label class="control-label">{{ _('Identifier') }}</label>
<div class="controls">
<input type="text" data-bind="value: printerProfiles.editorName">
<input type="text" data-bind="value: printerProfiles.editorIdentifier, enable: $root.printerProfiles.editorNew, css: {disabled: !$root.printerProfiles.editorNew()}">
</div>
</div>
<div class="control-group">
@ -273,108 +270,6 @@
<button class="btn btn-primary btn-confirm">{{ _('Confirm') }}</button>
</div>
</div>
</div>
<div class="tab-pane" id="settings_printerParameters">
<form class="form-horizontal">
<div class="control-group">
<label class="control-label">{{ _('Axis') }}</label>
<div class="controls form-inline">
<label>{{ _('X') }}:</label>
<div class="input-append">
<input type="number" class="input-mini text-right" data-bind="value: printer_movementSpeedX" id="settings-movementSpeedX">
<span class="add-on">mm/min</span>
</div>
<label class="checkbox">
<input type="checkbox" data-bind="checked: printer_invertX" id="settings-printerInvertX"> {{ _('Invert control') }}
</label>
</div>
<div class="controls form-inline">
<label>{{ _('Y') }}:</label>
<div class="input-append">
<input type="number" class="input-mini text-right" data-bind="value: printer_movementSpeedY" id="settings-movementSpeedY">
<span class="add-on">mm/min</span>
</div>
<label class="checkbox">
<input type="checkbox" data-bind="checked: printer_invertY" id="settings-printerInvertY"> {{ _('Invert control') }}
</label>
</div>
<div class="controls form-inline">
<label>{{ _('Z') }}:</label>
<div class="input-append">
<input type="number" class="input-mini text-right" data-bind="value: printer_movementSpeedZ" id="settings-movementSpeedZ">
<span class="add-on">mm/min</span>
</div>
<label class="checkbox">
<input type="checkbox" data-bind="checked: printer_invertZ" id="settings-printerInvertZ"> {{ _('Invert control') }}
</label>
</div>
<div class="controls form-inline">
<label>{{ _('E') }}:</label>
<div class="input-append">
<input type="number" class="input-mini text-right" data-bind="value: printer_movementSpeedE" id="settings-movementSpeedE">
<span class="add-on">mm/min</span>
</div>
</div>
</div>
<div class="control-group">
<label class="control-label" for="settings-defaultExtrusionLength">{{ _('Default extrusion length') }}</label>
<div class="controls">
<input type="number" class="input-mini text-right" min="1" data-bind="value: printer_defaultExtrusionLength" id="settings-defaultExtrusionLength">
</div>
</div>
<div class="control-group">
<label class="control-label" for="settings-numExtruders">{{ _('Number of Extruders') }}</label>
<div class="controls">
<input type="number" class="input-mini text-right" min="1" max="5" data-bind="value: printer_numExtruders" id="settings-numExtruders">
</div>
</div>
<div class="control-group">
<label class="control-label" for="settings-extruderOffsets">{{ _('Extruder Offsets') }}</label>
<!-- ko foreach: ko_printer_extruderOffsets -->
<div class="controls form-inline">
<label>X:</label>
<div class="input-append">
<input type="number" step="0.01" class="input-mini text-right" data-bind="value: x">
<span class="add-on">mm</span>
</div>
<label>Y:</label>
<div class="input-append">
<input type="number" step="0.01" class="input-mini text-right" data-bind="value: y">
<span class="add-on">mm</span>
</div>
</div>
<!-- /ko -->
</div>
<div class="control-group">
<label class="control-label" for="settings-bedSize">{{ _('Bed Size') }}</label>
<div class="controls form-inline" data-bind="ifnot: printer_bedCircular">
<label>{{ _('X') }}:</label>
<div class="input-append">
<input type="number" step="0.01" class="input-mini text-right" data-bind="value: printer_bedDimensionX" id="settings-bedX">
<span class="add-on">mm</span>
</div>
<label>{{ _('Y') }}:</label>
<div class="input-append">
<input type="number" step="0.01" class="input-mini text-right" data-bind="value: printer_bedDimensionY" id="settings-bedY">
<span class="add-on">mm</span>
</div>
</div>
<div class="controls form-inline" data-bind="if: printer_bedCircular">
<label>{{ _('Radius') }}:</label>
<div class="input-append">
<input type="number" step="0.01" class="input-mini text-right" data-bind="value: printer_bedDimensionR" id="settings-bedR">
<span class="add-on">mm</span>
</div>
</div>
<div class="controls form-inline">
<label class="checkbox">
<input type="checkbox" data-bind="checked: printer_bedCircular" id="settings-bedCircular"> {{ _('Circular') }}
</label>
</div>
</div>
</form>
</div>
<div class="tab-pane" id="settings_webcam">
<form class="form-horizontal">