← All bug reports

FS#103Runtime reload script

Type
Feature Request
Status
Closed
Resolution
Implemented
Category
ECMAScript
Severity
Low
Priority
Low
Reported version
3 TP1
Operating system
All
Reported
2011-05-25 by hungerburg
Closed
2011-05-25 by andrew

As of TP1, a script once loaded into the runtime, does reflect changes to the file it was loaded from only after a restart of the whole of QCAD. This adds a considerable time overhead to developing scripts. Therefore I want to suggest a reload mechanism, that works kind of like the one known from a web browser.

As there is no clear separation between users custom scripts and ribbonsoft supplied scripts, checking the modification time for every access to any script might prove a performance hit.

Possibly a user script can be written, to invalidate another certain script and have the runtime reload it from file? I could add that to my menu.

Or as some magic, that can be written to "MyAction.init()"?

Comments (2)

andrew 2011-05-25

You can achieve this by unloading your class at the end of the script by setting it to undefined.

Example:

include("../BaseClass.js");

function MyTool(guiAction) {
    BaseClass.call(this, guiAction);
}

MyTool.prototype = new BaseClass();

MyTool.prototype.beginEvent = function() {
    BaseClass.prototype.beginEvent.call(this);

    appWin = EAction.getMainWindow();
    appWin.handleUserWarning("My Message...");

    this.terminate();

    // unload class. the class will be loaded again on every execution:
    MyTool = undefined;
};

MyTool.init = function(basePath) {
    var action = new RGuiAction(qsTr("&My Tool"),
        RMainWindowQt.getMainWindow());
    action.setRequiresDocument(true);
    action.setScriptFile(basePath + "/MyTool.js");
    action.setIcon(basePath + "/MyTool.svg");
    EAction.addGuiActionTo(action, BaseClass, true, true, true);
};
hungerburg 2011-05-27

Thank you Andrew, this works with the example provided. Yet, as soon as a dialogue is execed() from the script, invalidating the class no longer works; then it will not run again at all. Possibly some ressources have to be freed?

Closure comment

Can be achieved by the script itself (see comment)