diff --git a/sources/diagramcontextwidget.cpp b/sources/diagramcontextwidget.cpp new file mode 100644 index 000000000..98ccf9d93 --- /dev/null +++ b/sources/diagramcontextwidget.cpp @@ -0,0 +1,173 @@ +#include "diagramcontextwidget.h" +#include +#include +#include +#include + +/** + Constructor + @param parent Parent QWidget +*/ +DiagramContextWidget::DiagramContextWidget(QWidget *parent) : + QWidget(parent) +{ + initWidgets(); + initLayout(); +} + +/** + Destructor +*/ +DiagramContextWidget::~DiagramContextWidget() { +} + +/** + @return Whether this widget is read-only. +*/ +bool DiagramContextWidget::isReadOnly() { + return(table_ -> isEnabled()); +} + +/** + @return the DiagramContext object edited by this widget. +*/ +DiagramContext DiagramContextWidget::context() const { + DiagramContext context; + for (int i = 0 ; i < table_ -> rowCount() ; ++ i) { + QTableWidgetItem *qtwi_name = table_ -> item(i, 0); + QTableWidgetItem *qtwi_value = table_ -> item(i, 1); + 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); +} + +/** + Load the content from \a context into this widget. +*/ +void DiagramContextWidget::setContext(const DiagramContext &context) { + clear(); + int i = 0; + foreach (QString key, context.keys(DiagramContext::Alphabetical)) { + table_ -> setItem(i, 0, new QTableWidgetItem(key)); + table_ -> setItem(i, 1, new QTableWidgetItem(context[key].toString())); + ++ i; + } + checkTableRows(); +} + +/** + @return The count of name-less rows in the table. +*/ +int DiagramContextWidget::nameLessRowsCount() const { + int name_less_rows_count = 0; + for (int i = 0 ; i < table_ -> rowCount() ; ++ i) { + QTableWidgetItem *qtwi_name = table_ -> item(i, 0); + if (qtwi_name && qtwi_name -> text().isEmpty()) ++ name_less_rows_count; + } + return(name_less_rows_count); +} + +/** + @param ro Whether this widget should be read-only. +*/ +void DiagramContextWidget::setReadOnly(bool ro) { + table_ -> setEnabled(!ro); +} + +/** + Clear any value entered within this widget. +*/ +void DiagramContextWidget::clear() { + table_ -> clearContents(); + for (int i = 1 ; i < table_ -> rowCount() ; ++ i) { + table_ -> removeRow(i); + } + refreshFormatLabel(); +} + + +/** + Highlight keys that would not be accepted by a DiagramContext object. + @return the number of highlighted keys. +*/ +int DiagramContextWidget::highlightNonAcceptableKeys() { + static QRegExp re(DiagramContext::validKeyRegExp()); + + QBrush fg_brush = table_ -> palette().brush(QPalette::WindowText); + + int invalid_keys = 0; + for (int i = 0 ; i < table_ -> rowCount() ; ++ i) { + QTableWidgetItem *qtwi_name = table_ -> item(i, 0); + if (!qtwi_name) continue; + bool highlight = false; + if (!qtwi_name -> text().isEmpty()) { + if (!re.exactMatch(qtwi_name -> text())) { + highlight = true; + ++ invalid_keys; + } + } + qtwi_name -> setForeground(highlight ? Qt::red : fg_brush); + } + return(invalid_keys); +} + +/** + Sets the text describing the acceptable format for keys when adding extra + key/value pairs. +*/ +void DiagramContextWidget::refreshFormatLabel() { + QString format_text = tr( + "Les noms ne peuvent contenir que des lettres minuscules, des " + "chiffres et des tirets." + ); + + if (highlightNonAcceptableKeys()) { + format_text = QString("%1").arg(format_text); + } + format_label -> setText(format_text); +} + +/** + Adds a row in the additional fields table if needed. +*/ +void DiagramContextWidget::checkTableRows() { + refreshFormatLabel(); + if (!nameLessRowsCount()) { + int new_idx = table_ -> rowCount(); + table_ -> setRowCount(new_idx + 1); + table_ -> setItem(new_idx, 0, new QTableWidgetItem("")); + table_ -> setItem(new_idx, 1, new QTableWidgetItem("")); + } +} + +/** + Initialize child widgets. +*/ +void DiagramContextWidget::initWidgets() { + format_label = new QLabel(); + format_label -> setWordWrap(true); + format_label -> setAlignment(Qt::AlignJustify); + + table_ = new QTableWidget(0, 2); + table_ -> setSelectionMode(QAbstractItemView::SingleSelection); + table_ -> setHorizontalHeaderLabels(QStringList() << tr("Nom", "table header") << tr("Valeur", "table header")); + table_ -> horizontalHeader() -> setStretchLastSection(true); + + connect(table_, SIGNAL(itemChanged(QTableWidgetItem *)), this, SLOT(checkTableRows())); +} + +/** + Initialize the layout of this widget. +*/ +void DiagramContextWidget::initLayout() { + QVBoxLayout *vlayout0 = new QVBoxLayout(); + vlayout0 -> addWidget(format_label); + vlayout0 -> addWidget(table_); + setLayout(vlayout0); +} diff --git a/sources/diagramcontextwidget.h b/sources/diagramcontextwidget.h new file mode 100644 index 000000000..dde77d1a1 --- /dev/null +++ b/sources/diagramcontextwidget.h @@ -0,0 +1,48 @@ +#ifndef DIAGRAMCONTEXTWIDGET_H +#define DIAGRAMCONTEXTWIDGET_H +#include +#include "diagramcontext.h" +class QLabel; +class QTableWidget; +/** + This class provides a table which enables end users to edit the key/value + pairs of a DiagamContext. +*/ +class DiagramContextWidget : public QWidget { + Q_OBJECT + // Constructor, destructor + public: + DiagramContextWidget(QWidget *parent = 0); + virtual ~DiagramContextWidget(); + private: + DiagramContextWidget(const DiagramContextWidget &); + + // methods + public: + bool isReadOnly(); + DiagramContext context() const; + void setContext(const DiagramContext &); + int nameLessRowsCount() const; + + signals: + + public slots: + void setReadOnly(bool); + void clear(); + int highlightNonAcceptableKeys(); + void refreshFormatLabel(); + + private slots: + void checkTableRows(); + + private: + void initWidgets(); + void initLayout(); + + // attributes + private: + QLabel *format_label; ///< label used to detail keys format + QTableWidget *table_; ///< table used to enter key/value pairs +}; + +#endif diff --git a/sources/titleblockpropertieswidget.cpp b/sources/titleblockpropertieswidget.cpp index 8f355978d..b01ea3bca 100644 --- a/sources/titleblockpropertieswidget.cpp +++ b/sources/titleblockpropertieswidget.cpp @@ -16,9 +16,9 @@ along with QElectroTech. If not, see . */ #include "titleblockpropertieswidget.h" +#include "diagramcontextwidget.h" #include "qeticons.h" #include "templatescollection.h" - /** Constructeur @param titleblock TitleBlockProperties a afficher @@ -70,17 +70,7 @@ TitleBlockProperties TitleBlockPropertiesWidget::titleBlockProperties() const { QString current_template_name = currentTitleBlockTemplateName(); if (!current_template_name.isEmpty()) prop.template_name = current_template_name; - for (int i = 0 ; i < additional_fields_table -> rowCount() ; ++ i) { - QTableWidgetItem *qtwi_name = additional_fields_table -> item(i, 0); - QTableWidgetItem *qtwi_value = additional_fields_table -> item(i, 1); - if (!qtwi_name || !qtwi_value) continue; - - QString key = qtwi_name -> text(); - if (key.isEmpty()) continue; - - QString value = qtwi_value -> text(); - prop.context.addValue(key, value); - } + prop.context = additional_fields_ -> context(); return(prop); } @@ -133,24 +123,14 @@ void TitleBlockPropertiesWidget::setTitleBlockProperties(const TitleBlockPropert Clear the custom variables list. */ void TitleBlockPropertiesWidget::clearDiagramContext() { - additional_fields_table -> clearContents(); - for (int i = 1 ; i < additional_fields_table -> rowCount() ; ++ i) { - additional_fields_table -> removeRow(i); - } + additional_fields_ -> clear(); } /** Clear the custom variables table then add the key/value pairs from \a context to it. */ void TitleBlockPropertiesWidget::setDiagramContext(const DiagramContext &context) { - clearDiagramContext(); - int i = 0; - foreach (QString key, context.keys(DiagramContext::Alphabetical)) { - additional_fields_table -> setItem(i, 0, new QTableWidgetItem(key)); - additional_fields_table -> setItem(i, 1, new QTableWidgetItem(context[key].toString())); - ++ i; - } - checkTableRows(); + additional_fields_ -> setContext(context); } /** @@ -180,7 +160,7 @@ void TitleBlockPropertiesWidget::setReadOnly(bool ro) { titleblock_current_date -> setDisabled(ro); titleblock_fixed_date -> setDisabled(ro); titleblock_template_name -> setDisabled(ro); - additional_fields_table -> setDisabled(ro); + additional_fields_ -> setDisabled(ro); } /** @@ -242,35 +222,6 @@ void TitleBlockPropertiesWidget::setCurrentTitleBlockTemplateName(const QString } } -/** - Sets the text describing the acceptable format for keys when adding extra - key/value pairs. -*/ -void TitleBlockPropertiesWidget::refreshFieldsFormatLabel() { - QString format_text = tr( - "Les noms ne peuvent contenir que des lettres minuscules, des " - "chiffres et des tirets." - ); - - if (highlightNonAcceptableKeys()) { - format_text = QString("%1").arg(format_text); - } - additional_fields_format_label -> setText(format_text); -} - -/** - Adds a row in the additional fields table if needed. -*/ -void TitleBlockPropertiesWidget::checkTableRows() { - refreshFieldsFormatLabel(); - if (!nameLessRowsCount()) { - int new_idx = additional_fields_table -> rowCount(); - additional_fields_table -> setRowCount(new_idx + 1); - additional_fields_table -> setItem(new_idx, 0, new QTableWidgetItem("")); - additional_fields_table -> setItem(new_idx, 1, new QTableWidgetItem("")); - } -} - /** Update the title block templates list. */ @@ -370,19 +321,8 @@ void TitleBlockPropertiesWidget::initWidgets(const TitleBlockProperties &titlebl ); additional_fields_label -> setWordWrap(true); additional_fields_label -> setAlignment(Qt::AlignJustify); - additional_fields_format_label = new QLabel(); - additional_fields_format_label -> setWordWrap(true); - additional_fields_format_label -> setAlignment(Qt::AlignJustify); - - additional_fields_table = new QTableWidget(0, 2); - additional_fields_table -> setSelectionMode(QAbstractItemView::SingleSelection); - additional_fields_table -> setHorizontalHeaderLabels(QStringList() << tr("Nom") << tr("Valeur")); - additional_fields_table -> horizontalHeader() -> setStretchLastSection(true); - - setDiagramContext(titleblock.context); - - refreshFieldsFormatLabel(); - connect(additional_fields_table, SIGNAL(itemChanged(QTableWidgetItem *)), this, SLOT(checkTableRows())); + additional_fields_ = new DiagramContextWidget(); + additional_fields_ -> setContext(titleblock.context); tabbar = new QTabBar(this); tabbar -> addTab(tr("Principales")); @@ -423,8 +363,7 @@ void TitleBlockPropertiesWidget::initLayouts() { QWidget *widget_user_fields = new QWidget(this); QVBoxLayout *layout_user_fields = new QVBoxLayout(widget_user_fields); layout_user_fields -> addWidget(additional_fields_label); - layout_user_fields -> addWidget(additional_fields_format_label); - layout_user_fields -> addWidget(additional_fields_table); + layout_user_fields -> addWidget(additional_fields_); layout_user_fields -> setContentsMargins(0, 0, 0, 0); // stacked layout @@ -459,40 +398,3 @@ void TitleBlockPropertiesWidget::initLayouts() { this_layout -> addWidget(titleblock_infos); setLayout(this_layout); } - -/** - @return The count of name-less rows in the additional fields table. -*/ -int TitleBlockPropertiesWidget::nameLessRowsCount() const { - int name_less_rows_count = 0; - for (int i = 0 ; i < additional_fields_table -> rowCount() ; ++ i) { - QTableWidgetItem *qtwi_name = additional_fields_table -> item(i, 0); - if (qtwi_name && qtwi_name -> text().isEmpty()) ++ name_less_rows_count; - } - return(name_less_rows_count); -} - -/** - Highlight keys that would not be accepted by a DiagramContext object. - @return the number of highlighted keys. -*/ -int TitleBlockPropertiesWidget::highlightNonAcceptableKeys() { - static QRegExp re(DiagramContext::validKeyRegExp()); - - QBrush fg_brush = additional_fields_table -> palette().brush(QPalette::WindowText); - - int invalid_keys = 0; - for (int i = 0 ; i < additional_fields_table -> rowCount() ; ++ i) { - QTableWidgetItem *qtwi_name = additional_fields_table -> item(i, 0); - if (!qtwi_name) continue; - bool highlight = false; - if (!qtwi_name -> text().isEmpty()) { - if (!re.exactMatch(qtwi_name -> text())) { - highlight = true; - ++ invalid_keys; - } - } - qtwi_name -> setForeground(highlight ? Qt::red : fg_brush); - } - return(invalid_keys); -} diff --git a/sources/titleblockpropertieswidget.h b/sources/titleblockpropertieswidget.h index d082077f1..911e26d03 100644 --- a/sources/titleblockpropertieswidget.h +++ b/sources/titleblockpropertieswidget.h @@ -19,6 +19,7 @@ #define TITLEBLOCK_PROPERTIES_WIDGET_H #include #include "titleblockproperties.h" +class DiagramContextWidget; class TitleBlockTemplatesCollection; /** Ce widget permet d'editer un objet TitleBlockProperties, c'est-a-dire les @@ -50,8 +51,6 @@ class TitleBlockPropertiesWidget : public QWidget { // slots: private slots: - void refreshFieldsFormatLabel(); - void checkTableRows(); void updateTemplateList(); void editCurrentTitleBlockTemplate(); void duplicateCurrentTitleBlockTemplate(); @@ -60,8 +59,6 @@ class TitleBlockPropertiesWidget : public QWidget { private: void initWidgets(const TitleBlockProperties &); void initLayouts(); - int nameLessRowsCount() const; - int highlightNonAcceptableKeys(); signals: void editTitleBlockTemplate(const QString &, bool); @@ -86,8 +83,7 @@ class TitleBlockPropertiesWidget : public QWidget { QRadioButton *titleblock_fixed_date; bool display_current_date; QLabel *additional_fields_label; - QLabel *additional_fields_format_label; - QTableWidget *additional_fields_table; + DiagramContextWidget *additional_fields_; QTabBar *tabbar; TitleBlockTemplatesCollection *tbt_collection_; };