Keep up to date the model when a dynamic text item change, for exemple after an undo command

git-svn-id: svn+ssh://svn.tuxfamily.org/svnroot/qet/qet/trunk@5030 bfdf4180-ca20-0410-9c96-a3a8aa849046
This commit is contained in:
blacksun
2017-08-24 17:35:40 +00:00
parent 99eac96475
commit 6419f84d9c
4 changed files with 59 additions and 18 deletions

View File

@@ -55,7 +55,7 @@ void DynamicElementTextItemEditor::setElement(Element *element)
DynamicElementTextModel *old_model = m_model; DynamicElementTextModel *old_model = m_model;
m_model = new DynamicElementTextModel(m_tree_view); m_model = new DynamicElementTextModel(m_tree_view);
connect(m_model, &DynamicElementTextModel::itemChanged, this, &DynamicElementTextItemEditor::dataEdited); connect(m_model, &DynamicElementTextModel::dataForTextChanged, this, &DynamicElementTextItemEditor::dataEdited);
for (DynamicElementTextItem *deti : m_element->dynamicTextItems()) for (DynamicElementTextItem *deti : m_element->dynamicTextItems())
m_model->addText(deti); m_model->addText(deti);
@@ -120,9 +120,9 @@ void DynamicElementTextItemEditor::setCurrentText(DynamicElementTextItem *text)
m_tree_view->setCurrentIndex(index); m_tree_view->setCurrentIndex(index);
} }
void DynamicElementTextItemEditor::dataEdited(QStandardItem *qsi) void DynamicElementTextItemEditor::dataEdited(DynamicElementTextItem *deti)
{ {
Q_UNUSED(qsi) Q_UNUSED(deti)
if (m_live_edit) if (m_live_edit)
apply(); apply();
} }

View File

@@ -44,7 +44,7 @@ class DynamicElementTextItemEditor : public AbstractElementPropertiesEditorWidge
void setCurrentText(DynamicElementTextItem *text); void setCurrentText(DynamicElementTextItem *text);
private: private:
void dataEdited(QStandardItem *qsi); void dataEdited(DynamicElementTextItem *deti);
private slots: private slots:
void on_m_add_text_clicked(); void on_m_add_text_clicked();

View File

@@ -35,7 +35,7 @@ QStandardItemModel(parent)
setHeaderData(0, Qt::Horizontal, tr("Propriété"), Qt::DisplayRole); setHeaderData(0, Qt::Horizontal, tr("Propriété"), Qt::DisplayRole);
setHeaderData(1, Qt::Horizontal, tr("Valeur"), Qt::DisplayRole); setHeaderData(1, Qt::Horizontal, tr("Valeur"), Qt::DisplayRole);
connect(this, &DynamicElementTextModel::itemChanged, this, &DynamicElementTextModel::dataEdited); connect(this, &DynamicElementTextModel::itemChanged, this, &DynamicElementTextModel::itemDataChanged);
} }
DynamicElementTextModel::~DynamicElementTextModel() DynamicElementTextModel::~DynamicElementTextModel()
@@ -56,7 +56,7 @@ void DynamicElementTextModel::addText(DynamicElementTextItem *deti)
return; return;
QList <QStandardItem *> qsi_list; QList <QStandardItem *> qsi_list;
QStandardItem *qsi = new QStandardItem(deti->toPlainText()); QStandardItem *qsi = new QStandardItem(deti->toPlainText());
qsi->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); qsi->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
@@ -300,7 +300,7 @@ void DynamicElementTextModel::enableSourceText(DynamicElementTextItem *deti, Dyn
{ {
if (!m_texts_list.contains(deti)) if (!m_texts_list.contains(deti))
return; return;
QStandardItem *qsi = m_texts_list.value(deti)->child(0,0); QStandardItem *qsi = m_texts_list.value(deti)->child(0,0);
bool usr = false, info = false, compo = false; bool usr = false, info = false, compo = false;
@@ -308,9 +308,9 @@ void DynamicElementTextModel::enableSourceText(DynamicElementTextItem *deti, Dyn
switch (tf) { switch (tf) {
case DynamicElementTextItem::UserText: usr = true; break; case DynamicElementTextItem::UserText: usr = true; break;
case DynamicElementTextItem::ElementInfo: info = true; break; case DynamicElementTextItem::ElementInfo: info = true; break;
case DynamicElementTextItem::CompositeText: compo = true; break; case DynamicElementTextItem::CompositeText: compo = true;break;
} }
//User text //User text
qsi->child(0,0)->setEnabled(usr); qsi->child(0,0)->setEnabled(usr);
qsi->child(0,1)->setEnabled(usr); qsi->child(0,1)->setEnabled(usr);
@@ -322,41 +322,59 @@ void DynamicElementTextModel::enableSourceText(DynamicElementTextItem *deti, Dyn
qsi->child(2,1)->setEnabled(compo); qsi->child(2,1)->setEnabled(compo);
} }
void DynamicElementTextModel::dataEdited(QStandardItem *qsi) void DynamicElementTextModel::itemDataChanged(QStandardItem *qsi)
{ {
DynamicElementTextItem *deti = textFromItem(qsi); DynamicElementTextItem *deti = textFromItem(qsi);
if (!deti) if (!deti)
return; return;
blockSignals(true); QStandardItem *text_qsi = m_texts_list.value(deti);
if (qsi->data().toInt() == textFrom) if (qsi->data().toInt() == textFrom)
{ {
QStandardItem *text_from_qsi = text_qsi->child(0,0);
QString from = qsi->data(Qt::DisplayRole).toString(); QString from = qsi->data(Qt::DisplayRole).toString();
if (from == tr("Texte utilisateur")) if (from == tr("Texte utilisateur"))
{
enableSourceText(deti, DynamicElementTextItem::UserText); enableSourceText(deti, DynamicElementTextItem::UserText);
text_qsi->setData(text_from_qsi->child(0,1)->data(Qt::DisplayRole).toString());
}
else if (from == tr("Information de l'élément")) else if (from == tr("Information de l'élément"))
{
enableSourceText(deti, DynamicElementTextItem::ElementInfo); enableSourceText(deti, DynamicElementTextItem::ElementInfo);
QString info = text_from_qsi->child(1,1)->data(Qt::UserRole+2).toString();
text_qsi->setData(deti->parentElement()->elementInformations().value(info), Qt::DisplayRole);
}
else else
{
enableSourceText(deti, DynamicElementTextItem::CompositeText); enableSourceText(deti, DynamicElementTextItem::CompositeText);
QString compo = text_from_qsi->child(2,1)->data(Qt::UserRole+2).toString();
text_qsi->setData(autonum::AssignVariables::replaceVariable(compo, deti->parentElement()->elementInformations()), Qt::DisplayRole);
}
} }
else if (qsi->data().toInt() == userText) else if (qsi->data().toInt() == userText)
{ {
QString text = qsi->data(Qt::DisplayRole).toString(); QString text = qsi->data(Qt::DisplayRole).toString();
m_texts_list.value(deti)->setData(text, Qt::DisplayRole); text_qsi->setData(text, Qt::DisplayRole);
} }
else if (qsi->data().toInt() == infoText && deti->parentElement()) else if (qsi->data().toInt() == infoText && deti->parentElement())
{ {
QString info = qsi->data(Qt::UserRole+2).toString(); QString info = qsi->data(Qt::UserRole+2).toString();
m_texts_list.value(deti)->setData(deti->parentElement()->elementInformations().value(info), Qt::DisplayRole); text_qsi->setData(deti->parentElement()->elementInformations().value(info), Qt::DisplayRole);
} }
else if (qsi->data().toInt() == compositeText && deti->parentElement()) else if (qsi->data().toInt() == compositeText && deti->parentElement())
{ {
QString compo = qsi->data(Qt::UserRole+2).toString(); QString compo = qsi->data(Qt::UserRole+2).toString();
m_texts_list.value(deti)->setData(autonum::AssignVariables::replaceVariable(compo, deti->parentElement()->elementInformations()), Qt::DisplayRole); text_qsi->setData(autonum::AssignVariables::replaceVariable(compo, deti->parentElement()->elementInformations()), Qt::DisplayRole);
} }
blockSignals(false); //We emit the signal only if @qsi is in the second column, because the data are stored on this column
//the first column is use only for display the title of the property
if(qsi->column() == 1)
emit dataForTextChanged(deti);
} }
/** /**
@@ -377,8 +395,10 @@ void DynamicElementTextModel::setConnection(DynamicElementTextItem *deti, bool s
connection_list << connect(deti, &DynamicElementTextItem::colorChanged, [deti,this](){this->updateDataFromText(deti, color);}); connection_list << connect(deti, &DynamicElementTextItem::colorChanged, [deti,this](){this->updateDataFromText(deti, color);});
connection_list << connect(deti, &DynamicElementTextItem::fontSizeChanged, [deti,this](){this->updateDataFromText(deti, size);}); connection_list << connect(deti, &DynamicElementTextItem::fontSizeChanged, [deti,this](){this->updateDataFromText(deti, size);});
connection_list << connect(deti, &DynamicElementTextItem::taggChanged, [deti,this](){this->updateDataFromText(deti, tagg);}); connection_list << connect(deti, &DynamicElementTextItem::taggChanged, [deti,this](){this->updateDataFromText(deti, tagg);});
connection_list << connect(deti, &DynamicElementTextItem::textChanged, [deti,this](){this->updateDataFromText(deti, userText);});
connection_list << connect(deti, &DynamicElementTextItem::textFromChanged, [deti,this](){this->updateDataFromText(deti, textFrom);}); connection_list << connect(deti, &DynamicElementTextItem::textFromChanged, [deti,this](){this->updateDataFromText(deti, textFrom);});
connection_list << connect(deti, &DynamicElementTextItem::textChanged, [deti,this](){this->updateDataFromText(deti, userText);});
connection_list << connect(deti, &DynamicElementTextItem::infoNameChanged, [deti,this](){this->updateDataFromText(deti, infoText);});
connection_list << connect(deti, &DynamicElementTextItem::compositeTextChanged, [deti, this]() {this->updateDataFromText(deti, compositeText);});
m_hash_text_connect.insert(deti, connection_list); m_hash_text_connect.insert(deti, connection_list);
} }
@@ -404,24 +424,42 @@ void DynamicElementTextModel::updateDataFromText(DynamicElementTextItem *deti, V
{ {
case textFrom: case textFrom:
{ {
switch (deti->textFrom()) { switch (deti->textFrom())
{
case DynamicElementTextItem::UserText: qsi->child(0,1)->setData(tr("Texte utilisateur"), Qt::DisplayRole); break; case DynamicElementTextItem::UserText: qsi->child(0,1)->setData(tr("Texte utilisateur"), Qt::DisplayRole); break;
case DynamicElementTextItem::ElementInfo : qsi->child(0,1)->setData(tr("Information de l'élément"), Qt::DisplayRole); break; case DynamicElementTextItem::ElementInfo : qsi->child(0,1)->setData(tr("Information de l'élément"), Qt::DisplayRole); break;
case DynamicElementTextItem::CompositeText : qsi->child(0,1)->setData(tr("Texte composé"), Qt::DisplayRole); break; case DynamicElementTextItem::CompositeText : qsi->child(0,1)->setData(tr("Texte composé"), Qt::DisplayRole); break;
} }
enableSourceText(deti, deti->textFrom());
qsi->setData(deti->toPlainText(), Qt::DisplayRole);
break; break;
} }
case userText: case userText:
{ {
qsi->setData(deti->toPlainText(), Qt::DisplayRole);
QStandardItem *qsia = qsi->child(0,0); QStandardItem *qsia = qsi->child(0,0);
qsia->child(0,1)->setData(deti->toPlainText(), Qt::DisplayRole); qsia->child(0,1)->setData(deti->toPlainText(), Qt::DisplayRole);
qsi->setData(deti->toPlainText(), Qt::DisplayRole); qsi->setData(deti->toPlainText(), Qt::DisplayRole);
break; break;
} }
case infoText: case infoText:
{
qsi->setData(deti->toPlainText(), Qt::DisplayRole);
QStandardItem *qsia = qsi->child(0,0);
QString info_name = deti->infoName();
qsia->child(1,1)->setData(info_name, Qt::UserRole+2);
qsia->child(1,1)->setData(QETApp::elementTranslatedInfoKey(info_name), Qt::DisplayRole);
break; break;
}
case compositeText: case compositeText:
{
qsi->setData(deti->toPlainText(), Qt::DisplayRole);
QStandardItem *qsia = qsi->child(0,0);
qsia->child(2,1)->setData(deti->compositeText(), Qt::UserRole+2);
qsia->child(2,1)->setData(deti->toPlainText(), Qt::DisplayRole);
qsi->setData(deti->toPlainText(), Qt::DisplayRole);
break; break;
}
case size: case size:
qsi->child(1,1)->setData(deti->fontSize(), Qt::EditRole); qsi->child(1,1)->setData(deti->fontSize(), Qt::EditRole);
break; break;

View File

@@ -54,10 +54,13 @@ class DynamicElementTextModel : public QStandardItemModel
DynamicElementTextItem *textFromItem(QStandardItem *item) const; DynamicElementTextItem *textFromItem(QStandardItem *item) const;
QModelIndex indexFromText(DynamicElementTextItem *text) const; QModelIndex indexFromText(DynamicElementTextItem *text) const;
QUndoCommand *undoForEditedText(DynamicElementTextItem *deti) const; QUndoCommand *undoForEditedText(DynamicElementTextItem *deti) const;
signals:
void dataForTextChanged(DynamicElementTextItem *text);
private: private:
void enableSourceText(DynamicElementTextItem *deti, DynamicElementTextItem::TextFrom tf ); void enableSourceText(DynamicElementTextItem *deti, DynamicElementTextItem::TextFrom tf );
void dataEdited(QStandardItem *qsi); void itemDataChanged(QStandardItem *qsi);
void setConnection(DynamicElementTextItem *deti, bool set); void setConnection(DynamicElementTextItem *deti, bool set);
void updateDataFromText(DynamicElementTextItem *deti, DynamicElementTextModel::ValueType type); void updateDataFromText(DynamicElementTextItem *deti, DynamicElementTextModel::ValueType type);