/**
* 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("../WidgetFactory.js");
/**
* \class LayerDialog
* \ingroup ecma_layer
*
* Creates a dialog to edit the attributes of a layer.
*
* \param document RDocument the layer is in.
* \param layer RLayer object to edit or undefined to show a dialog for a new layer.
*/
function LayerDialog(documentInterface, layer) {
this.dialog = null;
this.documentInterface = documentInterface;
this.document = undefined;
if (!isNull(this.documentInterface)) {
this.document = documentInterface.getDocument();
}
this.layer = layer;
this.prefix = undefined;
this.defaultName = qsTr("layer", "default layer name prefix") + " %1";
this.defaultColor = RSettings.getColor("Layer/DefaultColor", new RColor("black"));
}
/**
* Hook for derived classes to do additional initialization.
*/
LayerDialog.prototype.initDialog = function(dialog, layer) {
};
/**
* Hook for derived classes to store additional information back to layer.
*/
LayerDialog.prototype.initLayer = function(dialog, layer) {
};
/**
* Hook for derived classes to return complete layer name.
*/
LayerDialog.prototype.getLayerName = function(dialog) {
var leLayerName = dialog.findChild("LayerName");
if (!isNull(this.prefix)) {
return this.prefix + leLayerName.text;
}
return leLayerName.text;
};
LayerDialog.prototype.show = function() {
this.dialog = WidgetFactory.createDialog("scripts/Layer", "LayerDialog.ui");
var widgets = getWidgets(this.dialog);
var leLayerName = widgets["LayerName"];
var rx = new RegExp("[^<>/\\\\\":;\?\*|,=`]{1,255}");
if (RSettings.getQtVersion()>=0x060000) {
this.validator = new QRegularExpressionValidator(rx, leLayerName);
}
else {
this.validator = new QRegExpValidator(rx, leLayerName);
}
leLayerName.setValidator(this.validator);
var cbColor = widgets["Color"];
cbColor.setColor(this.defaultColor);
var cbLineweight = widgets["Lineweight"];
cbLineweight.setLineweight(RSettings.getIntValue("Layer/DefaultLineweight", RLineweight.Weight025));
var cbLinetype = widgets["Linetype"];
cbLinetype.init(this.document);
// init from existing layer:
if (!isNull(this.layer)) {
leLayerName.text = this.layer.getName();
if (leLayerName.text === "0") {
leLayerName.enabled = false;
}
else {
// only allow user to edit part after prefix:
if (!isNull(this.prefix)) {
if (leLayerName.text.startsWith(this.prefix)) {
leLayerName.text = leLayerName.text.substring(this.prefix.length);
}
}
}
// TODO: undeletable layers
cbColor.setColor(this.layer.getColor());
cbLineweight.setLineweight(this.layer.getLineweight());
var ltP = this.document.queryLinetype(this.layer.getLinetypeId());
if (!isNull(ltP)) {
//lt = ltP.data();
cbLinetype.setLinetypePattern(ltP.getPattern());
}
}
// show prefix as part of the layer name label:
var lLayerName = widgets["LayerNameLabel"];
if (!isNull(this.prefix)) {
lLayerName.text = lLayerName.text + " " + this.prefix;
}
leLayerName.textChanged.connect(this, this.validate);
this.initDialog(this.dialog, this.layer);
this.dialog.show();
if (isNull(this.layer)) {
var c = 1;
do {
leLayerName.text = this.defaultName.arg(c);
++c;
} while (!this.validate());
}
else {
this.validate();
}
leLayerName.selectAll();
if (!this.dialog.exec()) {
destr(this.dialog);
EAction.activateMainWindow();
return undefined;
}
var text = leLayerName.text.trim();
if (!isNull(this.prefix)) {
text = this.prefix + text;
}
var clr = cbColor.getColor();
var lw = cbLineweight.getLineweight();
var lt = cbLinetype.getLinetypePattern();
var ltId = this.document.getLinetypeId(lt.getName());
if (!isNull(this.layer)) {
this.layer.setName(text);
this.layer.setColor(clr);
this.layer.setLinetypeId(ltId);
this.layer.setLineweight(lw);
this.initLayer(this.dialog, this.layer);
return this.layer;
}
var layer = new RLayer(this.document, text, false, false, clr, ltId, lw);
this.initLayer(this.dialog, layer);
destr(this.dialog);
EAction.activateMainWindow();
return layer;
};
/**
* Layer name validation.
*/
LayerDialog.prototype.validate = function() {
var layerName = this.getLayerName(this.dialog);
return LayerDialog.validate(this.layer, layerName, this.document, this.dialog, this.validator);
};
LayerDialog.validate = function(layer, layerName, document, dialog, validator) {
var widgets = getWidgets(dialog);
var leLayerName = widgets["LayerName"];
if (isNull(leLayerName)) {
return false;
}
var pos = 0;
var acceptable = true;
var lMessage = widgets["Message"];
if (!isNull(lMessage)) {
lMessage.clear();
}
if (layerName!==layerName.trim()) {
if (!isNull(lMessage)) {
lMessage.text = "" + qsTr("Leading or trailing spaces.") + "";
}
acceptable = false;
}
if (validator.validate(layerName, pos) != QValidator.Acceptable) {
if (!isNull(lMessage)) {
lMessage.text = "" + qsTr("Layer name is empty.") + "";
}
acceptable = false;
}
// layer exists: check if name exists:
if (document.hasLayer(layerName)) {
// error if we're creating a new layer and the layer name is taken or
// we're trying to rename a layer to an existing name
if (isNull(layer) ||
layer.getName().toLowerCase() !== layerName.toLowerCase()) {
if (!isNull(lMessage)) {
lMessage.text = "" + qsTr("Layer already exists.") + "";
}
acceptable = false;
}
}
if (!isNull(widgets["ButtonBox"])) {
widgets["ButtonBox"].button(QDialogButtonBox.Ok).enabled = acceptable;
}
return acceptable;
};