| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222 |
- /**
- * Copyright (c) 2011-2018 by Andrew Mustun. All rights reserved.
- *
- * This file is part of the QCAD project.
- *
- * QCAD is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * QCAD is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with QCAD.
- */
- include("scripts/Block/Block.js");
- include("scripts/Block/InsertBlockItem/InsertBlockItem.js");
- /**
- * \class InsertScriptItem
- * \brief Called when a script is inserted from the part library.
- * \ingroup ecma_block
- */
- function InsertScriptItem(guiAction) {
- InsertBlockItem.call(this, guiAction);
- if (!isNull(guiAction)) {
- this.setUiOptions("../InsertBlockItem/InsertBlockItem.ui");
- }
- this.diItem = undefined;
- this.docItem = undefined;
- this.file = undefined;
- //this.offset = undefined;
- }
- InsertScriptItem.prototype = new InsertBlockItem();
- InsertScriptItem.prototype.beginEvent = function() {
- var ms = new RMemoryStorage();
- var si = createSpatialIndex();
- this.docItem = new RDocument(ms, si);
- // avoid unit conversion:
- this.docItem.setUnit(RS.None);
- this.diItem = new RDocumentInterface(this.docItem);
- // this document does never update the layer list, block list, etc:
- this.diItem.setNotifyListeners(false);
-
- Block.prototype.beginEvent.call(this);
- if (isNull(this.url) || !this.url.isLocalFile()) {
- this.terminate();
- return;
- }
- this.file = this.url.toLocalFile();
- // sanity checks:
- if (!InsertScriptItem.check(this.file)) {
- this.terminate();
- return;
- }
- include(this.file);
-
- InsertScriptItem.evalInit(this.file);
- this.generate();
- this.setState(InsertBlockItem.State.SettingPosition);
- };
- /**
- * Sanity check before including a script.
- * \return true if this is very likely a part library script item.
- */
- InsertScriptItem.check = function(fileName) {
- var baseName = new QFileInfo(fileName).baseName();
- var content = readTextFile(fileName);
- if (isNull(content)) {
- EAction.handleUserWarning(qsTr("Cannot read file:") + " " + fileName);
- return false;
- }
- if (!content.contains("function " + baseName)) {
- EAction.handleUserWarning(qsTr("No constructor found in file:") + " " + fileName);
- return false;
- }
- if (!content.contains(baseName + ".init")) {
- EAction.handleUserWarning(qsTr("No 'init' function found in file:") + " " + fileName);
- return false;
- }
- if (!content.contains(baseName + ".generate")) {
- EAction.handleUserWarning(qsTr("No 'generate' function found in file:") + " " + fileName);
- return false;
- }
- if (!content.contains(baseName + ".generatePreview")) {
- EAction.handleUserWarning(qsTr("No 'generatePreview' function found in file:") + " " + this.file);
- return false;
- }
- return true;
- };
- InsertScriptItem.prototype.finishEvent = function() {
- var dock = objectFromPath("MainWindow::" + InsertScriptItem.getObjectName(this.file));
- if (!isNull(dock)) {
- dock.hide();
- destr(dock);
- }
- if (!isNull(this.diItem)) {
- destr(this.diItem);
- }
- InsertBlockItem.prototype.finishEvent.call(this);
- };
- /**
- * Generates the script item into a temporary document for insertion.
- */
- InsertScriptItem.prototype.generate = function() {
- this.diItem.clear();
- var operation = InsertScriptItem.evalGenerate(this.diItem, this.file);
- if (!isNull(operation)) {
- this.diItem.applyOperation(operation);
- }
- };
- InsertScriptItem.isScriptFile = function(file) {
- return new QFileInfo(file).suffix().toLowerCase() == "js";
- };
- InsertScriptItem.hasUiFile = function(file) {
- var uiFile = InsertScriptItem.getUiFilePath(file);
- return new QFileInfo(uiFile).isFile();
- };
- InsertScriptItem.getUiFilePath = function(file) {
- var fi = new QFileInfo(file);
- return fi.absolutePath() + QDir.separator + fi.completeBaseName() + ".ui";
- };
- InsertScriptItem.getWidget = function(file) {
- return objectFromPath("MainWindow::" + InsertScriptItem.getObjectName(file)).widget();
- };
- InsertScriptItem.getObjectName = function(file) {
- var str = "";
- var sa = file.split(QDir.separator);
- for ( var i = 0; i < sa.length; ++i) {
- var s = sa[i];
- if (s.length === 0) {
- continue;
- }
- var first = s.slice(0, 1).toUpperCase();
- var rest = s.slice(1, s.length);
- str += first + rest;
- }
- var re = /\.js$/;
- return str.replace(re, "");
- };
- InsertScriptItem.getFileTitle = function(file) {
- return new QFileInfo(file).completeBaseName();
- };
- /**
- * Called when a script item is about to be inserted to initialize the
- * user interface component that displays script parameters and call
- * the script init function.
- */
- InsertScriptItem.evalInit = function(file) {
- var formWidget;
- var className = new QFileInfo(file).completeBaseName();
-
- if (InsertScriptItem.hasUiFile(file)) {
- var dock = objectFromPath("MainWindow::" + InsertScriptItem.getObjectName(file));
- if (isNull(dock)) {
- // create script item UI as a dock widget:
- var basePath = new QFileInfo(file).absolutePath();
- var uiFile = new QFileInfo(InsertScriptItem.getUiFilePath(file)).fileName();
- formWidget = WidgetFactory.createWidget(basePath, uiFile);
- var appWin = RMainWindowQt.getMainWindow();
- dock = new QDockWidget(InsertScriptItem.getFileTitle(file), appWin);
- dock.objectName = InsertScriptItem.getObjectName(file);
- dock.setWidget(formWidget);
- appWin.addDockWidget(Qt.RightDockWidgetArea, dock);
- } else {
- // show previously used and hidden script item UI again:
- if (!RSettings.getOriginalArguments().contains("-no-show")) {
- dock.visible = true;
- }
- formWidget = dock.widget();
- }
- }
- // call init()
- if (!isNull(global[className]) && isFunction(global[className].init)) {
- global[className].init(formWidget);
- }
- };
- InsertScriptItem.evalGenerate = function(di, file) {
- var operation = undefined;
-
- var className = new QFileInfo(file).completeBaseName();
- if (!isNull(global[className]) && isFunction(global[className].generate)) {
- operation = global[className].generate(di, file);
- }
- return operation;
- };
|