Merge pull request #361 from plc-user/master

element-editor: add mirror and flip for "text"
This commit is contained in:
Laurent Trinques
2025-02-18 06:27:14 +01:00
committed by GitHub
16 changed files with 68 additions and 34 deletions

View File

@@ -250,7 +250,7 @@ bool TerminalStrip::addTerminal(Element *terminal)
}
}
if (terminal->elementData().m_type != ElementData::Terminale) {
if (terminal->elementData().m_type != ElementData::Terminal) {
return false;
}

View File

@@ -458,8 +458,8 @@ void projectDataBase::populateElementTable()
for (auto diagram : m_project->diagrams())
{
const ElementProvider ep(diagram);
const auto elmt_vector = ep.find(ElementData::Simple | ElementData::Terminale | ElementData::Master | ElementData::Thumbnail);
//Insert all value into the database
const auto elmt_vector = ep.find(ElementData::Simple | ElementData::Terminal | ElementData::Master | ElementData::Thumbnail);
//Insert all values into the database
for (const auto &elmt : elmt_vector)
{
const auto elmt_data = elmt->elementData();
@@ -487,9 +487,9 @@ void projectDataBase::populateElementInfoTable()
for (const auto &diagram : m_project->diagrams())
{
const ElementProvider ep(diagram);
const auto elmt_vector = ep.find(ElementData::Simple | ElementData::Terminale | ElementData::Master | ElementData::Thumbnail);
const auto elmt_vector = ep.find(ElementData::Simple | ElementData::Terminal | ElementData::Master | ElementData::Thumbnail);
//Insert all value into the database
//Insert all values into the database
for (const auto &elmt : elmt_vector)
{
m_insert_element_info_query.bindValue(QStringLiteral(":uuid"), elmt->uuid().toString());

View File

@@ -171,7 +171,7 @@ void ElementQueryWidget::setQuery(const QString &query)
if (ui->m_simple_cb->isChecked()) {
++c;
}
ui->m_terminal_cb->setChecked (str_type.contains(ElementData::typeToString(ElementData::Terminale)) ? true : false);
ui->m_terminal_cb->setChecked (str_type.contains(ElementData::typeToString(ElementData::Terminal)) ? true : false);
if (ui->m_terminal_cb->isChecked()) {
++c;
}
@@ -340,7 +340,7 @@ QString ElementQueryWidget::queryStr() const
bool b = false;
if (ui->m_terminal_cb->isChecked()) {
if (b) where +=" OR";
where += QStringLiteral(" element_type = '") += ElementData::typeToString(ElementData::Terminale) += "'";
where += QStringLiteral(" element_type = '") += ElementData::typeToString(ElementData::Terminal) += "'";
b = true;
}
if (ui->m_thumbnail_cb->isChecked()) {

View File

@@ -220,7 +220,7 @@ bool DiagramEventAddElement::buildElement()
/**
@brief DiagramEventAddElement::addElement
Add an element at the current pos en current rotation,
Add an element at the current pos and current rotation,
if project autoconductor option is enable, and the element can be wired, we do it.
*/
void DiagramEventAddElement::addElement()

View File

@@ -686,7 +686,7 @@ void MirrorElementsCommand::redo()
foreach (auto *item, m_items) {
if (item->type() == PartText::Type) {
PartText* staticText = qgraphicsitem_cast<PartText*>(item);
//staticText->mirror();
staticText->mirror();
} else if (item->type() == PartDynamicTextField::Type) {
PartDynamicTextField* dyntext = qgraphicsitem_cast<PartDynamicTextField*>(item);
dyntext->mirror();
@@ -734,7 +734,7 @@ void FlipElementsCommand::redo()
foreach (auto *item, m_items) {
if (item->type() == PartText::Type) {
PartText* staticText = qgraphicsitem_cast<PartText*>(item);
//staticText->flip();
staticText->flip();
} else if (item->type() == PartDynamicTextField::Type) {
PartDynamicTextField* dyntext = qgraphicsitem_cast<PartDynamicTextField*>(item);
dyntext->flip();

View File

@@ -463,15 +463,14 @@ const QDomDocument ElementScene::toXml(bool all_parts)
auto type_ = m_element_data.m_type;
if (type_ == ElementData::Slave ||
type_ == ElementData::Master ||
type_ == ElementData::Terminale ||
type_ == ElementData::Thumbnail)
type_ == ElementData::Terminal)
{
root.appendChild(m_element_data.kindInfoToXml(xml_document));
}
if (type_ == ElementData::Simple ||
type_ == ElementData::Master ||
type_ == ElementData::Terminale ||
type_ == ElementData::Terminal ||
type_ == ElementData::Thumbnail)
{
QDomElement element_info = xml_document.createElement("elementInformations");

View File

@@ -216,7 +216,7 @@ void PartDynamicTextField::fromXml(const QDomElement &dom_elmt) {
setFont(font_);
}
else if (dom_elmt.hasAttribute("font_size")) {
// plc-user: for convenience - to support font-size from old 'input' ?")
// to support font-size from old 'input'
setFont(QETApp::dynamicTextsItemFont(dom_elmt.attribute("font_size", QString::number(9)).toInt()));
}
else {

View File

@@ -72,6 +72,39 @@ void PartText::setRotation(qreal angle) {
setPos(QTransform().rotate(angle).map(pos()));
}
void PartText::mirror() {
// at first: rotate the text:
QGraphicsObject::setRotation(QET::correctAngle((360-rotation()), true));
// then see, where we need to re-position depending on text, font ...
QFontMetrics qfm(font());
qreal textwidth = qfm.horizontalAdvance(toPlainText());
// ... and angle!!!
qreal rot = qRound(QET::correctAngle(rotation(), true));
qreal c = qCos(qDegreesToRadians(rot));
qreal s = qSin(qDegreesToRadians(rot));
// Now: Move!
qreal x = (-1) * pos().x() - c * (textwidth);
qreal y = pos().y() - s * (textwidth);
setPos(x, y);
}
void PartText::flip() {
// at first: rotate the text:
QGraphicsObject::setRotation(QET::correctAngle((360-rotation()), true));
// then see, where we need to re-position depending on text, font ...
QFontMetrics qfm(font());
qreal textheight = realSize() - qfm.descent();
// ... and angle!!!
qreal rot = qRound(QET::correctAngle(rotation(), true));
qreal c = qCos(qDegreesToRadians(rot));
qreal s = qSin(qDegreesToRadians(rot));
// Now: Move!
qreal x = pos().x() - s * (textheight);
qreal y = (-1) * pos().y() + c * (textheight);
setPos(x, y);
}
/**
Importe les proprietes d'un texte statique depuis un element XML
@param xml_element Element XML a lire

View File

@@ -62,6 +62,8 @@ class PartText : public QGraphicsTextItem, public CustomElementPart {
void fromXml(const QDomElement &) override;
const QDomElement toXml(QDomDocument &) const override;
void setRotation(qreal angle);
void mirror();
void flip();
bool isUseless() const override;
QRectF sceneGeometricRect() const override;
void startUserTransformation(const QRectF &) override;

View File

@@ -98,7 +98,7 @@ void ElementPropertiesEditorWidget::upDateInterface()
ui->m_master_type_cb->setCurrentIndex(
ui->m_master_type_cb->findData (
m_data.m_master_type));
} else if (m_data.m_type == ElementData::Terminale) {
} else if (m_data.m_type == ElementData::Terminal) {
ui->m_terminal_type_cb->setCurrentIndex(
ui->m_terminal_type_cb->findData(
m_data.m_terminal_type));
@@ -121,7 +121,7 @@ void ElementPropertiesEditorWidget::setUpInterface()
ui->m_base_type_cb->addItem (tr("Esclave"), ElementData::Slave);
ui->m_base_type_cb->addItem (tr("Renvoi de folio suivant"), ElementData::NextReport);
ui->m_base_type_cb->addItem (tr("Renvoi de folio précédent"), ElementData::PreviousReport);
ui->m_base_type_cb->addItem (tr("Bornier"), ElementData::Terminale);
ui->m_base_type_cb->addItem (tr("Bornier"), ElementData::Terminal);
ui->m_base_type_cb->addItem (tr("Vignette"), ElementData::Thumbnail);
// Slave option
@@ -181,7 +181,7 @@ void ElementPropertiesEditorWidget::updateTree()
case ElementData::Slave:
ui->m_tree->setDisabled(true);
break;
case ElementData::Terminale:
case ElementData::Terminal:
ui->m_tree->setEnabled(true);
break;
default:
@@ -227,7 +227,7 @@ void ElementPropertiesEditorWidget::on_m_buttonBox_accepted()
else if (m_data.m_type == ElementData::Master) {
m_data.m_master_type = ui->m_master_type_cb->currentData().value<ElementData::MasterType>();
}
else if (m_data.m_type == ElementData::Terminale)
else if (m_data.m_type == ElementData::Terminal)
{
m_data.m_terminal_type = ui->m_terminal_type_cb->currentData().value<ElementData::TerminalType>();
m_data.m_terminal_function = ui->m_terminal_func_cb->currentData().value<ElementData::TerminalFunction>();
@@ -260,7 +260,7 @@ void ElementPropertiesEditorWidget::on_m_base_type_cb_currentIndexChanged(int in
slave = true;
else if (type_ == ElementData::Master)
master = true;
else if (type_ == ElementData::Terminale)
else if (type_ == ElementData::Terminal)
terminal = true;
ui->m_slave_gb->setVisible(slave);

View File

@@ -204,7 +204,7 @@ QVector<TerminalElement *> ElementProvider::freeTerminal() const
for (const auto element : elmt_list)
{
if (element->elementData().m_type == ElementData::Terminale)
if (element->elementData().m_type == ElementData::Terminal)
{
const auto te{static_cast<TerminalElement *>(element)};
if (!te->parentTerminalStrip()) {

View File

@@ -102,7 +102,7 @@ QDomElement ElementData::kindInfoToXml(QDomDocument &document)
returned_elmt.appendChild(xml_count);
}
else if (m_type == ElementData::Terminale)
else if (m_type == ElementData::Terminal)
{
//type
auto xml_type = document.createElement(QStringLiteral("kindInformation"));
@@ -233,7 +233,7 @@ bool ElementData::operator==(const ElementData &data) const
return false;
}
}
else if (data.m_type == ElementData::Terminale) {
else if (data.m_type == ElementData::Terminal) {
//Check terminal type or overrided terminal type
if (data.m_terminal_type_is_override != m_terminal_type_is_override) {
return false;
@@ -309,7 +309,7 @@ QString ElementData::typeToString(ElementData::Type type)
return QStringLiteral("master");
case ElementData::Slave :
return QStringLiteral("slave");
case ElementData::Terminale :
case ElementData::Terminal :
return QStringLiteral("terminal");
case ElementData::Thumbnail:
return QStringLiteral("thumbnail");
@@ -333,7 +333,7 @@ ElementData::Type ElementData::typeFromString(const QString &string)
} else if (string == QLatin1String("slave")) {
return ElementData::Slave;
} else if (string == QLatin1String("terminal")) {
return ElementData::Terminale;
return ElementData::Terminal;
} else if (string == QLatin1String("thumbnail")) {
return ElementData::Thumbnail;
}
@@ -548,7 +548,7 @@ void ElementData::kindInfoFromXml(const QDomElement &xml_element)
{
if (m_type == ElementData::Master ||
m_type == ElementData::Slave ||
m_type == ElementData::Terminale)
m_type == ElementData::Terminal)
{
auto xml_kind = xml_element.firstChildElement(QStringLiteral("kindInformations"));
for (const auto &dom_elmt : QETXML::findInDomElement(xml_kind, QStringLiteral("kindInformation")))
@@ -571,7 +571,7 @@ void ElementData::kindInfoFromXml(const QDomElement &xml_element)
m_contact_count = dom_elmt.text().toInt();
}
}
else if (m_type == ElementData::Terminale) {
else if (m_type == ElementData::Terminal) {
if (name == QLatin1String("type")) {
m_terminal_type = terminalTypeFromString(dom_elmt.text());
} else if (name == QLatin1String("function")) {

View File

@@ -40,7 +40,7 @@ class ElementData : public PropertiesInterface
AllReport = 6,
Master = 8,
Slave = 16,
Terminale = 32,
Terminal = 32,
Thumbnail = 64};
Q_ENUM(Type)
Q_DECLARE_FLAGS(Types, Type)

View File

@@ -590,7 +590,7 @@ void QETDiagramEditor::setUpActions()
m_rotate_texts = m_selection_actions_group.addAction( QET::Icons::ObjectRotateRight, tr("Orienter les textes") );
m_find_element = m_selection_actions_group.addAction( QET::Icons::ZoomDraw, tr("Retrouver dans le panel") );
m_edit_selection = m_selection_actions_group.addAction( QET::Icons::ElementEdit, tr("Éditer l'item sélectionné") );
m_group_selected_texts = m_selection_actions_group.addAction(QET::Icons::textGroup, tr("Grouper les textes sélectionnés"));
m_group_selected_texts = m_selection_actions_group.addAction( QET::Icons::textGroup, tr("Grouper les textes sélectionnés"));
m_delete_selection->setShortcut(Qt::Key_Delete);
m_rotate_selection->setShortcut(Qt::Key_Space);

View File

@@ -632,8 +632,8 @@ DynamicElementTextItem *Element::parseDynamicText(
const QDomElement &dom_element)
{
DynamicElementTextItem *deti = new DynamicElementTextItem(this);
//Because the xml description of a .elmt file is the same as how a dynamic text field is save to xml in a .qet file
//wa call fromXml, we just change the tagg name (.elmt = dynamic_text, .qet = dynamic_elmt_text)
//Because the xml description of a .elmt file is the same as how a dynamic text field is saved to xml in a .qet file
//we call fromXml, we just change the tagg name (.elmt = dynamic_text, .qet = dynamic_elmt_text)
//and the uuid (because the uuid, is the uuid of the description and not the uuid of instantiated dynamic text field)
QDomElement dom(dom_element.cloneNode(true).toElement());
@@ -845,7 +845,7 @@ bool Element::fromXml(QDomElement &e,
QStringLiteral("elementInformation"));
//Load override properties (For now, only used when the element is a terminal)
if (m_data.m_type == ElementData::Terminale)
if (m_data.m_type == ElementData::Terminal)
{
auto elmt_type_list = QETXML::subChild(e, QStringLiteral("properties"), QStringLiteral("element_type"));
@@ -976,7 +976,7 @@ QDomElement Element::toXml(
}
//Save override properties (For now, only used when the element is a terminal)
if (m_data.m_type == ElementData::Terminale)
if (m_data.m_type == ElementData::Terminal)
{
QDomElement properties = document.createElement(QStringLiteral("properties"));
QDomElement element_type = document.createElement(QStringLiteral("element_type"));

View File

@@ -179,7 +179,7 @@ void ElementInfoWidget::disableLiveEdit()
void ElementInfoWidget::buildInterface()
{
QStringList keys;
if (m_element.data()->elementData().m_type == ElementData::Terminale) {
if (m_element.data()->elementData().m_type == ElementData::Terminal) {
keys = QETInformation::terminalElementInfoKeys();
} else {
keys = QETInformation::elementInfoKeys();