Highlight currently selected file, disable deletion and load/loadAndPrint for it

Fixed #182
master
Gina Häußge 2013-07-07 23:27:22 +02:00
parent 7d85860195
commit 8dcbb620bb
4 changed files with 60 additions and 7 deletions

View File

@ -477,6 +477,10 @@ class Printer():
def getCurrentData(self):
return self._stateMonitor.getCurrentData()
def getCurrentJob(self):
currentData = self._stateMonitor.getCurrentData()
return currentData["job"]
def getCurrentTemperatures(self):
return {
"extruder": {

View File

@ -345,9 +345,17 @@ def loadGcodeFile():
def deleteGcodeFile():
if "filename" in request.values.keys():
filename = request.values["filename"]
if "target" in request.values.keys() and request.values["target"] == "sd":
currentJob = printer.getCurrentJob()
currentFilename = None
currentSd = None
if currentJob is not None and "filename" in currentJob.keys() and "sd" in currentJob.keys():
currentFilename = currentJob["filename"]
currentSd = currentJob["sd"]
if "target" in request.values.keys() and request.values["target"] == "sd" and not (currentFilename == filename and currentSd is True):
printer.deleteSdFile(filename)
else:
elif not (currentFilename == filename and currentSd is False):
gcodeManager.removeFile(filename)
return readGcodeFiles()

View File

@ -769,9 +769,10 @@ function TerminalViewModel(loginStateViewModel) {
}
}
function GcodeFilesViewModel(loginStateViewModel) {
function GcodeFilesViewModel(printerStateViewModel, loginStateViewModel) {
var self = this;
self.printerState = printerStateViewModel;
self.loginState = loginStateViewModel;
self.isErrorOrClosed = ko.observable(undefined);
@ -831,6 +832,20 @@ function GcodeFilesViewModel(loginStateViewModel) {
return self.loginState.isUser() && self.isOperational() && self.isLoadActionPossible();
});
self.printerState.filename.subscribe(function(newValue) {
self.highlightFilename(newValue);
});
self.highlightFilename = function(filename) {
if (filename == undefined) {
self.listHelper.selectNone();
} else {
self.listHelper.selectItem(function(item) {
return item.name == filename;
})
}
}
self.fromCurrentData = function(data) {
self._processStateData(data.state);
}
@ -868,6 +883,8 @@ function GcodeFilesViewModel(loginStateViewModel) {
// got a file to scroll to
self.listHelper.switchToItem(function(item) {return item.name == response.filename});
}
self.highlightFilename(self.printerState.filename());
}
self.loadFile = function(filename, printAfterLoad) {
@ -1626,11 +1643,13 @@ function ItemListHelper(listType, supportedSorting, supportedFilters, defaultSor
self.exclusiveFilters = exclusiveFilters;
self.allItems = [];
self.items = ko.observableArray([]);
self.pageSize = ko.observable(filesPerPage);
self.currentPage = ko.observable(0);
self.currentSorting = ko.observable(self.defaultSorting);
self.currentFilters = ko.observableArray(self.defaultFilters);
self.selectedItem = ko.observable(undefined);
//~~ item handling
@ -1639,6 +1658,28 @@ function ItemListHelper(listType, supportedSorting, supportedFilters, defaultSor
self._updateItems();
}
self.selectItem = function(matcher) {
var itemList = self.items();
for (var i = 0; i < itemList.length; i++) {
if (matcher(itemList[i])) {
self.selectedItem(itemList[i]);
break;
}
}
}
self.selectNone = function() {
self.selectedItem(undefined);
}
self.isSelected = function(data) {
return self.selectedItem() == data;
}
self.isSelectedByMatcher = function(matcher) {
return matcher(self.selectedItem());
}
//~~ pagination
self.paginatedItems = ko.dependentObservable(function() {
@ -1852,7 +1893,7 @@ function ItemListHelper(listType, supportedSorting, supportedFilters, defaultSor
self._initializeLocalStorage = function() {
if (!Modernizr.localstorage)
return false;
return false;
if (localStorage[self.listType + "." + "currentSorting"] !== undefined && localStorage[self.listType + "." + "currentFilters"] !== undefined && JSON.parse(localStorage[self.listType + "." + "currentFilters"]) instanceof Array)
return true;
@ -1900,7 +1941,7 @@ $(function() {
var temperatureViewModel = new TemperatureViewModel(loginStateViewModel, settingsViewModel);
var controlViewModel = new ControlViewModel(loginStateViewModel, settingsViewModel);
var terminalViewModel = new TerminalViewModel(loginStateViewModel);
var gcodeFilesViewModel = new GcodeFilesViewModel(loginStateViewModel);
var gcodeFilesViewModel = new GcodeFilesViewModel(printerStateViewModel, loginStateViewModel);
var timelapseViewModel = new TimelapseViewModel(loginStateViewModel);
var gcodeViewModel = new GcodeViewModel(loginStateViewModel);
var navigationViewModel = new NavigationViewModel(loginStateViewModel, appearanceViewModel, settingsViewModel, usersViewModel);

View File

@ -177,11 +177,11 @@
</tr>
</thead>
<tbody data-bind="foreach: listHelper.paginatedItems">
<tr data-bind="css: $root.getSuccessClass($data), popover: { title: name, animation: true, html: true, placement: 'right', trigger: 'hover', delay: 0, content: $root.getPopoverContent($data), html: true }">
<tr data-bind="css: $root.getSuccessClass($data), style: { 'font-weight': $root.listHelper.isSelected($data) ? 'bold' : 'normal' }, popover: { title: name, animation: true, html: true, placement: 'right', trigger: 'hover', delay: 0, content: $root.getPopoverContent($data), html: true }">
<td class="gcode_files_name" data-bind="text: name"></td>
<td class="gcode_files_size" data-bind="text: size"></td>
<td class="gcode_files_action">
<a href="#" class="icon-trash" title="Remove" data-bind="click: function() { if ($root.loginState.isUser()) { $root.removeFile($data.name); } else { return; } }, css: {disabled: !$root.loginState.isUser()}"></a>&nbsp;|&nbsp;<a href="#" class="icon-folder-open" title="Load" data-bind="click: function() { if ($root.isLoadActionPossible()) { $root.loadFile($data.name, false); } else { return; } }, css: {disabled: !$root.isLoadActionPossible()}"></a>&nbsp;|&nbsp;<a href="#" class="icon-print" title="Load and Print" data-bind="click: function() { if ($root.isLoadAndPrintActionPossible()) { $root.loadFile($data.name, true); } else { return; } }, css: {disabled: !$root.isLoadAndPrintActionPossible()}"></a>
<a href="#" class="icon-trash" title="Remove" data-bind="click: function() { if ($root.loginState.isUser() && !$root.listHelper.isSelected($data)) { $root.removeFile($data.name); } else { return; } }, css: {disabled: !$root.loginState.isUser() || $root.listHelper.isSelected($data)}"></a>&nbsp;|&nbsp;<a href="#" class="icon-folder-open" title="Load" data-bind="click: function() { if ($root.isLoadActionPossible() && !$root.listHelper.isSelected($data)) { $root.loadFile($data.name, false); } else { return; } }, css: {disabled: !$root.isLoadActionPossible() || $root.listHelper.isSelected($data)}"></a>&nbsp;|&nbsp;<a href="#" class="icon-print" title="Load and Print" data-bind="click: function() { if ($root.isLoadAndPrintActionPossible() && !$root.listHelper.isSelected($data)) { $root.loadFile($data.name, true); } else { return; } }, css: {disabled: !$root.isLoadAndPrintActionPossible() || $root.listHelper.isSelected($data)}"></a>
</td>
</tr>
</tbody>