From 7e8491804fc28bc1ca0548f07f280b8ac3438ea8 Mon Sep 17 00:00:00 2001 From: Teja Date: Tue, 3 Feb 2015 19:12:47 +0100 Subject: [PATCH] primitive dependency resolving while instanciating plugins viewmodels --- .../static/js/lasercutterprofiles.js | 2 +- .../plugins/svgtogcode/static/js/convert.js | 2 +- .../svgtogcode/static/js/working_area.js | 15 +---- src/octoprint/static/js/app/main.js | 64 +++++++++++++------ .../static/js/app/viewmodels/files.js | 6 +- 5 files changed, 53 insertions(+), 36 deletions(-) diff --git a/src/octoprint/plugins/lasercutterprofiles/static/js/lasercutterprofiles.js b/src/octoprint/plugins/lasercutterprofiles/static/js/lasercutterprofiles.js index 77cd5282..f899a951 100644 --- a/src/octoprint/plugins/lasercutterprofiles/static/js/lasercutterprofiles.js +++ b/src/octoprint/plugins/lasercutterprofiles/static/js/lasercutterprofiles.js @@ -258,7 +258,7 @@ $(function() { // view model class, identifier, parameters for constructor, container to bind to - ADDITIONAL_VIEWMODELS.push([LaserCutterProfilesViewModel, "laserCutterProfilesViewModel", + ADDITIONAL_VIEWMODELS.push([LaserCutterProfilesViewModel, ["workingAreaViewModel", "controlViewModel", "vectorConversionViewModel"], document.getElementById("laserCutterProfiles")]); diff --git a/src/octoprint/plugins/svgtogcode/static/js/convert.js b/src/octoprint/plugins/svgtogcode/static/js/convert.js index f3a4ceec..b92456ce 100644 --- a/src/octoprint/plugins/svgtogcode/static/js/convert.js +++ b/src/octoprint/plugins/svgtogcode/static/js/convert.js @@ -297,7 +297,7 @@ $(function(){ } - ADDITIONAL_VIEWMODELS.push([VectorConversionViewModel, "vectorConversionViewModel", + ADDITIONAL_VIEWMODELS.push([VectorConversionViewModel, ["loginStateViewModel", "settingsViewModel", "printerStateViewModel", "workingAreaViewModel", "gcodeFilesViewModel"], document.getElementById("dialog_vector_graphics_conversion")]); diff --git a/src/octoprint/plugins/svgtogcode/static/js/working_area.js b/src/octoprint/plugins/svgtogcode/static/js/working_area.js index d857f36f..22fd5848 100644 --- a/src/octoprint/plugins/svgtogcode/static/js/working_area.js +++ b/src/octoprint/plugins/svgtogcode/static/js/working_area.js @@ -9,20 +9,11 @@ $(function(){ self.settings = params[1]; self.state = params[2]; self.files = params[3]; - self.conversion = params[4]; self.log = []; self.command = ko.observable(undefined); -// self.isErrorOrClosed = ko.observable(undefined); -// self.isOperational = ko.observable(undefined); -// self.isPrinting = ko.observable(undefined); -// self.isPaused = ko.observable(undefined); -// self.isError = ko.observable(undefined); -// self.isReady = ko.observable(undefined); -// self.isLoading = ko.observable(undefined); - self.availableHeight = ko.observable(undefined); self.availableWidth = ko.observable(undefined); self.px2mm_factor = 1; // initial value @@ -380,7 +371,7 @@ $(function(){ GCODE.workingArea = self; // Temporary hack to use the gcode parser from the gCodeViewer self.state.workingArea = self; self.files.workingArea = self; - self.conversion.workingArea = self; + $(window).resize(function(){ self.trigger_resize(); }); @@ -391,8 +382,8 @@ $(function(){ // view model class, parameters for constructor, container to bind to - ADDITIONAL_VIEWMODELS.push([WorkingAreaViewModel, "workingAreaViewModel", - ["loginStateViewModel", "settingsViewModel", "printerStateViewModel", "gcodeFilesViewModel", "vectorConversionViewModel"], + ADDITIONAL_VIEWMODELS.push([WorkingAreaViewModel, + ["loginStateViewModel", "settingsViewModel", "printerStateViewModel", "gcodeFilesViewModel"], [document.getElementById("area_preview"), document.getElementById("working_area_files")]]); }); \ No newline at end of file diff --git a/src/octoprint/static/js/app/main.js b/src/octoprint/static/js/app/main.js index d2bdfb9c..228a4aa4 100644 --- a/src/octoprint/static/js/app/main.js +++ b/src/octoprint/static/js/app/main.js @@ -71,7 +71,7 @@ $(function() { var terminalViewModel = new TerminalViewModel(loginStateViewModel, settingsViewModel); var slicingViewModel = new SlicingViewModel(loginStateViewModel, printerProfilesViewModel); - var gcodeFilesViewModel = new GcodeFilesViewModel(printerStateViewModel, loginStateViewModel, slicingViewModel, null, null); + var gcodeFilesViewModel = new GcodeFilesViewModel(printerStateViewModel, loginStateViewModel, slicingViewModel); var controlViewModel = new ControlViewModel(loginStateViewModel, settingsViewModel, printerStateViewModel); var navigationViewModel = new NavigationViewModel(loginStateViewModel, appearanceViewModel, settingsViewModel, usersViewModel); var logViewModel = new LogViewModel(loginStateViewModel); @@ -96,32 +96,58 @@ $(function() { slicingViewModel: slicingViewModel, }; - var allViewModels = _.values(viewModelMap); - - var additionalViewModels = []; - _.each(ADDITIONAL_VIEWMODELS, function(viewModel) { - var viewModelClass = viewModel[0]; - var viewModelId = viewModel[1]; - var viewModelParameters = viewModel[2]; - var viewModelBindTarget = viewModel[3]; + var _createViewModelInstance = function(viewModel, viewModelMap){ + var viewModelClass = viewModel[0]; + var viewModelParameters = viewModel[1]; var constructorParameters = []; - _.each(viewModelParameters, function(parameter) { + for (var idx = 0; idx < viewModelParameters.length; idx++) { + var parameter = viewModelParameters[idx]; + if (_.has(viewModelMap, parameter)) { constructorParameters.push(viewModelMap[parameter]); } else { - constructorParameters.push(undefined); - } - }); - - var viewModelInstance = new viewModelClass(constructorParameters); - additionalViewModels.push([viewModelInstance, viewModelBindTarget]); - allViewModels.push(viewModelInstance); - viewModelMap[viewModelId] = viewModelInstance; - }); + console.warn("postponing", viewModel[0].name, 'missing param: ', parameter); + return; + } + } + var viewModelInstance = new viewModelClass(constructorParameters); + return viewModelInstance; + }; + + var _getViewModelId = function(viewModel){ + var name = viewModel[0].name; + return name.substr(0, 1).toLowerCase() + name.substr(1); + }; + + var vmtmp = ADDITIONAL_VIEWMODELS.slice(); + var additionalViewModels = []; + var attempt = 0; + while(vmtmp.length > 0 && attempt < 3){ + while(vmtmp.length > 0){ + var viewModel = vmtmp.shift(); + var viewModelInstance = _createViewModelInstance(viewModel, viewModelMap); + if(viewModelInstance !== undefined){ + var viewModelBindTarget = viewModel[2]; + var viewModelId = _getViewModelId(viewModel); + if(viewModelMap[viewModelId] !== undefined){ + console.error("Duplicate class name while instantiating viewModel ", viewModelId); + } else { + additionalViewModels.push([viewModelInstance, viewModelBindTarget]); + viewModelMap[viewModelId] = viewModelInstance; + } + } else { + vmtmp.push(viewModel); + } + } + attempt++; + } + + var allViewModels = _.values(viewModelMap); var dataUpdater = new DataUpdater(allViewModels); + //~~ Temperature $('#tabs a[data-toggle="tab"]').on('shown', function (e) { diff --git a/src/octoprint/static/js/app/viewmodels/files.js b/src/octoprint/static/js/app/viewmodels/files.js index be7a3d15..c8e8dc36 100644 --- a/src/octoprint/static/js/app/viewmodels/files.js +++ b/src/octoprint/static/js/app/viewmodels/files.js @@ -1,11 +1,11 @@ -function GcodeFilesViewModel(printerStateViewModel, loginStateViewModel, slicingViewModel, vectorConversionViewModel, workingAreaViewModel) { +function GcodeFilesViewModel(printerStateViewModel, loginStateViewModel, slicingViewModel) { var self = this; self.printerState = printerStateViewModel; self.loginState = loginStateViewModel; self.slicing = slicingViewModel; - //self.conversion = vectorConversionViewModel; - self.workingArea = workingAreaViewModel; + self.conversion = undefined; + self.workingArea = undefined; self.isErrorOrClosed = ko.observable(undefined); self.isOperational = ko.observable(undefined);