From 536315ebc0b73f0bc28a1e61d2441d9ec2476cdd Mon Sep 17 00:00:00 2001 From: Kellermorph Date: Thu, 26 Mar 2026 15:21:34 +0100 Subject: [PATCH] Update masterelement.cpp for max_slaves https://qelectrotech.org/forum/viewtopic.php?id=3101 --- .../ui/elementpropertieseditorwidget.cpp | 457 ++++++++---------- 1 file changed, 212 insertions(+), 245 deletions(-) diff --git a/sources/editor/ui/elementpropertieseditorwidget.cpp b/sources/editor/ui/elementpropertieseditorwidget.cpp index 7ed277efb..aaa0966d0 100644 --- a/sources/editor/ui/elementpropertieseditorwidget.cpp +++ b/sources/editor/ui/elementpropertieseditorwidget.cpp @@ -1,277 +1,244 @@ -/* +/* Copyright 2006-2026 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 . */ -#include "elementpropertieseditorwidget.h" - -#include "../../qetapp.h" -#include "../../qetinformation.h" -#include "ui_elementpropertieseditorwidget.h" -#include "../../qetinformation.h" - -#include +#include "exportpropertieswidget.h" +#include /** - @brief The EditorDelegate class - This delegate is only use for disable the edition of the first - column of the information tree widget + @brief ExportPropertiesWidget::ExportPropertiesWidget + Constructeur + @param parent QWidget parent */ -class EditorDelegate : public QItemDelegate -{ - public: - EditorDelegate(QObject *parent) : - QItemDelegate(parent) - {} - - QWidget* createEditor(QWidget *parent, - const QStyleOptionViewItem &option, - const QModelIndex &index) const override - { - if(index.column() == 1) - { - return QItemDelegate::createEditor(parent, - option, - index); - } - return nullptr; - } -}; - -/** - * @brief ElementPropertiesEditorWidget::ElementPropertiesEditorWidget - * @param data - * @param parent - */ -ElementPropertiesEditorWidget::ElementPropertiesEditorWidget(ElementData data, QWidget *parent) : - QDialog(parent), - ui(new Ui::ElementPropertiesEditorWidget), - m_data(data) -{ - ui->setupUi(this); - setUpInterface(); - upDateInterface(); +ExportPropertiesWidget::ExportPropertiesWidget(QWidget *parent) : QWidget(parent) { + setMinimumWidth(680); + setMinimumHeight(720); + build(); + setExportProperties(ExportProperties()); } /** - @brief ElementPropertiesEditorWidget::~ElementPropertiesEditorWidget - Default destructor + @brief ExportPropertiesWidget::ExportPropertiesWidget + Constructeur + @param export_properties Parametres d'export a afficher / editer + @param parent QWidget parent */ -ElementPropertiesEditorWidget::~ElementPropertiesEditorWidget() -{ - delete ui; +ExportPropertiesWidget::ExportPropertiesWidget(const ExportProperties &export_properties, QWidget *parent) : QWidget(parent) { + build(); + setExportProperties(export_properties); } /** - @brief ElementPropertiesEditorWidget::upDateInterface - Update the interface with the current value + @brief ExportPropertiesWidget::~ExportPropertiesWidget + Destructeur */ -void ElementPropertiesEditorWidget::upDateInterface() +ExportPropertiesWidget::~ExportPropertiesWidget() { - ui->m_base_type_cb->setCurrentIndex( - ui->m_base_type_cb->findData( - m_data.m_type)); +} + +/** + @brief ExportPropertiesWidget::exportProperties + @return les parametres d'export definis via le widget +*/ +ExportProperties ExportPropertiesWidget::exportProperties() const +{ + ExportProperties export_properties; - if (m_data.m_type == ElementData::Slave) - { - ui->m_state_cb->setCurrentIndex( - ui->m_state_cb->findData( - m_data.m_slave_state)); - ui->m_type_cb->setCurrentIndex ( - ui->m_type_cb->findData( - m_data.m_slave_type)); - ui->m_number_ctc->setValue(m_data.m_contact_count); - } - else if (m_data.m_type == ElementData::Master) { - ui->m_master_type_cb->setCurrentIndex( - ui->m_master_type_cb->findData ( - m_data.m_master_type)); - } 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)); - ui->m_terminal_func_cb->setCurrentIndex( - ui->m_terminal_func_cb->findData( - m_data.m_terminal_function)); - } - - on_m_base_type_cb_currentIndexChanged(ui->m_base_type_cb->currentIndex()); -} - -/** - @brief ElementPropertiesEditorWidget::setUpInterface -*/ -void ElementPropertiesEditorWidget::setUpInterface() -{ - // Type combo box - ui->m_base_type_cb->addItem (tr("Simple"), ElementData::Simple); - ui->m_base_type_cb->addItem (tr("Maître"), ElementData::Master); - 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::Terminal); - ui->m_base_type_cb->addItem (tr("Vignette"), ElementData::Thumbnail); - - // Slave option - ui->m_state_cb->addItem(tr("Normalement ouvert"), ElementData::NO); - ui->m_state_cb->addItem(tr("Normalement fermé"), ElementData::NC); - ui->m_state_cb->addItem(tr("Inverseur"), ElementData::SW); - ui->m_state_cb->addItem(tr("Other"), ElementData::Other); - ui->m_type_cb->addItem(tr("Simple"), ElementData::SSimple); - ui->m_type_cb->addItem(tr("Puissance"), ElementData::Power); - ui->m_type_cb->addItem(tr("Temporisé travail"), ElementData::DelayOn); - ui->m_type_cb->addItem(tr("Temporisé repos"), ElementData::DelayOff); - ui->m_type_cb->addItem(tr("Temporisé travail & repos"), ElementData::delayOnOff); - - //Master option - ui->m_master_type_cb->addItem(tr("Bobine"), ElementData::Coil); - ui->m_master_type_cb->addItem(tr("Organe de protection"), ElementData::Protection); - ui->m_master_type_cb->addItem(tr("Commutateur / bouton"), ElementData::Commutator); - - //Terminal option - ui->m_terminal_type_cb->addItem(tr("Générique"), ElementData::TTGeneric); - ui->m_terminal_type_cb->addItem(tr("Fusible"), ElementData::TTFuse); - ui->m_terminal_type_cb->addItem(tr("Séctionnable"), ElementData::TTSectional); - ui->m_terminal_type_cb->addItem(tr("Diode"), ElementData::TTDiode); - ui->m_terminal_type_cb->addItem(tr("Terre"), ElementData::TTGround); - - ui->m_terminal_func_cb->addItem(tr("Générique"), ElementData::TFGeneric); - ui->m_terminal_func_cb->addItem(tr("Phase"), ElementData::TFPhase); - ui->m_terminal_func_cb->addItem(tr("Neutre"), ElementData::TFNeutral); - - //Disable the edition of the first column of the information tree - //by this little workaround - ui->m_tree->setItemDelegate(new EditorDelegate(this)); - ui->m_tree->header()->resizeSection(0, 150); - populateTree(); -} - -void ElementPropertiesEditorWidget::updateTree() -{ - auto type_ = ui->m_base_type_cb->currentData().value(); - - switch (type_) { - case ElementData::Simple: - ui->m_tree->setEnabled(true); - break; - case ElementData::Thumbnail: - ui->m_tree->setEnabled(true); - break; - case ElementData::NextReport: - ui->m_tree->setDisabled(true); - break; - case ElementData::PreviousReport: - ui->m_tree->setDisabled(true); - break; - case ElementData::Master: - ui->m_tree->setEnabled(true); - break; - case ElementData::Slave: - ui->m_tree->setDisabled(true); - break; - case ElementData::Terminal: - ui->m_tree->setEnabled(true); - break; - default: - ui->m_tree->setDisabled(true); - break; - } -} - -/** - @brief ElementPropertiesEditorWidget::populateTree - Create QTreeWidgetItem of the tree widget and populate it -*/ -void ElementPropertiesEditorWidget::populateTree() -{ - const auto keys = QETInformation::elementEditorElementInfoKeys(); - for(const QString& key : keys) - { - QTreeWidgetItem *qtwi = new QTreeWidgetItem(ui->m_tree); - qtwi->setFlags(Qt::ItemIsEnabled | Qt::ItemIsEditable); - qtwi->setData(0, Qt::DisplayRole, - QETInformation::translatedInfoKey(key)); - qtwi->setData(0, Qt::UserRole, key); - qtwi->setText(1, m_data.m_informations.value(key).toString()); - // Adjust column width - ui->m_tree->resizeColumnToContents(0); - } -} - -/** - @brief ElementPropertiesEditorWidget::on_m_buttonBox_accepted - Action on button accepted : the new information is set -*/ -void ElementPropertiesEditorWidget::on_m_buttonBox_accepted() -{ - m_data.m_type = ui->m_base_type_cb->currentData().value(); - - if (m_data.m_type == ElementData::Slave) - { - m_data.m_slave_state = ui->m_state_cb->currentData().value(); - m_data.m_slave_type = ui->m_type_cb->currentData().value(); - m_data.m_contact_count = ui->m_number_ctc->value(); - } - else if (m_data.m_type == ElementData::Master) { - m_data.m_master_type = ui->m_master_type_cb->currentData().value(); - } - else if (m_data.m_type == ElementData::Terminal) - { - m_data.m_terminal_type = ui->m_terminal_type_cb->currentData().value(); - m_data.m_terminal_function = ui->m_terminal_func_cb->currentData().value(); - } + export_properties.destination_directory = QDir(dirpath -> text()); + export_properties.format = format -> itemData(format -> currentIndex()).toString(); + export_properties.draw_grid = draw_grid -> isChecked(); + export_properties.draw_border = draw_border -> isChecked(); + export_properties.draw_titleblock = draw_titleblock -> isChecked(); + export_properties.draw_terminals = draw_terminals -> isChecked(); + export_properties.draw_bg_transparent = draw_bg_transparent -> isChecked(); + export_properties.draw_colored_conductors = draw_colored_conductors -> isChecked(); + export_properties.exported_area = export_border -> isChecked() ? QET::BorderArea : QET::ElementsArea; - for (QTreeWidgetItem *qtwi : ui->m_tree->invisibleRootItem()->takeChildren()) - { - QString txt = qtwi->text(1); - //remove line feed and carriage return - txt.remove("\r"); - txt.remove("\n"); - - m_data.m_informations.addValue(qtwi->data(0, Qt::UserRole).toString(), - txt); - } - - this->close(); + return(export_properties); } /** - @brief ElementPropertiesEditorWidget::on_m_base_type_cb_currentIndexChanged - @param index : Action when combo-box base type index change + @brief ExportPropertiesWidget::setExportProperties + @param export_properties les parametres d'export a afficher / editer via le widget */ -void ElementPropertiesEditorWidget::on_m_base_type_cb_currentIndexChanged(int index) -{ - bool slave = false , master = false, terminal = false; - - auto type_ = ui->m_base_type_cb->itemData(index).value(); - if (type_ == ElementData::Slave) - slave = true; - else if (type_ == ElementData::Master) - master = true; - else if (type_ == ElementData::Terminal) - terminal = true; - - ui->m_slave_gb->setVisible(slave); - ui->m_master_gb->setVisible(master); - ui->m_terminal_gb->setVisible(terminal); - -#if QT_VERSION >= QT_VERSION_CHECK(5,15,0) - ui->tabWidget->setTabVisible(1, - (type_ == ElementData::Simple || - type_ == ElementData::Master)); -#endif - - updateTree(); +void ExportPropertiesWidget::setExportProperties(const ExportProperties &export_properties) { + dirpath -> setText(QDir::toNativeSeparators(export_properties.destination_directory.absolutePath())); + + int index = format -> findData(export_properties.format); + if (index == -1) index = 0; + format -> setCurrentIndex(index); + + draw_grid -> setChecked(export_properties.draw_grid); + draw_border -> setChecked(export_properties.draw_border); + draw_titleblock -> setChecked(export_properties.draw_titleblock); + draw_terminals -> setChecked(export_properties.draw_terminals); + draw_bg_transparent -> setChecked(export_properties.draw_bg_transparent); + draw_colored_conductors -> setChecked(export_properties.draw_colored_conductors); + + if (export_properties.exported_area == QET::BorderArea) { + export_border -> setChecked(true); + } else { + export_elements -> setChecked(true); + } +} + +/** + @brief ExportPropertiesWidget::setPrintingMode + Puts the widget in Print or Export mode. Print mode + does not display as many options as Export mode. + / + Passe le widget en mode Impression ou en mode Export. Le mode Impression + n'affiche pas autant d'options que le mode Export. + @param mode + true to use the widget in print mode, + false to use it in export mode + / + true pour utiliser le widget en mode impression, false pour + l'utiliser en mode export +*/ +void ExportPropertiesWidget::setPrintingMode(bool mode) { + dirpath_label -> setVisible(!mode); + dirpath -> setVisible(!mode); + button_browse -> setVisible(!mode); + format_label -> setVisible(!mode); + format -> setVisible(!mode); + export_border -> setVisible(!mode); + export_elements -> setVisible(!mode); + draw_bg_transparent -> setVisible(!mode); +} + +/** + @brief ExportPropertiesWidget::slot_chooseADirectory + Slot asking the user to choose a folder + / Slot demandant a l'utilisateur de choisir un dossier +*/ +void ExportPropertiesWidget::slot_chooseADirectory() +{ + QString user_dir = QFileDialog::getExistingDirectory( + this, + tr("Exporter dans le dossier", "dialog title"), + dirpath -> text() + ); + if (!user_dir.isEmpty()) { + dirpath -> setText(QDir::toNativeSeparators(user_dir)); + } +} + +/** + @brief ExportPropertiesWidget::build + Generated the ExportPropertiesWidget ui + / Cette methode construit le widget en lui-meme +*/ +void ExportPropertiesWidget::build() +{ + // le dialogue est un empilement vertical d'elements + QVBoxLayout *vboxLayout = new QVBoxLayout(); + vboxLayout -> setContentsMargins(0, 0, 0, 0); + + /* le dialogue comprend une ligne permettant d'indiquer un chemin de dossier (hboxLayout) */ + QHBoxLayout *hboxLayout = new QHBoxLayout(); + dirpath_label = new QLabel(tr("Dossier cible :"), this); + dirpath = new QLineEdit(this); + QCompleter *completer = new QCompleter(this); + completer -> setModel(new QFileSystemModel(completer)); + dirpath -> setCompleter(completer); + button_browse = new QPushButton(tr("Parcourir"), this); + hboxLayout -> addWidget(dirpath_label); + hboxLayout -> addWidget(dirpath); + hboxLayout -> addWidget(button_browse); + hboxLayout -> addStretch(); + + vboxLayout -> addLayout(hboxLayout); + + /* une ligne permettant de choisir le format (hboxLayout1) */ + QHBoxLayout *hboxLayout1 = new QHBoxLayout(); + format_label = new QLabel(tr("Format :"), this); + hboxLayout1 -> addWidget(format_label); + hboxLayout1 -> addWidget(format = new QComboBox(this)); + format -> addItem(tr("PNG (*.png)"), "PNG"); + format -> addItem(tr("JPEG (*.jpg)"), "JPG"); + format -> addItem(tr("Bitmap (*.bmp)"), "BMP"); + format -> addItem(tr("SVG (*.svg)"), "SVG"); + format -> addItem(tr("DXF (*.dxf)"), "DXF"); + hboxLayout1 -> addStretch(); + + vboxLayout -> addLayout(hboxLayout1); + + /* un cadre permettant de specifier les options de l'image finale */ + QGroupBox *groupbox_options = new QGroupBox(tr("Options de rendu", "groupbox title")); + QGridLayout *optionshlayout = new QGridLayout(groupbox_options); + + // Choix de la zone du schema a exporter + exported_content_choices = new QButtonGroup(groupbox_options); + export_border = new QRadioButton(tr("Exporter entièrement le folio"), groupbox_options); + optionshlayout -> addWidget(export_border, 0, 0); + exported_content_choices -> addButton(export_border); + export_elements = new QRadioButton(tr("Exporter seulement les éléments"), groupbox_options); + optionshlayout -> addWidget(export_elements, 0, 1); + exported_content_choices -> addButton(export_elements); + + // dessiner la grille + draw_grid = new QCheckBox(tr("Dessiner la grille"), groupbox_options); + optionshlayout -> addWidget(draw_grid, 1, 1); + + // dessiner le cadre + draw_border = new QCheckBox(tr("Dessiner le cadre"), groupbox_options); + optionshlayout -> addWidget(draw_border, 1, 0); + + // dessiner le cartouche + draw_titleblock = new QCheckBox(tr("Dessiner le cartouche"), groupbox_options); + optionshlayout -> addWidget(draw_titleblock, 2, 0); + + // dessiner les bornes + draw_terminals = new QCheckBox(tr("Dessiner les bornes"), groupbox_options); + optionshlayout -> addWidget(draw_terminals, 2, 1); + + // conserver les couleurs des conducteurs + draw_colored_conductors = new QCheckBox(tr("Conserver les couleurs des conducteurs"), groupbox_options); + optionshlayout -> addWidget(draw_colored_conductors, 3, 0); + + // use transparent background for SVG-Export + draw_bg_transparent = new QCheckBox(tr("SVG: fond transparent"), groupbox_options); + optionshlayout -> addWidget(draw_bg_transparent, 3, 1); + + vboxLayout -> addWidget(groupbox_options); + + setLayout(vboxLayout); + + // ordre des input selectionnes avec la touche tab + setTabOrder(dirpath, button_browse); + setTabOrder(button_browse, format); + setTabOrder(format, export_border); + setTabOrder(export_border, draw_border); + setTabOrder(draw_border, draw_grid); + setTabOrder(draw_grid, draw_titleblock); + setTabOrder(draw_titleblock, draw_terminals); + setTabOrder(draw_terminals, draw_colored_conductors); + setTabOrder(draw_colored_conductors, draw_bg_transparent); + + // connexion du bouton permettant le choix du repertoire + connect(button_browse, SIGNAL(released()), this, SLOT(slot_chooseADirectory())); + + // emission de signaux lors du changement de format et lors du changement de zone exportee + connect(format, SIGNAL(currentIndexChanged(int)), this, SIGNAL(formatChanged())); + connect(exported_content_choices, SIGNAL(buttonClicked(QAbstractButton *)), this, SIGNAL(exportedAreaChanged())); + connect(draw_grid, SIGNAL(stateChanged(int)), this, SIGNAL(optionChanged())); + connect(draw_border, SIGNAL(stateChanged(int)), this, SIGNAL(optionChanged())); + connect(draw_titleblock, SIGNAL(stateChanged(int)), this, SIGNAL(optionChanged())); + connect(draw_terminals, SIGNAL(stateChanged(int)), this, SIGNAL(optionChanged())); + connect(draw_bg_transparent, SIGNAL(stateChanged(int)), this, SIGNAL(optionChanged())); + connect(draw_colored_conductors, SIGNAL(stateChanged(int)), this, SIGNAL(optionChanged())); }