mirror of
https://github.com/qelectrotech/qelectrotech-source-mirror.git
synced 2026-02-25 14:49:59 +01:00
Merge branch 'master' of ssh://git.tuxfamily.org/gitroot/qet/qet
This commit is contained in:
BIN
lang/qet_de.qm
BIN
lang/qet_de.qm
Binary file not shown.
415
lang/qet_de.ts
415
lang/qet_de.ts
File diff suppressed because it is too large
Load Diff
@@ -76,6 +76,7 @@ include(sources/QWidgetAnimation/QWidgetAnimation.pri)
|
||||
DEFINES += QAPPLICATION_CLASS=QApplication
|
||||
DEFINES += QT_MESSAGELOGCONTEXT
|
||||
DEFINES += GIT_COMMIT_SHA="\\\"$(shell git -C \""$$_PRO_FILE_PWD_"\" rev-parse --verify HEAD)\\\""
|
||||
DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000
|
||||
|
||||
TEMPLATE = app
|
||||
DEPENDPATH += .
|
||||
|
||||
@@ -19,6 +19,7 @@
|
||||
#define ELEMENTSCOLLECTIONMODEL2_H
|
||||
|
||||
#include <QStandardItemModel>
|
||||
#include <QHash>
|
||||
#include "elementslocation.h"
|
||||
|
||||
class XmlProjectElementCollectionItem;
|
||||
|
||||
@@ -1,17 +1,17 @@
|
||||
/*
|
||||
Copyright 2006-2020 The QElectroTech Team
|
||||
This file is part of QElectroTech.
|
||||
|
||||
|
||||
QElectroTech 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 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
|
||||
QElectroTech 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 QElectroTech. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
@@ -1,25 +1,27 @@
|
||||
/*
|
||||
Copyright 2006-2020 The QElectroTech Team
|
||||
This file is part of QElectroTech.
|
||||
|
||||
|
||||
QElectroTech 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 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
|
||||
QElectroTech 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 QElectroTech. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#ifndef NAMELISTWIDGET_H
|
||||
#define NAMELISTWIDGET_H
|
||||
|
||||
#include "nameslist.h"
|
||||
#include <QWidget>
|
||||
#include <QHash>
|
||||
|
||||
#include "nameslist.h"
|
||||
|
||||
namespace Ui {
|
||||
class NameListWidget;
|
||||
@@ -32,27 +34,27 @@ namespace Ui {
|
||||
class NameListWidget : public QWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
|
||||
public:
|
||||
explicit NameListWidget(QWidget *parent = nullptr);
|
||||
~NameListWidget();
|
||||
|
||||
|
||||
void addLine();
|
||||
void setNames (const NamesList &name_list);
|
||||
NamesList names() const;
|
||||
void setReadOnly(bool ro);
|
||||
bool isEmpty() const;
|
||||
void setClipboardValue (QHash <QString, QString> value);
|
||||
|
||||
|
||||
private slots:
|
||||
void on_m_clipboard_cb_activated(int index);
|
||||
|
||||
|
||||
private:
|
||||
void clean();
|
||||
|
||||
|
||||
private:
|
||||
Ui::NameListWidget *ui;
|
||||
bool m_read_only = false;
|
||||
bool m_read_only = false;
|
||||
};
|
||||
|
||||
#endif // NAMELISTWIDGET_H
|
||||
|
||||
@@ -20,7 +20,6 @@
|
||||
|
||||
#include <QRectF>
|
||||
#include <QLineF>
|
||||
#include <QColor>
|
||||
#include <QPolygonF>
|
||||
|
||||
class QPainter;
|
||||
|
||||
@@ -16,9 +16,10 @@
|
||||
along with QElectroTech. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#include "numerotationcontext.h"
|
||||
#include "qet.h"
|
||||
|
||||
#include <utility>
|
||||
#include "qet.h"
|
||||
#include <QRegularExpression>
|
||||
|
||||
/**
|
||||
Constructor
|
||||
@@ -141,7 +142,7 @@ QString NumerotationContext::validRegExpNumber() const
|
||||
*/
|
||||
bool NumerotationContext::keyIsAcceptable(const QString &type) const
|
||||
{
|
||||
return (type.contains(QRegExp(validRegExpNum())));
|
||||
return (type.contains(QRegularExpression(validRegExpNum())));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -150,7 +151,7 @@ bool NumerotationContext::keyIsAcceptable(const QString &type) const
|
||||
*/
|
||||
bool NumerotationContext::keyIsNumber(const QString &type) const
|
||||
{
|
||||
return (type.contains(QRegExp(validRegExpNumber())));
|
||||
return (type.contains(QRegularExpression(validRegExpNumber())));
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -1,21 +1,20 @@
|
||||
/*
|
||||
Copyright 2006-2020 The QElectroTech Team
|
||||
This file is part of QElectroTech.
|
||||
|
||||
|
||||
QElectroTech 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 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
|
||||
QElectroTech 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 QElectroTech. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#include <QRegExp>
|
||||
#include "numparteditorw.h"
|
||||
#include "ui_numparteditorw.h"
|
||||
|
||||
|
||||
@@ -1,22 +1,24 @@
|
||||
/*
|
||||
Copyright 2006-2020 The QElectroTech Team
|
||||
This file is part of QElectroTech.
|
||||
|
||||
|
||||
QElectroTech 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 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
|
||||
QElectroTech 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 QElectroTech. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#include <QPainter>
|
||||
#include <utility>
|
||||
#include <QLocale>
|
||||
|
||||
#include "titleblocktemplate.h"
|
||||
#include "titleblocktemplaterenderer.h"
|
||||
#include "bordertitleblock.h"
|
||||
@@ -49,18 +51,19 @@ BorderTitleBlock::BorderTitleBlock(QObject *parent) :
|
||||
// at first, the internal titleblock template renderer uses the default titleblock template
|
||||
m_titleblock_template_renderer = new TitleBlockTemplateRenderer(this);
|
||||
m_titleblock_template_renderer -> setTitleBlockTemplate(QETApp::defaultTitleBlockTemplate());
|
||||
|
||||
|
||||
// disable the QPicture-based cache from Qt 4.8 to avoid rendering errors and crashes
|
||||
if (!QRegExp("4\\.[0-7]\\.").exactMatch(qVersion())) {
|
||||
m_titleblock_template_renderer -> setUseCache(false);
|
||||
}
|
||||
|
||||
#if QT_VERSION < QT_VERSION_CHECK(4, 8, 0) // ### Qt 6: remove
|
||||
#else
|
||||
m_titleblock_template_renderer -> setUseCache(false);
|
||||
#endif
|
||||
|
||||
// dimensions par defaut du schema
|
||||
importBorder(BorderProperties());
|
||||
|
||||
|
||||
// contenu par defaut du cartouche
|
||||
importTitleBlock(TitleBlockProperties());
|
||||
|
||||
|
||||
display_titleblock_ = true;
|
||||
display_border_ = true;
|
||||
setFolioData(1, 1);
|
||||
@@ -227,11 +230,11 @@ void BorderTitleBlock::borderToXml(QDomElement &xml_elmt) {
|
||||
xml_elmt.setAttribute("cols", columnsCount());
|
||||
xml_elmt.setAttribute("colsize", QString("%1").arg(columnsWidth()));
|
||||
xml_elmt.setAttribute("displaycols", columnsAreDisplayed() ? "true" : "false");
|
||||
|
||||
|
||||
xml_elmt.setAttribute("rows", rowsCount());
|
||||
xml_elmt.setAttribute("rowsize", QString("%1").arg(rowsHeight()));
|
||||
xml_elmt.setAttribute("displayrows", rowsAreDisplayed() ? "true" : "false");
|
||||
|
||||
|
||||
// attribut datant de la version 0.1 - laisse pour retrocompatibilite
|
||||
xml_elmt.setAttribute("height", QString("%1").arg(diagramHeight()));
|
||||
}
|
||||
@@ -246,18 +249,18 @@ void BorderTitleBlock::borderFromXml(const QDomElement &xml_elmt) {
|
||||
// columns count
|
||||
int cols_count = xml_elmt.attribute("cols").toInt(&ok);
|
||||
if (ok) setColumnsCount(cols_count);
|
||||
|
||||
|
||||
// columns width
|
||||
double cols_width = xml_elmt.attribute("colsize").toDouble(&ok);
|
||||
if (ok) setColumnsWidth(cols_width);
|
||||
|
||||
|
||||
// backward compatibility:
|
||||
// diagrams saved with 0.1 version have a "height" attribute
|
||||
if (xml_elmt.hasAttribute("rows") && xml_elmt.hasAttribute("rowsize")) {
|
||||
// rows counts
|
||||
int rows_count = xml_elmt.attribute("rows").toInt(&ok);
|
||||
if (ok) setRowsCount(rows_count);
|
||||
|
||||
|
||||
// taille des lignes
|
||||
double rows_size = xml_elmt.attribute("rowsize").toDouble(&ok);
|
||||
if (ok) setRowsHeight(rows_size);
|
||||
@@ -266,7 +269,7 @@ void BorderTitleBlock::borderFromXml(const QDomElement &xml_elmt) {
|
||||
double height = xml_elmt.attribute("height").toDouble(&ok);
|
||||
if (ok) setDiagramHeight(height);
|
||||
}
|
||||
|
||||
|
||||
// rows and columns display
|
||||
displayColumns(xml_elmt.attribute("displaycols") != "false");
|
||||
displayRows(xml_elmt.attribute("displayrows") != "false");
|
||||
@@ -282,7 +285,7 @@ void BorderTitleBlock::borderFromXml(const QDomElement &xml_elmt) {
|
||||
TitleBlockProperties BorderTitleBlock::exportTitleBlock()
|
||||
{
|
||||
TitleBlockProperties ip;
|
||||
|
||||
|
||||
ip.author = author();
|
||||
ip.date = date();
|
||||
ip.title = title();
|
||||
@@ -297,7 +300,7 @@ TitleBlockProperties BorderTitleBlock::exportTitleBlock()
|
||||
ip.auto_page_num = autoPageNum();
|
||||
ip.context = additional_fields_;
|
||||
ip.collection = QET::QetCollection::Embedded;
|
||||
|
||||
|
||||
return(ip);
|
||||
}
|
||||
|
||||
@@ -322,7 +325,7 @@ void BorderTitleBlock::importTitleBlock(const TitleBlockProperties &ip) {
|
||||
emit(displayChanged());
|
||||
}
|
||||
additional_fields_ = ip.context;
|
||||
|
||||
|
||||
emit(needFolioData()); // Note: we expect additional data to be provided
|
||||
// through setFolioData(),
|
||||
// which in turn calls updateDiagramContextForTitleBlock().
|
||||
@@ -422,7 +425,7 @@ void BorderTitleBlock::titleBlockTemplateRemoved(
|
||||
const QString &removed_template_name,
|
||||
const TitleBlockTemplate *new_template) {
|
||||
if (titleBlockTemplateName() != removed_template_name) return;
|
||||
|
||||
|
||||
if (new_template) {
|
||||
setTitleBlockTemplate(new_template);
|
||||
} else {
|
||||
@@ -516,14 +519,14 @@ void BorderTitleBlock::draw(QPainter *painter)
|
||||
pen.setCosmetic(true);
|
||||
painter -> setPen(pen);
|
||||
painter -> setBrush(Qt::NoBrush);
|
||||
|
||||
|
||||
QSettings settings;
|
||||
|
||||
|
||||
//Draw the borer
|
||||
if (display_border_) painter -> drawRect(diagram_rect_);
|
||||
|
||||
|
||||
painter -> setFont(QETApp::diagramTextsFont());
|
||||
|
||||
|
||||
//Draw the empty case at the top left of diagram when there is header
|
||||
if (display_border_ && (display_columns_ || display_rows_))
|
||||
{
|
||||
@@ -535,7 +538,7 @@ void BorderTitleBlock::draw(QPainter *painter)
|
||||
);
|
||||
painter -> drawRect(first_rectangle);
|
||||
}
|
||||
|
||||
|
||||
//Draw the nums of columns
|
||||
if (display_border_ && display_columns_) {
|
||||
for (int i = 1 ; i <= columns_count_ ; ++ i) {
|
||||
@@ -561,7 +564,7 @@ void BorderTitleBlock::draw(QPainter *painter)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//Draw the nums of rows
|
||||
if (display_border_ && display_rows_) {
|
||||
QString row_string("A");
|
||||
@@ -584,7 +587,7 @@ void BorderTitleBlock::draw(QPainter *painter)
|
||||
row_string = incrementLetters(row_string);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// render the titleblock, using the TitleBlockTemplate object
|
||||
if (display_titleblock_) {
|
||||
QRectF tbt_rect = titleBlockRectForQPainter();
|
||||
@@ -607,7 +610,7 @@ void BorderTitleBlock::draw(QPainter *painter)
|
||||
painter -> translate(-tbt_rect.topLeft());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
painter -> restore();
|
||||
}
|
||||
|
||||
@@ -646,18 +649,18 @@ void BorderTitleBlock::drawDxf(
|
||||
}
|
||||
|
||||
QSettings settings;
|
||||
|
||||
|
||||
// draw the numbering of the columns
|
||||
// dessine la numerotation des colonnes
|
||||
if (display_border_ &&
|
||||
display_columns_) {
|
||||
int offset = settings.value("border-columns_0", true).toBool() ? -1 : 0;
|
||||
int offset = settings.value("border-columns_0", true).toBool() ? -1 : 0;
|
||||
for (int i = 1 ; i <= columns_count_ ; ++ i) {
|
||||
double xCoord = diagram_rect_.topLeft().x() * Createdxf::xScale +
|
||||
double xCoord = diagram_rect_.topLeft().x() * Createdxf::xScale +
|
||||
(rows_header_width_ + ((i - 1) *
|
||||
columns_width_));
|
||||
double yCoord = Createdxf::sheetHeight
|
||||
- diagram_rect_.topLeft().y()*Createdxf::yScale
|
||||
- diagram_rect_.topLeft().y()*Createdxf::yScale
|
||||
- columns_header_height_;
|
||||
double recWidth = columns_width_;
|
||||
double recHeight = columns_header_height_;
|
||||
@@ -665,18 +668,18 @@ void BorderTitleBlock::drawDxf(
|
||||
recWidth, recHeight, color);
|
||||
|
||||
Createdxf::drawTextAligned(file_path,
|
||||
QString::number(i + offset),
|
||||
xCoord+recWidth/4,
|
||||
yCoord + recHeight*0.5,
|
||||
QString::number(i + offset),
|
||||
xCoord+recWidth/4,
|
||||
yCoord + recHeight*0.5,
|
||||
recHeight*0.7,
|
||||
0,
|
||||
0,
|
||||
1,
|
||||
2,
|
||||
xCoord+recWidth/2,
|
||||
1,
|
||||
xCoord+recWidth/2,
|
||||
1,
|
||||
color);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// draw line numbering
|
||||
@@ -686,8 +689,8 @@ void BorderTitleBlock::drawDxf(
|
||||
for (int i = 1 ; i <= rows_count_ ; ++ i) {
|
||||
double xCoord = diagram_rect_.topLeft().x()
|
||||
* Createdxf::xScale;
|
||||
double yCoord = Createdxf::sheetHeight
|
||||
- diagram_rect_.topLeft().y()
|
||||
double yCoord = Createdxf::sheetHeight
|
||||
- diagram_rect_.topLeft().y()
|
||||
*Createdxf::yScale
|
||||
- (
|
||||
columns_header_height_
|
||||
@@ -700,15 +703,15 @@ void BorderTitleBlock::drawDxf(
|
||||
recWidth, recHeight, color);
|
||||
Createdxf::drawTextAligned(file_path,
|
||||
row_string,
|
||||
xCoord+recWidth*0.1,
|
||||
yCoord + recHeight*0.4,
|
||||
xCoord+recWidth*0.1,
|
||||
yCoord + recHeight*0.4,
|
||||
recWidth*0.7,
|
||||
0,
|
||||
0,
|
||||
1,
|
||||
2,
|
||||
xCoord+recWidth/2,
|
||||
1,
|
||||
1,
|
||||
color);
|
||||
row_string = incrementLetters(row_string);
|
||||
}
|
||||
@@ -869,11 +872,11 @@ DiagramPosition BorderTitleBlock::convertPosition(const QPointF &pos)
|
||||
QPointF relative_pos = pos - insideBorderRect().topLeft();
|
||||
int row_number = int(ceil(relative_pos.x() / columnsWidth()));
|
||||
int column_number = int(ceil(relative_pos.y() / rowsHeight()));
|
||||
|
||||
|
||||
QString letter = "A";
|
||||
for (int i = 1 ; i < column_number ; ++ i)
|
||||
letter = incrementLetters(letter);
|
||||
|
||||
|
||||
return(DiagramPosition(letter, row_number));
|
||||
}
|
||||
|
||||
@@ -931,11 +934,14 @@ void BorderTitleBlock::updateDiagramContextForTitleBlock(
|
||||
foreach (QString key, additional_fields_.keys()) {
|
||||
context.addValue(key, additional_fields_[key]);
|
||||
}
|
||||
|
||||
|
||||
// ... overridden by the historical and/or dynamically generated fields
|
||||
QLocale var;
|
||||
var.dateFormat(QLocale::ShortFormat);
|
||||
context.addValue("author", btb_author_);
|
||||
context.addValue("date", btb_date_.toString(
|
||||
Qt::SystemLocaleShortDate));
|
||||
context.addValue(
|
||||
"date",
|
||||
QLocale::system().toString(btb_date_, QLocale::ShortFormat));
|
||||
context.addValue("title", btb_title_);
|
||||
context.addValue("filename", btb_filename_);
|
||||
context.addValue("plant", btb_plant_);
|
||||
@@ -948,7 +954,7 @@ void BorderTitleBlock::updateDiagramContextForTitleBlock(
|
||||
context.addValue("auto_page_num", btb_auto_page_num_);
|
||||
context.addValue("previous-folio-num", m_previous_folio_num);
|
||||
context.addValue("next-folio-num", m_next_folio_num);
|
||||
|
||||
|
||||
m_titleblock_template_renderer -> setContext(context);
|
||||
}
|
||||
|
||||
@@ -1000,12 +1006,12 @@ void BorderTitleBlock::setFolioData(
|
||||
const QString& autonum,
|
||||
const DiagramContext &project_properties) {
|
||||
if (index < 1 || total < 1 || index > total) return;
|
||||
|
||||
|
||||
// memorize information
|
||||
// memorise les informations
|
||||
folio_index_ = index;
|
||||
folio_total_ = total;
|
||||
|
||||
|
||||
// regenerate the content of the folio field
|
||||
// regenere le contenu du champ folio
|
||||
btb_final_folio_ = btb_folio_;
|
||||
|
||||
@@ -1,24 +1,24 @@
|
||||
/*
|
||||
Copyright 2006-2020 The QElectroTech Team
|
||||
This file is part of QElectroTech.
|
||||
|
||||
|
||||
QElectroTech 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 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
|
||||
QElectroTech 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 QElectroTech. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#include "conductorproperties.h"
|
||||
#include <QPainter>
|
||||
#include <QMetaEnum>
|
||||
|
||||
#include <QRegularExpression>
|
||||
/**
|
||||
Constructeur par defaut
|
||||
*/
|
||||
@@ -70,7 +70,7 @@ void SingleLineProperties::draw(QPainter *painter,
|
||||
const QRectF &rect) {
|
||||
// s'il n'y a rien a dessiner, on retourne immediatement
|
||||
if (!hasNeutral && !hasGround && !phases) return;
|
||||
|
||||
|
||||
// prepare le QPainter
|
||||
painter -> save();
|
||||
QPen pen(painter -> pen());
|
||||
@@ -80,12 +80,12 @@ void SingleLineProperties::draw(QPainter *painter,
|
||||
pen.setWidthF(1);
|
||||
painter -> setPen(pen);
|
||||
painter -> setRenderHint(QPainter::Antialiasing, true);
|
||||
|
||||
|
||||
uint symbols_count = (hasNeutral ? 1 : 0) + (hasGround ? 1 : 0) - (isPen() ? 1 : 0) + phases;
|
||||
qreal interleave_base = (direction == QET::Horizontal ? rect.width() : rect.height());
|
||||
qreal interleave = interleave_base / (symbols_count + 1);;
|
||||
qreal symbol_width = interleave_base / 12;
|
||||
|
||||
|
||||
for (uint i = 1 ; i <= symbols_count ; ++ i) {
|
||||
// dessine le tronc du symbole
|
||||
QPointF symbol_p1, symbol_p2;
|
||||
@@ -97,7 +97,7 @@ void SingleLineProperties::draw(QPainter *painter,
|
||||
symbol_p1 = QPointF(rect.x() + rect.width() * 0.25, rect.y() + (i * interleave) + symbol_width);
|
||||
}
|
||||
painter -> drawLine(QLineF(symbol_p1, symbol_p2));
|
||||
|
||||
|
||||
// dessine le reste des symboles terre et neutre
|
||||
if (isPen()) {
|
||||
if (i == 1) {
|
||||
@@ -126,13 +126,13 @@ void SingleLineProperties::drawGround(QPainter *painter,
|
||||
QPointF center,
|
||||
qreal size) {
|
||||
painter -> save();
|
||||
|
||||
|
||||
// prepare le QPainter
|
||||
painter -> setRenderHint(QPainter::Antialiasing, false);
|
||||
QPen pen2(painter -> pen());
|
||||
pen2.setCapStyle(Qt::SquareCap);
|
||||
painter -> setPen(pen2);
|
||||
|
||||
|
||||
// dessine le segment representant la terre
|
||||
qreal half_size = size / 2.0;
|
||||
QPointF offset_point(
|
||||
@@ -145,7 +145,7 @@ void SingleLineProperties::drawGround(QPainter *painter,
|
||||
center - offset_point
|
||||
)
|
||||
);
|
||||
|
||||
|
||||
painter -> restore();
|
||||
}
|
||||
|
||||
@@ -161,11 +161,11 @@ void SingleLineProperties::drawNeutral(
|
||||
qreal size)
|
||||
{
|
||||
painter -> save();
|
||||
|
||||
|
||||
// prepare le QPainter
|
||||
if (painter -> brush() == Qt::NoBrush) painter -> setBrush(Qt::black);
|
||||
painter -> setPen(Qt::NoPen);
|
||||
|
||||
|
||||
// desine le cercle representant le neutre
|
||||
painter -> drawEllipse(
|
||||
QRectF(
|
||||
@@ -173,7 +173,7 @@ void SingleLineProperties::drawNeutral(
|
||||
QSizeF(size, size)
|
||||
)
|
||||
);
|
||||
|
||||
|
||||
painter -> restore();
|
||||
}
|
||||
|
||||
@@ -192,7 +192,7 @@ void SingleLineProperties::drawPen(QPainter *painter,
|
||||
QPointF center,
|
||||
qreal size) {
|
||||
painter -> save();
|
||||
|
||||
|
||||
//painter -> setBrush(Qt::white);
|
||||
// desine le cercle representant le neutre
|
||||
//painter -> drawEllipse(
|
||||
@@ -202,7 +202,7 @@ void SingleLineProperties::drawPen(QPainter *painter,
|
||||
// )
|
||||
//);
|
||||
drawNeutral(painter, center, size * 1.5);
|
||||
|
||||
|
||||
int offset = (size * 1.5 / 2.0);
|
||||
QPointF pos = center + (direction == QET::Horizontal ? QPointF(0.0, -offset - 0.5) : QPointF(offset + 0.5, 0.0));
|
||||
drawGround(painter, direction, pos, 2.0 * size);
|
||||
@@ -271,11 +271,11 @@ void ConductorProperties::toXml(QDomElement &e) const
|
||||
|
||||
if (color != QColor(Qt::black))
|
||||
e.setAttribute("color", color.name());
|
||||
|
||||
|
||||
e.setAttribute("bicolor", m_bicolor? "true" : "false");
|
||||
e.setAttribute("color2", m_color_2.name());
|
||||
e.setAttribute("dash-size", QString::number(m_dash_size));
|
||||
|
||||
|
||||
if (type == Single)
|
||||
singleLineProperties.toXml(e);
|
||||
|
||||
@@ -292,11 +292,11 @@ void ConductorProperties::toXml(QDomElement &e) const
|
||||
e.setAttribute("onetextperfolio", m_one_text_per_folio);
|
||||
e.setAttribute("vertirotatetext", QString::number(verti_rotate_text));
|
||||
e.setAttribute("horizrotatetext", QString::number(horiz_rotate_text));
|
||||
|
||||
|
||||
QMetaEnum me = QMetaEnum::fromType<Qt::Alignment>();
|
||||
e.setAttribute("horizontal-alignment", me.valueToKey(m_horizontal_alignment));
|
||||
e.setAttribute("vertical-alignment", me.valueToKey(m_vertical_alignment));
|
||||
|
||||
|
||||
QString conductor_style = writeStyle();
|
||||
if (!conductor_style.isEmpty())
|
||||
e.setAttribute("style", conductor_style);
|
||||
@@ -316,15 +316,15 @@ void ConductorProperties::fromXml(QDomElement &e)
|
||||
|
||||
QString bicolor_str = e.attribute("bicolor", "false");
|
||||
m_bicolor = bicolor_str == "true"? true : false;
|
||||
|
||||
|
||||
QColor xml_color_2 = QColor(e.attribute("color2"));
|
||||
m_color_2 = xml_color_2.isValid()? xml_color_2 : QColor(Qt::black);
|
||||
|
||||
|
||||
m_dash_size = e.attribute("dash-size", QString::number(1)).toInt();
|
||||
|
||||
|
||||
// read style of conductor
|
||||
readStyle(e.attribute("style"));
|
||||
|
||||
|
||||
if (e.attribute("type") == typeToString(Single))
|
||||
{
|
||||
// get specific properties for single conductor
|
||||
@@ -349,7 +349,7 @@ void ConductorProperties::fromXml(QDomElement &e)
|
||||
m_one_text_per_folio = e.attribute("onetextperfolio", QString::number(0)).toInt();
|
||||
verti_rotate_text = e.attribute("vertirotatetext").toDouble();
|
||||
horiz_rotate_text = e.attribute("horizrotatetext").toDouble();
|
||||
|
||||
|
||||
QMetaEnum me = QMetaEnum::fromType<Qt::Alignment>();
|
||||
m_horizontal_alignment = Qt::Alignment(
|
||||
me.keyToValue(
|
||||
@@ -396,7 +396,7 @@ void ConductorProperties::toSettings(QSettings &settings, const QString &prefix)
|
||||
settings.setValue(prefix + "onetextperfolio", m_one_text_per_folio);
|
||||
settings.setValue(prefix + "vertirotatetext", QString::number(verti_rotate_text));
|
||||
settings.setValue(prefix + "horizrotatetext", QString::number(horiz_rotate_text));
|
||||
|
||||
|
||||
QMetaEnum me = QMetaEnum::fromType<Qt::Alignment>();
|
||||
settings.setValue(prefix + "horizontal-alignment", me.valueToKey(m_horizontal_alignment));
|
||||
settings.setValue(prefix + "vertical-alignment", me.valueToKey(m_vertical_alignment));
|
||||
@@ -412,13 +412,13 @@ void ConductorProperties::fromSettings(QSettings &settings, const QString &prefi
|
||||
{
|
||||
QColor settings_color = QColor(settings.value(prefix + "color").toString());
|
||||
color = (settings_color.isValid()? settings_color : QColor(Qt::black));
|
||||
|
||||
|
||||
QColor settings_color_2 = QColor(settings.value(prefix + "color2").toString());
|
||||
m_color_2 = (settings_color_2.isValid()? settings_color_2 : QColor(Qt::black));
|
||||
|
||||
|
||||
m_bicolor = settings.value(prefix + "bicolor", false).toBool();
|
||||
m_dash_size = settings.value(prefix + "dash-size", 1).toInt();
|
||||
|
||||
|
||||
QString setting_type = settings.value(prefix + "type", typeToString(Multi)).toString();
|
||||
type = (setting_type == typeToString(Single)? Single : Multi);
|
||||
|
||||
@@ -438,11 +438,11 @@ void ConductorProperties::fromSettings(QSettings &settings, const QString &prefi
|
||||
m_one_text_per_folio = settings.value(prefix + "onetextperfolio", false).toBool();
|
||||
verti_rotate_text = settings.value((prefix + "vertirotatetext"), "270").toDouble();
|
||||
horiz_rotate_text = settings.value((prefix + "horizrotatetext"), "0").toDouble();
|
||||
|
||||
|
||||
QMetaEnum me = QMetaEnum::fromType<Qt::Alignment>();
|
||||
m_horizontal_alignment = Qt::Alignment(me.keyToValue(settings.value(prefix + "horizontal-alignment", "AlignBottom").toString().toStdString().data()));
|
||||
m_vertical_alignment = Qt::Alignment(me.keyToValue(settings.value(prefix + "vertical-alignment", "AlignRight").toString().toStdString().data()));
|
||||
|
||||
|
||||
readStyle(settings.value(prefix + "style").toString());
|
||||
}
|
||||
|
||||
@@ -468,7 +468,7 @@ QString ConductorProperties::typeToString(ConductorType t)
|
||||
void ConductorProperties::applyForEqualAttributes(QList<ConductorProperties> list)
|
||||
{
|
||||
const QList<ConductorProperties> clist = std::move(list);
|
||||
|
||||
|
||||
if (clist.isEmpty())
|
||||
return;
|
||||
|
||||
@@ -505,7 +505,7 @@ void ConductorProperties::applyForEqualAttributes(QList<ConductorProperties> lis
|
||||
int i_value;
|
||||
double d_value;
|
||||
Qt::Alignment align_value;
|
||||
|
||||
|
||||
//Color
|
||||
c_value = clist.first().color;
|
||||
for(ConductorProperties cp : clist)
|
||||
@@ -516,7 +516,7 @@ void ConductorProperties::applyForEqualAttributes(QList<ConductorProperties> lis
|
||||
if (equal)
|
||||
color = c_value;
|
||||
equal = true;
|
||||
|
||||
|
||||
//bicolor
|
||||
b_value = clist.first().m_bicolor;
|
||||
for(ConductorProperties cp : clist)
|
||||
@@ -527,7 +527,7 @@ void ConductorProperties::applyForEqualAttributes(QList<ConductorProperties> lis
|
||||
if (equal)
|
||||
m_bicolor = b_value;
|
||||
equal = true;
|
||||
|
||||
|
||||
//second color
|
||||
c_value = clist.first().m_color_2;
|
||||
for(ConductorProperties cp : clist)
|
||||
@@ -538,7 +538,7 @@ void ConductorProperties::applyForEqualAttributes(QList<ConductorProperties> lis
|
||||
if (equal)
|
||||
m_color_2 = c_value;
|
||||
equal = true;
|
||||
|
||||
|
||||
//Dash size
|
||||
i_value = clist.first().m_dash_size;
|
||||
for(ConductorProperties cp : clist)
|
||||
@@ -693,7 +693,7 @@ void ConductorProperties::applyForEqualAttributes(QList<ConductorProperties> lis
|
||||
if (equal)
|
||||
horiz_rotate_text = d_value;
|
||||
equal = true;
|
||||
|
||||
|
||||
//Text alignment for horizontal conducor
|
||||
align_value = clist.first().m_horizontal_alignment;
|
||||
for(ConductorProperties cp : clist)
|
||||
@@ -704,7 +704,7 @@ void ConductorProperties::applyForEqualAttributes(QList<ConductorProperties> lis
|
||||
if (equal)
|
||||
m_horizontal_alignment = align_value;
|
||||
equal = true;
|
||||
|
||||
|
||||
//Text alignment for vertical conducor
|
||||
align_value = clist.first().m_vertical_alignment;
|
||||
for(ConductorProperties cp : clist)
|
||||
@@ -778,9 +778,9 @@ bool ConductorProperties::operator!=(const ConductorProperties &other) const{
|
||||
*/
|
||||
void ConductorProperties::readStyle(const QString &style_string) {
|
||||
style = Qt::SolidLine; // style par defaut
|
||||
|
||||
|
||||
if (style_string.isEmpty()) return;
|
||||
|
||||
|
||||
// recupere la liste des couples style / valeur
|
||||
#if QT_VERSION < QT_VERSION_CHECK(5, 14, 0) // ### Qt 6: remove
|
||||
QStringList styles = style_string.split(";", QString::SkipEmptyParts);
|
||||
@@ -788,12 +788,13 @@ void ConductorProperties::readStyle(const QString &style_string) {
|
||||
#pragma message("@TODO remove code QString::SkipEmptyParts for QT 5.14 or later")
|
||||
QStringList styles = style_string.split(";", Qt::SkipEmptyParts);
|
||||
#endif
|
||||
|
||||
QRegExp rx("^\\s*([a-z-]+)\\s*:\\s*([a-z-]+)\\s*$");
|
||||
|
||||
QRegularExpression Rx("^\\s*([a-z-]+)\\s*:\\s*([a-z-]+)\\s*$");
|
||||
foreach (QString style_str, styles) {
|
||||
if (rx.exactMatch(style_str)) {
|
||||
QString style_name = rx.cap(1);
|
||||
QString style_value = rx.cap(2);
|
||||
if (Rx==QRegularExpression(style_str)) {
|
||||
|
||||
QString style_name = Rx.namedCaptureGroups().at(1);
|
||||
QString style_value = Rx.namedCaptureGroups().at(2);
|
||||
if (style_name == "line-style") {
|
||||
if (style_value == "dashed") style = Qt::DashLine;
|
||||
else if (style_value == "dashdotted") style = Qt::DashDotLine;
|
||||
|
||||
@@ -1,20 +1,26 @@
|
||||
/*
|
||||
Copyright 2006-2020 The QElectroTech Team
|
||||
This file is part of QElectroTech.
|
||||
|
||||
|
||||
QElectroTech 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 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
|
||||
QElectroTech 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 QElectroTech. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <QFontDialog>
|
||||
#include <QFont>
|
||||
#include <QSizePolicy>
|
||||
#include <utility>
|
||||
|
||||
#include "configpages.h"
|
||||
#include "borderpropertieswidget.h"
|
||||
#include "conductorpropertieswidget.h"
|
||||
@@ -27,10 +33,7 @@
|
||||
#include "qetproject.h"
|
||||
#include "reportproperties.h"
|
||||
#include "qetapp.h"
|
||||
#include <QFontDialog>
|
||||
#include <QFont>
|
||||
#include <QSizePolicy>
|
||||
#include <utility>
|
||||
#include "nameslist.h"
|
||||
|
||||
/**
|
||||
@brief NewDiagramPage::NewDiagramPage
|
||||
@@ -249,13 +252,13 @@ void NewDiagramPage::loadSavedTbp()
|
||||
ExportConfigPage::ExportConfigPage(QWidget *parent) : ConfigPage(parent) {
|
||||
// epw contient les options d'export
|
||||
epw = new ExportPropertiesWidget(ExportProperties::defaultExportProperties());
|
||||
|
||||
|
||||
// layout vertical contenant le titre, une ligne horizontale et epw
|
||||
QVBoxLayout *vlayout1 = new QVBoxLayout();
|
||||
|
||||
|
||||
QLabel *title = new QLabel(this -> title());
|
||||
vlayout1 -> addWidget(title);
|
||||
|
||||
|
||||
QFrame *horiz_line = new QFrame();
|
||||
horiz_line -> setFrameShape(QFrame::HLine);
|
||||
vlayout1 -> addWidget(horiz_line);
|
||||
@@ -300,13 +303,13 @@ PrintConfigPage::PrintConfigPage(QWidget *parent) : ConfigPage(parent) {
|
||||
// epw contient les options d'export
|
||||
epw = new ExportPropertiesWidget(ExportProperties::defaultPrintProperties());
|
||||
epw -> setPrintingMode(true);
|
||||
|
||||
|
||||
// layout vertical contenant le titre, une ligne horizontale et epw
|
||||
QVBoxLayout *vlayout1 = new QVBoxLayout();
|
||||
|
||||
|
||||
QLabel *title = new QLabel(this -> title());
|
||||
vlayout1 -> addWidget(title);
|
||||
|
||||
|
||||
QFrame *horiz_line = new QFrame();
|
||||
horiz_line -> setFrameShape(QFrame::HLine);
|
||||
vlayout1 -> addWidget(horiz_line);
|
||||
@@ -329,10 +332,10 @@ PrintConfigPage::~PrintConfigPage()
|
||||
void PrintConfigPage::applyConf()
|
||||
{
|
||||
QString prefix = "print/default";
|
||||
|
||||
|
||||
QSettings settings;
|
||||
epw -> exportProperties().toSettings(settings, prefix);
|
||||
|
||||
|
||||
// annule l'enregistrement de certaines proprietes non pertinentes
|
||||
settings.remove(prefix + "path");
|
||||
settings.remove(prefix + "format");
|
||||
|
||||
@@ -33,7 +33,6 @@ Createdxf::Createdxf()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
Createdxf::~Createdxf()
|
||||
{
|
||||
}
|
||||
@@ -438,32 +437,15 @@ int Createdxf::getcolorCode (const long red, const long green, const long blue)
|
||||
}
|
||||
return minndx;
|
||||
}
|
||||
|
||||
int Createdxf::dxfColor(QColor color) {
|
||||
return Createdxf::getcolorCode(color.red(), color.green(), color.blue());
|
||||
}
|
||||
|
||||
int Createdxf::dxfColor(QPen pen) {
|
||||
return Createdxf::dxfColor(pen.color());
|
||||
}
|
||||
|
||||
/**
|
||||
@brief Createdxf::drawLine
|
||||
Conveniance function to draw line
|
||||
@param filepath
|
||||
@param line
|
||||
@param colorcode
|
||||
*/
|
||||
void Createdxf::drawLine(
|
||||
const QString &filepath,
|
||||
const QLineF &line,
|
||||
const int &colorcode)
|
||||
{
|
||||
drawLine(filepath, line.p1().x() * xScale,
|
||||
sheetHeight - (line.p1().y() * yScale),
|
||||
line.p2().x() * xScale,
|
||||
sheetHeight - (line.p2().y() * yScale),
|
||||
colorcode);
|
||||
}
|
||||
|
||||
void Createdxf::drawArcEllipse(
|
||||
const QString &file_path,
|
||||
qreal x,
|
||||
@@ -611,26 +593,7 @@ void Createdxf::drawArcEllipse(
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@brief Createdxf::drawEllipse
|
||||
Conveniance function for draw ellipse
|
||||
@param filepath
|
||||
@param rect
|
||||
@param colorcode
|
||||
*/
|
||||
void Createdxf::drawEllipse(
|
||||
const QString &filepath,
|
||||
const QRectF &rect,
|
||||
const int &colorcode)
|
||||
{
|
||||
drawArcEllipse(
|
||||
filepath,
|
||||
rect.topLeft().x() * xScale,
|
||||
sheetHeight - (rect.topLeft().y() * yScale),
|
||||
rect.width() * xScale,
|
||||
rect.height() * yScale,
|
||||
0, 360, 0, 0, 0, colorcode);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
@brief Createdxf::drawRectangle
|
||||
@@ -655,44 +618,11 @@ void Createdxf::drawRectangle (
|
||||
drawPolyline(fileName,poly,colour,true);
|
||||
}
|
||||
|
||||
static QRectF scaleRect(QRectF rect)
|
||||
{
|
||||
QRectF ro(rect.bottomLeft().x() * Createdxf::xScale,
|
||||
Createdxf::sheetHeight - (rect.bottomLeft().y() * Createdxf::yScale),
|
||||
rect.width() * Createdxf::xScale,
|
||||
rect.height() * Createdxf::yScale);
|
||||
return ro;
|
||||
}
|
||||
|
||||
/**
|
||||
@brief Createdxf::drawRectangle
|
||||
Convenience function for draw rectangle
|
||||
@param filepath
|
||||
@param rect
|
||||
@param colorcode
|
||||
*/
|
||||
void Createdxf::drawRectangle(
|
||||
const QString &filepath,
|
||||
const QRectF &rect,
|
||||
const int &colorcode) {
|
||||
QPolygonF poly(scaleRect(rect));
|
||||
drawPolyline(filepath,poly,colorcode);
|
||||
}
|
||||
|
||||
/**
|
||||
@brief Createdxf::drawPolygon
|
||||
Convenience function for draw polygon
|
||||
@param filepath
|
||||
@param poly
|
||||
@param colorcode
|
||||
*/
|
||||
void Createdxf::drawPolygon(
|
||||
const QString &filepath,
|
||||
const QPolygonF &poly,
|
||||
const int &colorcode)
|
||||
{
|
||||
drawPolyline(filepath,poly,colorcode);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
@brief Createdxf::drawArc
|
||||
draw arc in dx format
|
||||
@@ -767,7 +697,7 @@ void Createdxf::drawText(
|
||||
double height,
|
||||
double rotation,
|
||||
int colour,
|
||||
double xScale)
|
||||
double xScaleW)
|
||||
{
|
||||
if (!fileName.isEmpty()) {
|
||||
QFile file(fileName);
|
||||
@@ -779,7 +709,7 @@ void Createdxf::drawText(
|
||||
errorFileOpen.exec();
|
||||
} else {
|
||||
QTextStream To_Dxf(&file);
|
||||
// Draw the circle
|
||||
// Draw the text
|
||||
To_Dxf << 0 << "\r\n";
|
||||
To_Dxf << "TEXT" << "\r\n";
|
||||
To_Dxf << 8 << "\r\n";
|
||||
@@ -795,7 +725,7 @@ void Createdxf::drawText(
|
||||
To_Dxf << 40 << "\r\n";
|
||||
To_Dxf << height << "\r\n"; // Text Height
|
||||
To_Dxf << 41 << "\r\n";
|
||||
To_Dxf << xScale << "\r\n"; // X Scale
|
||||
To_Dxf << xScaleW << "\r\n"; // X Scale
|
||||
To_Dxf << 1 << "\r\n";
|
||||
To_Dxf << text << "\r\n"; // Text Value
|
||||
To_Dxf << 50 << "\r\n";
|
||||
@@ -819,7 +749,7 @@ void Createdxf::drawTextAligned(
|
||||
int hAlign,
|
||||
int vAlign,
|
||||
double xAlign,
|
||||
double xScale,
|
||||
double xScaleW,
|
||||
int colour)
|
||||
{
|
||||
if (!fileName.isEmpty()) {
|
||||
@@ -848,7 +778,7 @@ void Createdxf::drawTextAligned(
|
||||
To_Dxf << 40 << "\r\n";
|
||||
To_Dxf << height << "\r\n"; // Text Height
|
||||
To_Dxf << 41 << "\r\n";
|
||||
To_Dxf << xScale << "\r\n"; // X Scale
|
||||
To_Dxf << xScaleW << "\r\n"; // X Scale
|
||||
To_Dxf << 1 << "\r\n";
|
||||
To_Dxf << text << "\r\n"; // Text Value
|
||||
To_Dxf << 50 << "\r\n";
|
||||
@@ -961,3 +891,158 @@ void Createdxf::drawPolyline(const QString &filepath,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* ================================================
|
||||
* Majority of calls above here are must be passed
|
||||
* parameters pre=scaled to DXF units
|
||||
* Calls below use Qt scaling, and re-scale them to DXF
|
||||
* ================================================
|
||||
*/
|
||||
/**
|
||||
@brief Createdxf::drawCircle
|
||||
draw circle in qt format
|
||||
@param fileName
|
||||
@param center
|
||||
@param radius
|
||||
@param colour
|
||||
*/
|
||||
void Createdxf::drawCircle(
|
||||
const QString& fileName,
|
||||
QPointF centre,
|
||||
double radius,
|
||||
int colour)
|
||||
{
|
||||
qreal x = centre.x() * xScale;
|
||||
qreal y = sheetHeight - centre.y() * yScale;
|
||||
qreal r = radius * xScale;
|
||||
drawCircle(fileName,r,x,y,colour);
|
||||
}
|
||||
|
||||
/**
|
||||
@brief Createdxf::drawLine
|
||||
Convenience function to draw line
|
||||
@param filepath
|
||||
@param line
|
||||
@param colorcode
|
||||
*/
|
||||
void Createdxf::drawLine(
|
||||
const QString &filepath,
|
||||
const QLineF &line,
|
||||
const int &colorcode)
|
||||
{
|
||||
drawLine(filepath, line.p1().x() * xScale,
|
||||
sheetHeight - (line.p1().y() * yScale),
|
||||
line.p2().x() * xScale,
|
||||
sheetHeight - (line.p2().y() * yScale),
|
||||
colorcode);
|
||||
}
|
||||
|
||||
/**
|
||||
@brief Createdxf::drawEllipse
|
||||
Conveniance function for draw ellipse
|
||||
@param filepath
|
||||
@param rect
|
||||
@param colorcode
|
||||
*/
|
||||
void Createdxf::drawEllipse(
|
||||
const QString &filepath,
|
||||
const QRectF &rect,
|
||||
const int &colorcode)
|
||||
{
|
||||
drawArcEllipse(
|
||||
filepath,
|
||||
rect.topLeft().x() * xScale,
|
||||
sheetHeight - (rect.topLeft().y() * yScale),
|
||||
rect.width() * xScale,
|
||||
rect.height() * yScale,
|
||||
0, 360, 0, 0, 0, colorcode);
|
||||
}
|
||||
|
||||
/**
|
||||
@brief Createdxf::drawRectangle
|
||||
Convenience function for draw rectangle
|
||||
@param filepath
|
||||
@param rect
|
||||
@param colorcode
|
||||
*/
|
||||
void Createdxf::drawRectangle(
|
||||
const QString &filepath,
|
||||
const QRectF &rect,
|
||||
const int &colorcode) {
|
||||
//QPolygonF poly(scaleRect(rect));
|
||||
QPolygonF poly(rect);
|
||||
drawPolyline(filepath,poly,colorcode);
|
||||
}
|
||||
|
||||
/**
|
||||
@brief Createdxf::drawPolygon
|
||||
Convenience function for draw polygon
|
||||
@param filepath
|
||||
@param poly
|
||||
@param colorcode
|
||||
*/
|
||||
void Createdxf::drawPolygon(
|
||||
const QString &filepath,
|
||||
const QPolygonF &poly,
|
||||
const int &colorcode)
|
||||
{
|
||||
QPolygonF pg = poly;
|
||||
if(!poly.isClosed()) {
|
||||
pg << poly.at(0); // Close it
|
||||
}
|
||||
drawPolyline(filepath,pg,colorcode);
|
||||
}
|
||||
|
||||
/**
|
||||
@brief Createdxf::drawText
|
||||
draw simple text in dxf format without any alignment specified
|
||||
@param fileName
|
||||
@param text
|
||||
@param point
|
||||
@param height
|
||||
@param rotation
|
||||
@param colour
|
||||
@param xScaleW=1
|
||||
*/
|
||||
void Createdxf::drawText(
|
||||
const QString& fileName,
|
||||
const QString& text,
|
||||
QPointF point,
|
||||
double height,
|
||||
double rotation,
|
||||
int colour,
|
||||
double xScaleW)
|
||||
{
|
||||
qreal x = point.x() * xScale;
|
||||
qreal y = sheetHeight - (point.y() * yScale);
|
||||
drawText(fileName,text,x,y,height * yScale,rotation,colour,xScaleW);
|
||||
}
|
||||
void Createdxf::drawArcEllipse(
|
||||
const QString &file_path,
|
||||
QRectF rect,
|
||||
qreal startAngle,
|
||||
qreal spanAngle,
|
||||
QPointF hotspot,
|
||||
qreal rotation_angle,
|
||||
const int &colorcode)
|
||||
{
|
||||
qreal x = rect.x() * xScale;
|
||||
qreal y = sheetHeight - rect.y() * yScale;
|
||||
qreal w = rect.width() * xScale;
|
||||
qreal h = rect.height() * yScale;
|
||||
qreal hotspot_x = hotspot.x() * xScale;
|
||||
qreal hotspot_y = sheetHeight - hotspot.y() * yScale;
|
||||
drawArcEllipse(file_path,x,y,w,h,startAngle,spanAngle,hotspot_x,hotspot_y,rotation_angle,colorcode);
|
||||
}
|
||||
|
||||
/*
|
||||
* Utility functions
|
||||
*/
|
||||
static QRectF scaleRect(QRectF rect)
|
||||
{
|
||||
QRectF ro(rect.bottomLeft().x() * Createdxf::xScale,
|
||||
Createdxf::sheetHeight - (rect.bottomLeft().y() * Createdxf::yScale),
|
||||
rect.width() * Createdxf::xScale,
|
||||
rect.height() * Createdxf::yScale);
|
||||
return ro;
|
||||
}
|
||||
|
||||
@@ -39,6 +39,13 @@ class Createdxf
|
||||
double,
|
||||
double,
|
||||
int);
|
||||
|
||||
static void drawCircle(
|
||||
const QString& ,
|
||||
QPointF,
|
||||
double,
|
||||
int );
|
||||
|
||||
static void drawArc(
|
||||
const QString&,
|
||||
double x,
|
||||
@@ -62,6 +69,15 @@ class Createdxf
|
||||
qreal rotation_angle,
|
||||
const int &colorcode);
|
||||
|
||||
static void drawArcEllipse(
|
||||
const QString &file_path,
|
||||
QRectF rect,
|
||||
qreal startAngle,
|
||||
qreal spanAngle,
|
||||
QPointF hotspot,
|
||||
qreal rotation_angle,
|
||||
const int &colorcode);
|
||||
|
||||
static void drawEllipse (const QString &filepath,
|
||||
const QRectF &rect,
|
||||
const int &colorcode);
|
||||
@@ -103,6 +119,14 @@ class Createdxf
|
||||
double,
|
||||
int,
|
||||
double xScale=1.0);
|
||||
static void drawText(
|
||||
const QString&,
|
||||
const QString&,
|
||||
QPointF,
|
||||
double,
|
||||
double,
|
||||
int,
|
||||
double xScale=1.0);
|
||||
static void drawTextAligned(
|
||||
const QString& fileName,
|
||||
const QString& text,
|
||||
|
||||
@@ -24,6 +24,7 @@
|
||||
#include "diagramposition.h"
|
||||
|
||||
#include <QSqlError>
|
||||
#include <QLocale>
|
||||
|
||||
#if defined(Q_OS_LINUX) || defined(Q_OS_WINDOWS)
|
||||
#include <QSqlDriver>
|
||||
@@ -161,7 +162,11 @@ void projectDataBase::addDiagram(Diagram *diagram)
|
||||
for (auto key : QETApp::diagramInfoKeys())
|
||||
{
|
||||
if (key == "date") {
|
||||
m_insert_diagram_info_query.bindValue(":date", QDate::fromString(infos.value("date").toString(), Qt::SystemLocaleShortDate));
|
||||
m_insert_diagram_info_query.bindValue(
|
||||
":date",
|
||||
QLocale::system().toString(
|
||||
infos.value("date").toDate(),
|
||||
QLocale::ShortFormat));
|
||||
} else {
|
||||
auto value = infos.value(key);
|
||||
auto bind = key.prepend(":");
|
||||
@@ -419,7 +424,11 @@ void projectDataBase::populateDiagramInfoTable()
|
||||
for (auto key : QETApp::diagramInfoKeys())
|
||||
{
|
||||
if (key == "date") {
|
||||
m_insert_diagram_info_query.bindValue(":date", QDate::fromString(infos.value("date").toString(), Qt::SystemLocaleShortDate));
|
||||
m_insert_diagram_info_query.bindValue(
|
||||
":date",
|
||||
QLocale::system().toString(
|
||||
infos.value("date").toDate(),
|
||||
QLocale::ShortFormat));
|
||||
} else {
|
||||
auto value = infos.value(key);
|
||||
auto bind = key.prepend(":");
|
||||
@@ -521,7 +530,7 @@ sqlite3 *projectDataBase::sqliteHandle(QSqlDatabase *db)
|
||||
{
|
||||
//sqlite 3 lib isn't availlable for the moment on macosx
|
||||
//need some help to add sqlite3 lib on macosx compilation
|
||||
#if Q_OS_MACOS
|
||||
#ifdef Q_OS_MACOS
|
||||
return nullptr;
|
||||
#else
|
||||
sqlite3 *handle = nullptr;
|
||||
@@ -553,7 +562,9 @@ void projectDataBase::exportDb(projectDataBase *db,
|
||||
if (caption_.isEmpty()) {
|
||||
caption_ = tr("Exporter la base de données interne du projet");
|
||||
}
|
||||
|
||||
#ifdef Q_OS_MACOS
|
||||
return;
|
||||
#else
|
||||
auto dir_ = dir;
|
||||
if(dir_.isEmpty()) {
|
||||
dir_ = db->project()->filePath();
|
||||
@@ -593,4 +604,5 @@ void projectDataBase::exportDb(projectDataBase *db,
|
||||
file_db.close();
|
||||
}
|
||||
QSqlDatabase::removeDatabase(connection_name);
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -20,6 +20,7 @@
|
||||
|
||||
#include <QWidget>
|
||||
#include <QButtonGroup>
|
||||
#include <QHash>
|
||||
|
||||
class QListWidgetItem;
|
||||
|
||||
|
||||
@@ -1,24 +1,25 @@
|
||||
/*
|
||||
Copyright 2006-2020 The QElectroTech Team
|
||||
This file is part of QElectroTech.
|
||||
|
||||
|
||||
QElectroTech 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 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
|
||||
QElectroTech 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 QElectroTech. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#include "diagramcontext.h"
|
||||
#include <QRegExp>
|
||||
#include "qet.h"
|
||||
#include <QDebug>
|
||||
#include <QRegularExpression>
|
||||
#include <QRegularExpressionMatch>
|
||||
|
||||
/**
|
||||
@brief DiagramContext::add
|
||||
@@ -241,8 +242,9 @@ bool DiagramContext::stringLongerThan(const QString &a, const QString &b) {
|
||||
*/
|
||||
bool DiagramContext::keyIsAcceptable(const QString &key) const
|
||||
{
|
||||
QRegExp re(DiagramContext::validKeyRegExp());
|
||||
return(re.exactMatch(key));
|
||||
QRegularExpression re(DiagramContext::validKeyRegExp());
|
||||
QRegularExpressionMatch match =re.match(key);
|
||||
return match.hasMatch();
|
||||
}
|
||||
|
||||
QDebug operator <<(QDebug debug, const DiagramContext &context)
|
||||
|
||||
@@ -1,17 +1,17 @@
|
||||
/*
|
||||
Copyright 2006-2020 The QElectroTech Team
|
||||
This file is part of QElectroTech.
|
||||
|
||||
|
||||
QElectroTech 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 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
|
||||
QElectroTech 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 QElectroTech. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
@@ -29,7 +29,7 @@
|
||||
DiagramPosition::DiagramPosition(const QString &letter, unsigned int number) {
|
||||
// purifie les lettres
|
||||
letter_ = letter.toUpper();
|
||||
letter_.remove(QRegExp("[^A-Z]"));
|
||||
letter_.remove(QRegularExpression("[^A-Z]"));
|
||||
number_ = number;
|
||||
}
|
||||
|
||||
@@ -64,7 +64,7 @@ QString DiagramPosition::toString()
|
||||
return("-");
|
||||
}
|
||||
QSettings settings;
|
||||
|
||||
|
||||
if (settings.value("border-columns_0", true).toBool()){
|
||||
return(QString("%1%2").arg(letter_).arg(number_ - 1));
|
||||
}else{
|
||||
|
||||
@@ -1,17 +1,17 @@
|
||||
/*
|
||||
Copyright 2006-2020 The QElectroTech Team
|
||||
This file is part of QElectroTech.
|
||||
|
||||
|
||||
QElectroTech 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 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
|
||||
QElectroTech 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 QElectroTech. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
@@ -19,7 +19,6 @@
|
||||
#define DIAGRAM_POSITION_H
|
||||
#include <QPointF>
|
||||
#include <QString>
|
||||
#include <QRegExp>
|
||||
/**
|
||||
This class stores the position of an electrical element on its parent diagram.
|
||||
While exact coordinates can be stored for convenience, the concept of diagram
|
||||
@@ -31,7 +30,7 @@ class DiagramPosition {
|
||||
public:
|
||||
DiagramPosition(const QString & = "", unsigned int = 0);
|
||||
virtual ~DiagramPosition();
|
||||
|
||||
|
||||
// methods
|
||||
public:
|
||||
QPointF position() const;
|
||||
@@ -40,7 +39,7 @@ class DiagramPosition {
|
||||
bool isOutOfBounds() const;
|
||||
unsigned int number()const {return number_;}
|
||||
QString letter()const {return letter_;}
|
||||
|
||||
|
||||
// attributes
|
||||
private:
|
||||
QString letter_;
|
||||
|
||||
@@ -1,17 +1,17 @@
|
||||
/*
|
||||
Copyright 2006-2020 The QElectroTech Team
|
||||
This file is part of QElectroTech.
|
||||
|
||||
|
||||
QElectroTech 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 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
|
||||
QElectroTech 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 QElectroTech. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
@@ -38,7 +38,7 @@ DiagramPrintDialog::DiagramPrintDialog(QETProject *project, QWidget *parent) :
|
||||
{
|
||||
// initialise l'imprimante
|
||||
printer_ = new QPrinter();
|
||||
|
||||
|
||||
// orientation paysage par defaut
|
||||
printer_ -> setOrientation(QPrinter::Landscape);
|
||||
backup_diagram_background_color = Diagram::background_color;
|
||||
@@ -95,16 +95,16 @@ QRect DiagramPrintDialog::diagramRect(Diagram *diagram,
|
||||
const ExportProperties &options) const
|
||||
{
|
||||
if (!diagram) return(QRect());
|
||||
|
||||
|
||||
QRectF diagram_rect = diagram -> border_and_titleblock.borderAndTitleBlockRect();
|
||||
if (!options.draw_titleblock) {
|
||||
qreal titleblock_height = diagram -> border_and_titleblock.titleBlockRect().height();
|
||||
diagram_rect.setHeight(diagram_rect.height() - titleblock_height);
|
||||
}
|
||||
|
||||
|
||||
// ajuste la bordure du schema d'un pixel (epaisseur du trait)
|
||||
diagram_rect = diagram_rect.adjusted(0.0, 0.0, 1.0, 1.0);
|
||||
|
||||
|
||||
return(diagram_rect.toAlignedRect());
|
||||
}
|
||||
|
||||
@@ -113,16 +113,16 @@ QRect DiagramPrintDialog::diagramRect(Diagram *diagram,
|
||||
*/
|
||||
void DiagramPrintDialog::exec()
|
||||
{
|
||||
|
||||
|
||||
// prise en compte du nom du document
|
||||
if (!doc_name_.isEmpty()) printer_ -> setDocName(doc_name_);
|
||||
printer_ -> setCreator(QString("QElectroTech %1").arg(QET::displayedVersion));
|
||||
|
||||
|
||||
// affichage d'un premier dialogue demandant a l'utilisateur le type
|
||||
// d'impression qu'il souhaite effectuer
|
||||
buildPrintTypeDialog();
|
||||
if (dialog_ -> exec() == QDialog::Rejected) return;
|
||||
|
||||
|
||||
// parametrage de l'imprimante en fonction du type d'impression choisi
|
||||
if (printer_choice_ -> isChecked()) {
|
||||
// affichage du dialogue d'impression standard pour parametrer l'imprimante
|
||||
@@ -141,7 +141,7 @@ void DiagramPrintDialog::exec()
|
||||
}
|
||||
|
||||
loadPageSetupForCurrentPrinter();
|
||||
|
||||
|
||||
//Preview before print
|
||||
#if defined Q_OS_LINUX
|
||||
//Due to some bug with xfwm, we display this dialog has a windows on linux os (X11)
|
||||
@@ -159,9 +159,9 @@ void DiagramPrintDialog::exec()
|
||||
DiagramsChooser *dc = preview_dialog.diagramsChooser();
|
||||
dc -> setSelectedAllDiagrams();
|
||||
if (preview_dialog.exec() == QDialog::Rejected) return;
|
||||
|
||||
|
||||
savePageSetupForCurrentPrinter();
|
||||
|
||||
|
||||
// effectue l'impression en elle-meme
|
||||
print(
|
||||
dc -> selectedDiagrams(),
|
||||
@@ -194,7 +194,7 @@ int DiagramPrintDialog::horizontalPagesCount(Diagram *diagram, const ExportPrope
|
||||
// note : pageRect et Paper Rect tiennent compte de l'orientation du papier
|
||||
QRect printable_area = fullpage ? printer_ -> paperRect() : printer_ -> pageRect();
|
||||
QRect diagram_rect = diagramRect(diagram, options);
|
||||
|
||||
|
||||
int h_pages_count = int(ceil(qreal(diagram_rect.width()) / qreal(printable_area.width())));
|
||||
return(h_pages_count);
|
||||
}
|
||||
@@ -211,7 +211,7 @@ int DiagramPrintDialog::verticalPagesCount(Diagram *diagram, const ExportPropert
|
||||
// note : pageRect et Paper Rect tiennent compte de l'orientation du papier
|
||||
QRect printable_area = fullpage ? printer_ -> paperRect() : printer_ -> pageRect();
|
||||
QRect diagram_rect = diagramRect(diagram, options);
|
||||
|
||||
|
||||
int v_pages_count = int(ceil(qreal(diagram_rect.height()) / qreal(printable_area.height())));
|
||||
return(v_pages_count);
|
||||
}
|
||||
@@ -227,7 +227,7 @@ void DiagramPrintDialog::buildPrintTypeDialog()
|
||||
#ifdef Q_OS_MACOS
|
||||
dialog_ -> setWindowFlags(Qt::Sheet);
|
||||
#endif
|
||||
|
||||
|
||||
printtype_label_ = new QLabel(tr("Quel type d'impression désirez-vous effectuer ?"));
|
||||
printer_icon_ = new QLabel();
|
||||
pdf_icon_ = new QLabel();
|
||||
@@ -239,7 +239,7 @@ void DiagramPrintDialog::buildPrintTypeDialog()
|
||||
filepath_field_ = new QLineEdit();
|
||||
browse_button_ = new QPushButton("...");
|
||||
buttons_ = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel);
|
||||
|
||||
|
||||
dialog_ -> setWindowTitle(tr("Choix du type d'impression"));
|
||||
printer_icon_ -> setPixmap(QET::Icons::Printer.pixmap(32, 32));
|
||||
pdf_icon_ -> setPixmap(QET::Icons::PDF.pixmap(32, 32));
|
||||
@@ -249,19 +249,19 @@ void DiagramPrintDialog::buildPrintTypeDialog()
|
||||
|
||||
printer_choice_ -> setChecked(true);
|
||||
if (!file_name_.isEmpty()) filepath_field_ -> setText(file_name_ + ".pdf");
|
||||
|
||||
|
||||
// connexions signaux / slots
|
||||
connect(printer_choice_, SIGNAL(toggled(bool)), this, SLOT(updatePrintTypeDialog()));
|
||||
connect(pdf_choice_, SIGNAL(toggled(bool)), this, SLOT(updatePrintTypeDialog()));
|
||||
connect(browse_button_, SIGNAL(clicked(bool)), this, SLOT(browseFilePrintTypeDialog()));
|
||||
connect(buttons_, SIGNAL(accepted()), this, SLOT(acceptPrintTypeDialog()));
|
||||
connect(buttons_, SIGNAL(rejected()), dialog_, SLOT(reject()));
|
||||
|
||||
|
||||
// organisation graphique
|
||||
glayout0_ = new QGridLayout();
|
||||
hlayout0_ = new QHBoxLayout();
|
||||
vlayout0_ = new QVBoxLayout();
|
||||
|
||||
|
||||
hlayout0_ -> addWidget(filepath_field_);
|
||||
hlayout0_ -> addWidget(browse_button_);
|
||||
glayout0_ -> addWidget(printer_icon_, 0, 0);
|
||||
@@ -269,13 +269,13 @@ void DiagramPrintDialog::buildPrintTypeDialog()
|
||||
glayout0_ -> addWidget(pdf_icon_, 1, 0);
|
||||
glayout0_ -> addWidget(pdf_choice_, 1, 1);
|
||||
glayout0_ -> addLayout(hlayout0_, 3, 1);
|
||||
|
||||
|
||||
vlayout0_ -> addWidget(printtype_label_);
|
||||
vlayout0_ -> addLayout(glayout0_);
|
||||
vlayout0_ -> addWidget(buttons_);
|
||||
|
||||
|
||||
dialog_ -> setLayout(vlayout0_);
|
||||
|
||||
|
||||
updatePrintTypeDialog();
|
||||
}
|
||||
|
||||
@@ -286,11 +286,11 @@ void DiagramPrintDialog::updatePrintTypeDialog()
|
||||
{
|
||||
// imprime-t-on vers un fichier ?
|
||||
bool file_print = !(printer_choice_ -> isChecked());
|
||||
|
||||
|
||||
// on n'active le champ fichier que pour les impressions vers un fichier
|
||||
filepath_field_ -> setEnabled(file_print);
|
||||
browse_button_ -> setEnabled(file_print);
|
||||
|
||||
|
||||
// on corrige eventuellement l'extension du fichier deja selectionne
|
||||
if (file_print)
|
||||
{
|
||||
@@ -299,7 +299,9 @@ void DiagramPrintDialog::updatePrintTypeDialog()
|
||||
{
|
||||
if (pdf_choice_ -> isChecked() && filepath.endsWith(".ps"))
|
||||
{
|
||||
QRegExp re("\\.ps$", Qt::CaseInsensitive);
|
||||
QRegularExpression re
|
||||
("\\.ps$",
|
||||
QRegularExpression::CaseInsensitiveOption);
|
||||
filepath.replace(re, ".pdf");
|
||||
filepath_field_ -> setText(filepath);
|
||||
}
|
||||
@@ -331,7 +333,7 @@ void DiagramPrintDialog::acceptPrintTypeDialog()
|
||||
}
|
||||
|
||||
/**
|
||||
Permet a l'utilisateur de choisir un fichier
|
||||
Permet a l'utilisateur de choisir un fichier
|
||||
*/
|
||||
void DiagramPrintDialog::browseFilePrintTypeDialog()
|
||||
{
|
||||
@@ -343,14 +345,14 @@ void DiagramPrintDialog::browseFilePrintTypeDialog()
|
||||
extension = ".pdf";
|
||||
filter = tr("Fichiers PDF (*.pdf)", "file filter");
|
||||
}
|
||||
|
||||
|
||||
QString filepath = QFileDialog::getSaveFileName(
|
||||
parentWidget(),
|
||||
QString(),
|
||||
filepath_field_ -> text(),
|
||||
filter
|
||||
);
|
||||
|
||||
|
||||
if (!filepath.isEmpty()) {
|
||||
if (!filepath.endsWith(extension)) filepath += extension;
|
||||
filepath = QDir::toNativeSeparators(QDir::cleanPath(filepath));
|
||||
@@ -390,13 +392,13 @@ void DiagramPrintDialog::print(const QList<Diagram *> &diagrams,
|
||||
#endif
|
||||
// QPainter utiliser pour effectuer le rendu
|
||||
QPainter qp(printer_);
|
||||
|
||||
|
||||
// cas special : il n'y a aucun schema a imprimer
|
||||
if (!diagrams.count()) {
|
||||
qp.end();
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
// imprime les schemas
|
||||
for (int i = 0 ; i < diagrams.count() ; ++ i) {
|
||||
printDiagram(diagrams[i], fit_page, options, &qp, printer_);
|
||||
@@ -422,18 +424,18 @@ void DiagramPrintDialog::printDiagram(Diagram *diagram,
|
||||
//qDebug() << printer -> paperSize() << printer -> paperRect() << diagram -> title();
|
||||
// l'imprimante utilise-t-elle toute la feuille ?
|
||||
bool full_page = printer -> fullPage();
|
||||
|
||||
|
||||
// impression physique (!= fichier PDF)
|
||||
if (printer -> outputFileName().isEmpty()) {
|
||||
// utiliser cette condition pour agir differemment en cas d'impression physique
|
||||
}
|
||||
|
||||
|
||||
saveReloadDiagramParameters(diagram, options, true);
|
||||
|
||||
|
||||
// deselectionne tous les elements
|
||||
QList<QGraphicsItem *> selected_elmts = diagram -> selectedItems();
|
||||
foreach (QGraphicsItem *qgi, selected_elmts) qgi -> setSelected(false);
|
||||
|
||||
|
||||
// enleve le flag focusable de tous les elements concernes pour eviter toute reprise de focus par un champ de texte editable
|
||||
QList<QGraphicsItem *> focusable_items;
|
||||
foreach (QGraphicsItem *qgi, diagram -> items()) {
|
||||
@@ -442,12 +444,12 @@ void DiagramPrintDialog::printDiagram(Diagram *diagram,
|
||||
qgi -> setFlag(QGraphicsItem::ItemIsFocusable, false);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// evite toute autre forme d'interaction
|
||||
foreach (QGraphicsView *view, diagram -> views()) {
|
||||
view -> setInteractive(false);
|
||||
}
|
||||
|
||||
|
||||
QRect diagram_rect = diagramRect(diagram, options);
|
||||
if (fit_page) {
|
||||
// impression adaptee sur une seule page
|
||||
@@ -458,19 +460,19 @@ void DiagramPrintDialog::printDiagram(Diagram *diagram,
|
||||
//qDebug() << "impression sur une ou plusieurs pages";
|
||||
//qDebug() << " schema :" << diagram_rect;
|
||||
//qDebug() << " page :" << printed_area;
|
||||
|
||||
|
||||
int used_width = printed_area.width();
|
||||
int used_height = printed_area.height();
|
||||
int h_pages_count = horizontalPagesCount(diagram, options, full_page);
|
||||
int v_pages_count = verticalPagesCount(diagram, options, full_page);
|
||||
|
||||
|
||||
QVector< QVector< QRect > > pages_grid;
|
||||
// le schema est imprime sur une matrice de feuilles
|
||||
// parcourt les lignes de la matrice
|
||||
int y_offset = 0;
|
||||
for (int i = 0 ; i < v_pages_count ; ++ i) {
|
||||
pages_grid << QVector< QRect >();
|
||||
|
||||
|
||||
// parcourt les feuilles de la ligne
|
||||
int x_offset = 0;
|
||||
for (int j = 0 ; j < h_pages_count ; ++ j) {
|
||||
@@ -483,10 +485,10 @@ void DiagramPrintDialog::printDiagram(Diagram *diagram,
|
||||
);
|
||||
x_offset += used_width;
|
||||
}
|
||||
|
||||
|
||||
y_offset += used_height;
|
||||
}
|
||||
|
||||
|
||||
// ne retient que les pages a imprimer
|
||||
QVector<QRect> pages_to_print;
|
||||
for (int i = 0 ; i < v_pages_count ; ++ i) {
|
||||
@@ -495,7 +497,7 @@ void DiagramPrintDialog::printDiagram(Diagram *diagram,
|
||||
}
|
||||
}
|
||||
//qDebug() << " " << pages_to_print.count() << " pages a imprimer :";
|
||||
|
||||
|
||||
// parcourt les pages pour impression
|
||||
for (int i = 0 ; i < pages_to_print.count() ; ++ i) {
|
||||
QRect current_rect(pages_to_print.at(i));
|
||||
@@ -511,20 +513,20 @@ void DiagramPrintDialog::printDiagram(Diagram *diagram,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// remet en place les interactions
|
||||
foreach (QGraphicsView *view, diagram -> views()) {
|
||||
view -> setInteractive(true);
|
||||
}
|
||||
|
||||
|
||||
// restaure les flags focusable
|
||||
foreach (QGraphicsItem *qgi, focusable_items) {
|
||||
qgi -> setFlag(QGraphicsItem::ItemIsFocusable, true);
|
||||
}
|
||||
|
||||
|
||||
// restaure les elements selectionnes
|
||||
foreach (QGraphicsItem *qgi, selected_elmts) qgi -> setSelected(true);
|
||||
|
||||
|
||||
saveReloadDiagramParameters(diagram, options, false);
|
||||
}
|
||||
|
||||
@@ -537,7 +539,7 @@ void DiagramPrintDialog::printDiagram(Diagram *diagram,
|
||||
*/
|
||||
void DiagramPrintDialog::saveReloadDiagramParameters(Diagram *diagram, const ExportProperties& options, bool save) {
|
||||
static ExportProperties state_exportProperties;
|
||||
|
||||
|
||||
if (save) {
|
||||
// memorise les parametres relatifs au schema tout en appliquant les nouveaux
|
||||
state_exportProperties = diagram -> applyProperties(options);
|
||||
@@ -556,11 +558,11 @@ void DiagramPrintDialog::savePageSetupForCurrentPrinter()
|
||||
{
|
||||
QSettings settings;
|
||||
QString printer_section = settingsSectionName(printer_);
|
||||
|
||||
|
||||
while (!settings.group().isEmpty()) settings.endGroup();
|
||||
settings.beginGroup("printers");
|
||||
settings.beginGroup(printer_section);
|
||||
|
||||
|
||||
settings.setValue("orientation", printer_ -> orientation() == QPrinter::Portrait ? "portrait" : "landscape");
|
||||
settings.setValue("papersize", int(printer_ -> paperSize()));
|
||||
if (printer_ -> paperSize() == QPrinter::Custom) {
|
||||
@@ -592,14 +594,14 @@ void DiagramPrintDialog::loadPageSetupForCurrentPrinter()
|
||||
{
|
||||
QSettings settings;
|
||||
QString printer_section = settingsSectionName(printer_);
|
||||
|
||||
|
||||
while (!settings.group().isEmpty()) settings.endGroup();
|
||||
settings.beginGroup("printers");
|
||||
if (!settings.childGroups().contains(printer_section)) {
|
||||
settings.endGroup();
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
settings.beginGroup(printer_section);
|
||||
if (settings.contains("orientation")) {
|
||||
QString value = settings.value("orientation", "landscape").toString();
|
||||
@@ -618,7 +620,7 @@ void DiagramPrintDialog::loadPageSetupForCurrentPrinter()
|
||||
printer_ -> setPaperSize(static_cast<QPrinter::PaperSize>(value));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
qreal margins[4];
|
||||
printer_ -> getPageMargins(&margins[0], &margins[1], &margins[2], &margins[3], QPrinter::Millimeter);
|
||||
QStringList margins_names(QStringList() << "left" << "top" << "right" << "bottom");
|
||||
@@ -629,7 +631,7 @@ void DiagramPrintDialog::loadPageSetupForCurrentPrinter()
|
||||
}
|
||||
printer_ -> setPageMargins(margins[0], margins[1], margins[2], margins[3], QPrinter::Millimeter);
|
||||
printer_ -> setFullPage(settings.value("fullpage", "false").toString() == "true");
|
||||
|
||||
|
||||
settings.endGroup();
|
||||
settings.endGroup();
|
||||
}
|
||||
|
||||
@@ -1,17 +1,17 @@
|
||||
/*
|
||||
Copyright 2006-2020 The QElectroTech Team
|
||||
This file is part of QElectroTech.
|
||||
|
||||
|
||||
QElectroTech 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 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
|
||||
QElectroTech 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 QElectroTech. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
@@ -19,6 +19,8 @@
|
||||
#include "elementscene.h"
|
||||
#include "QPropertyUndoCommand/qpropertyundocommand.h"
|
||||
|
||||
#include <QRegularExpression>
|
||||
|
||||
/**
|
||||
@brief CustomElementGraphicPart::CustomElementGraphicPart
|
||||
Default constructor.
|
||||
@@ -162,13 +164,13 @@ void CustomElementGraphicPart::setAntialiased(const bool b)
|
||||
void CustomElementGraphicPart::stylesToXml(QDomElement &qde) const
|
||||
{
|
||||
QString css_like_styles;
|
||||
|
||||
|
||||
css_like_styles += "line-style:";
|
||||
if (_linestyle == DashedStyle) css_like_styles += "dashed";
|
||||
else if (_linestyle == DottedStyle) css_like_styles += "dotted";
|
||||
else if (_linestyle == DashdottedStyle) css_like_styles += "dashdotted";
|
||||
else if (_linestyle == NormalStyle) css_like_styles += "normal";
|
||||
|
||||
|
||||
css_like_styles += ";line-weight:";
|
||||
if (_lineweight == NoneWeight) css_like_styles += "none";
|
||||
else if (_lineweight == ThinWeight) css_like_styles += "thin";
|
||||
@@ -508,7 +510,7 @@ void CustomElementGraphicPart::stylesToXml(QDomElement &qde) const
|
||||
void CustomElementGraphicPart::stylesFromXml(const QDomElement &qde)
|
||||
{
|
||||
resetStyles();
|
||||
|
||||
|
||||
//Get the list of pair style/value
|
||||
#if QT_VERSION < QT_VERSION_CHECK(5, 14, 0) // ### Qt 6: remove
|
||||
QStringList styles = qde.attribute("style").split(";", QString::SkipEmptyParts);
|
||||
@@ -516,14 +518,14 @@ void CustomElementGraphicPart::stylesFromXml(const QDomElement &qde)
|
||||
#pragma message("@TODO remove code for QT 5.14 or later")
|
||||
QStringList styles = qde.attribute("style").split(";", Qt::SkipEmptyParts);
|
||||
#endif
|
||||
|
||||
|
||||
//Check each pair of style
|
||||
QRegExp rx("^\\s*([a-z-]+)\\s*:\\s*([a-zA-Z-]+)\\s*$");
|
||||
QRegularExpression rx("^\\s*([a-z-]+)\\s*:\\s*([a-zA-Z-]+)\\s*$");
|
||||
foreach (QString style, styles)
|
||||
{
|
||||
if (!rx.exactMatch(style)) continue;
|
||||
QString style_name = rx.cap(1);
|
||||
QString style_value = rx.cap(2);
|
||||
if (rx!=QRegularExpression(style)) continue;
|
||||
QString style_name = rx.namedCaptureGroups().at(1);
|
||||
QString style_value = rx.namedCaptureGroups().at(2);
|
||||
if (style_name == "line-style")
|
||||
{
|
||||
if (style_value == "dashed") _linestyle = DashedStyle;
|
||||
@@ -887,13 +889,13 @@ void CustomElementGraphicPart::applyStylesToQPainter(QPainter &painter) const
|
||||
//Get the pen and brush
|
||||
QPen pen = painter.pen();
|
||||
QBrush brush = painter.brush();
|
||||
|
||||
|
||||
//Apply pen style
|
||||
if (_linestyle == DashedStyle) pen.setStyle(Qt::DashLine);
|
||||
else if (_linestyle == DashdottedStyle) pen.setStyle(Qt::DashDotLine);
|
||||
else if (_linestyle == DottedStyle) pen.setStyle(Qt::DotLine);
|
||||
else if (_linestyle == NormalStyle) pen.setStyle(Qt::SolidLine);
|
||||
|
||||
|
||||
//Apply pen width
|
||||
if (_lineweight == NoneWeight) pen.setColor(QColor(0, 0, 0, 0));
|
||||
else if (_lineweight == ThinWeight) pen.setWidth(0);
|
||||
@@ -1064,7 +1066,7 @@ void CustomElementGraphicPart::applyStylesToQPainter(QPainter &painter) const
|
||||
else if (_filling == HTMLGrayDarkSlateGrayFilling) brush.setColor(QColor(47, 79, 79));
|
||||
else if (_filling == HTMLGrayBlackFilling) brush.setColor(QColor(0, 0, 0));
|
||||
}
|
||||
|
||||
|
||||
//Apply pen color
|
||||
if (_color == WhiteColor) pen.setColor(QColor(255, 255, 255, pen.color().alpha()));
|
||||
else if (_color == BlackColor) pen.setColor(QColor( 0, 0, 0, pen.color().alpha()));
|
||||
@@ -1220,12 +1222,12 @@ void CustomElementGraphicPart::applyStylesToQPainter(QPainter &painter) const
|
||||
else if (_color == HTMLGrayDarkSlateGrayColor) pen.setColor(QColor(47, 79, 79));
|
||||
else if (_color == HTMLGrayBlackColor) pen.setColor(QColor(0, 0, 0));
|
||||
else if (_color == NoneColor) pen.setBrush(Qt::transparent);
|
||||
|
||||
|
||||
//Apply antialiasing
|
||||
painter.setRenderHint(QPainter::Antialiasing, _antialiased);
|
||||
painter.setRenderHint(QPainter::TextAntialiasing, _antialiased);
|
||||
painter.setRenderHint(QPainter::SmoothPixmapTransform, _antialiased);
|
||||
|
||||
|
||||
painter.setPen(pen);
|
||||
painter.setBrush(brush);
|
||||
}
|
||||
|
||||
@@ -407,54 +407,6 @@ QPainterPath PartLine::shadowShape() const
|
||||
return (pps.createStroke(shape));
|
||||
}
|
||||
|
||||
/**
|
||||
@brief PartLine::fourShapePoints
|
||||
@return a list with the two points that delimite the line
|
||||
+ the four points surrounding these two points
|
||||
*/
|
||||
QList<QPointF> PartLine::fourShapePoints() const
|
||||
{
|
||||
const qreal marge = 2.0;
|
||||
|
||||
QPointF a = m_line.p1();
|
||||
QPointF b = m_line.p2();
|
||||
|
||||
QList<QPointF> result;
|
||||
|
||||
//Special case, the line is defined by one point
|
||||
if (a == b)
|
||||
{
|
||||
result << QPointF(a.x() - marge, a.y() - marge);
|
||||
result << QPointF(a.x() - marge, a.y() + marge);
|
||||
result << QPointF(a.x() + marge, a.y() + marge);
|
||||
result << QPointF(a.x() + marge, a.y() - marge);
|
||||
}
|
||||
else
|
||||
{
|
||||
//We calcule the vector AB : (xb-xa, yb-ya)
|
||||
QPointF v_ab = b - a;
|
||||
|
||||
//And the distance AB: root of the coordinates of the vector squared
|
||||
qreal ab = sqrt(pow(v_ab.x(), 2) + pow(v_ab.y(), 2));
|
||||
|
||||
//Next, we define the vector u(a, b) wich is equal to the vector AB divided
|
||||
//by is length and multiplied by the length of marge.
|
||||
QPointF u = v_ab / ab * marge;
|
||||
|
||||
//We define the vector v(-b, a) wich is perpendicular to AB
|
||||
QPointF v(-u.y(), u.x());
|
||||
QPointF m = -u + v; // we have vector M = -u + v
|
||||
QPointF n = -u - v; // and vector N=-u-v
|
||||
QPointF h = a + m; // H = A + M
|
||||
QPointF k = a + n; // K = A + N
|
||||
QPointF i = b - n; // I = B - N
|
||||
QPointF j = b - m; // J = B - M
|
||||
|
||||
result << h << i << j << k;
|
||||
}
|
||||
return(result);
|
||||
}
|
||||
|
||||
/**
|
||||
@brief PartLine::firstEndCircleRect
|
||||
@return the rectangle bordering the entirety of the first extremity
|
||||
@@ -491,35 +443,6 @@ QRectF PartLine::secondEndCircleRect() const
|
||||
return(end_rect);
|
||||
}
|
||||
|
||||
/**
|
||||
@brief PartLine::debugPaint
|
||||
Display several composante of the drawing
|
||||
-the bounding rect
|
||||
-special points at each extremity
|
||||
-the quadrature of the circle at each extremity, even if itself is an other type
|
||||
@param painter
|
||||
*/
|
||||
void PartLine::debugPaint(QPainter *painter)
|
||||
{
|
||||
painter -> save();
|
||||
painter -> setPen(Qt::gray);
|
||||
painter -> drawRect(boundingRect());
|
||||
|
||||
painter -> setPen(Qt::green);
|
||||
painter -> drawRect(firstEndCircleRect());
|
||||
painter -> drawRect(secondEndCircleRect());
|
||||
|
||||
painter -> setPen(Qt::red);
|
||||
|
||||
foreach(QPointF pointy, fourEndPoints(m_line.p1(), m_line.p2(), first_length))
|
||||
painter -> drawEllipse(pointy, 0.1, 0.1);
|
||||
|
||||
foreach(QPointF pointy, fourEndPoints(m_line.p2(), m_line.p1(), second_length))
|
||||
painter -> drawEllipse(pointy, 0.1, 0.1);
|
||||
|
||||
painter -> restore();
|
||||
}
|
||||
|
||||
/**
|
||||
@brief PartLine::boundingRect
|
||||
@return the bounding rect of this part
|
||||
|
||||
@@ -110,10 +110,8 @@ class PartLine : public CustomElementGraphicPart
|
||||
void removeHandler();
|
||||
|
||||
QPainterPath path() const;
|
||||
QList<QPointF> fourShapePoints() const;
|
||||
QRectF firstEndCircleRect() const;
|
||||
QRectF secondEndCircleRect() const;
|
||||
void debugPaint(QPainter *);
|
||||
|
||||
/*****************/
|
||||
Qet::EndType first_end;
|
||||
|
||||
@@ -1,17 +1,17 @@
|
||||
/*
|
||||
Copyright 2006-2020 The QElectroTech Team
|
||||
This file is part of QElectroTech.
|
||||
|
||||
|
||||
QElectroTech 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 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
|
||||
QElectroTech 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 QElectroTech. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
@@ -83,7 +83,7 @@ QETElementEditor::QETElementEditor(QWidget *parent) :
|
||||
// la fenetre est maximisee par defaut
|
||||
setMinimumSize(QSize(500, 350));
|
||||
setWindowState(Qt::WindowMaximized);
|
||||
|
||||
|
||||
// lecture des parametres
|
||||
readSettings();
|
||||
slot_updateMenus();
|
||||
@@ -165,7 +165,7 @@ void QETElementEditor::setupActions()
|
||||
open_dxf -> setStatusTip(tr("To install the plugin DXFtoQET\nVisit https://download.tuxfamily.org/qet/builds/dxf_to_elmt/\n"
|
||||
"\n"
|
||||
">> Install on Windows\n"
|
||||
"Put DXFtoQET.exe binary on C:\\Users\\user_name\\AppData\\Roaming\\qet\\ directory \n"
|
||||
"Put DXFtoQET.exe binary on C:\\Users\\user_name\\AppData\\Roaming\\qet\\ directory \n"
|
||||
));
|
||||
#elif defined(Q_OS_MAC)
|
||||
open_dxf -> setStatusTip(tr("To install the plugin DXFtoQET\nVisit https://download.tuxfamily.org/qet/builds/dxf_to_elmt/\n"
|
||||
@@ -188,7 +188,7 @@ void QETElementEditor::setupActions()
|
||||
"Put DXFtoQET binary on your /home/user_name/.qet/ directory\n"
|
||||
"make it executable : chmod +x ./DXFtoQET\n"
|
||||
">> Install on Windows\n"
|
||||
"Put DXFtoQET.exe binary on C:\\Users\\user_name\\AppData\\Roaming\\qet\\ directory \n"
|
||||
"Put DXFtoQET.exe binary on C:\\Users\\user_name\\AppData\\Roaming\\qet\\ directory \n"
|
||||
"\n"
|
||||
">> Install on macOSX\n"
|
||||
"Put DXFtoQET.app binary on /Users/user_name/.qet/ directory \n"
|
||||
@@ -491,7 +491,7 @@ void QETElementEditor::slot_updateMenus()
|
||||
// actions dependant du contenu du presse-papiers
|
||||
paste -> setEnabled(clipboard_elmt);
|
||||
paste_in_area -> setEnabled(clipboard_elmt);
|
||||
|
||||
|
||||
// actions dependant de l'etat de la pile d'annulation
|
||||
save -> setEnabled(!read_only && !m_elmt_scene -> undoStack().isClean());
|
||||
undo -> setEnabled(!read_only && m_elmt_scene -> undoStack().canUndo());
|
||||
@@ -534,7 +534,7 @@ void QETElementEditor::setupInterface()
|
||||
// m_tools_dock_scroll_area = new QScrollArea();
|
||||
// m_tools_dock_scroll_area -> setFrameStyle(QFrame::NoFrame);
|
||||
// m_tools_dock_scroll_area -> setAlignment(Qt::AlignHCenter|Qt::AlignTop);
|
||||
|
||||
|
||||
// Pile de widgets pour accueillir les deux widgets precedents
|
||||
m_tools_dock_stack = new QStackedWidget();
|
||||
m_tools_dock_stack -> insertWidget(0, m_default_informations);
|
||||
@@ -555,7 +555,10 @@ void QETElementEditor::setupInterface()
|
||||
m_tools_dock = new QDockWidget(tr("Informations", "dock title"), this);
|
||||
m_tools_dock -> setObjectName("informations");
|
||||
m_tools_dock -> setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);
|
||||
m_tools_dock -> setFeatures(QDockWidget::AllDockWidgetFeatures);
|
||||
m_tools_dock -> setFeatures(
|
||||
QDockWidget::DockWidgetClosable
|
||||
|QDockWidget::DockWidgetMovable
|
||||
|QDockWidget::DockWidgetFloatable);
|
||||
//m_tools_dock -> setMinimumWidth(380);
|
||||
addDockWidget(Qt::RightDockWidgetArea, m_tools_dock);
|
||||
m_tools_dock -> setWidget(m_tools_dock_stack);
|
||||
@@ -564,7 +567,10 @@ void QETElementEditor::setupInterface()
|
||||
m_undo_dock = new QDockWidget(tr("Annulations", "dock title"), this);
|
||||
m_undo_dock -> setObjectName("undo");
|
||||
m_undo_dock -> setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);
|
||||
m_undo_dock -> setFeatures(QDockWidget::AllDockWidgetFeatures);
|
||||
m_undo_dock -> setFeatures(
|
||||
QDockWidget::DockWidgetClosable
|
||||
|QDockWidget::DockWidgetMovable
|
||||
|QDockWidget::DockWidgetFloatable);
|
||||
m_undo_dock -> setMinimumWidth(290);
|
||||
addDockWidget(Qt::RightDockWidgetArea, m_undo_dock);
|
||||
QUndoView* undo_view = new QUndoView(&(m_elmt_scene -> undoStack()), this);
|
||||
@@ -582,7 +588,10 @@ void QETElementEditor::setupInterface()
|
||||
m_parts_dock = new QDockWidget(tr("Parties", "dock title"), this);
|
||||
m_parts_dock -> setObjectName("parts_list");
|
||||
m_parts_dock -> setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);
|
||||
m_parts_dock -> setFeatures(QDockWidget::AllDockWidgetFeatures);
|
||||
m_parts_dock -> setFeatures(
|
||||
QDockWidget::DockWidgetClosable
|
||||
|QDockWidget::DockWidgetMovable
|
||||
|QDockWidget::DockWidgetFloatable);
|
||||
m_parts_dock -> setMinimumWidth(290);
|
||||
tabifyDockWidget(m_undo_dock, m_parts_dock);
|
||||
m_parts_dock -> setWidget(m_parts_list);
|
||||
@@ -1126,10 +1135,10 @@ void QETElementEditor::slot_openFile()
|
||||
{
|
||||
// repertoire a afficher initialement dans le dialogue
|
||||
QString open_dir = filename_.isEmpty() ? QETApp::customElementsDir() : QDir(filename_).absolutePath();
|
||||
|
||||
|
||||
// demande un nom de fichier a ouvrir a l'utilisateur
|
||||
QString user_filename = QETElementEditor::getOpenElementFileName(this, open_dir);
|
||||
|
||||
|
||||
// ouvre l'element
|
||||
openElement(user_filename);
|
||||
}
|
||||
@@ -1445,7 +1454,7 @@ void QETElementEditor::slot_createPartsList()
|
||||
m_parts_list -> blockSignals(true);
|
||||
m_parts_list -> clear();
|
||||
QList<QGraphicsItem *> qgis = m_elmt_scene -> zItems();
|
||||
|
||||
|
||||
// on ne construit plus la liste a partir de 200 primitives
|
||||
// c'est ingerable : la maj de la liste prend trop de temps et le resultat
|
||||
// est inexploitable
|
||||
|
||||
@@ -1,17 +1,17 @@
|
||||
/*
|
||||
Copyright 2006-2020 The QElectroTech Team
|
||||
This file is part of QElectroTech.
|
||||
|
||||
|
||||
QElectroTech 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 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
|
||||
QElectroTech 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 QElectroTech. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
@@ -200,7 +200,7 @@ StyleEditor::StyleEditor(QETElementEditor *editor, CustomElementGraphicPart *p,
|
||||
line_style -> addItem(tr("Pointillé", "element part line style"), CustomElementGraphicPart::DottedStyle);
|
||||
line_style -> addItem(tr("Traits et points", "element part line style"), CustomElementGraphicPart::DashdottedStyle);
|
||||
//normal_style -> setChecked(true);
|
||||
|
||||
|
||||
// epaisseur
|
||||
size_weight = new QComboBox(this);
|
||||
size_weight -> addItem(tr("Nulle", "element part weight"), CustomElementGraphicPart::NoneWeight);
|
||||
@@ -374,16 +374,16 @@ StyleEditor::StyleEditor(QETElementEditor *editor, CustomElementGraphicPart *p,
|
||||
|
||||
// antialiasing
|
||||
antialiasing = new QCheckBox(tr("Antialiasing"));
|
||||
|
||||
|
||||
updateForm();
|
||||
|
||||
|
||||
auto main_layout = new QVBoxLayout();
|
||||
main_layout -> setMargin(0);
|
||||
|
||||
main_layout -> setContentsMargins(0,0,0,0);
|
||||
|
||||
main_layout -> addWidget(new QLabel("<u>" + tr("Apparence :") + "</u> "));
|
||||
|
||||
outline_color->setSizeAdjustPolicy(QComboBox::AdjustToMinimumContentsLength);
|
||||
filling_color->setSizeAdjustPolicy(QComboBox::AdjustToMinimumContentsLength);
|
||||
outline_color->setSizeAdjustPolicy(QComboBox::AdjustToContents);
|
||||
filling_color->setSizeAdjustPolicy(QComboBox::AdjustToContents);
|
||||
auto grid_layout = new QGridLayout(this);
|
||||
grid_layout->addWidget(new QLabel(tr("Contour :")), 0,0, Qt::AlignRight);
|
||||
grid_layout->addWidget(outline_color, 0, 1);
|
||||
|
||||
@@ -1,17 +1,17 @@
|
||||
/*
|
||||
Copyright 2006-2020 The QElectroTech Team
|
||||
This file is part of QElectroTech.
|
||||
|
||||
|
||||
QElectroTech 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 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
|
||||
QElectroTech 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 QElectroTech. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
@@ -48,7 +48,7 @@
|
||||
ElementsPanelWidget::ElementsPanelWidget(QWidget *parent) : QWidget(parent) {
|
||||
// initalise le panel d'elements
|
||||
elements_panel = new ElementsPanel(this);
|
||||
|
||||
|
||||
// initialise les actions
|
||||
open_directory = new QAction(QET::Icons::FolderOpen, tr("Ouvrir le dossier correspondant"), this);
|
||||
copy_path = new QAction(QET::Icons::IC_CopyFile, tr("Copier le chemin"), this);
|
||||
@@ -67,13 +67,13 @@ ElementsPanelWidget::ElementsPanelWidget(QWidget *parent) : QWidget(parent) {
|
||||
tbt_edit = new QAction(QET::Icons::TitleBlock, tr("Éditer ce modèle"), this);
|
||||
tbt_remove = new QAction(QET::Icons::TitleBlock, tr("Supprimer ce modèle"), this);
|
||||
|
||||
|
||||
|
||||
prj_del_diagram -> setShortcut(QKeySequence(Qt::Key_Delete));
|
||||
prj_move_diagram_up -> setShortcut(QKeySequence(Qt::Key_F3));
|
||||
prj_move_diagram_down -> setShortcut(QKeySequence(Qt::Key_F4));
|
||||
prj_move_diagram_top -> setShortcut(QKeySequence(Qt::Key_F5));
|
||||
|
||||
|
||||
|
||||
|
||||
// initialise le champ de texte pour filtrer avec une disposition horizontale
|
||||
filter_textfield = new QLineEdit(this);
|
||||
filter_textfield -> setClearButtonEnabled(true);
|
||||
@@ -81,7 +81,7 @@ ElementsPanelWidget::ElementsPanelWidget(QWidget *parent) : QWidget(parent) {
|
||||
|
||||
|
||||
context_menu = new QMenu(this);
|
||||
|
||||
|
||||
connect(open_directory, SIGNAL(triggered()), this, SLOT(openDirectoryForSelectedItem()));
|
||||
connect(copy_path, SIGNAL(triggered()), this, SLOT(copyPathForSelectedItem()));
|
||||
connect(prj_activate, SIGNAL(triggered()), this, SLOT(activateProject()));
|
||||
@@ -98,9 +98,9 @@ ElementsPanelWidget::ElementsPanelWidget(QWidget *parent) : QWidget(parent) {
|
||||
connect(tbt_add, SIGNAL(triggered()), this, SLOT(addTitleBlockTemplate()));
|
||||
connect(tbt_edit, SIGNAL(triggered()), this, SLOT(editTitleBlockTemplate()));
|
||||
connect(tbt_remove, SIGNAL(triggered()), this, SLOT(removeTitleBlockTemplate()));
|
||||
|
||||
|
||||
connect(filter_textfield, SIGNAL(textChanged(const QString &)), this, SLOT(filterEdited(const QString &)));
|
||||
|
||||
|
||||
connect(elements_panel, SIGNAL(currentItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)), this, SLOT(updateButtons()));
|
||||
connect(elements_panel, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(handleContextMenu(const QPoint &)));
|
||||
connect(elements_panel, SIGNAL(requestForDiagram(Diagram*)), this, SIGNAL(requestForDiagram(Diagram*)));
|
||||
@@ -110,10 +110,10 @@ ElementsPanelWidget::ElementsPanelWidget(QWidget *parent) : QWidget(parent) {
|
||||
QETApp::instance(),
|
||||
SLOT(openTitleBlockTemplate(const TitleBlockTemplateLocation &))
|
||||
);
|
||||
|
||||
|
||||
// disposition verticale
|
||||
QVBoxLayout *vlayout = new QVBoxLayout(this);
|
||||
vlayout -> setMargin(0);
|
||||
vlayout -> setContentsMargins(0,0,0,0);
|
||||
vlayout -> setSpacing(0);
|
||||
vlayout -> addWidget(filter_textfield);
|
||||
vlayout -> addWidget(elements_panel);
|
||||
@@ -290,7 +290,7 @@ void ElementsPanelWidget::addTitleBlockTemplate()
|
||||
{
|
||||
QTreeWidgetItem *current_item = elements_panel -> currentItem();
|
||||
if (!current_item) return;
|
||||
|
||||
|
||||
if (current_item -> type() == QET::TitleBlockTemplatesCollection) {
|
||||
QETApp::instance() -> openTitleBlockTemplate(
|
||||
elements_panel -> templateLocationForItem(current_item)
|
||||
@@ -332,18 +332,18 @@ void ElementsPanelWidget::updateButtons()
|
||||
{
|
||||
QTreeWidgetItem *current_item = elements_panel -> currentItem();
|
||||
int current_type = elements_panel -> currentItemType();
|
||||
|
||||
|
||||
if (current_type == QET::Project) {
|
||||
bool is_writable = !(elements_panel -> selectedProject() -> isReadOnly());
|
||||
prj_add_diagram -> setEnabled(is_writable);
|
||||
} else if (current_type == QET::Diagram) {
|
||||
Diagram *selected_diagram = elements_panel -> selectedDiagram();
|
||||
QETProject *selected_diagram_project = selected_diagram -> project();
|
||||
|
||||
|
||||
bool is_writable = !(selected_diagram_project -> isReadOnly());
|
||||
int project_diagrams_count = selected_diagram_project -> diagrams().count();
|
||||
int diagram_position = selected_diagram_project -> diagrams().indexOf(selected_diagram);
|
||||
|
||||
|
||||
prj_del_diagram -> setEnabled(is_writable);
|
||||
prj_move_diagram_up -> setEnabled(is_writable && diagram_position > 0);
|
||||
prj_move_diagram_down -> setEnabled(is_writable && diagram_position < project_diagrams_count - 1);
|
||||
@@ -373,17 +373,17 @@ void ElementsPanelWidget::handleContextMenu(const QPoint &pos) {
|
||||
// recupere l'item concerne par l'evenement ainsi que son chemin
|
||||
QTreeWidgetItem *item = elements_panel -> itemAt(pos);
|
||||
if (!item) return;
|
||||
|
||||
|
||||
updateButtons();
|
||||
context_menu -> clear();
|
||||
|
||||
|
||||
QString dir_path = elements_panel -> dirPathForItem(item);
|
||||
if (!dir_path.isEmpty()) {
|
||||
context_menu -> addAction(open_directory);
|
||||
context_menu -> addAction(copy_path);
|
||||
context_menu -> addSeparator();
|
||||
}
|
||||
|
||||
|
||||
switch(item -> type()) {
|
||||
case QET::Project:
|
||||
context_menu -> addAction(prj_activate);
|
||||
@@ -408,7 +408,7 @@ void ElementsPanelWidget::handleContextMenu(const QPoint &pos) {
|
||||
context_menu -> addAction(tbt_remove);
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
// affiche le menu
|
||||
if (!context_menu -> isEmpty()) {
|
||||
context_menu -> popup(mapToGlobal(elements_panel -> mapTo(this, pos + QPoint(2, 2))));
|
||||
|
||||
@@ -20,6 +20,7 @@
|
||||
|
||||
#include <QSet>
|
||||
#include <QPointF>
|
||||
#include <QHash>
|
||||
|
||||
class QGraphicsItem;
|
||||
class DiagramTextItem;
|
||||
@@ -37,16 +38,16 @@ class ElementTextsMover
|
||||
ElementTextsMover();
|
||||
private:
|
||||
ElementTextsMover(const ElementTextsMover &);
|
||||
|
||||
|
||||
public:
|
||||
bool isReady() const;
|
||||
int beginMovement(Diagram *diagram, QGraphicsItem *driver_item = nullptr);
|
||||
void continueMovement(QGraphicsSceneMouseEvent *event);
|
||||
void endMovement();
|
||||
|
||||
|
||||
private:
|
||||
QString undoText() const;
|
||||
|
||||
|
||||
private:
|
||||
bool m_movement_running = false;
|
||||
Diagram *m_diagram = nullptr;
|
||||
|
||||
@@ -443,18 +443,10 @@ void ExportDialog::generateDxf(
|
||||
|
||||
//Add project elements (lines, rectangles, circles, texts) to dxf file
|
||||
if (epw -> exportProperties().draw_border) {
|
||||
double bx0 = Diagram::margin * Createdxf::xScale;
|
||||
double by0 = Diagram::margin * Createdxf::yScale;
|
||||
Createdxf::drawRectangle(
|
||||
file_path,
|
||||
bx0,
|
||||
-by0,
|
||||
double(width)*Createdxf::xScale,
|
||||
double(height)*Createdxf::yScale,
|
||||
0);
|
||||
QRectF rect(Diagram::margin,Diagram::margin,width,height);
|
||||
Createdxf::drawRectangle(file_path,rect,0);
|
||||
}
|
||||
diagram -> border_and_titleblock.drawDxf(file_path,
|
||||
0);
|
||||
diagram -> border_and_titleblock.drawDxf(file_path, 0);
|
||||
|
||||
// Build the lists of elements.
|
||||
QList<Element *> list_elements;
|
||||
@@ -503,9 +495,6 @@ void ExportDialog::generateDxf(
|
||||
qreal elem_pos_x = elmt -> pos().x();
|
||||
qreal elem_pos_y = elmt -> pos().y();// - (diagram -> margin / 2);
|
||||
|
||||
qreal hotspot_x = (elem_pos_x) * Createdxf::xScale;
|
||||
qreal hotspot_y = Createdxf::sheetHeight - (elem_pos_y) * Createdxf::yScale;
|
||||
|
||||
ElementPictureFactory::primitives primitives = ElementPictureFactory::instance()->getPrimitives(elmt->location());
|
||||
|
||||
for(QGraphicsSimpleTextItem *text : primitives.m_texts)
|
||||
@@ -514,125 +503,82 @@ void ExportDialog::generateDxf(
|
||||
if (fontSize < 0)
|
||||
fontSize = text->font().pixelSize();
|
||||
|
||||
fontSize *= Createdxf::yScale;
|
||||
qreal x = elem_pos_x + text->pos().x();
|
||||
qreal y = elem_pos_y + text->pos().y();
|
||||
x *= Createdxf::xScale;
|
||||
y = Createdxf::sheetHeight - (y * Createdxf::yScale);
|
||||
|
||||
qreal angle = text -> rotation() + rotation_angle;
|
||||
qreal angler = angle * M_PI/180;
|
||||
int xdir = -sin(angler);
|
||||
int ydir = -cos(angler);
|
||||
|
||||
QPointF transformed_point = rotation_transformed(x, y, hotspot_x, hotspot_y, rotation_angle);
|
||||
QPointF transformed_point = rotation_transformed(x, y, elem_pos_x, elem_pos_y, -rotation_angle);
|
||||
x = transformed_point.x() - ydir * fontSize * 0.5;
|
||||
y = transformed_point.y() + xdir * fontSize * 0.5;
|
||||
y = transformed_point.y() - xdir * fontSize * 0.5;
|
||||
QStringList lines = text->text().split('\n');
|
||||
qreal offset = fontSize * 1.6;
|
||||
for (QString line : lines)
|
||||
{
|
||||
if (line.size() > 0 && line != "_" ) {
|
||||
Createdxf::drawText(file_path, line, x, y, fontSize, 360 - angle, 0, 0.72);
|
||||
Createdxf::drawText(file_path, line, QPointF(x, y), fontSize, 360 - angle, 0, 0.72);
|
||||
}
|
||||
x += offset * xdir;
|
||||
y += offset * ydir;
|
||||
y -= offset * ydir;
|
||||
}
|
||||
}
|
||||
|
||||
for (QLineF line : primitives.m_lines)
|
||||
{
|
||||
qreal x1 = (elem_pos_x + line.p1().x()) * Createdxf::xScale;
|
||||
qreal y1 = Createdxf::sheetHeight - (elem_pos_y + line.p1().y()) * Createdxf::yScale;
|
||||
QPointF transformed_point = rotation_transformed(x1, y1, hotspot_x, hotspot_y, rotation_angle);
|
||||
x1 = transformed_point.x();
|
||||
y1 = transformed_point.y();
|
||||
qreal x2 = (elem_pos_x + line.p2().x()) * Createdxf::xScale;
|
||||
qreal y2 = Createdxf::sheetHeight - (elem_pos_y + line.p2().y()) * Createdxf::yScale;
|
||||
transformed_point = rotation_transformed(x2, y2, hotspot_x, hotspot_y, rotation_angle);
|
||||
x2 = transformed_point.x();
|
||||
y2 = transformed_point.y();
|
||||
Createdxf::drawLine(file_path, x1, y1, x2, y2, 0);
|
||||
QTransform t = QTransform().translate(elem_pos_x,elem_pos_y).rotate(rotation_angle);
|
||||
QLineF l = t.map(line);
|
||||
Createdxf::drawLine(file_path, l, 0);
|
||||
}
|
||||
|
||||
for (QRectF rect : primitives.m_rectangles)
|
||||
{
|
||||
qreal x1 = (elem_pos_x + rect.bottomLeft().x()) * Createdxf::xScale;
|
||||
qreal y1 = Createdxf::sheetHeight - (elem_pos_y + rect.bottomLeft().y()) * Createdxf::yScale;
|
||||
qreal w = rect.width() * Createdxf::xScale;
|
||||
qreal h = rect.height() * Createdxf::yScale;
|
||||
// opposite corner
|
||||
qreal x2 = x1 + w;
|
||||
qreal y2 = y1 + h;
|
||||
QPointF transformed_point = rotation_transformed(x1, y1, hotspot_x, hotspot_y, rotation_angle);
|
||||
x1 = transformed_point.x();
|
||||
y1 = transformed_point.y();
|
||||
transformed_point = rotation_transformed(x2, y2, hotspot_x, hotspot_y, rotation_angle);
|
||||
x2 = transformed_point.x();
|
||||
y2 = transformed_point.y();
|
||||
qreal bottom_left_x = (x1 < x2) ? x1 : x2;
|
||||
qreal bottom_left_y = (y1 < y2) ? y1 : y2;
|
||||
w = (x1 < x2) ? x2-x1 : x1-x2;
|
||||
h = (y1 < y2) ? y2-y1 : y1-y2;
|
||||
Createdxf::drawRectangle(file_path, bottom_left_x, bottom_left_y, w, h, 0);
|
||||
QTransform t = QTransform().translate(elem_pos_x,elem_pos_y).rotate(rotation_angle);
|
||||
QRectF r = t.mapRect(rect);
|
||||
Createdxf::drawRectangle(file_path,r,0);
|
||||
}
|
||||
|
||||
for (QRectF circle_rect : primitives.m_circles)
|
||||
{
|
||||
qreal x1 = (elem_pos_x + circle_rect.center().x()) * Createdxf::xScale;
|
||||
qreal y1 = Createdxf::sheetHeight - (elem_pos_y + circle_rect.center().y()) * Createdxf::yScale;
|
||||
qreal r = circle_rect.width() * Createdxf::xScale / 2;
|
||||
QPointF transformed_point = rotation_transformed(x1, y1, hotspot_x, hotspot_y, rotation_angle);
|
||||
x1 = transformed_point.x();
|
||||
y1 = transformed_point.y();
|
||||
Createdxf::drawCircle(file_path, r, x1, y1, 0);
|
||||
QTransform t = QTransform().translate(elem_pos_x,elem_pos_y).rotate(rotation_angle);
|
||||
QPointF c = t.map(QPointF(circle_rect.center().x(),circle_rect.center().y()));
|
||||
Createdxf::drawCircle(file_path,c,circle_rect.width()/2,0);
|
||||
}
|
||||
|
||||
for (QVector<QPointF> polygon : primitives.m_polygons)
|
||||
{
|
||||
if (polygon.size() == 0)
|
||||
continue;
|
||||
qreal x1 = (elem_pos_x + polygon.at(0).x()) * Createdxf::xScale;
|
||||
qreal y1 = Createdxf::sheetHeight - (elem_pos_y + polygon.at(0).y()) * Createdxf::yScale;
|
||||
QPointF transformed_point = rotation_transformed(x1, y1, hotspot_x, hotspot_y, rotation_angle);
|
||||
x1 = transformed_point.x();
|
||||
y1 = transformed_point.y();
|
||||
for (int i = 1; i < polygon.size(); ++i ) {
|
||||
qreal x2 = (elem_pos_x + polygon.at(i).x()) * Createdxf::xScale;
|
||||
qreal y2 = Createdxf::sheetHeight - (elem_pos_y + polygon.at(i).y()) * Createdxf::yScale;
|
||||
QPointF transformed_point = rotation_transformed(x2, y2, hotspot_x, hotspot_y, rotation_angle);
|
||||
x2 = transformed_point.x();
|
||||
y2 = transformed_point.y();
|
||||
Createdxf::drawLine(file_path, x1, y1, x2, y2, 0);
|
||||
x1 = x2;
|
||||
y1 = y2;
|
||||
}
|
||||
QTransform t = QTransform().translate(elem_pos_x,elem_pos_y).rotate(rotation_angle);
|
||||
QPolygonF poly = t.map(polygon);
|
||||
Createdxf::drawPolygon(file_path,poly,0);
|
||||
}
|
||||
|
||||
// Draw arcs and ellipses
|
||||
for (QVector<qreal> arc : primitives.m_arcs)
|
||||
{
|
||||
if (arc.size() == 0)
|
||||
continue;
|
||||
qreal x = (elem_pos_x + arc.at(0)) * Createdxf::xScale;
|
||||
qreal y = Createdxf::sheetHeight - (elem_pos_y + arc.at(1)) * Createdxf::yScale;
|
||||
qreal w = arc.at(2) * Createdxf::xScale;
|
||||
qreal h = arc.at(3) * Createdxf::yScale;
|
||||
qreal startAngle = arc.at(4);
|
||||
qreal spanAngle = arc .at(5);
|
||||
Createdxf::drawArcEllipse(file_path, x, y, w, h, startAngle, spanAngle, hotspot_x, hotspot_y, rotation_angle, 0);
|
||||
if (arc.size() == 0)
|
||||
continue;
|
||||
qreal x = (elem_pos_x + arc.at(0));
|
||||
qreal y = (elem_pos_y + arc.at(1));
|
||||
qreal w = arc.at(2);
|
||||
qreal h = arc.at(3);
|
||||
qreal startAngle = arc.at(4);
|
||||
qreal spanAngle = arc .at(5);
|
||||
QRectF r(x,y,w,h);
|
||||
QPointF hotspot(elem_pos_x,elem_pos_y);
|
||||
Createdxf::drawArcEllipse(file_path, r, startAngle, spanAngle, hotspot, rotation_angle, 0);
|
||||
}
|
||||
if (epw -> exportProperties().draw_terminals) {
|
||||
// Draw terminals
|
||||
QList<Terminal *> list_terminals = elmt->terminals();
|
||||
QColor col("red");
|
||||
QTransform t = QTransform().translate(elem_pos_x,elem_pos_y).rotate(rotation_angle);
|
||||
foreach(Terminal *tp, list_terminals) {
|
||||
qreal x = (elem_pos_x + tp->dock_elmt_.x()) * Createdxf::xScale;
|
||||
qreal y = Createdxf::sheetHeight - (elem_pos_y + tp->dock_elmt_.y()) * Createdxf::yScale;
|
||||
QPointF transformed_point = rotation_transformed(x, y, hotspot_x, hotspot_y, rotation_angle);
|
||||
x = transformed_point.x();
|
||||
y = transformed_point.y();
|
||||
Createdxf::drawCircle(file_path, 3.0* Createdxf::xScale, x, y, Createdxf::dxfColor(col));
|
||||
QPointF c = t.map(QPointF(tp->dock_elmt_.x(),tp->dock_elmt_.y()));
|
||||
Createdxf::drawCircle(file_path,c,3.0,Createdxf::dxfColor(col));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -652,31 +598,32 @@ void ExportDialog::generateDxf(
|
||||
Createdxf::drawPolyline(file_path,poly,0);
|
||||
//Draw conductor text item
|
||||
ConductorTextItem *textItem = cond -> textItem();
|
||||
if (textItem) {
|
||||
qreal fontSize = textItem -> font().pointSizeF();
|
||||
if (fontSize < 0)
|
||||
fontSize = textItem -> font().pixelSize();
|
||||
fontSize *= Createdxf::yScale;
|
||||
|
||||
if (textItem) {
|
||||
qreal fontSize = textItem -> font().pointSizeF();
|
||||
if (fontSize < 0)
|
||||
fontSize = textItem -> font().pixelSize();
|
||||
qreal angle = textItem -> rotation();
|
||||
qreal angler = angle * M_PI/180;
|
||||
int xdir = -sin(angler);
|
||||
int ydir = -cos(angler);
|
||||
|
||||
qreal x = (cond->pos().x() + textItem -> pos().x()) * Createdxf::xScale
|
||||
qreal x = (cond->pos().x() + textItem -> pos().x())
|
||||
+ xdir * fontSize * 1.8
|
||||
- ydir * fontSize;
|
||||
qreal y = Createdxf::sheetHeight - ((cond->pos().y() + textItem -> pos().y()) * Createdxf::yScale)
|
||||
+ ydir * fontSize * 1.8
|
||||
+ xdir * fontSize * 0.9;
|
||||
qreal y = (cond->pos().y() + textItem -> pos().y())
|
||||
- ydir * fontSize * 1.8
|
||||
- xdir * fontSize * 0.9;
|
||||
QStringList lines = textItem->toPlainText().split('\n');
|
||||
qreal offset = fontSize * 1.6;
|
||||
foreach (QString line, lines) {
|
||||
if (line.size() > 0 && line != "_" )
|
||||
Createdxf::drawText(file_path, line, x, y, fontSize, 360-angle, 0, 0.72 );
|
||||
Createdxf::drawText(file_path, line, QPointF(x, y), fontSize, 360-angle, 0, 0.72 );
|
||||
x += offset * xdir;
|
||||
y += offset * ydir;
|
||||
y -= offset * ydir;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Draw the junctions
|
||||
QList<QPointF> junctions_list = cond->junctions();
|
||||
if (!junctions_list.isEmpty()) {
|
||||
@@ -687,30 +634,38 @@ void ExportDialog::generateDxf(
|
||||
}
|
||||
|
||||
//Draw text items
|
||||
foreach(DiagramTextItem *dti, list_texts) {
|
||||
qreal fontSize = dti -> font().pointSizeF();
|
||||
if (fontSize < 0)
|
||||
fontSize = dti -> font().pixelSize();
|
||||
fontSize *= Createdxf::yScale;
|
||||
foreach(DiagramTextItem *dti, list_texts) {
|
||||
qreal fontSize = dti -> font().pointSizeF();
|
||||
if (fontSize < 0)
|
||||
fontSize = dti -> font().pixelSize();
|
||||
|
||||
qreal angle = dti -> rotation();
|
||||
|
||||
QGraphicsItem *parent = dti->parentItem();
|
||||
while (parent) {
|
||||
angle += parent->rotation();
|
||||
parent = parent->parentItem();
|
||||
}
|
||||
|
||||
qreal angler = angle * M_PI/180;
|
||||
int xdir = -sin(angler);
|
||||
int ydir = -cos(angler);
|
||||
qreal x = (dti->scenePos().x()) * Createdxf::xScale
|
||||
qreal x = (dti->scenePos().x())
|
||||
+ xdir * fontSize * 1.8
|
||||
- ydir * fontSize;
|
||||
qreal y = Createdxf::sheetHeight - (dti->scenePos().y() * Createdxf::yScale)
|
||||
+ ydir * fontSize * 1.8
|
||||
+ xdir * fontSize * 0.9;
|
||||
QStringList lines = dti -> toPlainText().split('\n');
|
||||
qreal y = dti->scenePos().y()
|
||||
- ydir * fontSize * 1.8
|
||||
- xdir * fontSize * 0.9;
|
||||
QStringList lines = dti -> toPlainText().split('\n');
|
||||
qreal offset = fontSize * 1.6;
|
||||
foreach (QString line, lines) {
|
||||
if (line.size() > 0 && line != "_" )
|
||||
Createdxf::drawText(file_path, line, x, y, fontSize, 360-angle, 0, 0.72 );
|
||||
Createdxf::drawText(file_path, line, QPointF(x, y), fontSize, 360-angle, Createdxf::dxfColor(dti->color()), 0.72 );
|
||||
x += offset * xdir;
|
||||
y += offset * ydir;
|
||||
y -= offset * ydir;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Createdxf::dxfEnd(file_path);
|
||||
|
||||
saveReloadDiagramParameters(diagram, false);
|
||||
|
||||
@@ -28,6 +28,7 @@
|
||||
#include <iostream>
|
||||
#include <QAbstractTextDocumentLayout>
|
||||
#include <QGraphicsSimpleTextItem>
|
||||
#include <QRegularExpression>
|
||||
|
||||
ElementPictureFactory* ElementPictureFactory::m_factory = nullptr;
|
||||
|
||||
@@ -44,14 +45,14 @@ void ElementPictureFactory::getPictures(const ElementsLocation &location, QPictu
|
||||
if(!location.exist()) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
QUuid uuid = location.uuid();
|
||||
if(Q_UNLIKELY(uuid.isNull()))
|
||||
{
|
||||
build(location, &picture, &low_picture);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
if(m_pictures_H.keys().contains(uuid))
|
||||
{
|
||||
picture = m_pictures_H.value(uuid);
|
||||
@@ -76,11 +77,11 @@ void ElementPictureFactory::getPictures(const ElementsLocation &location, QPictu
|
||||
QPixmap ElementPictureFactory::pixmap(const ElementsLocation &location)
|
||||
{
|
||||
QUuid uuid = location.uuid();
|
||||
|
||||
|
||||
if (m_pixmap_H.contains(uuid)) {
|
||||
return m_pixmap_H.value(uuid);
|
||||
}
|
||||
|
||||
|
||||
if(build(location))
|
||||
{
|
||||
auto doc = location.pugiXml();
|
||||
@@ -95,19 +96,19 @@ QPixmap ElementPictureFactory::pixmap(const ElementsLocation &location)
|
||||
|
||||
QPixmap pix(w, h);
|
||||
pix.fill(QColor(255, 255, 255, 0));
|
||||
|
||||
|
||||
QPainter painter(&pix);
|
||||
painter.setRenderHint(QPainter::Antialiasing, true);
|
||||
painter.setRenderHint(QPainter::SmoothPixmapTransform, true);
|
||||
painter.translate(hsx, hsy);
|
||||
painter.drawPicture(0, 0, m_pictures_H.value(uuid));
|
||||
|
||||
|
||||
if (!uuid.isNull()) {
|
||||
m_pixmap_H.insert(uuid, pix);
|
||||
}
|
||||
return pix;
|
||||
}
|
||||
|
||||
|
||||
return QPixmap();
|
||||
}
|
||||
|
||||
@@ -122,7 +123,7 @@ ElementPictureFactory::primitives ElementPictureFactory::getPrimitives(
|
||||
{
|
||||
if(!m_primitives_H.contains(location.uuid()))
|
||||
build(location);
|
||||
|
||||
|
||||
return m_primitives_H.value(location.uuid());
|
||||
}
|
||||
|
||||
@@ -143,14 +144,14 @@ ElementPictureFactory::~ElementPictureFactory()
|
||||
this function draw on it and don't store it.
|
||||
if null, this function create a QPicture for normal and low zoom,
|
||||
draw on it and store it in m_pictures_H and m_low_pictures_H
|
||||
@return
|
||||
@return
|
||||
*/
|
||||
bool ElementPictureFactory::build(const ElementsLocation &location,
|
||||
QPicture *picture,
|
||||
QPicture *low_picture)
|
||||
{
|
||||
QDomElement dom = location.xml();
|
||||
|
||||
|
||||
//Check if the curent version can read the xml description
|
||||
if (dom.hasAttribute("version"))
|
||||
{
|
||||
@@ -165,7 +166,7 @@ bool ElementPictureFactory::build(const ElementsLocation &location,
|
||||
) << std::endl;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//This attributes must be present and valid
|
||||
int w, h, hot_x, hot_y;
|
||||
if (!QET::attributeIsAnInteger(dom, QString("width"), &w) ||\
|
||||
@@ -175,7 +176,7 @@ bool ElementPictureFactory::build(const ElementsLocation &location,
|
||||
{
|
||||
return(false);
|
||||
}
|
||||
|
||||
|
||||
QPainter painter;
|
||||
QPicture pic;
|
||||
primitives primitives_;
|
||||
@@ -188,8 +189,8 @@ bool ElementPictureFactory::build(const ElementsLocation &location,
|
||||
painter.setRenderHint(QPainter::Antialiasing, true);
|
||||
painter.setRenderHint(QPainter::TextAntialiasing, true);
|
||||
painter.setRenderHint(QPainter::SmoothPixmapTransform,true);
|
||||
|
||||
|
||||
|
||||
|
||||
QPainter low_painter;
|
||||
QPicture low_pic;
|
||||
if (low_picture) {
|
||||
@@ -201,12 +202,12 @@ bool ElementPictureFactory::build(const ElementsLocation &location,
|
||||
low_painter.setRenderHint(QPainter::Antialiasing, true);
|
||||
low_painter.setRenderHint(QPainter::TextAntialiasing, true);
|
||||
low_painter.setRenderHint(QPainter::SmoothPixmapTransform,true);
|
||||
|
||||
|
||||
QPen tmp;
|
||||
tmp.setWidthF(1.0); //Vaudoo line to take into account the setCosmetic - don't remove
|
||||
tmp.setCosmetic(true);
|
||||
low_painter.setPen(tmp);
|
||||
|
||||
|
||||
//scroll of the Children of the Definition: Parts of the Drawing
|
||||
for (QDomNode node = dom.firstChild() ; !node.isNull() ; node = node.nextSibling())
|
||||
{
|
||||
@@ -214,9 +215,9 @@ bool ElementPictureFactory::build(const ElementsLocation &location,
|
||||
if (elmts.isNull()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
if (elmts.tagName() == "description")
|
||||
{
|
||||
{
|
||||
//Manage the graphic description = part of drawing
|
||||
for (QDomNode n = node.firstChild() ; !n.isNull() ; n = n.nextSibling())
|
||||
{
|
||||
@@ -230,7 +231,7 @@ bool ElementPictureFactory::build(const ElementsLocation &location,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//End of the drawing
|
||||
painter.end();
|
||||
low_painter.end();
|
||||
@@ -458,7 +459,7 @@ void ElementPictureFactory::parsePolygon(const QDomElement &dom, QPainter &paint
|
||||
if (i < 3) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
QVector<QPointF> points; // empty vector created instead of default initialized vector with i-1 elements.
|
||||
for (int j = 1 ; j < i ; ++ j) {
|
||||
points.insert(
|
||||
@@ -568,11 +569,11 @@ void ElementPictureFactory::setPainterStyle(const QDomElement &dom, QPainter &pa
|
||||
#pragma message("@TODO remove code for QT 5.14 or later")
|
||||
const QStringList styles = dom.attribute("style").split(";", Qt::SkipEmptyParts);
|
||||
#endif
|
||||
QRegExp rx("^\\s*([a-z-]+)\\s*:\\s*([a-zA-Z-]+)\\s*$");
|
||||
QRegularExpression rx("^\\s*([a-z-]+)\\s*:\\s*([a-zA-Z-]+)\\s*$");
|
||||
for (QString style : styles) {
|
||||
if (rx.exactMatch(style)) {
|
||||
QString style_name = rx.cap(1);
|
||||
QString style_value = rx.cap(2);
|
||||
if (rx==QRegularExpression(style)) {
|
||||
QString style_name = rx.namedCaptureGroups().at(1);
|
||||
QString style_value = rx.namedCaptureGroups().at(2);
|
||||
if (style_name == "line-style") {
|
||||
if (style_value == "dashed") pen.setStyle(Qt::DashLine);
|
||||
else if (style_value == "dotted") pen.setStyle(Qt::DotLine);
|
||||
|
||||
@@ -77,26 +77,21 @@ PropertiesEditorWidget *PropertiesEditorFactory::propertiesEditor(
|
||||
PropertiesEditorWidget *editor,
|
||||
QWidget *parent)
|
||||
{
|
||||
int count_ = items.size();
|
||||
const int count_ = items.size();
|
||||
if (count_ == 0) {
|
||||
return nullptr;
|
||||
}
|
||||
QGraphicsItem *item = items.first();
|
||||
const int type_ = item->type();
|
||||
|
||||
//The editor widget can only edit one item
|
||||
//or several items of the same type
|
||||
if (count_ != 1)
|
||||
{
|
||||
if (count_ == 0) {
|
||||
for (auto qgi : items) {
|
||||
if (qgi->type() != type_) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
int type_ = items.first()->type();
|
||||
for (QGraphicsItem *qgi : items) {
|
||||
if (qgi->type() != type_) {
|
||||
return nullptr;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
QGraphicsItem *item = items.first();
|
||||
const int type_ = item->type();
|
||||
QString class_name;
|
||||
if (editor) {
|
||||
class_name = editor->metaObject()->className();
|
||||
|
||||
@@ -203,7 +203,6 @@ int main(int argc, char **argv)
|
||||
my_ma->send_info_to_debug();
|
||||
delete my_ma;
|
||||
}
|
||||
|
||||
return app.exec();
|
||||
}
|
||||
|
||||
|
||||
@@ -15,9 +15,11 @@
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with QElectroTech. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#include <QMetaEnum>
|
||||
#include <QHash>
|
||||
|
||||
#include "xrefproperties.h"
|
||||
#include "qetapp.h"
|
||||
#include <QMetaEnum>
|
||||
|
||||
/**
|
||||
@brief XRefProperties::XRefProperties
|
||||
@@ -56,7 +58,7 @@ void XRefProperties::toSettings(QSettings &settings,
|
||||
QString slave_label = m_slave_label;
|
||||
settings.setValue(prefix + "slave_label", slave_label);
|
||||
|
||||
|
||||
|
||||
QMetaEnum var = QMetaEnum::fromType<Qt::Alignment>();
|
||||
settings.setValue(prefix + "xrefpos", var.valueToKey(m_xref_pos));
|
||||
|
||||
@@ -110,7 +112,7 @@ QDomElement XRefProperties::toXml(QDomDocument &xml_document) const
|
||||
xml_element.setAttribute("snapto", snap);
|
||||
|
||||
QString xrefpos;
|
||||
|
||||
|
||||
QMetaEnum var = QMetaEnum::fromType<Qt::Alignment>();
|
||||
xml_element.setAttribute("xrefpos", var.valueToKey(m_xref_pos));
|
||||
|
||||
|
||||
@@ -18,8 +18,10 @@
|
||||
#ifndef XREFPROPERTIES_H
|
||||
#define XREFPROPERTIES_H
|
||||
|
||||
#include "propertiesinterface.h"
|
||||
#include <QStringList>
|
||||
#include <QHash>
|
||||
|
||||
#include "propertiesinterface.h"
|
||||
|
||||
/**
|
||||
@brief The XRefProperties class
|
||||
|
||||
@@ -1,17 +1,17 @@
|
||||
/*
|
||||
Copyright 2006-2020 The QElectroTech Team
|
||||
This file is part of QElectroTech.
|
||||
|
||||
|
||||
QElectroTech 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 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
|
||||
QElectroTech 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 QElectroTech. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
@@ -24,6 +24,7 @@
|
||||
#include <QFileInfo>
|
||||
#include <QSaveFile>
|
||||
#include <QTextStream>
|
||||
#include <QRegularExpression>
|
||||
|
||||
/**
|
||||
Permet de convertir une chaine de caracteres ("n", "s", "e" ou "w")
|
||||
@@ -169,10 +170,10 @@ bool QET::orthogonalProjection(const QPointF &point,
|
||||
// recupere le vecteur normal de `line'
|
||||
QLineF line_normal_vector(line.normalVector());
|
||||
QPointF normal_vector(line_normal_vector.dx(), line_normal_vector.dy());
|
||||
|
||||
|
||||
// cree une droite perpendiculaire a `line' passant par `point'
|
||||
QLineF perpendicular_line(point, point + normal_vector);
|
||||
|
||||
|
||||
// determine le point d'intersection des deux droites = le projete orthogonal
|
||||
QPointF intersection_point;
|
||||
|
||||
@@ -184,15 +185,15 @@ bool QET::orthogonalProjection(const QPointF &point,
|
||||
intersects
|
||||
#endif
|
||||
(perpendicular_line, &intersection_point);
|
||||
|
||||
|
||||
// ne devrait pas arriver (mais bon...)
|
||||
if (it == QLineF::NoIntersection) return(false);
|
||||
|
||||
|
||||
// fournit le point d'intersection a l'appelant si necessaire
|
||||
if (intersection) {
|
||||
*intersection = intersection_point;
|
||||
}
|
||||
|
||||
|
||||
// determine si le point d'intersection appartient au segment de droite
|
||||
if (QET::lineContainsPoint(line, intersection_point)) {
|
||||
return(true);
|
||||
@@ -272,7 +273,7 @@ QString QET::ElementsAndConductorsSentence(int elements_count,
|
||||
elements_count
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
if (conductors_count) {
|
||||
if (!text.isEmpty()) text += ", ";
|
||||
text += QObject::tr(
|
||||
@@ -281,7 +282,7 @@ QString QET::ElementsAndConductorsSentence(int elements_count,
|
||||
conductors_count
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
if (texts_count) {
|
||||
if (!text.isEmpty()) text += ", ";
|
||||
text += QObject::tr(
|
||||
@@ -308,7 +309,7 @@ QString QET::ElementsAndConductorsSentence(int elements_count,
|
||||
shapes_count
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
if (element_text_count) {
|
||||
if (!text.isEmpty()) text += ", ";
|
||||
text += QObject::tr(
|
||||
@@ -324,7 +325,7 @@ QString QET::ElementsAndConductorsSentence(int elements_count,
|
||||
"part of a sentence listing the content of diagram",
|
||||
tables_count);
|
||||
}
|
||||
|
||||
|
||||
return(text);
|
||||
}
|
||||
|
||||
@@ -354,7 +355,7 @@ QList<QDomElement> QET::findInDomElement(const QDomElement &e,
|
||||
const QString &parent,
|
||||
const QString &children) {
|
||||
QList<QDomElement> return_list;
|
||||
|
||||
|
||||
// parcours des elements parents
|
||||
for (QDomNode enfant = e.firstChild() ; !enfant.isNull() ; enfant = enfant.nextSibling()) {
|
||||
// on s'interesse a l'element XML "parent"
|
||||
@@ -417,15 +418,15 @@ QList<QChar> QET::forbiddenCharacters()
|
||||
*/
|
||||
QString QET::stringToFileName(const QString &name) {
|
||||
QString file_name(name.toLower());
|
||||
|
||||
|
||||
// remplace les caracteres interdits par des tirets
|
||||
foreach(QChar c, QET::forbiddenCharacters()) {
|
||||
file_name.replace(c, '-');
|
||||
}
|
||||
|
||||
|
||||
// remplace les espaces par des underscores
|
||||
file_name.replace(' ', '_');
|
||||
|
||||
|
||||
return(file_name);
|
||||
}
|
||||
|
||||
@@ -455,12 +456,12 @@ QString QET::unescapeSpaces(const QString &string) {
|
||||
*/
|
||||
QString QET::joinWithSpaces(const QStringList &string_list) {
|
||||
QString returned_string;
|
||||
|
||||
|
||||
for (int i = 0 ; i < string_list.count() ; ++ i) {
|
||||
returned_string += QET::escapeSpaces(string_list.at(i));
|
||||
if (i != string_list.count() - 1) returned_string += " ";
|
||||
}
|
||||
|
||||
|
||||
return(returned_string);
|
||||
}
|
||||
|
||||
@@ -475,7 +476,7 @@ QStringList QET::splitWithSpaces(const QString &string) {
|
||||
// = avec un nombre nul ou pair de backslashes devant
|
||||
|
||||
#pragma message("@TODO remove code for QT 5.14 or later")
|
||||
QStringList escaped_strings = string.split(QRegExp("[^\\]?(?:\\\\)* "),
|
||||
QStringList escaped_strings = string.split(QRegularExpression("[^\\]?(?:\\\\)* "),
|
||||
#if QT_VERSION < QT_VERSION_CHECK(5, 14, 0) // ### Qt 6: remove
|
||||
QString
|
||||
#else
|
||||
@@ -570,13 +571,13 @@ bool QET::compareCanonicalFilePaths(const QString &first, const QString &second)
|
||||
|
||||
QString second_canonical_path = QFileInfo(second).canonicalFilePath();
|
||||
if (second_canonical_path.isEmpty()) return(false);
|
||||
|
||||
|
||||
#ifdef Q_OS_WIN
|
||||
// sous Windows, on ramene les chemins en minuscules
|
||||
first_canonical_path = first_canonical_path.toLower();
|
||||
second_canonical_path = second_canonical_path.toLower();
|
||||
#endif
|
||||
|
||||
|
||||
return(first_canonical_path == second_canonical_path);
|
||||
}
|
||||
|
||||
@@ -592,7 +593,7 @@ bool QET::compareCanonicalFilePaths(const QString &first, const QString &second)
|
||||
bool QET::writeXmlFile(QDomDocument &xml_doc, const QString &filepath, QString *error_message)
|
||||
{
|
||||
QSaveFile file(filepath);
|
||||
|
||||
|
||||
// Note: we do not set QIODevice::Text to avoid generating CRLF end of lines
|
||||
bool file_opening = file.open(QIODevice::WriteOnly);
|
||||
if (!file_opening)
|
||||
@@ -605,7 +606,7 @@ bool QET::writeXmlFile(QDomDocument &xml_doc, const QString &filepath, QString *
|
||||
}
|
||||
return(false);
|
||||
}
|
||||
|
||||
|
||||
QTextStream out(&file);
|
||||
out.setCodec("UTF-8");
|
||||
out.setGenerateByteOrderMark(false);
|
||||
@@ -617,10 +618,10 @@ bool QET::writeXmlFile(QDomDocument &xml_doc, const QString &filepath, QString *
|
||||
"Une erreur est survenue lors de l'écriture du fichier %1, erreur %2 rencontrée.",
|
||||
"error message when attempting to write an XML file")).arg(filepath).arg(file.error());
|
||||
}
|
||||
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
return(true);
|
||||
}
|
||||
|
||||
@@ -687,7 +688,7 @@ QActionGroup *QET::depthActionGroup(QObject *parent)
|
||||
{
|
||||
QActionGroup *action_group = new QActionGroup(parent);
|
||||
|
||||
QAction *edit_forward = new QAction(QET::Icons::BringForward, QObject::tr("Amener au premier plan"), action_group);
|
||||
QAction *edit_forward = new QAction(QET::Icons::BringForward, QObject::tr("Amener au premier plan"), action_group);
|
||||
QAction *edit_raise = new QAction(QET::Icons::Raise, QObject::tr("Rapprocher"), action_group);
|
||||
QAction *edit_lower = new QAction(QET::Icons::Lower, QObject::tr("Éloigner"), action_group);
|
||||
QAction *edit_backward = new QAction(QET::Icons::SendBackward, QObject::tr("Envoyer au fond"), action_group);
|
||||
@@ -696,17 +697,17 @@ QActionGroup *QET::depthActionGroup(QObject *parent)
|
||||
edit_raise ->setStatusTip(QObject::tr("Rapproche la ou les sélections"));
|
||||
edit_lower ->setStatusTip(QObject::tr("Éloigne la ou les sélections"));
|
||||
edit_backward->setStatusTip(QObject::tr("Envoie en arrière plan la ou les sélections"));
|
||||
|
||||
|
||||
edit_raise ->setShortcut(QKeySequence(QObject::tr("Ctrl+Shift+Up")));
|
||||
edit_lower ->setShortcut(QKeySequence(QObject::tr("Ctrl+Shift+Down")));
|
||||
edit_backward->setShortcut(QKeySequence(QObject::tr("Ctrl+Shift+End")));
|
||||
edit_forward ->setShortcut(QKeySequence(QObject::tr("Ctrl+Shift+Home")));
|
||||
|
||||
|
||||
edit_forward ->setData(QET::BringForward);
|
||||
edit_raise ->setData(QET::Raise);
|
||||
edit_lower ->setData(QET::Lower);
|
||||
edit_backward->setData(QET::SendBackward);
|
||||
|
||||
|
||||
return action_group;
|
||||
}
|
||||
|
||||
|
||||
@@ -33,14 +33,14 @@
|
||||
#include "projectview.h"
|
||||
#include "elementpicturefactory.h"
|
||||
#include "aboutqetdialog.h"
|
||||
#include "factory/elementfactory.h"
|
||||
|
||||
#include <cstdlib>
|
||||
#include <iostream>
|
||||
#define QUOTE(x) STRINGIFY(x)
|
||||
#define STRINGIFY(x) #x
|
||||
#include <QProcessEnvironment>
|
||||
#include "factory/elementfactory.h"
|
||||
|
||||
#include <QRegularExpression>
|
||||
#include <KAutoSaveFile>
|
||||
|
||||
#ifdef QET_ALLOW_OVERRIDE_CED_OPTION
|
||||
@@ -97,7 +97,7 @@ QETApp::QETApp() :
|
||||
"splash screen caption"));
|
||||
if (!collections_cache_) {
|
||||
QString cache_path = QETApp::configDir() + "/elements_cache.sqlite";
|
||||
|
||||
|
||||
collections_cache_ = new ElementsCollectionCache(cache_path, this);
|
||||
collections_cache_->setLocale(langFromSetting());
|
||||
}
|
||||
@@ -113,12 +113,12 @@ QETApp::QETApp() :
|
||||
"splash screen caption"));
|
||||
openFiles(qet_arguments_);
|
||||
}
|
||||
|
||||
|
||||
buildSystemTrayMenu();
|
||||
if (m_splash_screen) {
|
||||
m_splash_screen -> hide();
|
||||
}
|
||||
|
||||
|
||||
checkBackupFiles();
|
||||
}
|
||||
|
||||
@@ -129,17 +129,17 @@ QETApp::~QETApp()
|
||||
{
|
||||
m_elements_recent_files->save();
|
||||
m_projects_recent_files->save();
|
||||
|
||||
|
||||
delete m_splash_screen;
|
||||
delete m_elements_recent_files;
|
||||
delete m_projects_recent_files;
|
||||
delete m_qsti;
|
||||
|
||||
|
||||
if (m_custom_tbt_collection)
|
||||
delete m_custom_tbt_collection;
|
||||
if (m_common_tbt_collection)
|
||||
delete m_common_tbt_collection;
|
||||
|
||||
|
||||
ElementFactory::dropInstance();
|
||||
ElementPictureFactory::dropInstance();
|
||||
}
|
||||
@@ -409,12 +409,12 @@ QString QETApp::elementTranslatedInfoKey(const QString &info)
|
||||
else if (info == "label") return tr("Label");
|
||||
else if (info == "plant") return tr("Installation");
|
||||
else if (info == "location") return tr("Localisation");
|
||||
|
||||
|
||||
else if (info == "comment") return tr("Commentaire");
|
||||
else if (info == "function") return tr("Fonction");
|
||||
else if (info == "auxiliary1") return tr("Bloc auxiliaire 1");
|
||||
else if (info == "auxiliary2") return tr("Bloc auxiliaire 2");
|
||||
|
||||
|
||||
else if (info == "description") return tr("Description textuelle");
|
||||
else if (info == "designation") return tr("Numéro d'article");
|
||||
else if (info == "manufacturer") return tr("Fabricant");
|
||||
@@ -455,7 +455,7 @@ QStringList QETApp::conductorInfoKeys()
|
||||
keys.append("tension/protocol");
|
||||
keys.append("conductor_color");
|
||||
keys.append("conductor_section");
|
||||
|
||||
|
||||
return keys;
|
||||
}
|
||||
|
||||
@@ -492,7 +492,7 @@ QStringList QETApp::diagramInfoKeys()
|
||||
list.append("indexrev");
|
||||
list.append("date");
|
||||
list.append("display_folio");
|
||||
|
||||
|
||||
return list;
|
||||
}
|
||||
|
||||
@@ -625,7 +625,7 @@ QString QETApp::commonElementsDir()
|
||||
else if (m_user_common_elements_dir != "default") {
|
||||
return m_user_common_elements_dir;
|
||||
}
|
||||
|
||||
|
||||
#ifdef QET_ALLOW_OVERRIDE_CED_OPTION
|
||||
if (common_elements_dir != QString()) return(common_elements_dir);
|
||||
#endif
|
||||
@@ -687,7 +687,7 @@ QString QETApp::customElementsDir()
|
||||
else if (m_user_custom_elements_dir != "default") {
|
||||
return m_user_custom_elements_dir;
|
||||
}
|
||||
|
||||
|
||||
return(configDir() + "elements/");
|
||||
}
|
||||
|
||||
@@ -786,7 +786,7 @@ QString QETApp::customTitleBlockTemplatesDir()
|
||||
else if (m_user_custom_tbt_dir != "default") {
|
||||
return m_user_custom_tbt_dir;
|
||||
}
|
||||
|
||||
|
||||
return(configDir() + "titleblocks/");
|
||||
}
|
||||
|
||||
@@ -911,7 +911,7 @@ QStringList QETApp::handledFileExtensions()
|
||||
if (!ext.count()) {
|
||||
ext << "qet";
|
||||
ext << "elmt";
|
||||
ext << QString(TITLEBLOCKS_FILE_EXTENSION).remove(QRegExp("^\\."));
|
||||
ext << QString(TITLEBLOCKS_FILE_EXTENSION).remove(QRegularExpression("^\\."));
|
||||
}
|
||||
return(ext);
|
||||
}
|
||||
@@ -1159,7 +1159,7 @@ QFont QETApp::diagramTextsItemFont(qreal size)
|
||||
).toDouble();
|
||||
QString diagram_texts_item_style = settings.value("diagramitemstyle",
|
||||
"normal").toString();
|
||||
|
||||
|
||||
if (size != -1.0) {
|
||||
diagram_texts_item_size = size;
|
||||
}
|
||||
@@ -1359,9 +1359,9 @@ QList<QETElementEditor *> QETApp::elementEditors(QETProject *project) {
|
||||
void QETApp::receiveMessage(int instanceId, QByteArray message)
|
||||
{
|
||||
Q_UNUSED(instanceId);
|
||||
|
||||
|
||||
QString str(message);
|
||||
|
||||
|
||||
if (str.startsWith("launched-with-args: "))
|
||||
{
|
||||
QString my_message(str.mid(20));
|
||||
@@ -2102,10 +2102,10 @@ template <class T> void QETApp::addWindowsListToMenu(
|
||||
or -1 if none could be found.
|
||||
*/
|
||||
int QETApp::projectIdFromString(const QString &url) {
|
||||
QRegExp embedded("^project([0-9]+)\\+embed.*$", Qt::CaseInsensitive);
|
||||
if (embedded.exactMatch(url)) {
|
||||
QRegularExpression embedded("^project([0-9]+)\\+embed.*$", QRegularExpression::CaseInsensitiveOption);
|
||||
if (embedded==QRegularExpression(url)) {
|
||||
bool conv_ok = false;
|
||||
int project_id = embedded.capturedTexts().at(1).toInt(&conv_ok);
|
||||
int project_id = embedded.namedCaptureGroups().at(1).toInt(&conv_ok);
|
||||
if (conv_ok) {
|
||||
return(project_id);
|
||||
}
|
||||
@@ -2191,7 +2191,7 @@ void QETApp::buildSystemTrayMenu()
|
||||
void QETApp::checkBackupFiles()
|
||||
{
|
||||
QList<KAutoSaveFile *> stale_files = KAutoSaveFile::allStaleFiles();
|
||||
|
||||
|
||||
//Remove from the list @stale_files, the stales file of opened project
|
||||
const QList<KAutoSaveFile *> sf = stale_files;
|
||||
for (KAutoSaveFile *kasf : sf)
|
||||
@@ -2227,10 +2227,10 @@ void QETApp::checkBackupFiles()
|
||||
for(const KAutoSaveFile *kasf : stale_files)
|
||||
{
|
||||
#ifdef Q_OS_WIN
|
||||
//Remove the first character '/' before the name of the drive
|
||||
text.append("<br>" + kasf->managedFile().path().remove(0,1));
|
||||
//Remove the first character '/' before the name of the drive
|
||||
text.append("<br>" + kasf->managedFile().path().remove(0,1));
|
||||
#else
|
||||
text.append("<br>" + kasf->managedFile().path());
|
||||
text.append("<br>" + kasf->managedFile().path());
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -2319,12 +2319,12 @@ void QETApp::fetchWindowStats(
|
||||
bool QETApp::eventFiltrer(QObject *object, QEvent *e) {
|
||||
// gere l'ouverture de fichiers (sous MacOs)
|
||||
if (e -> type() == QEvent::FileOpen) {
|
||||
// nom du fichier a ouvrir
|
||||
QString filename = static_cast<QFileOpenEvent *>(e) -> file();
|
||||
openFiles(QStringList() << filename);
|
||||
return(true);
|
||||
// nom du fichier a ouvrir
|
||||
QString filename = static_cast<QFileOpenEvent *>(e) -> file();
|
||||
openFiles(QStringList() << filename);
|
||||
return(true);
|
||||
} else {
|
||||
return QObject::eventFilter(object, e);
|
||||
return QObject::eventFilter(object, e);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -1,17 +1,17 @@
|
||||
/*
|
||||
Copyright 2006-2020 The QElectroTech Team
|
||||
This file is part of QElectroTech.
|
||||
|
||||
|
||||
QElectroTech 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 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
|
||||
QElectroTech 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 QElectroTech. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
@@ -60,7 +60,7 @@ QETDiagramEditor::QETDiagramEditor(const QStringList &files, QWidget *parent) :
|
||||
open_dialog_dir (QStandardPaths::writableLocation(QStandardPaths::DesktopLocation))
|
||||
{
|
||||
activeSubWindowIndex = 0;
|
||||
|
||||
|
||||
QSplitter *splitter_ = new QSplitter(this);
|
||||
splitter_->setChildrenCollapsible(false);
|
||||
splitter_->setOrientation(Qt::Vertical);
|
||||
@@ -77,19 +77,19 @@ QETDiagramEditor::QETDiagramEditor(const QStringList &files, QWidget *parent) :
|
||||
anim->setObjectName("search and replace animator");
|
||||
m_search_and_replace_widget.setHidden(true);
|
||||
anim->setLastShowSize(m_search_and_replace_widget.minimumSizeHint().height());
|
||||
|
||||
|
||||
//Set object name to be retrieved by the stylesheets
|
||||
m_workspace.setBackground(QBrush(Qt::NoBrush));
|
||||
m_workspace.setObjectName("mdiarea");
|
||||
m_workspace.setTabsClosable(true);
|
||||
|
||||
|
||||
//Set the signal mapper
|
||||
connect(&windowMapper, SIGNAL(mapped(QWidget *)), this, SLOT(activateWidget(QWidget *)));
|
||||
|
||||
setWindowTitle(tr("QElectroTech", "window title"));
|
||||
|
||||
setWindowTitle(tr("QElectroTech", "window title"));
|
||||
setWindowIcon(QET::Icons::QETLogo);
|
||||
statusBar() -> showMessage(tr("QElectroTech", "status bar message"));
|
||||
|
||||
|
||||
setUpElementsPanel();
|
||||
setUpElementsCollectionWidget();
|
||||
setUpUndoStack();
|
||||
@@ -101,11 +101,11 @@ QETDiagramEditor::QETDiagramEditor(const QStringList &files, QWidget *parent) :
|
||||
setUpMenu();
|
||||
|
||||
tabifyDockWidget(qdw_undo, qdw_pa);
|
||||
|
||||
|
||||
//By default the windows is maximised
|
||||
setMinimumSize(QSize(500, 350));
|
||||
setWindowState(Qt::WindowMaximized);
|
||||
|
||||
|
||||
connect (&m_workspace,
|
||||
SIGNAL(subWindowActivated(QMdiSubWindow *)),
|
||||
this,
|
||||
@@ -117,7 +117,7 @@ QETDiagramEditor::QETDiagramEditor(const QStringList &files, QWidget *parent) :
|
||||
|
||||
readSettings();
|
||||
show();
|
||||
|
||||
|
||||
//If valid file path is given as arguments
|
||||
uint opened_projects = 0;
|
||||
if (files.count())
|
||||
@@ -149,7 +149,10 @@ void QETDiagramEditor::setUpElementsPanel()
|
||||
|
||||
qdw_pa -> setObjectName ("projects panel");
|
||||
qdw_pa -> setAllowedAreas (Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);
|
||||
qdw_pa -> setFeatures (QDockWidget::AllDockWidgetFeatures);
|
||||
qdw_pa -> setFeatures (
|
||||
QDockWidget::DockWidgetClosable
|
||||
|QDockWidget::DockWidgetMovable
|
||||
|QDockWidget::DockWidgetFloatable);
|
||||
qdw_pa -> setMinimumWidth (160);
|
||||
qdw_pa -> setWidget (pa = new ElementsPanelWidget(qdw_pa));
|
||||
|
||||
@@ -179,7 +182,10 @@ void QETDiagramEditor::setUpElementsCollectionWidget()
|
||||
m_qdw_elmt_collection = new QDockWidget(tr("Collections"), this);
|
||||
m_qdw_elmt_collection->setObjectName("elements_collection_widget");
|
||||
m_qdw_elmt_collection->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);
|
||||
m_qdw_elmt_collection->setFeatures(QDockWidget::AllDockWidgetFeatures);
|
||||
m_qdw_elmt_collection->setFeatures(
|
||||
QDockWidget::DockWidgetClosable
|
||||
|QDockWidget::DockWidgetMovable
|
||||
|QDockWidget::DockWidgetFloatable);
|
||||
|
||||
m_element_collection_widget = new ElementsCollectionWidget(m_qdw_elmt_collection);
|
||||
m_qdw_elmt_collection->setWidget(m_element_collection_widget);
|
||||
@@ -205,7 +211,10 @@ void QETDiagramEditor::setUpUndoStack()
|
||||
qdw_undo -> setObjectName("diagram_undo");
|
||||
|
||||
qdw_undo -> setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);
|
||||
qdw_undo -> setFeatures(QDockWidget::AllDockWidgetFeatures);
|
||||
qdw_undo -> setFeatures(
|
||||
QDockWidget::DockWidgetClosable
|
||||
|QDockWidget::DockWidgetMovable
|
||||
|QDockWidget::DockWidgetFloatable);
|
||||
qdw_undo -> setMinimumWidth(160);
|
||||
qdw_undo -> setWidget(undo_view);
|
||||
|
||||
@@ -231,7 +240,10 @@ void QETDiagramEditor::setUpAutonumberingWidget()
|
||||
{
|
||||
m_autonumbering_dock = new AutoNumberingDockWidget(this);
|
||||
m_autonumbering_dock -> setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);
|
||||
m_autonumbering_dock -> setFeatures(QDockWidget::AllDockWidgetFeatures);
|
||||
m_autonumbering_dock -> setFeatures(
|
||||
QDockWidget::DockWidgetClosable
|
||||
|QDockWidget::DockWidgetMovable
|
||||
|QDockWidget::DockWidgetFloatable);
|
||||
addDockWidget(Qt::RightDockWidgetArea, m_autonumbering_dock);
|
||||
}
|
||||
|
||||
@@ -251,7 +263,7 @@ void QETDiagramEditor::setUpActions()
|
||||
current_project -> exportProject();
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
//Print
|
||||
m_print = new QAction(QET::Icons::DocumentPrint, tr("Imprimer"), this);
|
||||
m_print->setShortcut(QKeySequence(QKeySequence::Print));
|
||||
@@ -262,7 +274,7 @@ void QETDiagramEditor::setUpActions()
|
||||
current_project -> printProject();
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
//Quit editor
|
||||
m_quit_editor = new QAction(QET::Icons::ApplicationExit, tr("&Quitter"), this);
|
||||
m_quit_editor->setShortcut(QKeySequence(tr("Ctrl+Q")));
|
||||
@@ -314,7 +326,7 @@ void QETDiagramEditor::setUpActions()
|
||||
if (DiagramView *dv = currentDiagramView())
|
||||
dv->resetConductors();
|
||||
});
|
||||
|
||||
|
||||
//AutoConductor
|
||||
m_auto_conductor = new QAction (QET::Icons::Autoconnect, tr("Création automatique de conducteur(s)","Tool tip of auto conductor"), this);
|
||||
m_auto_conductor->setStatusTip (tr("Utiliser la création automatique de conducteur(s) quand cela est possible", "Status tip of auto conductor"));
|
||||
@@ -358,13 +370,13 @@ void QETDiagramEditor::setUpActions()
|
||||
project_view->editCurrentDiagramProperties();
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
//Edit current project properties
|
||||
m_project_edit_properties = new QAction(QET::Icons::ProjectProperties, tr("Propriétés du projet"), this);
|
||||
connect(m_project_edit_properties, &QAction::triggered, [this]() {
|
||||
editProjectProperties(currentProjectView());
|
||||
});
|
||||
|
||||
|
||||
//Add new folio to current project
|
||||
m_project_add_diagram = new QAction(QET::Icons::DiagramAdd, tr("Ajouter un folio"), this);
|
||||
m_project_add_diagram->setShortcut(QKeySequence(tr("Ctrl+T")));
|
||||
@@ -373,11 +385,11 @@ void QETDiagramEditor::setUpActions()
|
||||
current_project->project()->addNewDiagram();
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
//Remove current folio from current project
|
||||
m_remove_diagram_from_project = new QAction(QET::Icons::DiagramDelete, tr("Supprimer le folio"), this);
|
||||
connect(m_remove_diagram_from_project, &QAction::triggered, this, &QETDiagramEditor::removeDiagramFromProject);
|
||||
|
||||
|
||||
//Clean the current project
|
||||
m_clean_project = new QAction(QET::Icons::EditClear, tr("Nettoyer le projet"), this);
|
||||
connect(m_clean_project, &QAction::triggered, [this]() {
|
||||
@@ -394,7 +406,7 @@ void QETDiagramEditor::setUpActions()
|
||||
BOMExportDialog bom(currentProjectView()->project(), this);
|
||||
bom.exec();
|
||||
});
|
||||
|
||||
|
||||
//Add a nomenclature item
|
||||
m_add_nomenclature = new QAction(QET::Icons::TableOfContent, tr("Ajouter une nomenclature"), this);
|
||||
connect(m_add_nomenclature, &QAction::triggered, [this]() {
|
||||
@@ -430,27 +442,27 @@ void QETDiagramEditor::setUpActions()
|
||||
connect(m_export_project_db, &QAction::triggered, [this]() {
|
||||
projectDataBase::exportDb(this->currentProject()->dataBase(), this);
|
||||
});
|
||||
|
||||
|
||||
//MDI view style
|
||||
m_tabbed_view_mode = new QAction(tr("en utilisant des onglets"), this);
|
||||
m_tabbed_view_mode->setStatusTip(tr("Présente les différents projets ouverts des onglets", "status bar tip"));
|
||||
m_tabbed_view_mode->setCheckable(true);
|
||||
connect(m_tabbed_view_mode, &QAction::triggered, this, &QETDiagramEditor::setTabbedMode);
|
||||
|
||||
|
||||
m_windowed_view_mode = new QAction(tr("en utilisant des fenêtres"), this);
|
||||
m_windowed_view_mode->setStatusTip(tr("Présente les différents projets ouverts dans des sous-fenêtres", "status bar tip"));
|
||||
m_windowed_view_mode->setCheckable(true);
|
||||
connect(m_windowed_view_mode, &QAction::triggered, this, &QETDiagramEditor::setWindowedMode);
|
||||
|
||||
|
||||
m_group_view_mode = new QActionGroup(this);
|
||||
m_group_view_mode -> addAction(m_windowed_view_mode);
|
||||
m_group_view_mode -> addAction(m_tabbed_view_mode);
|
||||
m_group_view_mode -> setExclusive(true);
|
||||
|
||||
|
||||
m_tile_window = new QAction(tr("&Mosaïque"), this);
|
||||
m_tile_window->setStatusTip(tr("Dispose les fenêtres en mosaïque", "status bar tip"));
|
||||
connect(m_tile_window, &QAction::triggered, &m_workspace, &QMdiArea::tileSubWindows);
|
||||
|
||||
|
||||
m_cascade_window = new QAction(tr("&Cascade"), this);
|
||||
m_cascade_window->setStatusTip(tr("Dispose les fenêtres en cascade", "status bar tip"));
|
||||
connect(m_cascade_window, &QAction::triggered, &m_workspace, &QMdiArea::cascadeSubWindows);
|
||||
@@ -467,7 +479,7 @@ void QETDiagramEditor::setUpActions()
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
m_mode_visualise = new QAction(QET::Icons::ViewMove, tr("Mode Visualisation"), this);
|
||||
m_mode_visualise->setStatusTip(tr("Permet de visualiser le folio sans pouvoir le modifier", "status bar tip"));
|
||||
m_mode_visualise->setCheckable(true);
|
||||
@@ -489,7 +501,7 @@ void QETDiagramEditor::setUpActions()
|
||||
m_next_window->setShortcut(QKeySequence::NextChild);
|
||||
m_next_window->setStatusTip(tr("Active le projet suivant", "status bar tip"));
|
||||
connect(m_next_window, &QAction::triggered, &m_workspace, &QMdiArea::activateNextSubWindow);
|
||||
|
||||
|
||||
m_previous_window = new QAction(tr("Projet précédent"), this);
|
||||
m_previous_window->setShortcut(QKeySequence::PreviousChild);
|
||||
m_previous_window->setStatusTip(tr("Active le projet précédent", "status bar tip"));
|
||||
@@ -645,11 +657,11 @@ void QETDiagramEditor::setUpActions()
|
||||
//Depth action
|
||||
m_depth_action_group = QET::depthActionGroup(this);
|
||||
m_depth_action_group->setDisabled(true);
|
||||
|
||||
|
||||
connect(m_depth_action_group, &QActionGroup::triggered, [this](QAction *action) {
|
||||
this->currentDiagramView()->diagram()->changeZValue(action->data().value<QET::DepthOption>());
|
||||
});
|
||||
|
||||
|
||||
m_find = new QAction(tr("Chercher/remplacer"), this);
|
||||
m_find->setShortcut(QKeySequence::Find);
|
||||
connect(m_find, &QAction::triggered, [this]()
|
||||
@@ -705,7 +717,7 @@ void QETDiagramEditor::setUpToolBar()
|
||||
m_add_item_tool_bar = new QToolBar(tr("Ajouter"), this);
|
||||
m_add_item_tool_bar->setObjectName("adding");
|
||||
m_add_item_tool_bar->addActions(m_add_item_actions_group.actions());
|
||||
|
||||
|
||||
m_depth_tool_bar = new QToolBar(tr("Profondeur", "toolbar title"));
|
||||
m_depth_tool_bar->setObjectName("diagram_depth_toolbar");
|
||||
m_depth_tool_bar->addActions(m_depth_action_group->actions());
|
||||
@@ -792,7 +804,7 @@ void QETDiagramEditor::setUpMenu()
|
||||
diagram_tool_bar -> toggleViewAction() -> setStatusTip(tr("Affiche ou non la barre d'outils Schéma"));
|
||||
qdw_pa -> toggleViewAction() -> setStatusTip(tr("Affiche ou non le panel d'appareils"));
|
||||
qdw_undo -> toggleViewAction() -> setStatusTip(tr("Affiche ou non la liste des modifications"));
|
||||
|
||||
|
||||
|
||||
// menu Affichage
|
||||
QMenu *projects_view_mode = menu_affichage -> addMenu(QET::Icons::ConfigureToolbars, tr("Afficher les projets"));
|
||||
@@ -848,7 +860,7 @@ void QETDiagramEditor::closeEvent(QCloseEvent *qce)
|
||||
Reimplemented to :
|
||||
-Load elements collection when WindowActivate.
|
||||
@param e
|
||||
@return
|
||||
@return
|
||||
*/
|
||||
bool QETDiagramEditor::event(QEvent *e)
|
||||
{
|
||||
@@ -916,10 +928,10 @@ void QETDiagramEditor::saveAs()
|
||||
bool QETDiagramEditor::newProject()
|
||||
{
|
||||
auto new_project = new QETProject(this);
|
||||
|
||||
|
||||
// add new diagram
|
||||
new_project -> addNewDiagram();
|
||||
|
||||
|
||||
return addProject(new_project);
|
||||
}
|
||||
|
||||
@@ -952,10 +964,10 @@ bool QETDiagramEditor::openProject()
|
||||
tr("Projets QElectroTech (*.qet);;Fichiers XML (*.xml);;Tous les fichiers (*)")
|
||||
);
|
||||
if (filepath.isEmpty()) return(false);
|
||||
|
||||
|
||||
// retient le dossier contenant le dernier projet ouvert
|
||||
open_dialog_dir = QDir(filepath);
|
||||
|
||||
|
||||
// ouvre le fichier
|
||||
return(openAndAddProject(filepath));
|
||||
}
|
||||
@@ -1002,7 +1014,7 @@ bool QETDiagramEditor::openAndAddProject(
|
||||
bool interactive)
|
||||
{
|
||||
if (filepath.isEmpty()) return(false);
|
||||
|
||||
|
||||
QFileInfo filepath_info(filepath);
|
||||
|
||||
//Check if project is not open in another editor
|
||||
@@ -1024,7 +1036,7 @@ bool QETDiagramEditor::openAndAddProject(
|
||||
return(diagram_editor -> openAndAddProject(filepath));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// check the file exists
|
||||
if (!filepath_info.exists())
|
||||
{
|
||||
@@ -1056,7 +1068,7 @@ bool QETDiagramEditor::openAndAddProject(
|
||||
}
|
||||
return(false);
|
||||
}
|
||||
|
||||
|
||||
//Check if file is read only
|
||||
if (!filepath_info.isWritable())
|
||||
{
|
||||
@@ -1070,10 +1082,10 @@ bool QETDiagramEditor::openAndAddProject(
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//Create the project
|
||||
DialogWaiting::instance(this);
|
||||
|
||||
|
||||
QETProject *project = new QETProject(filepath);
|
||||
if (project -> state() != QETProject::Ok)
|
||||
{
|
||||
@@ -1120,14 +1132,14 @@ bool QETDiagramEditor::addProject(QETProject *project, bool update_panel)
|
||||
undo_group.addStack(project -> undoStack());
|
||||
|
||||
m_element_collection_widget->addProject(project);
|
||||
|
||||
|
||||
// met a jour le panel d'elements
|
||||
if (update_panel) {
|
||||
pa -> elementsPanel().projectWasOpened(project);
|
||||
if (currentDiagramView() != nullptr)
|
||||
m_autonumbering_dock->setProject(project, project_view);
|
||||
}
|
||||
|
||||
|
||||
return(true);
|
||||
}
|
||||
|
||||
@@ -1154,10 +1166,10 @@ ProjectView *QETDiagramEditor::currentProjectView() const
|
||||
{
|
||||
QMdiSubWindow *current_window = m_workspace.activeSubWindow();
|
||||
if (!current_window) return(nullptr);
|
||||
|
||||
|
||||
QWidget *current_widget = current_window -> widget();
|
||||
if (!current_widget) return(nullptr);
|
||||
|
||||
|
||||
if (ProjectView *project_view = qobject_cast<ProjectView *>(current_widget)) {
|
||||
return(project_view);
|
||||
}
|
||||
@@ -1203,11 +1215,11 @@ Element *QETDiagramEditor::currentElement() const
|
||||
DiagramView *dv = currentDiagramView();
|
||||
if (!dv)
|
||||
return(nullptr);
|
||||
|
||||
|
||||
QList<Element *> selected_elements = DiagramContent(dv->diagram()).m_elements;
|
||||
if (selected_elements.count() != 1)
|
||||
return(nullptr);
|
||||
|
||||
|
||||
return(selected_elements.first());
|
||||
}
|
||||
|
||||
@@ -1426,7 +1438,7 @@ void QETDiagramEditor::selectionGroupTriggered(QAction *action)
|
||||
QList<DynamicElementTextItem *> deti_list = dc.m_element_texts.values();
|
||||
if(deti_list.size() <= 1)
|
||||
return;
|
||||
|
||||
|
||||
diagram->undoStack().push(new AddTextsGroupCommand(deti_list.first()->parentElement(), tr("Groupe"), deti_list));
|
||||
}
|
||||
}
|
||||
@@ -1441,7 +1453,7 @@ void QETDiagramEditor::rowColumnGroupTriggered(QAction *action)
|
||||
Diagram *d = dv->diagram();
|
||||
BorderProperties old_bp = d->border_and_titleblock.exportBorder();
|
||||
BorderProperties new_bp = d->border_and_titleblock.exportBorder();
|
||||
|
||||
|
||||
if (value == "add_column")
|
||||
new_bp.columns_count += 1;
|
||||
else if (value == "remove_column")
|
||||
@@ -1450,7 +1462,7 @@ void QETDiagramEditor::rowColumnGroupTriggered(QAction *action)
|
||||
new_bp.rows_count += 1;
|
||||
else if (value == "remove_row")
|
||||
new_bp.rows_count -= 1;
|
||||
|
||||
|
||||
d->undoStack().push(new ChangeBorderCommand(d, old_bp, new_bp));
|
||||
}
|
||||
|
||||
@@ -1542,23 +1554,23 @@ void QETDiagramEditor::slot_updateComplexActions()
|
||||
<< m_group_selected_texts;
|
||||
for(QAction *action : action_list)
|
||||
action->setEnabled(false);
|
||||
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
Diagram *diagram_ = dv->diagram();
|
||||
DiagramContent dc(diagram_);
|
||||
bool ro = diagram_->isReadOnly();
|
||||
|
||||
|
||||
|
||||
//Number of selected conductors
|
||||
int selected_conductors_count = diagram_->selectedConductors().count();
|
||||
m_conductor_reset->setEnabled(!ro && selected_conductors_count);
|
||||
|
||||
|
||||
// number of selected elements
|
||||
int selected_elements_count = dc.count(DiagramContent::Elements);
|
||||
m_find_element->setEnabled(selected_elements_count == 1);
|
||||
|
||||
|
||||
//Action that need items (elements, conductors, texts...) selected, to be enabled
|
||||
bool copiable_items = dc.hasCopiableItems();
|
||||
bool deletable_items = dc.hasDeletableItems();
|
||||
@@ -1584,7 +1596,7 @@ void QETDiagramEditor::slot_updateComplexActions()
|
||||
selected_dynamic_elmt_text++;
|
||||
}
|
||||
m_rotate_texts->setEnabled(!ro && (selected_texts || groups.size()));
|
||||
|
||||
|
||||
//Action that need only element text selected
|
||||
QList<DynamicElementTextItem *> deti_list = dc.m_element_texts.values();
|
||||
if(deti_list.size() > 1 && dc.count() == deti_list.count())
|
||||
@@ -1653,7 +1665,7 @@ void QETDiagramEditor::slot_updateComplexActions()
|
||||
m_edit_selection -> setIcon(QET::Icons::ElementEdit);
|
||||
m_edit_selection -> setEnabled(false);
|
||||
}
|
||||
|
||||
|
||||
//Actions for edit Z value
|
||||
QList<QGraphicsItem *> list = dc.items(
|
||||
DiagramContent::SelectedOnly
|
||||
@@ -1670,7 +1682,7 @@ void QETDiagramEditor::slot_updateComplexActions()
|
||||
void QETDiagramEditor::slot_updateModeActions()
|
||||
{
|
||||
DiagramView *dv = currentDiagramView();
|
||||
|
||||
|
||||
if (!dv)
|
||||
grp_visu_sel -> setEnabled(false);
|
||||
else
|
||||
@@ -1708,7 +1720,7 @@ void QETDiagramEditor::slot_updatePasteAction()
|
||||
{
|
||||
DiagramView *dv = currentDiagramView();
|
||||
bool editable_diagram = (dv && !dv -> diagram() -> isReadOnly());
|
||||
|
||||
|
||||
// pour coller, il faut un schema ouvert et un schema dans le presse-papier
|
||||
m_paste -> setEnabled(editable_diagram && Diagram::clipboardMayContainDiagram());
|
||||
}
|
||||
@@ -1725,7 +1737,7 @@ void QETDiagramEditor::addProjectView(ProjectView *project_view)
|
||||
|
||||
foreach(DiagramView *dv, project_view -> diagram_views())
|
||||
diagramWasAdded(dv);
|
||||
|
||||
|
||||
//Manage the close event of project
|
||||
connect(project_view, SIGNAL(projectClosed(ProjectView*)),
|
||||
this, SLOT(projectWasClosed(ProjectView *)));
|
||||
@@ -1736,13 +1748,13 @@ void QETDiagramEditor::addProjectView(ProjectView *project_view)
|
||||
if (QETProject *project = project_view -> project())
|
||||
connect(project, SIGNAL(readOnlyChanged(QETProject *, bool)),
|
||||
this, SLOT(slot_updateActions()));
|
||||
|
||||
|
||||
//Manage request for edit or find element and titleblock
|
||||
connect (project_view, &ProjectView::findElementRequired,
|
||||
this, &QETDiagramEditor::findElementInPanel);
|
||||
connect (project_view, &ProjectView::editElementRequired,
|
||||
this, &QETDiagramEditor::editElementInEditor);
|
||||
|
||||
|
||||
// display error messages sent by the project view
|
||||
connect(project_view, SIGNAL(errorEncountered(QString)),
|
||||
this, SLOT(showError(const QString &)));
|
||||
@@ -1757,7 +1769,7 @@ void QETDiagramEditor::addProjectView(ProjectView *project_view)
|
||||
QMdiSubWindow *sub_window = m_workspace.addSubWindow(project_view);
|
||||
sub_window -> setWindowIcon(project_view -> windowIcon());
|
||||
sub_window -> systemMenu() -> clear();
|
||||
|
||||
|
||||
//By defaut QMdiSubWindow have a QAction "close" with shortcut QKeySequence::Close
|
||||
//But the QAction m_close_file of this class have the same shortcut too.
|
||||
//We remove the shortcut of the QAction of QMdiSubWindow for avoid conflic
|
||||
@@ -1796,7 +1808,7 @@ QList<QString> QETDiagramEditor::editedFiles() const
|
||||
ProjectView *QETDiagramEditor::viewForFile(const QString &filepath) const
|
||||
{
|
||||
if (filepath.isEmpty()) return(nullptr);
|
||||
|
||||
|
||||
QString searched_can_file_path = QFileInfo(filepath).canonicalFilePath();
|
||||
if (searched_can_file_path.isEmpty()) {
|
||||
// QFileInfo returns an empty path for non-existent files
|
||||
@@ -1858,29 +1870,29 @@ void QETDiagramEditor::slot_updateWindowsMenu()
|
||||
{
|
||||
// nettoyage du menu
|
||||
foreach(QAction *a, windows_menu -> actions()) windows_menu -> removeAction(a);
|
||||
|
||||
|
||||
// actions de fermeture
|
||||
windows_menu -> addAction(m_close_file);
|
||||
//windows_menu -> addAction(closeAllAct);
|
||||
|
||||
|
||||
// actions de reorganisation des fenetres
|
||||
windows_menu -> addSeparator();
|
||||
windows_menu -> addAction(m_tile_window);
|
||||
windows_menu -> addAction(m_cascade_window);
|
||||
|
||||
|
||||
// actions de deplacement entre les fenetres
|
||||
windows_menu -> addSeparator();
|
||||
windows_menu -> addAction(m_next_window);
|
||||
windows_menu -> addAction(m_previous_window);
|
||||
|
||||
|
||||
// liste des fenetres
|
||||
QList<ProjectView *> windows = openedProjects();
|
||||
|
||||
|
||||
m_tile_window -> setEnabled(!windows.isEmpty() && m_workspace.viewMode() == QMdiArea::SubWindowView);
|
||||
m_cascade_window -> setEnabled(!windows.isEmpty() && m_workspace.viewMode() == QMdiArea::SubWindowView);
|
||||
m_next_window -> setEnabled(windows.count() > 1);
|
||||
m_previous_window -> setEnabled(windows.count() > 1);
|
||||
|
||||
|
||||
if (!windows.isEmpty()) windows_menu -> addSeparator();
|
||||
QActionGroup *windows_actions = new QActionGroup(this);
|
||||
foreach(ProjectView *project_view, windows) {
|
||||
@@ -1946,15 +1958,15 @@ void QETDiagramEditor::setTabbedMode()
|
||||
void QETDiagramEditor::readSettings()
|
||||
{
|
||||
QSettings settings;
|
||||
|
||||
|
||||
// dimensions et position de la fenetre
|
||||
QVariant geometry = settings.value("diagrameditor/geometry");
|
||||
if (geometry.isValid()) restoreGeometry(geometry.toByteArray());
|
||||
|
||||
|
||||
// etat de la fenetre (barres d'outils, docks...)
|
||||
QVariant state = settings.value("diagrameditor/state");
|
||||
if (state.isValid()) restoreState(state.toByteArray());
|
||||
|
||||
|
||||
// gestion des projets (onglets ou fenetres)
|
||||
bool tabbed = settings.value("diagrameditor/viewmode", "tabbed") == "tabbed";
|
||||
if (tabbed) {
|
||||
@@ -2018,7 +2030,7 @@ void QETDiagramEditor::activateProject(ProjectView *project_view)
|
||||
void QETDiagramEditor::projectWasClosed(ProjectView *project_view)
|
||||
{
|
||||
QETProject *project = project_view -> project();
|
||||
if (project)
|
||||
if (project)
|
||||
{
|
||||
pa -> elementsPanel().projectWasClosed(project);
|
||||
m_element_collection_widget->removeProject(project);
|
||||
@@ -2064,7 +2076,7 @@ void QETDiagramEditor::addDiagramToProject(QETProject *project)
|
||||
if (!project) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
if (ProjectView *project_view = findProject(project))
|
||||
{
|
||||
activateProject(project);
|
||||
@@ -2079,15 +2091,15 @@ void QETDiagramEditor::addDiagramToProject(QETProject *project)
|
||||
void QETDiagramEditor::removeDiagram(Diagram *diagram)
|
||||
{
|
||||
if (!diagram) return;
|
||||
|
||||
|
||||
// recupere le projet contenant le schema
|
||||
if (QETProject *diagram_project = diagram -> project()) {
|
||||
// recupere la vue sur ce projet
|
||||
if (ProjectView *project_view = findProject(diagram_project)) {
|
||||
|
||||
|
||||
// affiche le schema en question
|
||||
project_view -> showDiagram(diagram);
|
||||
|
||||
|
||||
// supprime le schema
|
||||
project_view -> removeDiagram(diagram);
|
||||
}
|
||||
@@ -2102,11 +2114,11 @@ void QETDiagramEditor::removeDiagram(Diagram *diagram)
|
||||
void QETDiagramEditor::moveDiagramUp(Diagram *diagram)
|
||||
{
|
||||
if (!diagram) return;
|
||||
|
||||
|
||||
// recupere le projet contenant le schema
|
||||
if (QETProject *diagram_project = diagram -> project()) {
|
||||
if (diagram_project -> isReadOnly()) return;
|
||||
|
||||
|
||||
// recupere la vue sur ce projet
|
||||
if (ProjectView *project_view = findProject(diagram_project)) {
|
||||
project_view -> moveDiagramUp(diagram);
|
||||
@@ -2122,11 +2134,11 @@ void QETDiagramEditor::moveDiagramUp(Diagram *diagram)
|
||||
void QETDiagramEditor::moveDiagramDown(Diagram *diagram)
|
||||
{
|
||||
if (!diagram) return;
|
||||
|
||||
|
||||
// recupere le projet contenant le schema
|
||||
if (QETProject *diagram_project = diagram -> project()) {
|
||||
if (diagram_project -> isReadOnly()) return;
|
||||
|
||||
|
||||
// recupere la vue sur ce projet
|
||||
if (ProjectView *project_view = findProject(diagram_project)) {
|
||||
project_view -> moveDiagramDown(diagram);
|
||||
@@ -2313,7 +2325,7 @@ void QETDiagramEditor::generateTerminalBlock()
|
||||
{
|
||||
bool success;
|
||||
QProcess *process = new QProcess(qApp);
|
||||
|
||||
|
||||
// If launched under control:
|
||||
//connect(process, SIGNAL(errorOcurred(int error)), this, SLOT(slot_generateTerminalBlock_error()));
|
||||
//process->start("qet_tb_generator");
|
||||
@@ -2351,7 +2363,7 @@ void QETDiagramEditor::generateTerminalBlock()
|
||||
else {
|
||||
success = process->startDetached(QDir::homePath() + "/.qet/qet_tb_generator.app", {("")});
|
||||
}
|
||||
|
||||
|
||||
#else
|
||||
if (openedProjects().count()){
|
||||
success = process->startDetached("qet_tb_generator", {(QETDiagramEditor::currentProjectView()->project()->filePath())});
|
||||
@@ -2365,7 +2377,7 @@ void QETDiagramEditor::generateTerminalBlock()
|
||||
else {
|
||||
success = process->startDetached(QDir::homePath() + "/.qet/qet_tb_generator", {("")});
|
||||
}
|
||||
|
||||
|
||||
#endif
|
||||
#if defined(Q_OS_WIN32) || defined(Q_OS_WIN64)
|
||||
QString message=QObject::tr(
|
||||
|
||||
@@ -1,23 +1,27 @@
|
||||
/*
|
||||
Copyright 2006-2020 The QElectroTech Team
|
||||
This file is part of QElectroTech.
|
||||
|
||||
|
||||
QElectroTech 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 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
|
||||
QElectroTech 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 QElectroTech. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#ifndef ELEMENT_H
|
||||
#define ELEMENT_H
|
||||
|
||||
#include <algorithm>
|
||||
#include <QPicture>
|
||||
#include <QHash>
|
||||
|
||||
#include "qet.h"
|
||||
#include "qetgraphicsitem.h"
|
||||
#include "diagramcontext.h"
|
||||
@@ -25,9 +29,6 @@
|
||||
#include "elementslocation.h"
|
||||
#include "nameslist.h"
|
||||
|
||||
#include <algorithm>
|
||||
#include <QPicture>
|
||||
|
||||
class QETProject;
|
||||
class Terminal;
|
||||
class Conductor;
|
||||
@@ -40,7 +41,7 @@ class ElementTextItemGroup;
|
||||
class Element : public QetGraphicsItem
|
||||
{
|
||||
friend class DiagramEventAddElement;
|
||||
|
||||
|
||||
Q_OBJECT
|
||||
public:
|
||||
/**
|
||||
@@ -64,7 +65,7 @@ class Element : public QetGraphicsItem
|
||||
~Element() override;
|
||||
private:
|
||||
Element(const Element &);
|
||||
|
||||
|
||||
// attributes
|
||||
public:
|
||||
/**
|
||||
@@ -74,7 +75,7 @@ class Element : public QetGraphicsItem
|
||||
*/
|
||||
enum { Type = UserType + 1000 };
|
||||
int type() const override { return Type; }
|
||||
|
||||
|
||||
signals:
|
||||
void linkedElementChanged(); //This signal is emited when the linked elements with this element change
|
||||
void elementInfoChange(
|
||||
@@ -91,12 +92,12 @@ class Element : public QetGraphicsItem
|
||||
DynamicElementTextItem *text,
|
||||
ElementTextItemGroup *group);
|
||||
|
||||
|
||||
|
||||
public:
|
||||
QList<Terminal *> terminals() const;
|
||||
QList<Conductor *> conductors() const;
|
||||
QList<QPair<Terminal *,Terminal *>> AlignedFreeTerminals() const;
|
||||
|
||||
|
||||
//METHODS related to information
|
||||
DiagramContext elementInformations()const
|
||||
{return m_element_informations;}
|
||||
@@ -118,7 +119,7 @@ class Element : public QetGraphicsItem
|
||||
bool isFreezeLabel() const {return m_freeze_label;}
|
||||
void freezeNewAddedElement();
|
||||
QString actualLabel();
|
||||
|
||||
|
||||
QString name() const override;
|
||||
ElementsLocation location() const;
|
||||
virtual void setHighlighted(bool);
|
||||
@@ -140,7 +141,7 @@ class Element : public QetGraphicsItem
|
||||
int> &) const;
|
||||
QUuid uuid() const;
|
||||
int orientation() const;
|
||||
|
||||
|
||||
//METHODS related to texts
|
||||
void addDynamicTextItem(DynamicElementTextItem *deti = nullptr);
|
||||
void removeDynamicTextItem(DynamicElementTextItem *deti);
|
||||
@@ -156,7 +157,7 @@ class Element : public QetGraphicsItem
|
||||
bool removeTextFromGroup(
|
||||
DynamicElementTextItem *text,
|
||||
ElementTextItemGroup *group);
|
||||
|
||||
|
||||
//METHODS related to linked element
|
||||
bool isFree() const;
|
||||
virtual void linkToElement(Element *) {}
|
||||
@@ -171,7 +172,7 @@ class Element : public QetGraphicsItem
|
||||
protected:
|
||||
void drawAxes(QPainter *, const QStyleOptionGraphicsItem *);
|
||||
void setSize(int, int);
|
||||
|
||||
|
||||
private:
|
||||
void drawSelection(
|
||||
QPainter *,
|
||||
@@ -212,25 +213,25 @@ class Element : public QetGraphicsItem
|
||||
// to be use in the function element::fromXml
|
||||
QHash <DynamicElementTextItem *, QPointF>
|
||||
m_converted_text_from_xml_description;
|
||||
|
||||
|
||||
//ATTRIBUTES related to linked element
|
||||
QList <Element *> connected_elements;
|
||||
QList <QUuid> tmp_uuids_link;
|
||||
QUuid m_uuid;
|
||||
kind m_link_type = Element::Simple;
|
||||
|
||||
|
||||
//ATTRIBUTES related to informations
|
||||
DiagramContext m_element_informations, m_kind_informations;
|
||||
autonum::sequentialNumbers m_autoNum_seq;
|
||||
bool m_freeze_label = false;
|
||||
QString m_F_str;
|
||||
|
||||
|
||||
ElementsLocation m_location;
|
||||
NamesList m_names;
|
||||
QList <Terminal *> m_terminals;
|
||||
const QPicture m_picture;
|
||||
const QPicture m_low_zoom_picture;
|
||||
|
||||
|
||||
private:
|
||||
bool m_must_highlight = false;
|
||||
QSize dimensions;
|
||||
|
||||
@@ -965,30 +965,28 @@ bool QetShapeItem::toDXF(const QString &filepath,const QPen &pen)
|
||||
switch (m_shapeType)
|
||||
{
|
||||
case Line:
|
||||
Createdxf::drawLine(filepath,
|
||||
QLineF(mapToScene(m_P1),
|
||||
mapToScene(m_P2)),
|
||||
Createdxf::getcolorCode(pen.color().red(),
|
||||
pen.color().green(),
|
||||
pen.color().blue()));
|
||||
return true;
|
||||
Createdxf::drawLine(filepath,
|
||||
QLineF( mapToScene(m_P1),
|
||||
mapToScene(m_P2)),
|
||||
Createdxf::dxfColor(pen));
|
||||
return true;
|
||||
case Rectangle:
|
||||
Createdxf::drawRectangle(filepath,
|
||||
QRectF(mapToScene(m_P1),
|
||||
mapToScene(m_P2)).normalized(),
|
||||
Createdxf::getcolorCode(pen.color().red(),
|
||||
pen.color().green(),
|
||||
pen.color().blue()));
|
||||
return true;
|
||||
Createdxf::drawRectangle(filepath,
|
||||
QRectF(mapToScene(m_P1),
|
||||
mapToScene(m_P2)).normalized(),
|
||||
Createdxf::dxfColor(pen));
|
||||
return true;
|
||||
case Ellipse:
|
||||
Createdxf::drawEllipse (filepath,
|
||||
QRectF(mapToScene(m_P1),
|
||||
mapToScene(m_P2)).normalized(),
|
||||
Createdxf::getcolorCode(pen.color().red(),
|
||||
pen.color().green(),
|
||||
pen.color().blue()));
|
||||
return true;
|
||||
default: return false;
|
||||
Createdxf::drawEllipse(filepath,
|
||||
QRectF(mapToScene(m_P1),
|
||||
mapToScene(m_P2)).normalized(),
|
||||
Createdxf::dxfColor(pen));
|
||||
return true;
|
||||
case Polygon:
|
||||
Createdxf::drawPolygon(filepath,m_polygon,Createdxf::dxfColor(pen));
|
||||
return true;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,25 +1,26 @@
|
||||
/*
|
||||
Copyright 2006-2020 The QElectroTech Team
|
||||
This file is part of QElectroTech.
|
||||
|
||||
|
||||
QElectroTech 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 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
|
||||
QElectroTech 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 QElectroTech. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#include "qetinformation.h"
|
||||
|
||||
#include <QObject>
|
||||
#include <QHash>
|
||||
|
||||
#include "qetinformation.h"
|
||||
|
||||
/**
|
||||
@brief QETInformation::titleblockInfoKeys
|
||||
@return all available key for use with a titleblock
|
||||
@@ -47,7 +48,7 @@ QStringList QETInformation::titleblockInfoKeys()
|
||||
info_list << "savedtime";
|
||||
info_list << "savedfilename";
|
||||
info_list << "savedfilepath";
|
||||
|
||||
|
||||
return info_list;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,17 +1,17 @@
|
||||
/*
|
||||
Copyright 2006-2020 The QElectroTech Team
|
||||
This file is part of QElectroTech.
|
||||
|
||||
|
||||
QElectroTech 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 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
|
||||
QElectroTech 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 QElectroTech. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
@@ -19,6 +19,7 @@
|
||||
#define QETINFORMATION_H
|
||||
|
||||
#include <QStringList>
|
||||
#include <QHash>
|
||||
|
||||
namespace QETInformation
|
||||
{
|
||||
|
||||
@@ -1,20 +1,27 @@
|
||||
/*
|
||||
Copyright 2006-2020 The QElectroTech Team
|
||||
This file is part of QElectroTech.
|
||||
|
||||
|
||||
QElectroTech 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 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
|
||||
QElectroTech 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 QElectroTech. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <QTimer>
|
||||
#include <QStandardPaths>
|
||||
#include <utility>
|
||||
#include <QtConcurrent>
|
||||
#include <QHash>
|
||||
|
||||
#include "qetproject.h"
|
||||
#include "diagram.h"
|
||||
#include "qetapp.h"
|
||||
@@ -30,11 +37,6 @@
|
||||
#include "numerotationcontextcommands.h"
|
||||
#include "assignvariables.h"
|
||||
|
||||
#include <QTimer>
|
||||
#include <QStandardPaths>
|
||||
#include <utility>
|
||||
#include <QtConcurrent>
|
||||
|
||||
static int BACKUP_INTERVAL = 120000; //interval in ms of backup = 2min
|
||||
|
||||
/**
|
||||
@@ -279,7 +281,7 @@ void QETProject::setFilePath(const QString &filepath)
|
||||
m_backup_file.setManagedFile(QUrl::fromLocalFile(filepath));
|
||||
|
||||
m_file_path = filepath;
|
||||
|
||||
|
||||
QFileInfo fi(m_file_path);
|
||||
if (fi.isWritable()) {
|
||||
setReadOnly(false);
|
||||
@@ -290,9 +292,9 @@ void QETProject::setFilePath(const QString &filepath)
|
||||
m_project_properties.addValue("savedtime", QDateTime::currentDateTime().toString("HH:mm"));
|
||||
m_project_properties.addValue("savedfilename", QFileInfo(filePath()).baseName());
|
||||
m_project_properties.addValue("savedfilepath", filePath());
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
emit(projectFilePathChanged(this, m_file_path));
|
||||
emit(projectInformationsChanged(this));
|
||||
updateDiagramsFolioData();
|
||||
@@ -315,7 +317,7 @@ QString QETProject::currentDir() const
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
|
||||
@return une chaine de caractere du type "Projet titre du projet".
|
||||
Si le projet n'a pas de titre, le nom du fichier est utilise.
|
||||
Si le projet n'est pas associe a un fichier, cette methode retourne "Projet
|
||||
@@ -326,7 +328,7 @@ QString QETProject::currentDir() const
|
||||
QString QETProject::pathNameTitle() const
|
||||
{
|
||||
QString final_title;
|
||||
|
||||
|
||||
if (!project_title_.isEmpty()) {
|
||||
final_title = QString(
|
||||
tr(
|
||||
@@ -349,7 +351,7 @@ QString QETProject::pathNameTitle() const
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
if (isReadOnly()) {
|
||||
final_title = QString(
|
||||
tr(
|
||||
@@ -366,7 +368,7 @@ QString QETProject::pathNameTitle() const
|
||||
)
|
||||
).arg(final_title);
|
||||
}
|
||||
|
||||
|
||||
return(final_title);
|
||||
}
|
||||
|
||||
@@ -394,10 +396,10 @@ qreal QETProject::declaredQElectroTechVersion()
|
||||
void QETProject::setTitle(const QString &title) {
|
||||
// ne fait rien si le projet est en lecture seule
|
||||
if (isReadOnly()) return;
|
||||
|
||||
|
||||
// ne fait rien si le titre du projet n'est pas change par l'appel de cette methode
|
||||
if (project_title_ == title) return;
|
||||
|
||||
|
||||
project_title_ = title;
|
||||
emit(projectTitleChanged(this, project_title_));
|
||||
emit(projectInformationsChanged(this));
|
||||
@@ -487,7 +489,7 @@ void QETProject::setDefaultReportProperties(const QString &properties)
|
||||
{
|
||||
QString old = m_default_report_properties;
|
||||
m_default_report_properties = properties;
|
||||
|
||||
|
||||
emit reportPropertiesChanged(old, properties);
|
||||
}
|
||||
|
||||
@@ -856,7 +858,7 @@ QDomDocument QETProject::toXml()
|
||||
project_root.setAttribute("version", QET::version);
|
||||
project_root.setAttribute("title", project_title_);
|
||||
xml_doc.appendChild(project_root);
|
||||
|
||||
|
||||
// titleblock templates, if any
|
||||
if (m_titleblocks_collection.templates().count()) {
|
||||
QDomElement titleblocktemplates_elmt = xml_doc.createElement("titleblocktemplates");
|
||||
@@ -866,19 +868,19 @@ QDomDocument QETProject::toXml()
|
||||
}
|
||||
project_root.appendChild(titleblocktemplates_elmt);
|
||||
}
|
||||
|
||||
|
||||
// project-wide properties
|
||||
QDomElement project_properties = xml_doc.createElement("properties");
|
||||
writeProjectPropertiesXml(project_properties);
|
||||
project_root.appendChild(project_properties);
|
||||
|
||||
|
||||
// Properties for news diagrams
|
||||
QDomElement new_diagrams_properties = xml_doc.createElement("newdiagrams");
|
||||
writeDefaultPropertiesXml(new_diagrams_properties);
|
||||
project_root.appendChild(new_diagrams_properties);
|
||||
|
||||
|
||||
// schemas
|
||||
|
||||
|
||||
qDebug() << "Export XML de" << m_diagrams_list.count() << "schemas";
|
||||
int order_num = 1;
|
||||
const QList<Diagram *> diagrams_list = m_diagrams_list;
|
||||
@@ -895,10 +897,10 @@ QDomDocument QETProject::toXml()
|
||||
QDomNode appended_diagram = project_root.appendChild(xml_node);
|
||||
appended_diagram.toElement().setAttribute("order", order_num ++);
|
||||
}
|
||||
|
||||
|
||||
// Write the elements collection.
|
||||
project_root.appendChild(m_elements_collection->root().cloneNode(true));
|
||||
|
||||
|
||||
return(xml_doc);
|
||||
}
|
||||
|
||||
@@ -932,16 +934,20 @@ QETResult QETProject::write()
|
||||
QString error_message;
|
||||
if (!QET::writeXmlFile(xml_project, m_file_path, &error_message))
|
||||
return(error_message);
|
||||
|
||||
|
||||
//title block variables should be updated after file save dialog is confirmed, before file is saved.
|
||||
m_project_properties.addValue("saveddate", QDate::currentDate().toString(Qt::SystemLocaleShortDate));
|
||||
m_project_properties.addValue(
|
||||
"saveddate",
|
||||
QDate::currentDate().toString(
|
||||
QLocale::system().toString(
|
||||
QLocale::ShortFormat)));
|
||||
m_project_properties.addValue("savedtime", QDateTime::currentDateTime().toString("HH:mm"));
|
||||
m_project_properties.addValue("savedfilename", QFileInfo(filePath()).baseName());
|
||||
m_project_properties.addValue("savedfilepath", filePath());
|
||||
|
||||
emit(projectInformationsChanged(this));
|
||||
updateDiagramsFolioData();
|
||||
|
||||
|
||||
emit(projectInformationsChanged(this));
|
||||
updateDiagramsFolioData();
|
||||
|
||||
setModified(false);
|
||||
return(QETResult());
|
||||
}
|
||||
@@ -981,15 +987,15 @@ bool QETProject::isEmpty() const
|
||||
{
|
||||
// si le projet a un titre, on considere qu'il n'est pas vide
|
||||
if (!project_title_.isEmpty()) return(false);
|
||||
|
||||
|
||||
//@TODO check if the embedded element collection is empty
|
||||
|
||||
|
||||
// compte le nombre de schemas non vides
|
||||
int pertinent_diagrams = 0;
|
||||
foreach(Diagram *diagram, m_diagrams_list) {
|
||||
if (!diagram -> isEmpty()) ++ pertinent_diagrams;
|
||||
}
|
||||
|
||||
|
||||
return(pertinent_diagrams > 0);
|
||||
}
|
||||
|
||||
@@ -1089,13 +1095,13 @@ ElementsLocation QETProject::importElement(ElementsLocation &location)
|
||||
Integrate a title block template into this project.
|
||||
@param src_tbt The location of the title block template
|
||||
to be integrated into this project
|
||||
@param handler
|
||||
@param handler
|
||||
@return the name of the template after integration,
|
||||
or an empty QString if a problem occurred.
|
||||
*/
|
||||
QString QETProject::integrateTitleBlockTemplate(const TitleBlockTemplateLocation &src_tbt, MoveTitleBlockTemplatesHandler *handler) {
|
||||
TitleBlockTemplateLocation dst_tbt(src_tbt.name(), &m_titleblocks_collection);
|
||||
|
||||
|
||||
// check whether a TBT having the same name already exists within this project
|
||||
QString target_name = dst_tbt.name();
|
||||
while (m_titleblocks_collection.templates().contains(target_name))
|
||||
@@ -1113,7 +1119,7 @@ QString QETProject::integrateTitleBlockTemplate(const TitleBlockTemplateLocation
|
||||
return(target_name);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (!m_titleblocks_collection.setTemplateXmlDescription(target_name, src_tbt.getTemplateXmlDescription()))
|
||||
{
|
||||
handler -> errorWithATemplate(src_tbt, tr("Une erreur s'est produite durant l'intégration du modèle.", "error message"));
|
||||
@@ -1164,7 +1170,7 @@ QList<ElementsLocation> QETProject::unusedElements() const
|
||||
bool QETProject::usesTitleBlockTemplate(const TitleBlockTemplateLocation &location) {
|
||||
// a diagram can only use a title block template embedded wihtin its parent project
|
||||
if (location.parentProject() != this) return(false);
|
||||
|
||||
|
||||
foreach (Diagram *diagram, diagrams()) {
|
||||
if (diagram -> usesTitleBlockTemplate(location.name())) {
|
||||
return(true);
|
||||
@@ -1184,9 +1190,9 @@ Diagram *QETProject::addNewDiagram(int pos)
|
||||
if (isReadOnly()) {
|
||||
return(nullptr);
|
||||
}
|
||||
|
||||
|
||||
Diagram *diagram = new Diagram(this);
|
||||
|
||||
|
||||
diagram->border_and_titleblock.importBorder(defaultBorderProperties());
|
||||
diagram->border_and_titleblock.importTitleBlock(defaultTitleBlockProperties());
|
||||
diagram->defaultConductorProperties = defaultConductorProperties();
|
||||
@@ -1214,7 +1220,7 @@ void QETProject::removeDiagram(Diagram *diagram)
|
||||
emit(diagramRemoved(this, diagram));
|
||||
diagram->deleteLater();
|
||||
}
|
||||
|
||||
|
||||
updateDiagramsFolioData();
|
||||
}
|
||||
|
||||
@@ -1228,10 +1234,10 @@ void QETProject::removeDiagram(Diagram *diagram)
|
||||
*/
|
||||
void QETProject::diagramOrderChanged(int old_index, int new_index) {
|
||||
if (old_index < 0 || new_index < 0) return;
|
||||
|
||||
|
||||
int diagram_max_index = m_diagrams_list.size() - 1;
|
||||
if (old_index > diagram_max_index || new_index > diagram_max_index) return;
|
||||
|
||||
|
||||
m_diagrams_list.move(old_index, new_index);
|
||||
updateDiagramsFolioData();
|
||||
setModified(true);
|
||||
@@ -1258,7 +1264,7 @@ void QETProject::readProjectXml(QDomDocument &xml_project)
|
||||
{
|
||||
QDomElement root_elmt = xml_project.documentElement();
|
||||
m_state = ProjectParsingRunning;
|
||||
|
||||
|
||||
//The roots of the xml document must be a "project" element
|
||||
if (root_elmt.tagName() == "project")
|
||||
{
|
||||
@@ -1282,7 +1288,7 @@ void QETProject::readProjectXml(QDomDocument &xml_project)
|
||||
"message box content"),
|
||||
QMessageBox::Open | QMessageBox::Cancel
|
||||
);
|
||||
|
||||
|
||||
if (ret == QMessageBox::Cancel)
|
||||
{
|
||||
m_state = FileOpenDiscard;
|
||||
@@ -1296,7 +1302,7 @@ void QETProject::readProjectXml(QDomDocument &xml_project)
|
||||
{
|
||||
m_state = ProjectParsingFailed;
|
||||
}
|
||||
|
||||
|
||||
m_data_base.blockSignals(true);
|
||||
//Load the project-wide properties
|
||||
readProjectPropertiesXml(xml_project);
|
||||
@@ -1310,7 +1316,7 @@ void QETProject::readProjectXml(QDomDocument &xml_project)
|
||||
readDiagramsXml(xml_project);
|
||||
m_data_base.blockSignals(false);
|
||||
m_data_base.updateDB();
|
||||
|
||||
|
||||
m_state = Ok;
|
||||
}
|
||||
|
||||
@@ -1336,18 +1342,18 @@ void QETProject::readDiagramsXml(QDomDocument &xml_project)
|
||||
"Création des folios"
|
||||
"</p>"));
|
||||
}
|
||||
|
||||
|
||||
//Search the diagrams in the project
|
||||
QDomNodeList diagram_nodes = xml_project.elementsByTagName("diagram");
|
||||
|
||||
|
||||
if(dlgWaiting)
|
||||
dlgWaiting->setProgressBarRange(0, diagram_nodes.length()*3);
|
||||
|
||||
|
||||
for (int i = 0 ; i < diagram_nodes.length() ; ++ i)
|
||||
{
|
||||
if(dlgWaiting)
|
||||
dlgWaiting->setProgressBar(i+1);
|
||||
|
||||
|
||||
if (diagram_nodes.at(i).isElement())
|
||||
{
|
||||
QDomElement diagram_xml_element = diagram_nodes
|
||||
@@ -1543,17 +1549,17 @@ void QETProject::writeProjectPropertiesXml(QDomElement &xml_element) {
|
||||
void QETProject::writeDefaultPropertiesXml(QDomElement &xml_element)
|
||||
{
|
||||
QDomDocument xml_document = xml_element.ownerDocument();
|
||||
|
||||
|
||||
// export size of border
|
||||
QDomElement border_elmt = xml_document.createElement("border");
|
||||
default_border_properties_.toXml(border_elmt);
|
||||
xml_element.appendChild(border_elmt);
|
||||
|
||||
|
||||
// export content of titleblock
|
||||
QDomElement titleblock_elmt = xml_document.createElement("inset");
|
||||
default_titleblock_properties_.toXml(titleblock_elmt);
|
||||
xml_element.appendChild(titleblock_elmt);
|
||||
|
||||
|
||||
// exporte default conductor
|
||||
QDomElement conductor_elmt = xml_document.createElement("conductors");
|
||||
default_conductor_properties_.toXml(conductor_elmt);
|
||||
@@ -1728,7 +1734,7 @@ bool QETProject::projectWasModified()
|
||||
!m_undo_stack -> isClean() ||
|
||||
m_titleblocks_collection.templates().count() )
|
||||
return(true);
|
||||
|
||||
|
||||
else
|
||||
return(false);
|
||||
}
|
||||
@@ -1740,19 +1746,19 @@ bool QETProject::projectWasModified()
|
||||
void QETProject::updateDiagramsFolioData()
|
||||
{
|
||||
int total_folio = m_diagrams_list.count();
|
||||
|
||||
|
||||
DiagramContext project_wide_properties = m_project_properties;
|
||||
project_wide_properties.addValue("projecttitle", title());
|
||||
project_wide_properties.addValue("projectpath", filePath());
|
||||
project_wide_properties.addValue("projectfilename", QFileInfo(filePath()).baseName());
|
||||
|
||||
|
||||
for (int i = 0 ; i < total_folio ; ++ i)
|
||||
{
|
||||
QString autopagenum = m_diagrams_list[i]->border_and_titleblock.autoPageNum();
|
||||
NumerotationContext nC = folioAutoNum(autopagenum);
|
||||
NumerotationContextCommands nCC = NumerotationContextCommands(nC);
|
||||
|
||||
if ((m_diagrams_list[i]->border_and_titleblock.folio().contains("%autonum")) &&
|
||||
|
||||
if ((m_diagrams_list[i]->border_and_titleblock.folio().contains("%autonum")) &&
|
||||
(!autopagenum.isNull()))
|
||||
{
|
||||
m_diagrams_list[i] -> border_and_titleblock.setFolioData(i + 1, total_folio, nCC.toRepresentedString(), project_wide_properties);
|
||||
@@ -1761,12 +1767,12 @@ void QETProject::updateDiagramsFolioData()
|
||||
else {
|
||||
m_diagrams_list[i] -> border_and_titleblock.setFolioData(i + 1, total_folio, nullptr, project_wide_properties);
|
||||
}
|
||||
|
||||
|
||||
if (i > 0)
|
||||
{
|
||||
m_diagrams_list.at(i)->border_and_titleblock.setPreviousFolioNum(m_diagrams_list.at(i-1)->border_and_titleblock.finalfolio());
|
||||
m_diagrams_list.at(i-1)->border_and_titleblock.setNextFolioNum(m_diagrams_list.at(i)->border_and_titleblock.finalfolio());
|
||||
|
||||
|
||||
if (i == total_folio-1) {
|
||||
m_diagrams_list.at(i)->border_and_titleblock.setNextFolioNum(QString());
|
||||
}
|
||||
@@ -1775,7 +1781,7 @@ void QETProject::updateDiagramsFolioData()
|
||||
m_diagrams_list.at(i)->border_and_titleblock.setPreviousFolioNum(QString());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
for (Diagram *d : m_diagrams_list) {
|
||||
d->update();
|
||||
}
|
||||
@@ -1788,7 +1794,7 @@ void QETProject::updateDiagramsFolioData()
|
||||
*/
|
||||
void QETProject::updateDiagramsTitleBlockTemplate(TitleBlockTemplatesCollection *collection, const QString &template_name) {
|
||||
Q_UNUSED(collection)
|
||||
|
||||
|
||||
foreach (Diagram *diagram, m_diagrams_list) {
|
||||
diagram -> titleBlockTemplateChanged(template_name);
|
||||
}
|
||||
@@ -1801,7 +1807,7 @@ void QETProject::updateDiagramsTitleBlockTemplate(TitleBlockTemplatesCollection
|
||||
*/
|
||||
void QETProject::removeDiagramsTitleBlockTemplate(TitleBlockTemplatesCollection *collection, const QString &template_name) {
|
||||
Q_UNUSED(collection)
|
||||
|
||||
|
||||
// warn diagrams that the given template is about to be removed
|
||||
foreach (Diagram *diagram, m_diagrams_list) {
|
||||
diagram -> titleBlockTemplateRemoved(template_name);
|
||||
|
||||
@@ -1,23 +1,26 @@
|
||||
/*
|
||||
Copyright 2006-2020 The QElectroTech Team
|
||||
This file is part of QElectroTech.
|
||||
|
||||
|
||||
QElectroTech 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 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
|
||||
QElectroTech 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 QElectroTech. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#ifndef QET_PROJECT_H
|
||||
#define QET_PROJECT_H
|
||||
|
||||
#include <KAutoSaveFile>
|
||||
#include <QHash>
|
||||
|
||||
#include "nameslist.h"
|
||||
#include "elementslocation.h"
|
||||
#include "borderproperties.h"
|
||||
@@ -28,8 +31,6 @@
|
||||
#include "projectdatabase.h"
|
||||
#include "reportproperties.h"
|
||||
|
||||
#include <KAutoSaveFile>
|
||||
|
||||
class Diagram;
|
||||
class ElementsLocation;
|
||||
class QETResult;
|
||||
@@ -62,7 +63,7 @@ class QETProject : public QObject
|
||||
};
|
||||
|
||||
Q_PROPERTY(bool autoConductor READ autoConductor WRITE setAutoConductor)
|
||||
|
||||
|
||||
// constructors, destructor
|
||||
public:
|
||||
QETProject (QObject *parent = nullptr);
|
||||
@@ -72,7 +73,7 @@ class QETProject : public QObject
|
||||
|
||||
private:
|
||||
QETProject(const QETProject &);
|
||||
|
||||
|
||||
// methods
|
||||
public:
|
||||
projectDataBase *dataBase();
|
||||
@@ -166,13 +167,13 @@ class QETProject : public QObject
|
||||
DiagramContext projectProperties();
|
||||
void setProjectProperties(const DiagramContext &);
|
||||
QUndoStack* undoStack() {return m_undo_stack;}
|
||||
|
||||
|
||||
public slots:
|
||||
Diagram *addNewDiagram(int pos = -1);
|
||||
void removeDiagram(Diagram *);
|
||||
void diagramOrderChanged(int, int);
|
||||
void setModified(bool);
|
||||
|
||||
|
||||
signals:
|
||||
void projectFilePathChanged(QETProject *, const QString &);
|
||||
void projectTitleChanged(QETProject *, const QString &);
|
||||
@@ -195,14 +196,14 @@ class QETProject : public QObject
|
||||
void folioAutoNumChanged(QString);
|
||||
void defaultTitleBlockPropertiesChanged();
|
||||
void conductorAutoNumChanged();
|
||||
|
||||
|
||||
private slots:
|
||||
void updateDiagramsFolioData();
|
||||
void updateDiagramsTitleBlockTemplate(TitleBlockTemplatesCollection *, const QString &);
|
||||
void removeDiagramsTitleBlockTemplate(TitleBlockTemplatesCollection *, const QString &);
|
||||
void usedTitleBlockTemplateChanged(const QString &);
|
||||
void undoStackChanged (bool a) {if (!a) setModified(true);}
|
||||
|
||||
|
||||
private:
|
||||
void readProjectXml(QDomDocument &xml_project);
|
||||
void readDiagramsXml(QDomDocument &xml_project);
|
||||
@@ -217,7 +218,7 @@ class QETProject : public QObject
|
||||
void writeBackup();
|
||||
void init();
|
||||
ProjectState openFile(QFile *file);
|
||||
|
||||
|
||||
// attributes
|
||||
private:
|
||||
/// File path this project is saved to
|
||||
|
||||
@@ -1,27 +1,30 @@
|
||||
/*
|
||||
Copyright 2006-2020 The QElectroTech Team
|
||||
This file is part of QElectroTech.
|
||||
|
||||
|
||||
QElectroTech 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 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
|
||||
QElectroTech 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 QElectroTech. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#include "qetregexpvalidator.h"
|
||||
#include <QRegularExpression>
|
||||
|
||||
/**
|
||||
Constructeur
|
||||
@param parent QObject parent
|
||||
*/
|
||||
QETRegExpValidator::QETRegExpValidator(QObject *parent) : QRegExpValidator(parent) {
|
||||
QETRegExpValidator::QETRegExpValidator(QObject *parent)
|
||||
: QRegularExpressionValidator(parent)
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -29,7 +32,10 @@ QETRegExpValidator::QETRegExpValidator(QObject *parent) : QRegExpValidator(paren
|
||||
@param regexp Expression reguliere a valider
|
||||
@param parent QObject parent
|
||||
*/
|
||||
QETRegExpValidator::QETRegExpValidator(const QRegExp ®exp, QObject *parent) : QRegExpValidator(regexp, parent) {
|
||||
QETRegExpValidator::QETRegExpValidator(
|
||||
const QRegularExpression ®exp, QObject *parent) :
|
||||
QRegularExpressionValidator(regexp, parent)
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -40,13 +46,15 @@ QETRegExpValidator::~QETRegExpValidator()
|
||||
}
|
||||
|
||||
/**
|
||||
@see QRegExpValidator::validate
|
||||
@see QRegularExpressionValidator::validate
|
||||
@see validationFailed()
|
||||
Emet le signal validationFailed si la validation echoue
|
||||
*/
|
||||
QValidator::State QETRegExpValidator::validate(QString &input, int &pos) const
|
||||
{
|
||||
QValidator::State result = QRegExpValidator::validate(input, pos);
|
||||
if (result == QValidator::Invalid) emit(validationFailed());
|
||||
QValidator::State result = QRegularExpressionValidator::validate(
|
||||
input, pos);
|
||||
if (result == QValidator::Invalid)
|
||||
emit(validationFailed());
|
||||
return(result);
|
||||
}
|
||||
|
||||
@@ -1,42 +1,42 @@
|
||||
/*
|
||||
Copyright 2006-2020 The QElectroTech Team
|
||||
This file is part of QElectroTech.
|
||||
|
||||
|
||||
QElectroTech 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 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
|
||||
QElectroTech 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 QElectroTech. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#ifndef QET_REGEXP_VALIDATOR_H
|
||||
#define QET_REGEXP_VALIDATOR_H
|
||||
#include <QRegExpValidator>
|
||||
#include <QRegularExpressionValidator>
|
||||
/**
|
||||
This class acts like a QRegExpValidator except it emits a signal when the
|
||||
input validation fails.
|
||||
This class acts like a QRegularExpressionValidator
|
||||
except it emits a signal when the input validation fails.
|
||||
*/
|
||||
class QETRegExpValidator : public QRegExpValidator {
|
||||
class QETRegExpValidator : public QRegularExpressionValidator {
|
||||
Q_OBJECT
|
||||
|
||||
|
||||
// constructors, destructor
|
||||
public:
|
||||
QETRegExpValidator(QObject *);
|
||||
QETRegExpValidator(const QRegExp &, QObject *);
|
||||
QETRegExpValidator(const QRegularExpression &, QObject *);
|
||||
~QETRegExpValidator() override;
|
||||
private:
|
||||
QETRegExpValidator(const QETRegExpValidator &);
|
||||
|
||||
|
||||
// methods
|
||||
public:
|
||||
QValidator::State validate(QString &, int &) const override;
|
||||
|
||||
|
||||
signals:
|
||||
void validationFailed() const;
|
||||
};
|
||||
|
||||
@@ -1,24 +1,24 @@
|
||||
/*
|
||||
Copyright 2006-2020 The QElectroTech Team
|
||||
This file is part of QElectroTech.
|
||||
|
||||
|
||||
QElectroTech 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 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
|
||||
QElectroTech 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 QElectroTech. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#include "qfilenameedit.h"
|
||||
#include "qetregexpvalidator.h"
|
||||
#include <QKeyEvent>
|
||||
#include <QRegExp>
|
||||
#include <QRegularExpression>
|
||||
#include <QToolTip>
|
||||
|
||||
/**
|
||||
@@ -36,7 +36,7 @@ QFileNameEdit::QFileNameEdit(QWidget *parent) : QLineEdit(parent) {
|
||||
*/
|
||||
QFileNameEdit::QFileNameEdit(const QString &contents, QWidget *parent) : QLineEdit(parent) {
|
||||
init();
|
||||
if (!contents.isEmpty() && regexp_.exactMatch(contents)) {
|
||||
if (!contents.isEmpty() && regexp_==QRegularExpression(contents)) {
|
||||
setText(contents);
|
||||
}
|
||||
}
|
||||
@@ -61,7 +61,7 @@ bool QFileNameEdit::isEmpty()
|
||||
*/
|
||||
bool QFileNameEdit::isValid()
|
||||
{
|
||||
return(regexp_.exactMatch(text()));
|
||||
return(regexp_==QRegularExpression(text()));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -69,7 +69,7 @@ bool QFileNameEdit::isValid()
|
||||
*/
|
||||
void QFileNameEdit::init()
|
||||
{
|
||||
regexp_ = QRegExp("^[0-9a-z_\\-\\.]+$", Qt::CaseSensitive);
|
||||
regexp_ = QRegularExpression("^[0-9a-z_\\-\\.]+$");
|
||||
validator_ = new QETRegExpValidator(regexp_, this);
|
||||
setValidator(validator_);
|
||||
tooltip_text_ = QString(
|
||||
|
||||
@@ -1,25 +1,25 @@
|
||||
/*
|
||||
Copyright 2006-2020 The QElectroTech Team
|
||||
This file is part of QElectroTech.
|
||||
|
||||
|
||||
QElectroTech 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 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
|
||||
QElectroTech 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 QElectroTech. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#ifndef Q_FILENAME_EDIT_H
|
||||
#define Q_FILENAME_EDIT_H
|
||||
#include <QLineEdit>
|
||||
#include <QRegExp>
|
||||
#include <QString>
|
||||
#include <QRegularExpression>
|
||||
class QETRegExpValidator;
|
||||
/**
|
||||
This class represents a textfield dedicated to input a portable filename (not
|
||||
@@ -31,7 +31,7 @@ class QETRegExpValidator;
|
||||
*/
|
||||
class QFileNameEdit : public QLineEdit {
|
||||
Q_OBJECT
|
||||
|
||||
|
||||
// constructors, destructor
|
||||
public:
|
||||
QFileNameEdit(QWidget * = nullptr);
|
||||
@@ -39,22 +39,22 @@ class QFileNameEdit : public QLineEdit {
|
||||
~QFileNameEdit() override;
|
||||
private:
|
||||
QFileNameEdit(const QFileNameEdit &);
|
||||
|
||||
|
||||
// methods
|
||||
public:
|
||||
bool isEmpty();
|
||||
bool isValid();
|
||||
|
||||
|
||||
private:
|
||||
void init();
|
||||
void displayToolTip();
|
||||
|
||||
|
||||
private slots:
|
||||
void validationFailed();
|
||||
|
||||
|
||||
// attributes
|
||||
private:
|
||||
QRegExp regexp_;
|
||||
QRegularExpression regexp_;
|
||||
QETRegExpValidator *validator_;
|
||||
QString tooltip_text_;
|
||||
};
|
||||
|
||||
@@ -1,17 +1,17 @@
|
||||
/*
|
||||
Copyright 2006-2020 The QElectroTech Team
|
||||
This file is part of QElectroTech.
|
||||
|
||||
|
||||
QElectroTech 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 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
|
||||
QElectroTech 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 QElectroTech. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
@@ -40,7 +40,7 @@ QETTitleBlockTemplateEditor::QETTitleBlockTemplateEditor(QWidget *parent) :
|
||||
{
|
||||
setWindowIcon(QET::Icons::QETLogo);
|
||||
setAttribute(Qt::WA_DeleteOnClose);
|
||||
|
||||
|
||||
initWidgets();
|
||||
initActions();
|
||||
initMenus();
|
||||
@@ -74,7 +74,7 @@ bool QETTitleBlockTemplateEditor::isEditing(const QString &filepath)
|
||||
} else {
|
||||
current_filepath = QETApp::realPath(location_.toString());
|
||||
}
|
||||
|
||||
|
||||
return(
|
||||
QET::compareCanonicalFilePaths(
|
||||
current_filepath,
|
||||
@@ -166,7 +166,7 @@ void QETTitleBlockTemplateEditor::duplicateCurrentLocation()
|
||||
{
|
||||
// this method does not work for templates edited from the filesystem
|
||||
if (opened_from_file_) return;
|
||||
|
||||
|
||||
QString proposed_name;
|
||||
if (location_.name().isEmpty()) {
|
||||
proposed_name = tr("nouveau_modele",
|
||||
@@ -174,7 +174,7 @@ void QETTitleBlockTemplateEditor::duplicateCurrentLocation()
|
||||
} else {
|
||||
proposed_name = QString("%1_copy").arg(location_.name());
|
||||
}
|
||||
|
||||
|
||||
bool accepted = false;
|
||||
QString new_template_name = QInputDialog::getText(
|
||||
this,
|
||||
@@ -212,7 +212,7 @@ bool QETTitleBlockTemplateEditor::edit(
|
||||
/// TODO The TBT does not exist, manage error
|
||||
return(false);
|
||||
}
|
||||
|
||||
|
||||
opened_from_file_ = false;
|
||||
location_ = location;
|
||||
setReadOnly(location.isReadOnly());
|
||||
@@ -231,7 +231,7 @@ bool QETTitleBlockTemplateEditor::edit(
|
||||
{
|
||||
// we require a project we will rattach templates to
|
||||
if (!project) return(false);
|
||||
|
||||
|
||||
// the template name may be empty to create a new one
|
||||
const TitleBlockTemplate *tb_template_orig;
|
||||
if (template_name.isEmpty())
|
||||
@@ -244,12 +244,12 @@ bool QETTitleBlockTemplateEditor::edit(
|
||||
{
|
||||
tb_template_orig = project->embeddedTitleBlockTemplatesCollection()->getTemplate(template_name);
|
||||
}
|
||||
|
||||
|
||||
if (!tb_template_orig) {
|
||||
/// TODO The TBT does not exist, manage error
|
||||
return(false);
|
||||
}
|
||||
|
||||
|
||||
opened_from_file_ = false;
|
||||
location_.setParentCollection(project -> embeddedTitleBlockTemplatesCollection());
|
||||
location_.setName(template_name);
|
||||
@@ -270,13 +270,13 @@ bool QETTitleBlockTemplateEditor::edit(const QString &file_path)
|
||||
/// TODO the file opening failed, warn the user?
|
||||
return(false);
|
||||
}
|
||||
|
||||
|
||||
bool editing = edit(tbt);
|
||||
if (!editing) {
|
||||
/// TODO the file editing failed, warn the user?
|
||||
return(false);
|
||||
}
|
||||
|
||||
|
||||
QFileInfo file_path_info(file_path);
|
||||
filepath_ = file_path;
|
||||
opened_from_file_ = true;
|
||||
@@ -318,20 +318,20 @@ void QETTitleBlockTemplateEditor::editLogos()
|
||||
if (!logo_manager_) {
|
||||
initLogoManager();
|
||||
}
|
||||
|
||||
|
||||
logo_manager_ -> layout() -> setContentsMargins(0, 0, 0, 0);
|
||||
QDialogButtonBox *buttons = new QDialogButtonBox(QDialogButtonBox::Close);
|
||||
|
||||
|
||||
QVBoxLayout *vlayout0 = new QVBoxLayout();
|
||||
vlayout0 -> addWidget(logo_manager_);
|
||||
vlayout0 -> addWidget(buttons);
|
||||
|
||||
|
||||
QDialog d(this);
|
||||
d.setWindowTitle(logo_manager_ -> windowTitle());
|
||||
d.setLayout(vlayout0);
|
||||
connect(buttons, SIGNAL(rejected()), &d, SLOT(reject()));
|
||||
d.exec();
|
||||
|
||||
|
||||
// prevent the logo manager from being deleted along with the dialog
|
||||
logo_manager_ -> setParent(this);
|
||||
}
|
||||
@@ -374,10 +374,10 @@ void QETTitleBlockTemplateEditor::initActions()
|
||||
add_col_ = new QAction(QET::Icons::EditTableInsertColumnRight, tr("Ajouter une &colonne", "menu entry"), this);
|
||||
merge_cells_ = new QAction(QET::Icons::EditTableCellMerge, tr("&Fusionner les cellules", "menu entry"), this);
|
||||
split_cell_ = new QAction(QET::Icons::EditTableCellSplit, tr("&Séparer les cellules", "menu entry"), this);
|
||||
|
||||
|
||||
undo_ -> setIcon(QET::Icons::EditUndo);
|
||||
redo_ -> setIcon(QET::Icons::EditRedo);
|
||||
|
||||
|
||||
new_ -> setShortcut(QKeySequence::New);
|
||||
open_ -> setShortcut(QKeySequence::Open);
|
||||
open_from_file_ -> setShortcut(tr("Ctrl+Shift+O", "shortcut to open a template from a file"));
|
||||
@@ -397,7 +397,7 @@ void QETTitleBlockTemplateEditor::initActions()
|
||||
zoom_out_ -> setShortcut(QKeySequence::ZoomOut);
|
||||
zoom_fit_ -> setShortcut(QKeySequence(tr("Ctrl+9", "shortcut to enable fit zoom")));
|
||||
zoom_reset_ -> setShortcut(QKeySequence(tr("Ctrl+0", "shortcut to reset zoom")));
|
||||
|
||||
|
||||
connect(new_, SIGNAL(triggered()), this, SLOT(newTemplate()));
|
||||
connect(open_, SIGNAL(triggered()), this, SLOT(open()));
|
||||
connect(open_from_file_, SIGNAL(triggered()), this, SLOT(openFromFile()));
|
||||
@@ -428,7 +428,7 @@ void QETTitleBlockTemplateEditor::initMenus()
|
||||
file_menu_ = new QMenu(tr("&Fichier", "menu title"), this);
|
||||
edit_menu_ = new QMenu(tr("&Édition", "menu title"), this);
|
||||
display_menu_ = new QMenu(tr("Afficha&ge", "menu title"), this);
|
||||
|
||||
|
||||
file_menu_ -> addAction(new_);
|
||||
file_menu_ -> addAction(open_);
|
||||
file_menu_ -> addAction(open_from_file_);
|
||||
@@ -437,7 +437,7 @@ void QETTitleBlockTemplateEditor::initMenus()
|
||||
file_menu_ -> addAction(save_as_file_);
|
||||
file_menu_ -> addSeparator();
|
||||
file_menu_ -> addAction(quit_);
|
||||
|
||||
|
||||
edit_menu_ -> addAction(undo_);
|
||||
edit_menu_ -> addAction(redo_);
|
||||
edit_menu_ -> addSeparator();
|
||||
@@ -456,7 +456,7 @@ void QETTitleBlockTemplateEditor::initMenus()
|
||||
display_menu_ -> addAction(zoom_out_);
|
||||
display_menu_ -> addAction(zoom_fit_);
|
||||
display_menu_ -> addAction(zoom_reset_);
|
||||
|
||||
|
||||
insertMenu(settings_menu_, file_menu_);
|
||||
insertMenu(settings_menu_, edit_menu_);
|
||||
insertMenu(settings_menu_, display_menu_);
|
||||
@@ -474,7 +474,7 @@ void QETTitleBlockTemplateEditor::initToolbars()
|
||||
main_toolbar -> addAction(save_);
|
||||
main_toolbar -> addAction(save_as_);
|
||||
addToolBar(Qt::TopToolBarArea, main_toolbar);
|
||||
|
||||
|
||||
QToolBar *edit_toolbar = new QToolBar(tr("Édition", "toolbar title"), this);
|
||||
edit_toolbar -> setObjectName("tbt_edit_toolbar");
|
||||
edit_toolbar -> addAction(undo_);
|
||||
@@ -483,7 +483,7 @@ void QETTitleBlockTemplateEditor::initToolbars()
|
||||
edit_toolbar -> addAction(merge_cells_);
|
||||
edit_toolbar -> addAction(split_cell_);
|
||||
addToolBar(Qt::TopToolBarArea, edit_toolbar);
|
||||
|
||||
|
||||
QToolBar *display_toolbar = new QToolBar(tr("Affichage", "toolbar title"), this);
|
||||
display_toolbar -> setObjectName("tbt_display_toolbar");
|
||||
display_toolbar -> addAction(zoom_in_);
|
||||
@@ -499,19 +499,22 @@ void QETTitleBlockTemplateEditor::initToolbars()
|
||||
void QETTitleBlockTemplateEditor::initWidgets()
|
||||
{
|
||||
QSettings settings;
|
||||
|
||||
|
||||
// undo list on the right
|
||||
undo_stack_ = new QUndoStack(this);
|
||||
undo_view_ = new QUndoView(undo_stack_);
|
||||
undo_view_ -> setEmptyLabel(tr("Aucune modification", "label displayed in the undo list when empty"));
|
||||
|
||||
|
||||
undo_dock_widget_ = new QDockWidget(tr("Annulations", "dock title"));
|
||||
undo_dock_widget_ -> setObjectName("tbt_undo_dock");
|
||||
undo_dock_widget_ -> setFeatures(QDockWidget::AllDockWidgetFeatures);
|
||||
undo_dock_widget_ -> setFeatures(
|
||||
QDockWidget::DockWidgetClosable
|
||||
|QDockWidget::DockWidgetMovable
|
||||
|QDockWidget::DockWidgetFloatable);
|
||||
undo_dock_widget_ -> setWidget(undo_view_);
|
||||
undo_dock_widget_ -> setMinimumWidth(290);
|
||||
addDockWidget(Qt::RightDockWidgetArea, undo_dock_widget_);
|
||||
|
||||
|
||||
// WYSIWYG editor as central widget
|
||||
template_edition_area_scene_ = new QGraphicsScene(this);
|
||||
template_edition_area_view_ = new TitleBlockTemplateView(template_edition_area_scene_);
|
||||
@@ -521,18 +524,21 @@ void QETTitleBlockTemplateEditor::initWidgets()
|
||||
template_edition_area_view_ -> setPreviewWidth(conf_preview_width);
|
||||
}
|
||||
setCentralWidget(template_edition_area_view_);
|
||||
|
||||
|
||||
// cell edition widget at the bottom
|
||||
template_cell_editor_widget_ = new TitleBlockTemplateCellWidget(tb_template_);
|
||||
template_cell_editor_dock_widget_ = new QDockWidget(tr("Propriétés de la cellule", "dock title"), this);
|
||||
template_cell_editor_dock_widget_ -> setObjectName("tbt_celleditor_dock");
|
||||
template_cell_editor_dock_widget_ -> setFeatures(QDockWidget::AllDockWidgetFeatures);
|
||||
template_cell_editor_dock_widget_ -> setFeatures(
|
||||
QDockWidget::DockWidgetClosable
|
||||
|QDockWidget::DockWidgetMovable
|
||||
|QDockWidget::DockWidgetFloatable);
|
||||
template_cell_editor_dock_widget_ -> setWidget(template_cell_editor_widget_);
|
||||
template_cell_editor_dock_widget_ -> setMinimumWidth(180);
|
||||
template_cell_editor_dock_widget_ -> setMinimumHeight(250);
|
||||
addDockWidget(Qt::BottomDockWidgetArea, template_cell_editor_dock_widget_);
|
||||
template_cell_editor_widget_ -> setVisible(false);
|
||||
|
||||
|
||||
connect(
|
||||
template_edition_area_view_,
|
||||
SIGNAL(selectedCellsChanged(QList<TitleBlockCell *>)),
|
||||
@@ -592,7 +598,7 @@ QString QETTitleBlockTemplateEditor::currentlyEditedTitle() const
|
||||
} else {
|
||||
titleblock_title = location_.name();
|
||||
}
|
||||
|
||||
|
||||
// if a (file)name has been added, also add a "[Changed]" tag if needed
|
||||
if (!titleblock_title.isEmpty()) {
|
||||
QString tag;
|
||||
@@ -609,7 +615,7 @@ QString QETTitleBlockTemplateEditor::currentlyEditedTitle() const
|
||||
)
|
||||
).arg(titleblock_title).arg(tag);
|
||||
}
|
||||
|
||||
|
||||
return(titleblock_title);
|
||||
}
|
||||
|
||||
@@ -620,11 +626,11 @@ QString QETTitleBlockTemplateEditor::currentlyEditedTitle() const
|
||||
void QETTitleBlockTemplateEditor::readSettings()
|
||||
{
|
||||
QSettings settings;
|
||||
|
||||
|
||||
// window size and position
|
||||
QVariant geometry = settings.value("titleblocktemplateeditor/geometry");
|
||||
if (geometry.isValid()) restoreGeometry(geometry.toByteArray());
|
||||
|
||||
|
||||
// window state (toolbars, docks...)
|
||||
QVariant state = settings.value("titleblocktemplateeditor/state");
|
||||
if (state.isValid()) restoreState(state.toByteArray());
|
||||
@@ -698,10 +704,10 @@ void QETTitleBlockTemplateEditor::updateEditorTitle()
|
||||
"titleblock template editor: base window title"
|
||||
)
|
||||
);
|
||||
|
||||
|
||||
// get the currently edited template (file)name
|
||||
QString titleblock_title = currentlyEditedTitle();
|
||||
|
||||
|
||||
// generate the final window title
|
||||
QString title;
|
||||
if (titleblock_title.isEmpty()) {
|
||||
@@ -724,7 +730,7 @@ void QETTitleBlockTemplateEditor::updateEditorTitle()
|
||||
void QETTitleBlockTemplateEditor::updateActions()
|
||||
{
|
||||
save_ -> setEnabled(!read_only_);
|
||||
|
||||
|
||||
bool can_merge = true;
|
||||
bool can_split = true;
|
||||
int count = 0;
|
||||
@@ -748,15 +754,15 @@ void QETTitleBlockTemplateEditor::updateActions()
|
||||
bool QETTitleBlockTemplateEditor::saveAs(const TitleBlockTemplateLocation &location) {
|
||||
TitleBlockTemplatesCollection *collection = location.parentCollection();
|
||||
if (!collection) return(false);
|
||||
|
||||
|
||||
QDomDocument doc;
|
||||
QDomElement elmt = doc.createElement("root");
|
||||
tb_template_ -> saveToXmlElement(elmt);
|
||||
elmt.setAttribute("name", location.name());
|
||||
doc.appendChild(elmt);
|
||||
|
||||
|
||||
collection -> setTemplateXmlDescription(location.name(), elmt);
|
||||
|
||||
|
||||
opened_from_file_ = false;
|
||||
location_ = location;
|
||||
undo_stack_ -> setClean();
|
||||
@@ -772,7 +778,7 @@ bool QETTitleBlockTemplateEditor::saveAs(const TitleBlockTemplateLocation &locat
|
||||
bool QETTitleBlockTemplateEditor::saveAs(const QString &filepath) {
|
||||
bool saving = tb_template_ -> saveToXmlFile(filepath);
|
||||
if (!saving) return(false);
|
||||
|
||||
|
||||
opened_from_file_ = true;
|
||||
filepath_ = filepath;
|
||||
undo_stack_ -> setClean();
|
||||
@@ -805,7 +811,7 @@ void QETTitleBlockTemplateEditor::openFromFile()
|
||||
QString initial_dir = filepath_.isEmpty()
|
||||
? QETApp::customTitleBlockTemplatesDir()
|
||||
: QDir(filepath_).absolutePath();
|
||||
|
||||
|
||||
// ask the user to choose a filepath
|
||||
QString user_filepath = QFileDialog::getOpenFileName(
|
||||
this,
|
||||
@@ -819,8 +825,8 @@ void QETTitleBlockTemplateEditor::openFromFile()
|
||||
" - %1 is the .titleblock extension"
|
||||
).arg(QString(TITLEBLOCKS_FILE_EXTENSION))
|
||||
);
|
||||
|
||||
|
||||
|
||||
|
||||
if (!user_filepath.isEmpty()) QETApp::instance() -> openTitleBlockTemplate(user_filepath);
|
||||
}
|
||||
|
||||
@@ -871,7 +877,7 @@ bool QETTitleBlockTemplateEditor::saveAsFile()
|
||||
QString initial_dir = filepath_.isEmpty()
|
||||
? QETApp::customTitleBlockTemplatesDir()
|
||||
: QDir(filepath_).absolutePath();
|
||||
|
||||
|
||||
// ask the user to choose a target file
|
||||
QString filepath = QFileDialog::getSaveFileName(
|
||||
this,
|
||||
@@ -882,16 +888,16 @@ bool QETTitleBlockTemplateEditor::saveAsFile()
|
||||
"filetypes allowed when saving a title block template file - %1 is the .titleblock extension"
|
||||
).arg(QString(TITLEBLOCKS_FILE_EXTENSION))
|
||||
);
|
||||
|
||||
|
||||
// if no name was entered, return false
|
||||
if (filepath.isEmpty()) return(false);
|
||||
|
||||
|
||||
// if the name does not end with ".titleblock", add it
|
||||
if (!filepath.endsWith(".titleblock", Qt::CaseInsensitive)) filepath += ".titleblock";
|
||||
|
||||
|
||||
// attempts to save the file
|
||||
bool saving = saveAs(filepath);
|
||||
|
||||
|
||||
// retourne un booleen representatif de la reussite de l'enregistrement
|
||||
return(saving);
|
||||
}
|
||||
@@ -932,18 +938,18 @@ TitleBlockTemplateLocation QETTitleBlockTemplateEditor::getTitleBlockTemplateLoc
|
||||
}
|
||||
QDialogButtonBox *buttons = new QDialogButtonBox(
|
||||
QDialogButtonBox::Ok | QDialogButtonBox::Cancel);
|
||||
|
||||
|
||||
QVBoxLayout *dialog_layout = new QVBoxLayout();
|
||||
dialog_layout -> addWidget(widget);
|
||||
dialog_layout -> addWidget(buttons);
|
||||
|
||||
|
||||
QDialog dialog;
|
||||
dialog.setWindowTitle(title);
|
||||
dialog.setLayout(dialog_layout);
|
||||
|
||||
|
||||
connect(buttons, SIGNAL(accepted()), &dialog, SLOT(accept()));
|
||||
connect(buttons, SIGNAL(rejected()), &dialog, SLOT(reject()));
|
||||
|
||||
|
||||
if (dialog.exec() == QDialog::Accepted) {
|
||||
return(widget -> location());
|
||||
}
|
||||
@@ -978,7 +984,7 @@ void QETTitleBlockTemplateEditor::savePreviewWidthToApplicationSettings(
|
||||
void QETTitleBlockTemplateEditor::editTemplateInformation()
|
||||
{
|
||||
if (!tb_template_) return;
|
||||
|
||||
|
||||
QDialog dialog_author(this);
|
||||
dialog_author.setModal(true);
|
||||
#ifdef Q_OS_MACOS
|
||||
@@ -987,20 +993,20 @@ void QETTitleBlockTemplateEditor::editTemplateInformation()
|
||||
dialog_author.setMinimumSize(400, 260);
|
||||
dialog_author.setWindowTitle(tr("Éditer les informations complémentaires", "window title"));
|
||||
QVBoxLayout *dialog_layout = new QVBoxLayout(&dialog_author);
|
||||
|
||||
|
||||
// explanation label
|
||||
QLabel *information_label = new QLabel(tr("Vous pouvez utiliser ce champ libre pour mentionner les auteurs du cartouche, sa licence, ou tout autre renseignement que vous jugerez utile."));
|
||||
information_label -> setAlignment(Qt::AlignJustify | Qt::AlignVCenter);
|
||||
information_label -> setWordWrap(true);
|
||||
dialog_layout -> addWidget(information_label);
|
||||
|
||||
|
||||
// add a QTextEdit to the dialog
|
||||
QTextEdit *text_field = new QTextEdit();
|
||||
text_field -> setAcceptRichText(false);
|
||||
text_field -> setPlainText(tb_template_ -> information());
|
||||
text_field -> setReadOnly(read_only_);
|
||||
dialog_layout -> addWidget(text_field);
|
||||
|
||||
|
||||
// add two buttons to the dialog
|
||||
QDialogButtonBox *dialog_buttons = new QDialogButtonBox(
|
||||
read_only_
|
||||
@@ -1012,7 +1018,7 @@ void QETTitleBlockTemplateEditor::editTemplateInformation()
|
||||
&dialog_author, SLOT(accept()));
|
||||
connect(dialog_buttons, SIGNAL(rejected()),
|
||||
&dialog_author, SLOT(reject()));
|
||||
|
||||
|
||||
// run the dialog
|
||||
if (dialog_author.exec() == QDialog::Accepted && !read_only_) {
|
||||
QString new_info = text_field -> toPlainText().remove(QChar(13)); // CR-less text
|
||||
|
||||
@@ -1,17 +1,17 @@
|
||||
/*
|
||||
Copyright 2006-2020 The QElectroTech Team
|
||||
This file is part of QElectroTech.
|
||||
|
||||
|
||||
QElectroTech 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 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
|
||||
QElectroTech 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 QElectroTech. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
@@ -19,6 +19,8 @@
|
||||
#include "templatescollection.h"
|
||||
#include "qetapp.h"
|
||||
|
||||
#include <QRegularExpression>
|
||||
|
||||
// make this class usable with QVariant
|
||||
int TitleBlockTemplateLocation::MetaTypeId = qRegisterMetaType<TitleBlockTemplateLocation>("TitleBlockTemplateLocation");
|
||||
|
||||
@@ -97,10 +99,10 @@ bool TitleBlockTemplateLocation::isValid() const
|
||||
*/
|
||||
void TitleBlockTemplateLocation::fromString(const QString &loc_str) {
|
||||
collection_ = QETApp::titleBlockTemplatesCollection(QUrl(loc_str).scheme());
|
||||
|
||||
QRegExp name_from_url("^[^:]*:\\/\\/(.*)$");
|
||||
if (name_from_url.exactMatch(loc_str)) {
|
||||
name_ = name_from_url.capturedTexts().at(1);
|
||||
|
||||
QRegularExpression name_from_url("^[^:]*:\\/\\/(.*)$");
|
||||
if (name_from_url==QRegularExpression(loc_str)) {
|
||||
name_ = name_from_url.namedCaptureGroups().at(1);
|
||||
} else {
|
||||
name_ = QString();
|
||||
}
|
||||
|
||||
@@ -1,17 +1,17 @@
|
||||
/*
|
||||
Copyright 2006-2020 The QElectroTech Team
|
||||
This file is part of QElectroTech.
|
||||
|
||||
|
||||
QElectroTech 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 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
|
||||
QElectroTech 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 QElectroTech. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
@@ -20,6 +20,8 @@
|
||||
#include "qetapp.h"
|
||||
#include "qetproject.h"
|
||||
|
||||
#include <QRegularExpression>
|
||||
|
||||
/**
|
||||
Constructor
|
||||
@param parent Parent QObject
|
||||
@@ -136,7 +138,7 @@ TitleBlockTemplatesProjectCollection::~TitleBlockTemplatesProjectCollection()
|
||||
QString TitleBlockTemplatesProjectCollection::title() const
|
||||
{
|
||||
if (!title_.isEmpty()) return(title_);
|
||||
|
||||
|
||||
// if the title attribute is empty, we generate a suitable one using the
|
||||
// parent project
|
||||
QString final_title;
|
||||
@@ -204,12 +206,12 @@ TitleBlockTemplate *TitleBlockTemplatesProjectCollection::getTemplate(const QStr
|
||||
if (titleblock_templates_.contains(template_name)) {
|
||||
return(titleblock_templates_[template_name]);
|
||||
}
|
||||
|
||||
|
||||
// No? Do we even know of it?
|
||||
if (!titleblock_templates_xml_.contains(template_name)) {
|
||||
return(nullptr);
|
||||
}
|
||||
|
||||
|
||||
// Ok, we have its XML description, we have to generate a TitleBlockTemplate object
|
||||
TitleBlockTemplate *titleblock_template = new TitleBlockTemplate(this);
|
||||
if (titleblock_template -> loadFromXmlElement(titleblock_templates_xml_[template_name])) {
|
||||
@@ -248,16 +250,16 @@ bool TitleBlockTemplatesProjectCollection::setTemplateXmlDescription(const QStri
|
||||
if (xml_elmt.tagName() != "titleblocktemplate") {
|
||||
return(false);
|
||||
}
|
||||
|
||||
|
||||
// we *require* a project (at least for the moment...)
|
||||
if (!project_) return(false);
|
||||
|
||||
|
||||
// we import the provided XML element in the project document
|
||||
QDomElement import = xml_document_.importNode(xml_elmt, true).toElement();
|
||||
|
||||
|
||||
// ensure the name stored in the XML description remains consistent with the provided template name
|
||||
import.setAttribute("name", template_name);
|
||||
|
||||
|
||||
// we either replace the previous description
|
||||
if (titleblock_templates_xml_.contains(template_name)) {
|
||||
QDomElement old_description = titleblock_templates_xml_[template_name];
|
||||
@@ -266,12 +268,12 @@ bool TitleBlockTemplatesProjectCollection::setTemplateXmlDescription(const QStri
|
||||
}
|
||||
}
|
||||
titleblock_templates_xml_.insert(template_name, import);
|
||||
|
||||
|
||||
if (titleblock_templates_.contains(template_name)) {
|
||||
titleblock_templates_[template_name] -> loadFromXmlElement(titleblock_templates_xml_[template_name]);
|
||||
}
|
||||
emit(changed(this, template_name));
|
||||
|
||||
|
||||
return(true);
|
||||
}
|
||||
|
||||
@@ -282,11 +284,11 @@ bool TitleBlockTemplatesProjectCollection::setTemplateXmlDescription(const QStri
|
||||
*/
|
||||
void TitleBlockTemplatesProjectCollection::removeTemplate(const QString &template_name) {
|
||||
emit(aboutToRemove(this, template_name));
|
||||
|
||||
|
||||
// remove the template itself
|
||||
titleblock_templates_xml_.remove(template_name);
|
||||
titleblock_templates_.remove(template_name);
|
||||
|
||||
|
||||
// warn the rest of the world that the list of templates embedded within this project has changed
|
||||
emit(changed(this, template_name));
|
||||
}
|
||||
@@ -339,10 +341,10 @@ void TitleBlockTemplatesProjectCollection::fromXml(const QDomElement &xml_elemen
|
||||
// each titleblock template must have a name
|
||||
if (!e.hasAttribute("name")) continue;
|
||||
QString titleblock_template_name = e.attribute("name");
|
||||
|
||||
|
||||
// if several templates have the same name, we keep the first one encountered
|
||||
if (titleblock_templates_xml_.contains(titleblock_template_name)) continue;
|
||||
|
||||
|
||||
// we simply store the XML element describing the titleblock template,
|
||||
// without any further analysis for the moment
|
||||
titleblock_templates_xml_.insert(titleblock_template_name, e);
|
||||
@@ -355,7 +357,7 @@ void TitleBlockTemplatesProjectCollection::fromXml(const QDomElement &xml_elemen
|
||||
void TitleBlockTemplatesProjectCollection::deleteUnusedTitleBlocKTemplates()
|
||||
{
|
||||
if (!project_) return;
|
||||
|
||||
|
||||
foreach (QString template_name, templates()) {
|
||||
if (!project_ -> usesTitleBlockTemplate(location(template_name))) {
|
||||
removeTemplate(template_name);
|
||||
@@ -408,7 +410,7 @@ QString TitleBlockTemplatesFilesCollection::path(const QString &template_name) c
|
||||
QStringList TitleBlockTemplatesFilesCollection::templates()
|
||||
{
|
||||
QStringList templates_names;
|
||||
QRegExp replace_regexp(QString("%1$").arg(TITLEBLOCKS_FILE_EXTENSION));
|
||||
QRegularExpression replace_regexp(QString("%1$").arg(TITLEBLOCKS_FILE_EXTENSION));
|
||||
foreach(QString name, dir_.entryList()) {
|
||||
templates_names << name.replace(replace_regexp, "");
|
||||
}
|
||||
@@ -421,10 +423,10 @@ QStringList TitleBlockTemplatesFilesCollection::templates()
|
||||
*/
|
||||
TitleBlockTemplate *TitleBlockTemplatesFilesCollection::getTemplate(const QString &template_name) {
|
||||
if (!templates().contains(template_name)) return(nullptr);
|
||||
|
||||
|
||||
TitleBlockTemplate *tbtemplate = new TitleBlockTemplate();
|
||||
QString tbt_file_path = path(template_name);
|
||||
|
||||
|
||||
bool loading = tbtemplate -> loadFromXmlFile(tbt_file_path);
|
||||
if (!loading) {
|
||||
delete tbtemplate;
|
||||
@@ -439,17 +441,17 @@ TitleBlockTemplate *TitleBlockTemplatesFilesCollection::getTemplate(const QStrin
|
||||
*/
|
||||
QDomElement TitleBlockTemplatesFilesCollection::getTemplateXmlDescription(const QString &template_name) {
|
||||
QString xml_file_path = path(template_name);
|
||||
|
||||
|
||||
QFileInfo xml_file_info(xml_file_path);
|
||||
if (!xml_file_info.exists() || !xml_file_info.isReadable()) {
|
||||
return(QDomElement());
|
||||
}
|
||||
|
||||
|
||||
QFile xml_file(xml_file_path);
|
||||
if (!xml_file.open(QIODevice::ReadOnly)) {
|
||||
return(QDomElement());
|
||||
}
|
||||
|
||||
|
||||
QDomDocument *xml_document = new QDomDocument();
|
||||
bool xml_parsing = xml_document -> setContent(&xml_file);
|
||||
if (!xml_parsing) {
|
||||
@@ -466,16 +468,16 @@ QDomElement TitleBlockTemplatesFilesCollection::getTemplateXmlDescription(const
|
||||
*/
|
||||
bool TitleBlockTemplatesFilesCollection::setTemplateXmlDescription(const QString &template_name, const QDomElement &xml_element) {
|
||||
if (template_name.isEmpty()) return(false);
|
||||
|
||||
|
||||
// prevent the watcher from emitting signals while we open and write to file
|
||||
blockSignals(true);
|
||||
|
||||
|
||||
QDomDocument doc;
|
||||
doc.appendChild(doc.importNode(xml_element, true));
|
||||
|
||||
|
||||
bool writing = QET::writeXmlFile(doc, path(template_name));
|
||||
if (!writing) return(false);
|
||||
|
||||
|
||||
// emit a single signal for the change
|
||||
blockSignals(false);
|
||||
emit(changed(this, template_name));
|
||||
@@ -489,9 +491,9 @@ void TitleBlockTemplatesFilesCollection::removeTemplate(const QString &template_
|
||||
emit(aboutToRemove(this, template_name));
|
||||
// prevent the watcher from emitting signals while we open and write to file
|
||||
blockSignals(true);
|
||||
|
||||
|
||||
dir_.remove(toFileName(template_name));
|
||||
|
||||
|
||||
// emit a single signal for the removal
|
||||
blockSignals(false);
|
||||
emit(changed(this, template_name));
|
||||
@@ -500,7 +502,7 @@ void TitleBlockTemplatesFilesCollection::removeTemplate(const QString &template_
|
||||
/**
|
||||
@param template_name Name of a template supposed to be contained within
|
||||
this collection.
|
||||
@return
|
||||
@return
|
||||
*/
|
||||
TitleBlockTemplateLocation TitleBlockTemplatesFilesCollection::location(const QString &template_name) {
|
||||
return(TitleBlockTemplateLocation(template_name, this));
|
||||
@@ -544,7 +546,7 @@ bool TitleBlockTemplatesFilesCollection::isReadOnly(const QString &template_name
|
||||
@return the template name for \a file_name
|
||||
*/
|
||||
QString TitleBlockTemplatesFilesCollection::toTemplateName(const QString &file_name) {
|
||||
static QRegExp replace_regexp(QString("%1$").arg(TITLEBLOCKS_FILE_EXTENSION));
|
||||
static QRegularExpression replace_regexp(QString("%1$").arg(TITLEBLOCKS_FILE_EXTENSION));
|
||||
QString template_name(file_name);
|
||||
return(template_name.replace(replace_regexp, ""));
|
||||
}
|
||||
|
||||
@@ -1,17 +1,17 @@
|
||||
/*
|
||||
Copyright 2006-2020 The QElectroTech Team
|
||||
This file is part of QElectroTech.
|
||||
|
||||
|
||||
QElectroTech 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 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
|
||||
QElectroTech 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 QElectroTech. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
@@ -23,6 +23,8 @@
|
||||
// uncomment the line below to get more debug information
|
||||
//#define TITLEBLOCK_TEMPLATE_DEBUG
|
||||
|
||||
#include <QRegularExpression>
|
||||
#include <QRegularExpressionMatch>
|
||||
/**
|
||||
@brief TitleBlockTemplate::TitleBlockTemplate
|
||||
Constructor
|
||||
@@ -97,7 +99,7 @@ bool TitleBlockTemplate::loadFromXmlFile(const QString &filepath) {
|
||||
#ifdef TITLEBLOCK_TEMPLATE_DEBUG
|
||||
qDebug() << Q_FUNC_INFO << filepath << "opened";
|
||||
#endif
|
||||
|
||||
|
||||
// parse its content as XML
|
||||
QDomDocument xml_doc;
|
||||
bool xml_parsing = xml_doc.setContent(&template_file);
|
||||
@@ -124,11 +126,11 @@ bool TitleBlockTemplate::loadFromXmlElement(const QDomElement &xml_element) {
|
||||
return(false);
|
||||
}
|
||||
name_ = xml_element.attribute("name");
|
||||
|
||||
|
||||
loadInformation(xml_element);
|
||||
loadLogos(xml_element, true);
|
||||
loadGrid(xml_element);
|
||||
|
||||
|
||||
return(true);
|
||||
}
|
||||
|
||||
@@ -141,14 +143,14 @@ bool TitleBlockTemplate::loadFromXmlElement(const QDomElement &xml_element) {
|
||||
*/
|
||||
bool TitleBlockTemplate::saveToXmlFile(const QString &filepath) {
|
||||
if (filepath.isEmpty()) return(false);
|
||||
|
||||
|
||||
// generate the XML document
|
||||
QDomDocument doc;
|
||||
QDomElement e = doc.createElement("root");
|
||||
bool saving = saveToXmlElement(e);
|
||||
if (!saving) return(false);
|
||||
doc.appendChild(e);
|
||||
|
||||
|
||||
return(QET::writeXmlFile(doc, filepath));
|
||||
}
|
||||
|
||||
@@ -163,7 +165,7 @@ bool TitleBlockTemplate::saveToXmlElement(QDomElement &xml_element) const
|
||||
{
|
||||
// we are supposed to have at least a name
|
||||
if (name_.isEmpty()) return(false);
|
||||
|
||||
|
||||
xml_element.setTagName("titleblocktemplate");
|
||||
xml_element.setAttribute("name", name_);
|
||||
saveInformation(xml_element);
|
||||
@@ -195,7 +197,7 @@ TitleBlockTemplate *TitleBlockTemplate::clone() const
|
||||
TitleBlockTemplate *copy = new TitleBlockTemplate();
|
||||
copy -> name_ = name_;
|
||||
copy -> information_ = information_;
|
||||
|
||||
|
||||
// this does not really duplicates pixmaps,
|
||||
// only the objects that hold a key to the implicitly shared pixmaps
|
||||
foreach (QString logo_key, bitmap_logos_.keys()) {
|
||||
@@ -209,20 +211,20 @@ TitleBlockTemplate *TitleBlockTemplate::clone() const
|
||||
<< copy -> bitmap_logos_[logo_key] -> cacheKey();
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
// we have to create new QSvgRenderer objects from the data
|
||||
// (no copy constructor)
|
||||
foreach (QString logo_key, vector_logos_.keys()) {
|
||||
copy -> vector_logos_[logo_key] =
|
||||
new QSvgRenderer(data_logos_[logo_key]);
|
||||
}
|
||||
|
||||
|
||||
copy -> data_logos_ = data_logos_;
|
||||
copy -> storage_logos_ = storage_logos_;
|
||||
copy -> type_logos_ = type_logos_;
|
||||
copy -> rows_heights_ = rows_heights_;
|
||||
copy -> columns_width_ = columns_width_;
|
||||
|
||||
|
||||
// copy cells basically
|
||||
copy -> cells_ = cells_;
|
||||
for (int j = 0 ; j < rows_heights_.count() ; ++ j) {
|
||||
@@ -230,7 +232,7 @@ TitleBlockTemplate *TitleBlockTemplate::clone() const
|
||||
copy -> cells_[i][j] = copy -> createCell(cells_[i][j]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// ensure the copy has no spanner_cell attribute pointing to a cell
|
||||
// from the original object
|
||||
for (int j = 0 ; j < rows_heights_.count() ; ++ j) {
|
||||
@@ -247,7 +249,7 @@ TitleBlockTemplate *TitleBlockTemplate::clone() const
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return(copy);
|
||||
}
|
||||
|
||||
@@ -278,15 +280,15 @@ bool TitleBlockTemplate::loadLogos(const QDomElement &xml_element, bool reset) {
|
||||
if (reset) {
|
||||
qDeleteAll(vector_logos_.begin(), vector_logos_.end());
|
||||
vector_logos_.clear();
|
||||
|
||||
|
||||
// Note:
|
||||
// QPixmap are only a key to access the implicitly shared pixmap
|
||||
bitmap_logos_.clear();
|
||||
|
||||
|
||||
data_logos_.clear();
|
||||
storage_logos_.clear();
|
||||
}
|
||||
|
||||
|
||||
// we look for //logos/logo elements
|
||||
for (QDomNode n = xml_element.firstChild() ;
|
||||
!n.isNull() ;
|
||||
@@ -302,7 +304,7 @@ bool TitleBlockTemplate::loadLogos(const QDomElement &xml_element, bool reset) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return(true);
|
||||
}
|
||||
|
||||
@@ -321,7 +323,7 @@ bool TitleBlockTemplate::loadLogo(const QDomElement &xml_element) {
|
||||
QString logo_name = xml_element.attribute("name");
|
||||
QString logo_type = xml_element.attribute("type", "png");
|
||||
QString logo_storage = xml_element.attribute("storage", "base64");
|
||||
|
||||
|
||||
// Both QSvgRenderer and QPixmap read their data from a QByteArray, so
|
||||
// we convert the available data to that format.
|
||||
QByteArray logo_data;
|
||||
@@ -342,7 +344,7 @@ bool TitleBlockTemplate::loadLogo(const QDomElement &xml_element) {
|
||||
qDebug() << Q_FUNC_INFO << logo_name << logo_type << logo_storage;
|
||||
#endif
|
||||
addLogo(logo_name, &logo_data, logo_type, logo_storage);
|
||||
|
||||
|
||||
return(true);
|
||||
}
|
||||
|
||||
@@ -362,12 +364,12 @@ bool TitleBlockTemplate::loadGrid(const QDomElement &xml_element) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (!grid_element.hasAttribute("rows")
|
||||
|| !grid_element.hasAttribute("cols")) {
|
||||
return(false);
|
||||
}
|
||||
|
||||
|
||||
parseRows(grid_element.attribute("rows"));
|
||||
parseColumns(grid_element.attribute("cols"));
|
||||
initCells();
|
||||
@@ -386,7 +388,9 @@ bool TitleBlockTemplate::loadGrid(const QDomElement &xml_element) {
|
||||
void TitleBlockTemplate::parseRows(const QString &rows_string) {
|
||||
rows_heights_.clear();
|
||||
// parse the rows attribute: we expect a serie of absolute heights
|
||||
QRegExp row_size_format("^([0-9]+)(?:px)?$", Qt::CaseInsensitive);
|
||||
QRegularExpression row_size_format
|
||||
("^([0-9]+)(?:px)?$",
|
||||
QRegularExpression::CaseInsensitiveOption);
|
||||
bool conv_ok;
|
||||
|
||||
#if QT_VERSION < QT_VERSION_CHECK(5, 14, 0) // ### Qt 6: remove
|
||||
@@ -398,10 +402,11 @@ void TitleBlockTemplate::parseRows(const QString &rows_string) {
|
||||
rows_string.split(QChar(';'), Qt::SkipEmptyParts);
|
||||
#endif
|
||||
foreach (QString rows_description, rows_descriptions) {
|
||||
if (row_size_format.exactMatch(rows_description)) {
|
||||
QRegularExpressionMatch match;
|
||||
match = row_size_format.match(rows_description);
|
||||
if (match.hasMatch()) {
|
||||
int row_size =
|
||||
row_size_format.capturedTexts().at(1).toInt(
|
||||
&conv_ok);
|
||||
match.captured(1).toInt(&conv_ok);
|
||||
if (conv_ok)
|
||||
rows_heights_ << row_size;
|
||||
}
|
||||
@@ -420,8 +425,12 @@ void TitleBlockTemplate::parseRows(const QString &rows_string) {
|
||||
void TitleBlockTemplate::parseColumns(const QString &cols_string) {
|
||||
columns_width_.clear();
|
||||
// parse the cols attribute: we expect a serie of absolute or relative widths
|
||||
QRegExp abs_col_size_format("^([0-9]+)(?:px)?$", Qt::CaseInsensitive);
|
||||
QRegExp rel_col_size_format("^([rt])([0-9]+)%$", Qt::CaseInsensitive);
|
||||
QRegularExpression abs_col_size_format,rel_col_size_format;
|
||||
abs_col_size_format.setPattern("^([0-9]+)(?:px)?$");
|
||||
abs_col_size_format.setPatternOptions(QRegularExpression::CaseInsensitiveOption);
|
||||
//QRegExp rel_col_size_format("^([rt])([0-9]+)%$", Qt::CaseInsensitive);
|
||||
rel_col_size_format.setPattern("^([rt])([0-9]+)%$");
|
||||
rel_col_size_format.setPatternOptions(QRegularExpression::CaseInsensitiveOption);
|
||||
bool conv_ok;
|
||||
|
||||
#if QT_VERSION < QT_VERSION_CHECK(5, 14, 0) // ### Qt 6: remove
|
||||
@@ -433,18 +442,18 @@ void TitleBlockTemplate::parseColumns(const QString &cols_string) {
|
||||
cols_string.split(QChar(';'), Qt::SkipEmptyParts);
|
||||
#endif
|
||||
foreach (QString cols_description, cols_descriptions) {
|
||||
if (abs_col_size_format.exactMatch(cols_description)) {
|
||||
int col_size = abs_col_size_format.capturedTexts().at(1).toInt(&conv_ok);
|
||||
QRegularExpressionMatch match_abc,match_rel;
|
||||
match_abc = abs_col_size_format.match(cols_description);
|
||||
match_rel = rel_col_size_format.match(cols_description);
|
||||
if (match_abc.hasMatch()) {
|
||||
int col_size = match_abc.captured(1).toInt(&conv_ok);
|
||||
if (conv_ok)
|
||||
columns_width_ << TitleBlockDimension(
|
||||
col_size,
|
||||
QET::Absolute);
|
||||
} else if (rel_col_size_format.exactMatch(cols_description)) {
|
||||
int col_size =
|
||||
rel_col_size_format.capturedTexts().at(2).toInt(
|
||||
&conv_ok);
|
||||
QET::TitleBlockColumnLength col_type =
|
||||
rel_col_size_format.capturedTexts().at(1)
|
||||
} else if (match_rel.hasMatch()) {
|
||||
int col_size = match_rel.captured(2).toInt(&conv_ok);
|
||||
QET::TitleBlockColumnLength col_type = match_rel.captured(1)
|
||||
== "t"
|
||||
? QET::RelativeToTotalLength
|
||||
: QET::RelativeToRemainingLength;
|
||||
@@ -508,7 +517,7 @@ void TitleBlockTemplate::saveInformation(QDomElement &xml_element) const
|
||||
{
|
||||
QDomNode information_text_node =
|
||||
xml_element.ownerDocument().createTextNode(information());
|
||||
|
||||
|
||||
QDomElement information_element =
|
||||
xml_element.ownerDocument().createElement("information");
|
||||
information_element.appendChild(information_text_node);
|
||||
@@ -544,11 +553,11 @@ void TitleBlockTemplate::saveLogo(const QString &logo_name,
|
||||
QDomElement &xml_element) const
|
||||
{
|
||||
if (!type_logos_.contains(logo_name)) return;
|
||||
|
||||
|
||||
xml_element.setAttribute("name", logo_name);
|
||||
xml_element.setAttribute("type", type_logos_[logo_name]);
|
||||
xml_element.setAttribute("storage", storage_logos_[logo_name]);
|
||||
|
||||
|
||||
if (storage_logos_[logo_name] == "xml"
|
||||
&& type_logos_[logo_name] == "svg") {
|
||||
QDomDocument svg_logo;
|
||||
@@ -575,7 +584,7 @@ void TitleBlockTemplate::saveGrid(QDomElement &xml_element) const
|
||||
{
|
||||
QDomElement grid_element =
|
||||
xml_element.ownerDocument().createElement("grid");
|
||||
|
||||
|
||||
QString rows_attr, cols_attr;
|
||||
foreach(int row_height, rows_heights_)
|
||||
rows_attr += QString("%1;").arg(row_height);
|
||||
@@ -583,9 +592,9 @@ void TitleBlockTemplate::saveGrid(QDomElement &xml_element) const
|
||||
cols_attr += col_width.toShortString();
|
||||
grid_element.setAttribute("rows", rows_attr);
|
||||
grid_element.setAttribute("cols", cols_attr);
|
||||
|
||||
|
||||
saveCells(grid_element);
|
||||
|
||||
|
||||
xml_element.appendChild(grid_element);
|
||||
}
|
||||
|
||||
@@ -625,12 +634,12 @@ void TitleBlockTemplate::saveCell(TitleBlockCell *cell,
|
||||
if (cell -> spanner_cell) return;
|
||||
if (!save_empty && cell -> cell_type == TitleBlockCell::EmptyCell)
|
||||
return;
|
||||
|
||||
|
||||
|
||||
|
||||
QDomElement cell_elmt =
|
||||
xml_element.ownerDocument().createElement("cell");
|
||||
xml_element.appendChild(cell_elmt);
|
||||
|
||||
|
||||
// save information dependent from this template
|
||||
cell_elmt.setAttribute("row", cell -> num_row);
|
||||
cell_elmt.setAttribute("col", cell -> num_col);
|
||||
@@ -638,7 +647,7 @@ void TitleBlockTemplate::saveCell(TitleBlockCell *cell,
|
||||
cell -> row_span);
|
||||
if (cell -> col_span) cell_elmt.setAttribute("colspan",
|
||||
cell -> col_span);
|
||||
|
||||
|
||||
// save other information
|
||||
cell -> saveContentToXml(cell_elmt);
|
||||
}
|
||||
@@ -659,15 +668,15 @@ bool TitleBlockTemplate::checkCell(const QDomElement &xml_element,
|
||||
TitleBlockCell **titleblock_cell_ptr) {
|
||||
int col_count = columns_width_.count(),
|
||||
row_count = rows_heights_.count();
|
||||
|
||||
|
||||
#ifdef TITLEBLOCK_TEMPLATE_DEBUG
|
||||
qDebug() << Q_FUNC_INFO << "begin" << row_count << col_count;
|
||||
#endif
|
||||
|
||||
|
||||
int row_num, col_num, row_span, col_span;
|
||||
row_num = col_num = -1;
|
||||
row_span = col_span = 0;
|
||||
|
||||
|
||||
// parse the row and col attributes
|
||||
if (!QET::attributeIsAnInteger(xml_element, "row", &row_num)
|
||||
|| row_num < 0
|
||||
@@ -679,7 +688,7 @@ bool TitleBlockTemplate::checkCell(const QDomElement &xml_element,
|
||||
|| col_num >= col_count) {
|
||||
return(false);
|
||||
}
|
||||
|
||||
|
||||
// check whether the target cell can be used or not
|
||||
#ifdef TITLEBLOCK_TEMPLATE_DEBUG
|
||||
qDebug() << Q_FUNC_INFO << "cell access" << col_num << row_num;
|
||||
@@ -692,20 +701,20 @@ bool TitleBlockTemplate::checkCell(const QDomElement &xml_element,
|
||||
// ensure the num_row and num_col attributes are alright
|
||||
cell_ptr -> num_row = row_num;
|
||||
cell_ptr -> num_col = col_num;
|
||||
|
||||
|
||||
// parse the rowspan and colspan attributes
|
||||
if (QET::attributeIsAnInteger(xml_element, "rowspan", &row_span)
|
||||
&& row_span > 0) {
|
||||
cell_ptr -> row_span = row_span;
|
||||
}
|
||||
|
||||
|
||||
if (QET::attributeIsAnInteger(xml_element, "colspan", &col_span)
|
||||
&& col_span > 0) {
|
||||
cell_ptr -> col_span = col_span;
|
||||
}
|
||||
// these attributes are stored "as is" -- whether they can be applied
|
||||
// directly or must be restricted will be checked later
|
||||
|
||||
|
||||
if (titleblock_cell_ptr) *titleblock_cell_ptr = cell_ptr;
|
||||
return(true);
|
||||
}
|
||||
@@ -719,7 +728,7 @@ bool TitleBlockTemplate::checkCell(const QDomElement &xml_element,
|
||||
void TitleBlockTemplate::initCells()
|
||||
{
|
||||
if (columns_width_.count() < 1 || rows_heights_.count() < 1) return;
|
||||
|
||||
|
||||
cells_.clear();
|
||||
qDeleteAll(registered_cells_);
|
||||
registered_cells_.clear();
|
||||
@@ -838,12 +847,12 @@ int TitleBlockTemplate::rowsCount() const
|
||||
QList<int> TitleBlockTemplate::columnsWidth(int total_width) const
|
||||
{
|
||||
if (total_width < 0) return(QList<int>());
|
||||
|
||||
|
||||
// we first iter to determine the absolute and total-width-related widths
|
||||
QVector<int> final_widths(columns_width_.count());
|
||||
int abs_widths_sum = 0, rel_widths_sum = 0;
|
||||
QList<int> relative_columns;
|
||||
|
||||
|
||||
for (int i = 0 ; i < columns_width_.count() ; ++ i) {
|
||||
TitleBlockDimension icd = columns_width_.at(i);
|
||||
if (icd.type == QET::Absolute) {
|
||||
@@ -856,10 +865,10 @@ QList<int> TitleBlockTemplate::columnsWidth(int total_width) const
|
||||
final_widths[i] = abs_value;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// we can now deduce the remaining width
|
||||
int remaining_width = total_width - abs_widths_sum;
|
||||
|
||||
|
||||
// we do a second iteration to build the final widths list
|
||||
for (int i = 0 ; i < columns_width_.count() ; ++ i) {
|
||||
TitleBlockDimension icd = columns_width_.at(i);
|
||||
@@ -870,14 +879,14 @@ QList<int> TitleBlockTemplate::columnsWidth(int total_width) const
|
||||
rel_widths_sum += final_widths[i];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Have we computed widths from percentage for relative columns?
|
||||
if (relative_columns.count()) {
|
||||
// Due to the rounding process,
|
||||
// we may get a slight difference between the
|
||||
// sum of the columns widths and the total width.
|
||||
int difference = total_width - abs_widths_sum - rel_widths_sum;
|
||||
|
||||
|
||||
if (difference) {
|
||||
// We consider we should not attempt to compensate
|
||||
// this difference if it is under
|
||||
@@ -886,7 +895,7 @@ QList<int> TitleBlockTemplate::columnsWidth(int total_width) const
|
||||
// columns can "bring" up to 0.5px of difference).
|
||||
qreal max_acceptable_difference =
|
||||
relative_columns.count() * 0.5;
|
||||
|
||||
|
||||
int share = difference > 0 ? 1 : -1;
|
||||
if (qAbs(difference) <= max_acceptable_difference) {
|
||||
while (difference) {
|
||||
@@ -914,32 +923,32 @@ QList<int> TitleBlockTemplate::rowsHeights() const
|
||||
/**
|
||||
@brief TitleBlockTemplate::columnTypeCount
|
||||
@param type : a column type
|
||||
@return the count of \a type columns
|
||||
@return the count of \a type columns
|
||||
*/
|
||||
int TitleBlockTemplate::columnTypeCount(QET::TitleBlockColumnLength type) {
|
||||
int count = 0;
|
||||
|
||||
|
||||
for (int i = 0 ; i < columns_width_.count() ; ++ i) {
|
||||
if (columns_width_.at(i).type == type) ++ count;
|
||||
}
|
||||
|
||||
|
||||
return(count);
|
||||
}
|
||||
|
||||
/**
|
||||
@brief TitleBlockTemplate::columnTypeTotal
|
||||
@param type : a column type
|
||||
@return the sum of values attached to \a type columns
|
||||
@return the sum of values attached to \a type columns
|
||||
*/
|
||||
int TitleBlockTemplate::columnTypeTotal(QET::TitleBlockColumnLength type) {
|
||||
int total = 0;
|
||||
|
||||
|
||||
for (int i = 0 ; i < columns_width_.count() ; ++ i) {
|
||||
if (columns_width_.at(i).type == type) {
|
||||
total += columns_width_.at(i).value;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return(total);
|
||||
}
|
||||
|
||||
@@ -951,7 +960,7 @@ int TitleBlockTemplate::minimumWidth()
|
||||
// Abbreviations: ABS: absolute, RTT: relative to total, RTR:
|
||||
// relative to remaining,
|
||||
// TOT: total diagram/TBT width (variable).
|
||||
|
||||
|
||||
// Minimum size may be enforced by ABS and RTT widths:
|
||||
// TOT >= ((sum(REL)/100)*TOT)+sum(ABS)
|
||||
// => (1 - (sum(REL)/100))TOT >= sum(ABS)
|
||||
@@ -1050,7 +1059,7 @@ bool TitleBlockTemplate::insertRow(int dimension,
|
||||
const QList<TitleBlockCell *> &row,
|
||||
int i) {
|
||||
int index = (i == -1) ? rows_heights_.count() : i;
|
||||
|
||||
|
||||
for (int j = 0 ; j < columns_width_.count() ; ++ j) {
|
||||
cells_[j].insert(index, row[j]);
|
||||
}
|
||||
@@ -1166,7 +1175,7 @@ TitleBlockCell *TitleBlockTemplate::cell(int row, int col) const
|
||||
{
|
||||
if (row >= rows_heights_.count()) return(nullptr);
|
||||
if (col >= columns_width_.count()) return(nullptr);
|
||||
|
||||
|
||||
return(cells_[col][row]);
|
||||
}
|
||||
|
||||
@@ -1198,7 +1207,7 @@ QSet<TitleBlockCell *> TitleBlockTemplate::spannedCells(
|
||||
? given_cell -> col_span
|
||||
: given_cell -> applied_col_span;
|
||||
if (!final_row_span && !final_col_span) return(set);
|
||||
|
||||
|
||||
for (int i = given_cell -> num_col ;
|
||||
i <= given_cell -> num_col + final_col_span ;
|
||||
++ i) {
|
||||
@@ -1269,7 +1278,7 @@ bool TitleBlockTemplate::addLogo(const QString &logo_name,
|
||||
// we are replacing the logo
|
||||
removeLogo(logo_name);
|
||||
}
|
||||
|
||||
|
||||
// we can now create our image object from the byte array
|
||||
if (logo_type == "svg") {
|
||||
// SVG format is handled by the QSvgRenderer class
|
||||
@@ -1278,7 +1287,7 @@ bool TitleBlockTemplate::addLogo(const QString &logo_name,
|
||||
return(false);
|
||||
}
|
||||
vector_logos_.insert(logo_name, svg);
|
||||
|
||||
|
||||
// we also memorize the way to store them in the final XML output
|
||||
QString final_logo_storage = logo_storage;
|
||||
if (logo_storage != "xml" && logo_storage != "base64") {
|
||||
@@ -1286,7 +1295,7 @@ bool TitleBlockTemplate::addLogo(const QString &logo_name,
|
||||
}
|
||||
storage_logos_.insert(logo_name, logo_storage);
|
||||
} else {
|
||||
|
||||
|
||||
// bitmap formats are handled by the QPixmap class
|
||||
QPixmap logo_pixmap;
|
||||
logo_pixmap.loadFromData(*logo_data);
|
||||
@@ -1294,15 +1303,15 @@ bool TitleBlockTemplate::addLogo(const QString &logo_name,
|
||||
return(false);
|
||||
}
|
||||
bitmap_logos_.insert(logo_name, logo_pixmap);
|
||||
|
||||
|
||||
// bitmap logos can only be stored using a base64 encoding
|
||||
storage_logos_.insert(logo_name, "base64");
|
||||
}
|
||||
|
||||
|
||||
// we systematically store the raw data
|
||||
data_logos_.insert(logo_name, *logo_data);
|
||||
type_logos_.insert(logo_name, logo_type);
|
||||
|
||||
|
||||
return(true);
|
||||
}
|
||||
|
||||
@@ -1320,15 +1329,15 @@ bool TitleBlockTemplate::addLogoFromFile(const QString &filepath,
|
||||
QFileInfo filepath_info(filepath);
|
||||
QString filename = name.isEmpty() ? filepath_info.fileName() : name;
|
||||
QString filetype = filepath_info.suffix();
|
||||
|
||||
|
||||
// we read the provided logo
|
||||
QFile logo_file(filepath);
|
||||
if (!logo_file.open(QIODevice::ReadOnly)) return(false);
|
||||
QByteArray file_content = logo_file.readAll();
|
||||
|
||||
|
||||
// first, we try to add it as an SVG image
|
||||
if (addLogo(filename, &file_content, "svg", "xml")) return(true);
|
||||
|
||||
|
||||
// we then try to add it as a bitmap image
|
||||
return addLogo(filename,
|
||||
&file_content,
|
||||
@@ -1349,12 +1358,12 @@ bool TitleBlockTemplate::saveLogoToFile(const QString &logo_name,
|
||||
if (!data_logos_.contains(logo_name)) {
|
||||
return(false);
|
||||
}
|
||||
|
||||
|
||||
QFile target_file(filepath);
|
||||
if (!target_file.open(QIODevice::WriteOnly | QIODevice::Truncate)) {
|
||||
return(false);
|
||||
}
|
||||
|
||||
|
||||
target_file.write(data_logos_[logo_name]);
|
||||
target_file.close();
|
||||
return(true);
|
||||
@@ -1395,7 +1404,7 @@ bool TitleBlockTemplate::renameLogo(const QString &logo_name,
|
||||
|| data_logos_.contains(new_name)) {
|
||||
return(false);
|
||||
}
|
||||
|
||||
|
||||
/// TODO check existing cells using this logo.
|
||||
if (vector_logos_.contains(logo_name)) {
|
||||
vector_logos_.insert(new_name, vector_logos_.take(logo_name));
|
||||
@@ -1493,16 +1502,16 @@ void TitleBlockTemplate::render(QPainter &painter,
|
||||
{
|
||||
QList<int> widths = columnsWidth(titleblock_width);
|
||||
int titleblock_height = height();
|
||||
|
||||
|
||||
painter.save();
|
||||
//Setup the QPainter
|
||||
QPen pen(Qt::black);
|
||||
pen.setCosmetic(true);
|
||||
painter.setPen(pen);
|
||||
|
||||
|
||||
// draw the titleblock border
|
||||
painter.drawRect(QRect(0, 0, titleblock_width, titleblock_height));
|
||||
|
||||
|
||||
// run through each individual cell
|
||||
for (int j = 0 ; j < rows_heights_.count() ; ++ j) {
|
||||
for (int i = 0 ; i < columns_width_.count() ; ++ i) {
|
||||
@@ -1510,13 +1519,13 @@ void TitleBlockTemplate::render(QPainter &painter,
|
||||
|| cells_[i][j] -> cell_type
|
||||
== TitleBlockCell::EmptyCell)
|
||||
continue;
|
||||
|
||||
|
||||
// calculate the border rect of the current cell
|
||||
int x = lengthRange(0, cells_[i][j] -> num_col, widths);
|
||||
int y = lengthRange(0,
|
||||
cells_[i][j] -> num_row,
|
||||
rows_heights_);
|
||||
|
||||
|
||||
int row_span = 0, col_span = 0;
|
||||
if (cells_[i][j] -> span_state
|
||||
!= TitleBlockCell::Disabled) {
|
||||
@@ -1530,7 +1539,7 @@ void TitleBlockTemplate::render(QPainter &painter,
|
||||
cells_[i][j] -> num_row + 1 + row_span,
|
||||
rows_heights_);
|
||||
QRect cell_rect(x, y, w, h);
|
||||
|
||||
|
||||
renderCell(painter, *cells_[i][j],
|
||||
diagram_context,
|
||||
cell_rect);
|
||||
@@ -1647,7 +1656,7 @@ void TitleBlockTemplate::renderCell(QPainter &painter,
|
||||
pen.setColor(Qt::black);
|
||||
painter.setPen(pen);
|
||||
painter.drawRect(cell_rect);
|
||||
|
||||
|
||||
painter.save();
|
||||
// render the inner content of the current cell
|
||||
if (cell.type() == TitleBlockCell::LogoCell) {
|
||||
@@ -1672,7 +1681,7 @@ void TitleBlockTemplate::renderCell(QPainter &painter,
|
||||
renderTextCell(painter, final_text, cell, cell_rect);
|
||||
}
|
||||
painter.restore();
|
||||
|
||||
|
||||
// draw again the border rect of the current cell, without the brush this time
|
||||
painter.setBrush(Qt::NoBrush);
|
||||
painter.drawRect(cell_rect);
|
||||
@@ -1695,9 +1704,9 @@ QString TitleBlockTemplate::finalTextForCell(
|
||||
{
|
||||
QString cell_text = cell.value.name();
|
||||
QString cell_label = cell.label.name();
|
||||
|
||||
|
||||
cell_text = interpreteVariables(cell_text, diagram_context);
|
||||
|
||||
|
||||
if (cell.display_label && !cell.label.isEmpty()) {
|
||||
cell_label = interpreteVariables(cell_label, diagram_context);
|
||||
cell_text = QString(tr(" %1 : %2", "titleblock content - please let the blank space at the beginning")).arg(cell_label).arg(cell_text);
|
||||
@@ -1749,7 +1758,7 @@ QStringList TitleBlockTemplate::listOfVariables()
|
||||
#pragma message("@TODO not works on all cases...")
|
||||
// TODO: not works on all cases...
|
||||
list << cells_[i][j] -> value.name().replace("%","");
|
||||
}
|
||||
}
|
||||
}
|
||||
qDebug() << list;
|
||||
return list;
|
||||
@@ -1778,25 +1787,25 @@ void TitleBlockTemplate::renderTextCell(QPainter &painter,
|
||||
if (text.isEmpty()) return;
|
||||
QFont text_font = TitleBlockTemplate::fontForCell(cell);
|
||||
painter.setFont(text_font);
|
||||
|
||||
|
||||
if (cell.hadjust) {
|
||||
QFontMetricsF font_metrics(text_font);
|
||||
QRectF font_rect = font_metrics.boundingRect(
|
||||
QRect(-10000, -10000, 10000, 10000),
|
||||
cell.alignment,
|
||||
text);
|
||||
|
||||
|
||||
if (font_rect.width() > cell_rect.width()) {
|
||||
qreal ratio = qreal(cell_rect.width())
|
||||
/ qreal(font_rect.width());
|
||||
painter.save();
|
||||
|
||||
|
||||
painter.translate(cell_rect.topLeft());
|
||||
qreal vertical_adjustment =
|
||||
cell_rect.height() * (1 - ratio) / 2.0;
|
||||
painter.translate(0.0, vertical_adjustment);
|
||||
painter.scale(ratio, ratio);
|
||||
|
||||
|
||||
QRectF new_world_cell_rect(cell_rect);
|
||||
new_world_cell_rect.moveTo(0, 0.0);
|
||||
new_world_cell_rect.setWidth(new_world_cell_rect.width()
|
||||
@@ -1804,12 +1813,12 @@ void TitleBlockTemplate::renderTextCell(QPainter &painter,
|
||||
painter.drawText(new_world_cell_rect,
|
||||
cell.alignment,
|
||||
text);
|
||||
|
||||
|
||||
painter.restore();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Still here? Let's draw the text normally
|
||||
painter.drawText(cell_rect, cell.alignment, text);
|
||||
}
|
||||
@@ -1825,14 +1834,15 @@ void TitleBlockTemplate::renderTextCell(QPainter &painter,
|
||||
@param h
|
||||
@param color
|
||||
*/
|
||||
void TitleBlockTemplate::renderTextCellDxf(QString &file_path,
|
||||
const QString &text,
|
||||
const TitleBlockCell &cell,
|
||||
qreal x,
|
||||
qreal y,
|
||||
qreal w,
|
||||
qreal h,
|
||||
int color) const
|
||||
void TitleBlockTemplate::renderTextCellDxf(
|
||||
QString &file_path,
|
||||
const QString &text,
|
||||
const TitleBlockCell &cell,
|
||||
qreal x,
|
||||
qreal y,
|
||||
qreal w,
|
||||
qreal h,
|
||||
int color) const
|
||||
{
|
||||
if (text.isEmpty()) return;
|
||||
QFont text_font = TitleBlockTemplate::fontForCell(cell);
|
||||
@@ -1841,61 +1851,73 @@ void TitleBlockTemplate::renderTextCellDxf(QString &file_path,
|
||||
textHeight = text_font.pixelSize();
|
||||
|
||||
qreal x2 = x + w;
|
||||
qreal y1 = y;
|
||||
qreal y1 = y;
|
||||
|
||||
int vAlign = 0;
|
||||
int hAlign = 0;
|
||||
|
||||
x2 = x; // default
|
||||
x2 = x; // default
|
||||
|
||||
if ( cell.alignment & Qt::AlignTop ) {
|
||||
vAlign = 3;
|
||||
y1 = y + h - (textHeight*Createdxf::yScale / 8);
|
||||
} else if ( cell.alignment & Qt::AlignVCenter ) {
|
||||
vAlign = 2;
|
||||
y1 = y + h/2;
|
||||
} else if ( cell.alignment & Qt::AlignBottom ) {
|
||||
y1 = y + (textHeight*Createdxf::yScale / 8);
|
||||
}
|
||||
if ( cell.alignment & Qt::AlignTop )
|
||||
{
|
||||
vAlign = 3;
|
||||
y1 = y + h - (textHeight*Createdxf::yScale / 8);
|
||||
}
|
||||
else if ( cell.alignment & Qt::AlignVCenter )
|
||||
{
|
||||
vAlign = 2;
|
||||
y1 = y + h/2;
|
||||
}
|
||||
else if ( cell.alignment & Qt::AlignBottom )
|
||||
{
|
||||
y1 = y + (textHeight*Createdxf::yScale / 8);
|
||||
}
|
||||
|
||||
if ( cell.alignment & Qt::AlignRight ) {
|
||||
if ( cell.alignment & Qt::AlignRight )
|
||||
{
|
||||
hAlign = 2;
|
||||
x2 = x + w;
|
||||
} else if ( cell.alignment & Qt::AlignHCenter ) {
|
||||
x2 = x + w;
|
||||
}
|
||||
else if ( cell.alignment & Qt::AlignHCenter )
|
||||
{
|
||||
hAlign = 1;
|
||||
x2 = x + w/2;
|
||||
} else if (cell.alignment & Qt::AlignJustify ) {
|
||||
}
|
||||
else if (cell.alignment & Qt::AlignJustify )
|
||||
{
|
||||
hAlign = 5;
|
||||
vAlign = 0;
|
||||
x2 = x + w;
|
||||
y1 = y + textHeight*Createdxf::yScale / 8;
|
||||
vAlign = 0;
|
||||
x2 = x + w;
|
||||
y1 = y + textHeight*Createdxf::yScale / 8;
|
||||
}
|
||||
|
||||
//painter.setFont(text_font);
|
||||
qreal ratio = 1.0;
|
||||
qreal ratio = 1.0;
|
||||
|
||||
if (cell.hadjust) {
|
||||
// Scale font width to fit string in cell width w
|
||||
// As DXF font aspect ratio is implementation dependent we add a fudge-factor based on tests with AutoCAD
|
||||
int len = text.length() * textHeight * Createdxf::xScale * 1.2;
|
||||
if (cell.hadjust)
|
||||
{
|
||||
// Scale font width to fit string in cell width w
|
||||
// As DXF font aspect ratio is implementation dependent we add a fudge-factor based on tests with AutoCAD
|
||||
int len = text.length() * textHeight * Createdxf::xScale * 1.2;
|
||||
|
||||
if(len > w)
|
||||
ratio = (w/len);
|
||||
if(len > w)
|
||||
ratio = (w/len);
|
||||
}
|
||||
|
||||
// x offset value below currently set heuristically based on appearance...
|
||||
Createdxf::drawTextAligned(file_path,
|
||||
text,
|
||||
x - 2*Createdxf::xScale,
|
||||
y1,
|
||||
textHeight*Createdxf::yScale,
|
||||
0,
|
||||
0,
|
||||
hAlign,
|
||||
vAlign,
|
||||
x2,
|
||||
ratio,
|
||||
color);
|
||||
// x offset value below currently set heuristically based on appearance...
|
||||
Createdxf::drawTextAligned(
|
||||
file_path,
|
||||
text,
|
||||
x - 2*Createdxf::xScale,
|
||||
y1,
|
||||
textHeight*Createdxf::yScale,
|
||||
0,
|
||||
0,
|
||||
hAlign,
|
||||
vAlign,
|
||||
x2,
|
||||
ratio,
|
||||
color);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1965,11 +1987,11 @@ void TitleBlockTemplate::applyCellSpans()
|
||||
*/
|
||||
bool TitleBlockTemplate::checkCellSpan(TitleBlockCell *cell) {
|
||||
if (!cell) return(false);
|
||||
|
||||
|
||||
cell -> span_state = TitleBlockCell::Enabled;
|
||||
cell -> applied_row_span = cell -> row_span;
|
||||
cell -> applied_col_span = cell -> col_span;
|
||||
|
||||
|
||||
// ensure the cell can span as far as required
|
||||
if (cell -> num_col + cell -> col_span >= columnsCount()) {
|
||||
cell -> applied_col_span = columnsCount() - 1 - cell -> num_col;
|
||||
@@ -1979,7 +2001,7 @@ bool TitleBlockTemplate::checkCellSpan(TitleBlockCell *cell) {
|
||||
cell -> applied_row_span = rowsCount() - 1 - cell -> num_row;
|
||||
cell -> span_state = TitleBlockCell::Restricted;
|
||||
}
|
||||
|
||||
|
||||
// ensure cells that will be spanned are either empty or free
|
||||
for (int i = cell -> num_col ;
|
||||
i <= cell -> num_col + cell -> applied_col_span ;
|
||||
@@ -2006,7 +2028,7 @@ bool TitleBlockTemplate::checkCellSpan(TitleBlockCell *cell) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return(true);
|
||||
}
|
||||
|
||||
@@ -2019,10 +2041,11 @@ bool TitleBlockTemplate::checkCellSpan(TitleBlockCell *cell) {
|
||||
@param cell :
|
||||
Potentially spanning cell
|
||||
*/
|
||||
void TitleBlockTemplate::applyCellSpan(TitleBlockCell *cell) {
|
||||
void TitleBlockTemplate::applyCellSpan(TitleBlockCell *cell)
|
||||
{
|
||||
if (!cell || (!cell -> row_span && !cell -> col_span)) return;
|
||||
if (cell -> span_state == TitleBlockCell::Disabled) return;
|
||||
|
||||
|
||||
// goes through every spanned cell
|
||||
for (int i = cell -> num_col ;
|
||||
i <= cell -> num_col + cell -> applied_col_span ;
|
||||
@@ -2093,7 +2116,7 @@ int TitleBlockTemplate::lengthRange(
|
||||
#endif
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
||||
int length = 0;
|
||||
for (int i = start ; i < end ; ++i) {
|
||||
length += lengths_list[i];
|
||||
|
||||
@@ -1,23 +1,25 @@
|
||||
/*
|
||||
Copyright 2006-2020 The QElectroTech Team
|
||||
This file is part of QElectroTech.
|
||||
|
||||
|
||||
QElectroTech 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 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
|
||||
QElectroTech 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 QElectroTech. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#include "diagramcontextwidget.h"
|
||||
#include "ui_diagramcontextwidget.h"
|
||||
|
||||
#include <QRegularExpression>
|
||||
|
||||
DiagramContextWidget::DiagramContextWidget(QWidget *parent) :
|
||||
QWidget(parent),
|
||||
ui(new Ui::DiagramContextWidget)
|
||||
@@ -38,7 +40,7 @@ DiagramContextWidget::~DiagramContextWidget()
|
||||
DiagramContext DiagramContextWidget::context() const
|
||||
{
|
||||
DiagramContext context;
|
||||
|
||||
|
||||
for (int i = 0 ; i < ui->m_table-> rowCount() ; ++ i)
|
||||
{
|
||||
QTableWidgetItem *qtwi_name = ui->m_table-> item(i, 0);
|
||||
@@ -46,16 +48,16 @@ DiagramContext DiagramContextWidget::context() const
|
||||
if (!qtwi_name || !qtwi_value) {
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
QString key = qtwi_name -> text();
|
||||
if (key.isEmpty()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
QString value = qtwi_value -> text();
|
||||
context.addValue(key, value);
|
||||
}
|
||||
|
||||
|
||||
return(context);
|
||||
}
|
||||
|
||||
@@ -67,7 +69,7 @@ DiagramContext DiagramContextWidget::context() const
|
||||
void DiagramContextWidget::setContext (const DiagramContext &context)
|
||||
{
|
||||
clear();
|
||||
|
||||
|
||||
int i = 0;
|
||||
for (QString key : context.keys(DiagramContext::Alphabetical))
|
||||
{
|
||||
@@ -75,7 +77,7 @@ void DiagramContextWidget::setContext (const DiagramContext &context)
|
||||
ui->m_table->setItem(i, 1, new QTableWidgetItem(context[key].toString()));
|
||||
++ i;
|
||||
}
|
||||
|
||||
|
||||
checkTableRows();
|
||||
}
|
||||
|
||||
@@ -93,7 +95,7 @@ int DiagramContextWidget::nameLessRowsCount() const
|
||||
++ name_less_rows_count;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return(name_less_rows_count);
|
||||
}
|
||||
|
||||
@@ -107,7 +109,7 @@ void DiagramContextWidget::clear()
|
||||
for (int i = 1 ; i < ui->m_table->rowCount() ; ++ i) {
|
||||
ui->m_table->removeRow(i);
|
||||
}
|
||||
|
||||
|
||||
refreshFormatLabel();
|
||||
}
|
||||
|
||||
@@ -118,10 +120,10 @@ void DiagramContextWidget::clear()
|
||||
*/
|
||||
int DiagramContextWidget::highlightNonAcceptableKeys()
|
||||
{
|
||||
static QRegExp re(DiagramContext::validKeyRegExp());
|
||||
|
||||
static QRegularExpression re(DiagramContext::validKeyRegExp());
|
||||
|
||||
QBrush fg_brush = ui->m_table->palette().brush(QPalette::WindowText);
|
||||
|
||||
|
||||
int invalid_keys = 0;
|
||||
for (int i = 0 ; i < ui->m_table->rowCount() ; ++ i)
|
||||
{
|
||||
@@ -129,11 +131,11 @@ int DiagramContextWidget::highlightNonAcceptableKeys()
|
||||
if (!qtwi_name) {
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
bool highlight = false;
|
||||
if (!qtwi_name -> text().isEmpty())
|
||||
{
|
||||
if (!re.exactMatch(qtwi_name -> text()))
|
||||
if (re!=QRegularExpression(qtwi_name -> text()))
|
||||
{
|
||||
highlight = true;
|
||||
++ invalid_keys;
|
||||
@@ -141,7 +143,7 @@ int DiagramContextWidget::highlightNonAcceptableKeys()
|
||||
}
|
||||
qtwi_name -> setForeground(highlight ? Qt::red : fg_brush);
|
||||
}
|
||||
|
||||
|
||||
return(invalid_keys);
|
||||
}
|
||||
|
||||
@@ -156,7 +158,7 @@ void DiagramContextWidget::refreshFormatLabel()
|
||||
"Les noms ne peuvent contenir que des lettres minuscules, des "
|
||||
"chiffres et des tirets."
|
||||
);
|
||||
|
||||
|
||||
if (highlightNonAcceptableKeys()) {
|
||||
format_text = QString("<span style=\"color: red;\">%1</span>").arg(format_text);
|
||||
}
|
||||
|
||||
@@ -19,6 +19,8 @@
|
||||
#define DYNAMICELEMENTTEXTMODEL_H
|
||||
|
||||
#include <QStandardItemModel>
|
||||
#include <QHash>
|
||||
|
||||
#include <qstyleditemdelegate.h>
|
||||
#include "dynamicelementtextitem.h"
|
||||
|
||||
@@ -35,7 +37,7 @@ class Element;
|
||||
class DynamicElementTextModel : public QStandardItemModel
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
|
||||
public:
|
||||
enum ValueType {
|
||||
textFrom =1,
|
||||
@@ -58,10 +60,10 @@ class DynamicElementTextModel : public QStandardItemModel
|
||||
grpHoldBottom,
|
||||
grpFrame
|
||||
};
|
||||
|
||||
|
||||
DynamicElementTextModel(Element *element, QObject *parent = nullptr);
|
||||
~DynamicElementTextModel() override;
|
||||
|
||||
|
||||
bool indexIsInGroup(const QModelIndex &index) const;
|
||||
DynamicElementTextItem *textFromIndex(const QModelIndex &index) const;
|
||||
DynamicElementTextItem *textFromItem(QStandardItem *item) const;
|
||||
@@ -72,13 +74,13 @@ class DynamicElementTextModel : public QStandardItemModel
|
||||
QUndoCommand *undoForEditedGroup(
|
||||
ElementTextItemGroup *group,
|
||||
QUndoCommand *parent_undo = nullptr) const;
|
||||
|
||||
|
||||
ElementTextItemGroup *groupFromIndex(const QModelIndex &index) const;
|
||||
ElementTextItemGroup *groupFromItem(QStandardItem *item) const;
|
||||
QModelIndex indexFromGroup(ElementTextItemGroup *group) const;
|
||||
bool indexIsText(const QModelIndex &index) const;
|
||||
bool indexIsGroup(const QModelIndex &index) const;
|
||||
|
||||
|
||||
bool canDropMimeData(
|
||||
const QMimeData *data,
|
||||
Qt::DropAction action,
|
||||
@@ -93,10 +95,10 @@ class DynamicElementTextModel : public QStandardItemModel
|
||||
const QModelIndex &parent) override;
|
||||
QMimeData *mimeData(const QModelIndexList &indexes) const override;
|
||||
QStringList mimeTypes() const override;
|
||||
|
||||
|
||||
signals:
|
||||
void dataChanged();
|
||||
|
||||
|
||||
private:
|
||||
QList<QStandardItem *> itemsForText(DynamicElementTextItem *deti);
|
||||
void addText(DynamicElementTextItem *deti);
|
||||
@@ -119,7 +121,7 @@ class DynamicElementTextModel : public QStandardItemModel
|
||||
DynamicElementTextModel::ValueType type);
|
||||
void updateDataFromGroup(ElementTextItemGroup *group,
|
||||
DynamicElementTextModel::ValueType type);
|
||||
|
||||
|
||||
private:
|
||||
QPointer<Element> m_element;
|
||||
QHash <DynamicElementTextItem *, QStandardItem *> m_texts_list;
|
||||
@@ -134,10 +136,10 @@ class DynamicElementTextModel : public QStandardItemModel
|
||||
class DynamicTextItemDelegate : public QStyledItemDelegate
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
|
||||
public:
|
||||
DynamicTextItemDelegate(QObject *parent = Q_NULLPTR);
|
||||
|
||||
|
||||
QWidget *createEditor(
|
||||
QWidget *parent,
|
||||
const QStyleOptionViewItem &option,
|
||||
@@ -146,10 +148,10 @@ class DynamicTextItemDelegate : public QStyledItemDelegate
|
||||
QWidget *editor,
|
||||
QAbstractItemModel *model,
|
||||
const QModelIndex &index) const override;
|
||||
|
||||
|
||||
protected:
|
||||
bool eventFilter(QObject *object, QEvent *event) override;
|
||||
|
||||
|
||||
private:
|
||||
QStringList availableInfo(DynamicElementTextItem *deti) const;
|
||||
};
|
||||
|
||||
@@ -18,6 +18,8 @@
|
||||
#ifndef LINKSINGLEELEMENTWIDGET_H
|
||||
#define LINKSINGLEELEMENTWIDGET_H
|
||||
|
||||
#include <QHash>
|
||||
|
||||
#include "element.h"
|
||||
#include "abstractelementpropertieseditorwidget.h"
|
||||
|
||||
@@ -73,30 +75,30 @@ class LinkSingleElementWidget : public AbstractElementPropertiesEditorWidget
|
||||
void hideButtons();
|
||||
void showButtons();
|
||||
void headerCustomContextMenuRequested(const QPoint &pos);
|
||||
|
||||
|
||||
void on_m_unlink_pb_clicked();
|
||||
void on_m_tree_widget_itemDoubleClicked(QTreeWidgetItem *item, int column);
|
||||
void on_m_tree_widget_customContextMenuRequested(const QPoint &pos);
|
||||
void on_m_show_linked_pb_clicked();
|
||||
void on_m_show_this_pb_clicked();
|
||||
|
||||
|
||||
void on_m_search_field_textEdited(const QString &arg1);
|
||||
|
||||
|
||||
private:
|
||||
Ui::LinkSingleElementWidget *ui;
|
||||
|
||||
bool m_unlink = false;
|
||||
Element::kind m_filter;
|
||||
|
||||
|
||||
QHash <QTreeWidgetItem*, Element*> m_qtwi_elmt_hash;
|
||||
QHash <QTreeWidgetItem*, QStringList> m_qtwi_strl_hash;
|
||||
|
||||
|
||||
QTreeWidgetItem *m_qtwi_at_context_menu = nullptr,
|
||||
*m_pending_qtwi = nullptr;
|
||||
|
||||
|
||||
Element *m_showed_element = nullptr,
|
||||
*m_element_to_link = nullptr;
|
||||
|
||||
|
||||
QMenu *m_context_menu;
|
||||
QAction *m_link_action,
|
||||
*m_show_qtwi,
|
||||
|
||||
@@ -20,6 +20,7 @@
|
||||
|
||||
#include <QWidget>
|
||||
#include <QHash>
|
||||
|
||||
#include "abstractelementpropertieseditorwidget.h"
|
||||
|
||||
class Element;
|
||||
|
||||
@@ -15,13 +15,16 @@
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with QElectroTech. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <QSettings>
|
||||
#include <QHash>
|
||||
|
||||
#include "multipastedialog.h"
|
||||
#include "ui_multipastedialog.h"
|
||||
#include "diagram.h"
|
||||
#include "diagramcommands.h"
|
||||
#include "element.h"
|
||||
#include "conductorautonumerotation.h"
|
||||
#include <QSettings>
|
||||
|
||||
MultiPasteDialog::MultiPasteDialog(Diagram *diagram, QWidget *parent) :
|
||||
QDialog(parent),
|
||||
@@ -29,16 +32,16 @@ MultiPasteDialog::MultiPasteDialog(Diagram *diagram, QWidget *parent) :
|
||||
m_diagram(diagram)
|
||||
{
|
||||
ui->setupUi(this);
|
||||
|
||||
|
||||
connect(ui->m_x_sb, static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged), this, &MultiPasteDialog::updatePreview);
|
||||
connect(ui->m_y_sb, static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged), this, &MultiPasteDialog::updatePreview);
|
||||
connect(ui->m_copy_count, static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged), this, &MultiPasteDialog::updatePreview);
|
||||
|
||||
|
||||
QRectF br;
|
||||
for (QGraphicsItem *item : m_diagram->selectedItems())
|
||||
br = br.united(item->mapToScene(item->boundingRect()).boundingRect());
|
||||
m_origin = br.topLeft();
|
||||
|
||||
|
||||
m_document = m_diagram->toXml(false);
|
||||
updatePreview();
|
||||
}
|
||||
@@ -56,7 +59,7 @@ MultiPasteDialog::~MultiPasteDialog()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
delete ui;
|
||||
}
|
||||
|
||||
@@ -73,20 +76,20 @@ void MultiPasteDialog::updatePreview()
|
||||
}
|
||||
m_pasted_content.clear();
|
||||
m_pasted_content_list.clear();
|
||||
|
||||
|
||||
QPointF offset(ui->m_x_sb->value(), ui->m_y_sb->value());
|
||||
QPointF pos = m_origin+offset;
|
||||
|
||||
|
||||
for(int i=0 ; i<ui->m_copy_count->value() ; i++)
|
||||
{
|
||||
{
|
||||
DiagramContent dc;
|
||||
m_diagram->fromXml(m_document, pos, false, &dc);
|
||||
|
||||
|
||||
m_pasted_content += dc;
|
||||
m_pasted_content_list << dc;
|
||||
pos += offset;
|
||||
}
|
||||
|
||||
|
||||
if(m_pasted_content.count())
|
||||
m_diagram->adjustSceneRect();
|
||||
}
|
||||
@@ -96,7 +99,7 @@ void MultiPasteDialog::on_m_button_box_accepted()
|
||||
if(m_pasted_content.count())
|
||||
{
|
||||
m_diagram->undoStack().beginMacro(tr("Multi-collage"));
|
||||
|
||||
|
||||
QSettings settings;
|
||||
bool erase_label = settings.value("diagramcommands/erase-label-on-copy", true).toBool();
|
||||
//Ensure when 'auto_num' is checked, the settings 'save_label' is to true.
|
||||
@@ -105,18 +108,18 @@ void MultiPasteDialog::on_m_button_box_accepted()
|
||||
//and so the auto_num below do nothing (there is not a formula to compare)
|
||||
if(ui->m_auto_num_cb->isChecked())
|
||||
settings.setValue("diagramcommands/erase-label-on-copy", false);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
m_diagram->clearSelection();
|
||||
m_diagram->undoStack().push(new PasteDiagramCommand(m_diagram, m_pasted_content));
|
||||
|
||||
|
||||
for(DiagramContent dc : m_pasted_content_list)
|
||||
{
|
||||
QList<Element *> pasted_elements = dc.m_elements;
|
||||
//Sort the list element by there pos (top -> bottom)
|
||||
std::sort(pasted_elements.begin(), pasted_elements.end(), [](Element *a, Element *b){return (a->pos().y() < b->pos().y());});
|
||||
|
||||
|
||||
//Auto-connection
|
||||
if(ui->m_auto_connection_cb->isChecked())
|
||||
{
|
||||
@@ -125,10 +128,10 @@ void MultiPasteDialog::on_m_button_box_accepted()
|
||||
while (!elmt->AlignedFreeTerminals().isEmpty())
|
||||
{
|
||||
QPair <Terminal *, Terminal *> pair = elmt->AlignedFreeTerminals().takeFirst();
|
||||
|
||||
|
||||
Conductor *conductor = new Conductor(pair.first, pair.second);
|
||||
m_diagram->undoStack().push(new AddItemCommand<Conductor *>(conductor, m_diagram, QPointF()));
|
||||
|
||||
|
||||
//Autonum the new conductor, the undo command associated for this, have for parent undo_object
|
||||
ConductorAutoNumerotation can (conductor, m_diagram);
|
||||
can.numerate();
|
||||
@@ -138,7 +141,7 @@ void MultiPasteDialog::on_m_button_box_accepted()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//Set up the label of element
|
||||
//Instead of use the current autonum of project,
|
||||
//we try to fetch the same formula of the pasted element, in the several autonum of the project
|
||||
@@ -152,7 +155,7 @@ void MultiPasteDialog::on_m_button_box_accepted()
|
||||
{
|
||||
QHash <QString, NumerotationContext> autonums = m_diagram->project()->elementAutoNum();
|
||||
QHashIterator<QString, NumerotationContext> hash_iterator(autonums);
|
||||
|
||||
|
||||
while(hash_iterator.hasNext())
|
||||
{
|
||||
hash_iterator.next();
|
||||
@@ -167,7 +170,7 @@ void MultiPasteDialog::on_m_button_box_accepted()
|
||||
}
|
||||
//Like elements, we compare formula of pasted conductor with the autonums available in the project.
|
||||
if(ui->m_auto_num_cond_cb->isChecked())
|
||||
{
|
||||
{
|
||||
//This list is to ensure we not numerate twice the same conductor
|
||||
QList<Conductor *> numerated;
|
||||
//Start with the element at top
|
||||
@@ -184,7 +187,7 @@ void MultiPasteDialog::on_m_button_box_accepted()
|
||||
{
|
||||
QHash <QString, NumerotationContext> autonums = m_diagram->project()->conductorAutoNum();
|
||||
QHashIterator <QString, NumerotationContext> hash_iterator(autonums);
|
||||
|
||||
|
||||
while (hash_iterator.hasNext())
|
||||
{
|
||||
hash_iterator.next();
|
||||
@@ -205,7 +208,7 @@ void MultiPasteDialog::on_m_button_box_accepted()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
m_diagram->adjustSceneRect();
|
||||
m_accept = true;
|
||||
settings.setValue("diagramcommands/erase-label-on-copy", erase_label);
|
||||
|
||||
@@ -15,11 +15,14 @@
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with QElectroTech. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <QRadioButton>
|
||||
#include <QHash>
|
||||
|
||||
#include "potentialselectordialog.h"
|
||||
#include "ui_potentialselectordialog.h"
|
||||
#include "conductor.h"
|
||||
#include "terminal.h"
|
||||
#include <QRadioButton>
|
||||
#include "QPropertyUndoCommand/qpropertyundocommand.h"
|
||||
#include "diagram.h"
|
||||
#include "element.h"
|
||||
@@ -191,14 +194,14 @@ ConductorProperties PotentialSelectorDialog::chosenProperties(QList<ConductorPro
|
||||
} else if (list.size() == 1) {
|
||||
return list.first();
|
||||
}
|
||||
|
||||
|
||||
QDialog dialog(widget);
|
||||
QVBoxLayout layout(widget);
|
||||
dialog.setLayout(&layout);
|
||||
QLabel label(tr("Veuillez choisir un potentiel électrique de la liste \n"
|
||||
"à utiliser pour le nouveau potentiel"));
|
||||
layout.addWidget(&label);
|
||||
|
||||
|
||||
QHash <QRadioButton *, ConductorProperties> H;
|
||||
for (ConductorProperties cp : list)
|
||||
{
|
||||
@@ -213,7 +216,7 @@ ConductorProperties PotentialSelectorDialog::chosenProperties(QList<ConductorPro
|
||||
text.append(tr("\nCouleur du conducteur : %1").arg(cp.m_wire_color));
|
||||
if(!cp.m_wire_section.isEmpty())
|
||||
text.append(tr("\nSection du conducteur : %1").arg(cp.m_wire_section));
|
||||
|
||||
|
||||
QRadioButton *b = new QRadioButton(text, &dialog);
|
||||
layout.addWidget(b);
|
||||
H.insert(b, cp);
|
||||
@@ -221,14 +224,14 @@ ConductorProperties PotentialSelectorDialog::chosenProperties(QList<ConductorPro
|
||||
QDialogButtonBox *button_box = new QDialogButtonBox(QDialogButtonBox::Ok, &dialog);
|
||||
layout.addWidget(button_box);
|
||||
connect(button_box, &QDialogButtonBox::accepted, &dialog, &QDialog::accept);
|
||||
|
||||
|
||||
dialog.exec();
|
||||
for (QRadioButton *b : H.keys()) {
|
||||
if(b->isChecked()) {
|
||||
return H.value(b);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return ConductorProperties();
|
||||
}
|
||||
|
||||
@@ -290,7 +293,7 @@ void PotentialSelectorDialog::buildWidget()
|
||||
QString text1(tr("%n conducteurs composent le potentiel suivant :",
|
||||
"",
|
||||
m_potential_selector->m_conductor_number_1));
|
||||
|
||||
|
||||
ConductorProperties cp1;
|
||||
if(!m_potential_selector->m_properties_list_1.isEmpty())
|
||||
cp1 = m_potential_selector->m_properties_list_1.first();;
|
||||
@@ -308,14 +311,14 @@ void PotentialSelectorDialog::buildWidget()
|
||||
if(!cp1.m_wire_section.isEmpty())
|
||||
text1.append(tr("\nSection du conducteur : %1")
|
||||
.arg(cp1.m_wire_section));
|
||||
|
||||
|
||||
QString text2(tr("%n conducteurs composent le potentiel suivant :",
|
||||
"",
|
||||
m_potential_selector->m_conductor_number_2));
|
||||
ConductorProperties cp2;
|
||||
if(!m_potential_selector->m_properties_list_2.isEmpty())
|
||||
cp2 = m_potential_selector->m_properties_list_2.first();
|
||||
|
||||
|
||||
if(!cp2.text.isEmpty())
|
||||
text2.append(tr("\nNuméro : %1").arg(cp2.text));
|
||||
if(!cp2.m_function.isEmpty())
|
||||
@@ -329,7 +332,7 @@ void PotentialSelectorDialog::buildWidget()
|
||||
if(!cp2.m_wire_section.isEmpty())
|
||||
text2.append(tr("\nSection du conducteur : %1")
|
||||
.arg(cp2.m_wire_section));
|
||||
|
||||
|
||||
QRadioButton *rb1 = new QRadioButton(text1, this);
|
||||
QRadioButton *rb2 = new QRadioButton(text2, this);
|
||||
|
||||
@@ -429,7 +432,7 @@ void PotentialSelectorDialog::on_buttonBox_accepted()
|
||||
new_value,
|
||||
undo);
|
||||
}
|
||||
|
||||
|
||||
//Check if formula of the new potential
|
||||
// have incompatible variable with folio report
|
||||
QRegularExpression rx ("%sequf_|%seqtf_|%seqhf_|%id|%F|%M|%LM");
|
||||
@@ -445,7 +448,7 @@ void PotentialSelectorDialog::on_buttonBox_accepted()
|
||||
<< "%F"
|
||||
<< "%M"
|
||||
<< "%LM";
|
||||
|
||||
|
||||
QString text(tr("La formule du nouveau potentiel contient des variables incompatibles avec les reports de folio.\n"
|
||||
"Veuillez saisir une formule compatible pour ce potentiel.\n"
|
||||
"Les variables suivantes sont incompatibles :\n"
|
||||
@@ -455,7 +458,7 @@ void PotentialSelectorDialog::on_buttonBox_accepted()
|
||||
fag.setText(text);
|
||||
fag.setFormula(cp.m_formula);
|
||||
fag.exec();
|
||||
|
||||
|
||||
QString new_formula = fag.formula();
|
||||
QSet <Conductor *> c_list = m_report->conductors().first()->relatedPotentialConductors();
|
||||
c_list.insert(m_report->conductors().first());
|
||||
@@ -471,7 +474,7 @@ void PotentialSelectorDialog::on_buttonBox_accepted()
|
||||
new_value,
|
||||
undo);
|
||||
}
|
||||
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,6 +15,9 @@
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with QElectroTech. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <QHash>
|
||||
|
||||
#include "shapegraphicsitempropertieswidget.h"
|
||||
#include "ui_shapegraphicsitempropertieswidget.h"
|
||||
#include "qetshapeitem.h"
|
||||
|
||||
@@ -15,12 +15,14 @@
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with QElectroTech. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#include "xrefpropertieswidget.h"
|
||||
|
||||
#include <utility>
|
||||
#include <QHash>
|
||||
#include <QMetaEnum>
|
||||
|
||||
#include "xrefpropertieswidget.h"
|
||||
#include "ui_xrefpropertieswidget.h"
|
||||
#include "qdebug.h"
|
||||
#include <QMetaEnum>
|
||||
|
||||
/**
|
||||
@brief XRefPropertiesWidget::XRefPropertiesWidget
|
||||
|
||||
@@ -19,6 +19,8 @@
|
||||
#define XREFPROPERTIESWIDGET_H
|
||||
|
||||
#include <QWidget>
|
||||
#include <QHash>
|
||||
|
||||
#include "properties/xrefproperties.h"
|
||||
|
||||
namespace Ui {
|
||||
|
||||
@@ -1,17 +1,17 @@
|
||||
/*
|
||||
Copyright 2006-2020 The QElectroTech Team
|
||||
This file is part of QElectroTech.
|
||||
|
||||
|
||||
QElectroTech 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 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
|
||||
QElectroTech 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 QElectroTech. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
@@ -21,6 +21,7 @@
|
||||
#include <QUndoCommand>
|
||||
#include <QPointer>
|
||||
#include <QDomElement>
|
||||
#include <QHash>
|
||||
|
||||
class Element;
|
||||
class DynamicElementTextItem;
|
||||
@@ -37,10 +38,10 @@ class AddElementTextCommand : public QUndoCommand
|
||||
DynamicElementTextItem *deti,
|
||||
QUndoCommand *parent = nullptr);
|
||||
~AddElementTextCommand() override;
|
||||
|
||||
|
||||
void undo() override;
|
||||
void redo() override;
|
||||
|
||||
|
||||
private:
|
||||
Element *m_element = nullptr;
|
||||
DynamicElementTextItem *m_text = nullptr;
|
||||
@@ -64,10 +65,10 @@ class AddTextsGroupCommand : public QUndoCommand
|
||||
QList<DynamicElementTextItem *> texts_list,
|
||||
QUndoCommand *parent = nullptr);
|
||||
~AddTextsGroupCommand() override;
|
||||
|
||||
|
||||
void undo() override;
|
||||
void redo() override;
|
||||
|
||||
|
||||
private:
|
||||
QPointer<Element> m_element;
|
||||
QPointer<ElementTextItemGroup> m_group;
|
||||
@@ -88,10 +89,10 @@ class RemoveTextsGroupCommand : public QUndoCommand
|
||||
ElementTextItemGroup *group,
|
||||
QUndoCommand *parent = nullptr);
|
||||
~RemoveTextsGroupCommand() override;
|
||||
|
||||
|
||||
void undo() override;
|
||||
void redo() override;
|
||||
|
||||
|
||||
private:
|
||||
QPointer<Element> m_element;
|
||||
QPointer<ElementTextItemGroup> m_group;
|
||||
@@ -108,10 +109,10 @@ class AddTextToGroupCommand : public QUndoCommand
|
||||
ElementTextItemGroup *group,
|
||||
QUndoCommand *parent = nullptr);
|
||||
~AddTextToGroupCommand() override;
|
||||
|
||||
|
||||
void undo() override;
|
||||
void redo() override;
|
||||
|
||||
|
||||
private:
|
||||
QPointer<DynamicElementTextItem> m_text;
|
||||
QPointer<ElementTextItemGroup> m_group;
|
||||
@@ -128,10 +129,10 @@ class RemoveTextFromGroupCommand : public QUndoCommand
|
||||
ElementTextItemGroup *group,
|
||||
QUndoCommand *parent = nullptr);
|
||||
~RemoveTextFromGroupCommand() override;
|
||||
|
||||
|
||||
void undo() override;
|
||||
void redo() override;
|
||||
|
||||
|
||||
private:
|
||||
QPointer<DynamicElementTextItem> m_text;
|
||||
QPointer<ElementTextItemGroup> m_group;
|
||||
@@ -148,12 +149,12 @@ class AlignmentTextsGroupCommand : public QUndoCommand
|
||||
Qt::Alignment new_alignment,
|
||||
QUndoCommand *parent = nullptr);
|
||||
~AlignmentTextsGroupCommand() override;
|
||||
|
||||
|
||||
int id() const override{return 6;}
|
||||
bool mergeWith(const QUndoCommand *other) override;
|
||||
void undo() override;
|
||||
void redo() override;
|
||||
|
||||
|
||||
private:
|
||||
QPointer<ElementTextItemGroup> m_group;
|
||||
Qt::Alignment m_previous_alignment,
|
||||
|
||||
@@ -1,17 +1,17 @@
|
||||
/*
|
||||
Copyright 2006-2020 The QElectroTech Team
|
||||
This file is part of QElectroTech.
|
||||
|
||||
|
||||
QElectroTech 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 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
|
||||
QElectroTech 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 QElectroTech. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
@@ -19,6 +19,8 @@
|
||||
#define DELETEQGRAPHICSITEMCOMMAND_H
|
||||
|
||||
#include <QUndoCommand>
|
||||
#include <QHash>
|
||||
|
||||
#include "diagramcontent.h"
|
||||
|
||||
class Diagram;
|
||||
@@ -32,17 +34,17 @@ class DeleteQGraphicsItemCommand : public QUndoCommand
|
||||
public:
|
||||
DeleteQGraphicsItemCommand(Diagram *diagram, const DiagramContent &content, QUndoCommand * parent = nullptr);
|
||||
~DeleteQGraphicsItemCommand() override;
|
||||
|
||||
|
||||
private:
|
||||
DeleteQGraphicsItemCommand(const DeleteQGraphicsItemCommand &);
|
||||
|
||||
|
||||
void setPotentialsOfRemovedElements();
|
||||
Terminal *terminalInSamePotential(Terminal *terminal, Conductor *conductor_to_exclude);
|
||||
|
||||
public:
|
||||
void undo() override;
|
||||
void redo() override;
|
||||
|
||||
|
||||
// attributes
|
||||
private:
|
||||
DiagramContent m_removed_contents;
|
||||
|
||||
@@ -1,17 +1,17 @@
|
||||
/*
|
||||
Copyright 2006-2020 The QElectroTech Team
|
||||
This file is part of QElectroTech.
|
||||
|
||||
|
||||
QElectroTech 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 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
|
||||
QElectroTech 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 QElectroTech. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
@@ -20,6 +20,7 @@
|
||||
|
||||
#include <QUndoCommand>
|
||||
#include <QPointer>
|
||||
#include <QHash>
|
||||
|
||||
class Diagram;
|
||||
class ConductorTextItem;
|
||||
@@ -35,16 +36,16 @@ class RotateSelectionCommand : public QUndoCommand
|
||||
RotateSelectionCommand(Diagram *diagram, qreal angle=90, QUndoCommand *parent=nullptr);
|
||||
void undo() override;
|
||||
void redo() override;
|
||||
|
||||
|
||||
bool isValid();
|
||||
|
||||
|
||||
private:
|
||||
Diagram *m_diagram =nullptr;
|
||||
|
||||
|
||||
QList<QPointer<ConductorTextItem>> m_cond_text;
|
||||
QHash<ConductorTextItem *, bool> m_rotate_by_user;
|
||||
QList<QPropertyUndoCommand*> m_undo;
|
||||
|
||||
|
||||
};
|
||||
|
||||
#endif // ROTATESELECTIONCOMMAND_H
|
||||
|
||||
@@ -20,6 +20,7 @@
|
||||
|
||||
#include <QUndoCommand>
|
||||
#include <QPointer>
|
||||
#include <QHash>
|
||||
|
||||
class ConductorTextItem;
|
||||
class Diagram;
|
||||
@@ -34,14 +35,14 @@ class RotateTextsCommand : public QUndoCommand
|
||||
{
|
||||
public:
|
||||
RotateTextsCommand(Diagram *diagram, QUndoCommand *parent=nullptr);
|
||||
|
||||
|
||||
void undo() override;
|
||||
void redo() override;
|
||||
|
||||
|
||||
private:
|
||||
void openDialog();
|
||||
void setupAnimation(QObject *target, const QByteArray &propertyName, const QVariant& start, const QVariant& end);
|
||||
|
||||
|
||||
private:
|
||||
QPointer<Diagram> m_diagram;
|
||||
QHash<ConductorTextItem *, bool> m_cond_texts;
|
||||
|
||||
Reference in New Issue
Block a user