From 9828f2be76d6e2bb2a8f481b2daf0868be3fcbb8 Mon Sep 17 00:00:00 2001 From: blacksun Date: Fri, 1 Dec 2017 18:36:57 +0000 Subject: [PATCH] Dynamic element text editor : improve the gui git-svn-id: svn+ssh://svn.tuxfamily.org/svnroot/qet/qet/trunk@5129 bfdf4180-ca20-0410-9c96-a3a8aa849046 --- sources/ui/dynamicelementtextitemeditor.cpp | 216 ++------------ sources/ui/dynamicelementtextitemeditor.h | 21 +- sources/ui/dynamicelementtextitemeditor.ui | 18 +- sources/ui/dynamicelementtextmodel.cpp | 276 +++++++++++++++++- sources/ui/dynamicelementtextmodel.h | 7 + sources/undocommand/addelementtextcommand.cpp | 22 ++ sources/undocommand/addelementtextcommand.h | 1 + 7 files changed, 344 insertions(+), 217 deletions(-) diff --git a/sources/ui/dynamicelementtextitemeditor.cpp b/sources/ui/dynamicelementtextitemeditor.cpp index b669d110b..973d4e301 100644 --- a/sources/ui/dynamicelementtextitemeditor.cpp +++ b/sources/ui/dynamicelementtextitemeditor.cpp @@ -42,9 +42,11 @@ DynamicElementTextItemEditor::DynamicElementTextItemEditor(Element *element, QWi m_tree_view->setAlternatingRowColors(true); m_tree_view->setEditTriggers(QAbstractItemView::CurrentChanged); m_tree_view->installEventFilter(this); + m_tree_view->setDragDropMode(QAbstractItemView::InternalMove); ui->verticalLayout->addWidget(m_tree_view); - setUpAction(); + connect(m_tree_view, &QTreeView::clicked, this, &DynamicElementTextItemEditor::treeViewClicked); + ui->m_remove_selection->setDisabled(true); setElement(element); } @@ -135,6 +137,7 @@ void DynamicElementTextItemEditor::setCurrentText(DynamicElementTextItem *text) m_tree_view->expand(index); m_tree_view->expand(index.child(0,0)); m_tree_view->setCurrentIndex(index); + ui->m_remove_selection->setEnabled(true); } /** @@ -150,6 +153,7 @@ void DynamicElementTextItemEditor::setCurrentGroup(ElementTextItemGroup *group) m_tree_view->expand(index); m_tree_view->setCurrentIndex(index); + ui->m_remove_selection->setEnabled(true); } QUndoCommand *DynamicElementTextItemEditor::associatedUndo() const @@ -168,164 +172,6 @@ QUndoCommand *DynamicElementTextItemEditor::associatedUndo() const return nullptr; } -/** - * @brief DynamicElementTextItemEditor::eventFilter - * Reimplemented for intercept the context menu event of the tree view - * @param watched - * @param event - * @return - */ -bool DynamicElementTextItemEditor::eventFilter(QObject *watched, QEvent *event) -{ - if(watched == m_tree_view && event->type() == QEvent::ContextMenu) - { - QContextMenuEvent *qcme = static_cast(event); - QModelIndex index = m_tree_view->currentIndex(); - - if(index.isValid()) - { - for(QAction *action : m_actions_list) - m_context_menu->removeAction(action); - m_add_to_group->menu()->clear(); - - //Pop up a context menu for a group or a text in a group - if(m_model->indexIsInGroup(index)) - { - QStandardItem *item = m_model->itemFromIndex(index); - if(item) - { - if(m_model->textFromItem(item)) //User click on a text or a child item of a text - { - m_context_menu->addAction(m_remove_text_from_group); - m_context_menu->addAction(m_remove_current_text); - } - else//User click on a group item - m_context_menu->addAction(m_remove_current_group); - } - } - else //Popup a context menu for a text not owned by a group - { - if(m_element.data()->textGroups().isEmpty()) - m_context_menu->addAction(m_new_group); - else - { - m_context_menu->addAction(m_add_to_group); - m_context_menu->addAction(m_new_group); - m_context_menu->addAction(m_remove_current_text); - - for(ElementTextItemGroup *grp : m_element.data()->textGroups()) - { - QAction *action = m_add_to_group->menu()->addAction(grp->name()); - connect(action, &QAction::triggered, m_signal_mapper, static_cast(&QSignalMapper::map)); - m_signal_mapper->setMapping(action, grp->name()); - } - } - } - - m_context_menu->popup(qcme->globalPos()); - return true; - } - } - return AbstractElementPropertiesEditorWidget::eventFilter(watched, event); -} - -void DynamicElementTextItemEditor::setUpAction() -{ - m_context_menu = new QMenu(this); - - //Action add text to a group - m_add_to_group = new QAction(tr("Ajouter au groupe"), m_context_menu); - m_add_to_group->setMenu(new QMenu(m_context_menu)); - - m_signal_mapper = new QSignalMapper(this); - connect(m_signal_mapper, static_cast(&QSignalMapper::mapped), this, &DynamicElementTextItemEditor::addCurrentTextToGroup); - - //Action remove text from a group - m_remove_text_from_group = new QAction(tr("Supprimer le texte de ce groupe"), m_context_menu); - connect(m_remove_text_from_group, &QAction::triggered, [this]() - { - QAbstractItemModel *m = this->m_tree_view->model(); - if(m == nullptr) - return; - - DynamicElementTextModel *model = static_cast(m); - if(model->indexIsInGroup(m_tree_view->currentIndex())) - { - DynamicElementTextItem *deti = m_model->textFromIndex(m_tree_view->currentIndex()); - if(deti && deti->parentGroup()) - m_element.data()->removeTextFromGroup(deti, deti->parentGroup()); - } - }); - - //Action create new group and the connection for open a dialog to edit the name - //of the new group - m_new_group = new QAction(tr("Nouveau groupe"), m_context_menu); - connect(m_new_group, &QAction::triggered, [this]() - { - QAbstractItemModel *m = this->m_tree_view->model(); - if(m == nullptr) - return; - - DynamicElementTextModel *model = static_cast(m); - if(model->indexIsInGroup(m_tree_view->currentIndex())) - return; - - DynamicElementTextItem *deti = model->textFromIndex(m_tree_view->currentIndex()); - if(deti) - { - Element *element = deti->parentElement(); - QString name = QInputDialog::getText(this, tr("Nom du groupe"), tr("Entrer le nom du nouveau groupe")); - - if(name.isEmpty()) - return; - else - element->addTextGroup(name); - } - }); - - //Action remove the selected text - m_remove_current_text = new QAction(tr("Supprimer le texte"), m_context_menu); - connect(m_remove_current_text, &QAction::triggered, [this]() - { - QAbstractItemModel *m = this->m_tree_view->model(); - if(m == nullptr) - return; - - DynamicElementTextModel *model = static_cast(m); - if(DynamicElementTextItem *deti = model->textFromIndex(m_tree_view->currentIndex())) - { - if(m_element.data()->diagram() && m_element.data()->diagram()->project()) - { - QUndoStack *us =m_element.data()->diagram()->project()->undoStack(); - DiagramContent dc; - dc.m_element_texts << deti; - us->push((new DeleteQGraphicsItemCommand(m_element.data()->diagram(), dc))); - } - } - }); - - //Action remove the selected group - m_remove_current_group = new QAction(tr("Supprimer le groupe"), m_context_menu); - connect(m_remove_current_group, &QAction::triggered, [this]() - { - QAbstractItemModel *m = this->m_tree_view->model(); - if(m == nullptr) - return; - - DynamicElementTextModel *model = static_cast(m); - QModelIndex index = m_tree_view->currentIndex(); - if(model->indexIsInGroup(index) && !model->textFromIndex(index)) //Item is in group and is not a text, so item is the group - m_element.data()->removeTextGroup(model->groupFromIndex(index)); - }); - - m_actions_list << m_add_to_group \ - << m_remove_text_from_group \ - << m_new_group \ - << m_remove_current_text \ - << m_remove_current_group; - -} - void DynamicElementTextItemEditor::dataEdited(DynamicElementTextItem *deti) { Q_UNUSED(deti) @@ -333,28 +179,12 @@ void DynamicElementTextItemEditor::dataEdited(DynamicElementTextItem *deti) apply(); } -/** - * @brief DynamicElementTextItemEditor::addCurrentTextToGroup - * Add the current selected text to the group named @name - * @param name - */ -void DynamicElementTextItemEditor::addCurrentTextToGroup(QString name) +void DynamicElementTextItemEditor::treeViewClicked(const QModelIndex &index) { - QModelIndex index = m_tree_view->currentIndex(); - DynamicElementTextModel *model = static_cast(m_tree_view->model()); - - DynamicElementTextItem *deti = model->textFromIndex(index); - ElementTextItemGroup *group = m_element.data()->textGroup(name); - - if(deti && group) - { - if(deti->isSelected()) - { - deti->setSelected(false); - group->setSelected(true); - } - m_element.data()->addTextToGroup(deti, group); - } + if(m_model->indexIsText(index) || m_model->indexIsGroup(index)) + ui->m_remove_selection->setEnabled(true); + else + ui->m_remove_selection->setDisabled(true); } /** @@ -379,10 +209,10 @@ void DynamicElementTextItemEditor::on_m_add_text_clicked() } /** - * @brief DynamicElementTextItemEditor::on_m_remove_text_clicked - * Remove the selected text field + * @brief DynamicElementTextItemEditor::on_m_remove_selection_clicked + * Remove the selected item */ -void DynamicElementTextItemEditor::on_m_remove_text_clicked() +void DynamicElementTextItemEditor::on_m_remove_selection_clicked() { DynamicElementTextItem *deti = m_model->textFromIndex(m_tree_view->currentIndex()); if(deti) @@ -396,8 +226,20 @@ void DynamicElementTextItemEditor::on_m_remove_text_clicked() return; } ElementTextItemGroup *group = m_model->groupFromIndex(m_tree_view->currentIndex()); - if(group) - { - m_element.data()->removeTextGroup(group); - } + if(group && m_element.data()->diagram()) + m_element.data()->diagram()->undoStack().push(new RemoveTextsGroupCommand(m_element.data(), group)); +} + +/** + * @brief DynamicElementTextItemEditor::on_m_add_group_clicked + * Add a new group + */ +void DynamicElementTextItemEditor::on_m_add_group_clicked() +{ + QString name = QInputDialog::getText(this, tr("Nom du groupe"), tr("Entrer le nom du nouveau groupe")); + + if(name.isEmpty()) + return; + else if (m_element.data()->diagram()) + m_element.data()->diagram()->undoStack().push(new AddTextsGroupCommand(m_element, name)); } diff --git a/sources/ui/dynamicelementtextitemeditor.h b/sources/ui/dynamicelementtextitemeditor.h index b3b01958a..b7d56577a 100644 --- a/sources/ui/dynamicelementtextitemeditor.h +++ b/sources/ui/dynamicelementtextitemeditor.h @@ -24,8 +24,6 @@ class DynamicElementTextItem; class DynamicElementTextModel; class QTreeView; class QStandardItem; -class QMenu; -class QSignalMapper; class ElementTextItemGroup; namespace Ui { @@ -47,29 +45,20 @@ class DynamicElementTextItemEditor : public AbstractElementPropertiesEditorWidge void setCurrentText(DynamicElementTextItem *text); void setCurrentGroup(ElementTextItemGroup *group); QUndoCommand *associatedUndo() const override; - bool eventFilter(QObject *watched, QEvent *event) override; private: - void setUpAction(); void dataEdited(DynamicElementTextItem *deti); - void addCurrentTextToGroup(QString name); + void treeViewClicked(const QModelIndex &index); private slots: void on_m_add_text_clicked(); - void on_m_remove_text_clicked(); - - private: + void on_m_remove_selection_clicked(); + void on_m_add_group_clicked(); + + private: Ui::DynamicElementTextItemEditor *ui; QTreeView *m_tree_view = nullptr; DynamicElementTextModel *m_model = nullptr; - QMenu *m_context_menu = nullptr; - QSignalMapper *m_signal_mapper = nullptr; - QAction *m_add_to_group = nullptr, - *m_remove_text_from_group = nullptr, - *m_new_group = nullptr, - *m_remove_current_text = nullptr, - *m_remove_current_group = nullptr; - QList m_actions_list; }; #endif // DYNAMICELEMENTTEXTITEMEDITOR_H diff --git a/sources/ui/dynamicelementtextitemeditor.ui b/sources/ui/dynamicelementtextitemeditor.ui index 66d645f1e..bd9cfbfcf 100644 --- a/sources/ui/dynamicelementtextitemeditor.ui +++ b/sources/ui/dynamicelementtextitemeditor.ui @@ -35,7 +35,7 @@ Ajouter un texte - + Texte @@ -44,7 +44,21 @@ - + + + Ajouter un groupe de textes + + + Groupe + + + + :/ico/16x16/list-add.png:/ico/16x16/list-add.png + + + + + Supprimer la sélection diff --git a/sources/ui/dynamicelementtextmodel.cpp b/sources/ui/dynamicelementtextmodel.cpp index f84f22f71..5baf6c38f 100644 --- a/sources/ui/dynamicelementtextmodel.cpp +++ b/sources/ui/dynamicelementtextmodel.cpp @@ -31,6 +31,8 @@ #include "conductor.h" #include "elementtextitemgroup.h" #include "qeticons.h" +#include "diagram.h" +#include "addelementtextcommand.h" DynamicElementTextModel::DynamicElementTextModel(Element *element, QObject *parent) : QStandardItemModel(parent), @@ -100,7 +102,7 @@ QList DynamicElementTextModel::itemsForText(DynamicElementTextI return qsi_list; QStandardItem *qsi = new QStandardItem(deti->toPlainText()); - qsi->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); + qsi->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled |Qt::ItemIsDragEnabled); qsi->setIcon(QET::Icons::PartText); @@ -299,8 +301,8 @@ void DynamicElementTextModel::removeText(DynamicElementTextItem *deti) /** * @brief DynamicElementTextModel::textFromIndex * @param index - * @return the text associated with @index. Return value can be nullptr - * @Index can be a child of an index associated with a text + * @return the text associated with @index. Returned value can be nullptr + * @Index can be a child of an index associated with a text and can be the column 0 or 1. */ DynamicElementTextItem *DynamicElementTextModel::textFromIndex(const QModelIndex &index) const { @@ -317,11 +319,19 @@ DynamicElementTextItem *DynamicElementTextModel::textFromIndex(const QModelIndex * @brief DynamicElementTextModel::textFromItem * @param item * @return the text associated with @item. Return value can be nullptr - * @item can be a child of an item associated with a text + * @item can be a child of an item associated with a text and can be the column 0 or 1. * Note can return nullptr */ DynamicElementTextItem *DynamicElementTextModel::textFromItem(QStandardItem *item) const { + //Get the item of the column 0 + if(item->column() == 1) + { + if(item->parent()) + item = item->parent()->child(item->row(), 0); + else + item = itemFromIndex(index(item->row(),0)); + } //Item haven't got parent, so they can be only a text or a group if(!item->parent()) { @@ -486,7 +496,7 @@ void DynamicElementTextModel::addGroup(ElementTextItemGroup *group) return; QStandardItem *grp = new QStandardItem(group->name()); - grp->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); + grp->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsDropEnabled); grp->setIcon(QET::Icons::textGroup); QStandardItem *empty_qsi = new QStandardItem(0); @@ -550,7 +560,7 @@ void DynamicElementTextModel::removeTextFromGroup(DynamicElementTextItem *deti, * @brief DynamicElementTextModel::groupFromIndex * @param index * @return the group associated with @index. Return value can be nullptr - * @Index can be a child of an index associated with a group + * @Index can be a child of an index associated with a group and can be the column 0 or 1. */ ElementTextItemGroup *DynamicElementTextModel::groupFromIndex(const QModelIndex &index) const { @@ -567,17 +577,24 @@ ElementTextItemGroup *DynamicElementTextModel::groupFromIndex(const QModelIndex * @brief DynamicElementTextModel::groupFromItem * @param item * @return the group associated with @item. Return value can be nullptr - * @item can be a child of an item associated with a group + * @item can be a child of an item associated with a group and can be the column 0 or 1. */ ElementTextItemGroup *DynamicElementTextModel::groupFromItem(QStandardItem *item) const { - QStandardItem *group_item = item; + //Get the item of the column 0 + if(item->column() == 1) + { + if(item->parent()) + item = item->parent()->child(item->row(), 0); + else + item = itemFromIndex(index(item->row(),0)); + } - while (group_item->parent()) - group_item = group_item->parent(); + while (item->parent()) + item = item->parent(); - if(m_groups_list.values().contains(group_item)) - return m_groups_list.key(group_item); + if(m_groups_list.values().contains(item)) + return m_groups_list.key(item); else return nullptr; } @@ -596,6 +613,241 @@ QModelIndex DynamicElementTextModel::indexFromGroup(ElementTextItemGroup *group) return QModelIndex(); } +/** + * @brief DynamicElementTextModel::indexIsText + * @param index + * @return True if @index represente a text, both for the column 0 and 1. + * Return false if @index is a child of an index associated to a text. + */ +bool DynamicElementTextModel::indexIsText(const QModelIndex &index) const +{ + QStandardItem *item = nullptr; + + //The item represent the second column + if(index.column() == 1) + { + if(index.parent().isValid()) + item = itemFromIndex(index.parent().child(index.row(),0)); + else + item = itemFromIndex(this->index(index.row(),0)); + } + else + item = itemFromIndex(index); + + if(item && m_texts_list.values().contains(item)) + return true; + else + return false; +} + +/** + * @brief DynamicElementTextModel::indexIsGroup + * @param index + * @return True if @index represente a group, both for the column 0 and 1. + * Return false if @index is a child of an index associated to a group. + */ +bool DynamicElementTextModel::indexIsGroup(const QModelIndex &index) const +{ + QStandardItem *item = nullptr; + + //The item represent the second column + if(index.column() == 1) + { + if(index.parent().isValid()) + item = itemFromIndex(index.parent().child(index.row(),0)); + else + item = itemFromIndex(this->index(index.row(),0)); + } + else + item = itemFromIndex(index); + + if(item && m_groups_list.values().contains(item)) + return true; + else + return false; +} + +bool DynamicElementTextModel::canDropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent) const +{ + Q_UNUSED(action); + + if(data->hasFormat("application/x-qet-element-text-uuid")) + { + QModelIndex index; + if(parent.isValid() && row != -1 && column !=1) //Insert in child of parent + index = parent.child(row, column); + else if (parent.isValid() && row == -1 && column == -1) //Drop in parent + index = parent; + + QUuid uuid(data->text()); + + //The data is drop in a group + if(indexIsInGroup(index)) + { + //Data is dragged from a text direct child of element + for(DynamicElementTextItem *text : m_element.data()->dynamicTextItems()) + if(text->uuid() == uuid) + return true; + //Data is dragged from a text in a group + for(ElementTextItemGroup *group : m_element.data()->textGroups()) + { + for(DynamicElementTextItem *text : group->texts()) + if(text->uuid() == uuid) + return true; + } + + return false; + + } + else //The data is not drop in a group, then the action must be a drag of text from a group to the element + { + for(ElementTextItemGroup *group : m_element.data()->textGroups()) + { + for(DynamicElementTextItem *text : group->texts()) + if(text->uuid() == uuid) + return true; + } + } + } + + return false; +} + +/** + * @brief DynamicElementTextModel::dropMimeData + * @param data + * @param action + * @param row + * @param column + * @param parent + * @return In any case return false, for overwrite the default behavior of model. + */ +bool DynamicElementTextModel::dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent) +{ + Q_UNUSED(action) + + if(data->hasFormat("application/x-qet-element-text-uuid")) + { + QUuid uuid(data->text()); + DynamicElementTextItem *deti = nullptr; + ElementTextItemGroup *group = nullptr; + + QModelIndex index; + if(parent.isValid() && row != -1 && column !=1) //Insert in child of parent + index = parent.child(row, column); + else if (parent.isValid() && row == -1 && column == -1) //Drop in parent + index = parent; + + //Darg and drop in a group of text + if(indexIsInGroup(index)) + { + //The dragged text is a direct child of element + for(DynamicElementTextItem *text : m_element.data()->dynamicTextItems()) + { + if(text->uuid() == uuid) + { + deti = text; + group = groupFromIndex(index); + + if(group && deti) //Text successfully added in a group + { + m_element.data()->diagram()->undoStack().push(new AddTextToGroupCommand(deti, group)); + return false; + } + } + } + + //The dragged text is in a group + for(ElementTextItemGroup *grp : m_element.data()->textGroups()) + { + for(DynamicElementTextItem *text : grp->texts()) + { + if(text->uuid() == uuid) + { + deti = text; + group = groupFromIndex(index); + + //Text successfully moved from a group to another group + if(group && deti) + { + QUndoStack &stack = m_element.data()->diagram()->undoStack(); + stack.beginMacro(tr("Déplacer un texte dans un autre groupe")); + stack.push(new RemoveTextFromGroupCommand(deti, grp)); + stack.push(new AddTextToGroupCommand(deti, group)); + stack.endMacro(); + + return false; + } + } + } + } + + return false; + } + else //Drag and drop in anaother place + { + //Get the dropped text + for(ElementTextItemGroup *grp : m_element.data()->textGroups()) + { + for(DynamicElementTextItem *text : grp->texts()) + { + if(text->uuid() == uuid) + { + deti = text; + group = grp; + break; + } + } + if(deti) + break; + } + + if(deti && group) //Text successfully removed from group + { + m_element.data()->diagram()->undoStack().push((new RemoveTextFromGroupCommand(deti, group))); + return false; + } + + return false; + } + } + + return false; +} + +QMimeData *DynamicElementTextModel::mimeData(const QModelIndexList &indexes) const +{ + QModelIndex index = indexes.first(); + if (index.isValid()) + { + QStandardItem *item = itemFromIndex(index); + if(item) + { + DynamicElementTextItem *deti = m_texts_list.key(item); + if(deti) + { + QMimeData *mime_data = new QMimeData(); + mime_data->setText(deti->uuid().toString()); + mime_data->setData("application/x-qet-element-text-uuid", deti->uuid().toString().toLatin1()); + return mime_data; + } + } + } + + return new QMimeData(); +} + +/** + * @brief DynamicElementTextModel::mimeTypes + * @return + */ +QStringList DynamicElementTextModel::mimeTypes() const +{ + QStringList mime_list = QAbstractItemModel::mimeTypes(); + mime_list << "application/x-qet-element-text-uuid"; + return mime_list; +} + /** * @brief DynamicElementTextModel::enableSourceText * Enable the good field, according to the current source of text, for the edited text @deti diff --git a/sources/ui/dynamicelementtextmodel.h b/sources/ui/dynamicelementtextmodel.h index b25f12707..71eed2c88 100644 --- a/sources/ui/dynamicelementtextmodel.h +++ b/sources/ui/dynamicelementtextmodel.h @@ -62,6 +62,13 @@ class DynamicElementTextModel : public QStandardItemModel 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, int row, int column, const QModelIndex &parent) const override; + bool dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent) override; + QMimeData *mimeData(const QModelIndexList &indexes) const override; + QStringList mimeTypes() const override; signals: void dataForTextChanged(DynamicElementTextItem *text); diff --git a/sources/undocommand/addelementtextcommand.cpp b/sources/undocommand/addelementtextcommand.cpp index b0034fecb..2fb575668 100644 --- a/sources/undocommand/addelementtextcommand.cpp +++ b/sources/undocommand/addelementtextcommand.cpp @@ -118,6 +118,9 @@ RemoveTextsGroupCommand::RemoveTextsGroupCommand(Element *element, ElementTextIt m_group(group) { setText(QObject::tr("Supprimer un groupe de textes d'élément")); + + for(DynamicElementTextItem *deti : group->texts()) + m_text_list.append(deti); } RemoveTextsGroupCommand::~RemoveTextsGroupCommand() @@ -126,13 +129,25 @@ RemoveTextsGroupCommand::~RemoveTextsGroupCommand() void RemoveTextsGroupCommand::undo() { if(m_element && m_group) + { m_element.data()->addTextGroup(m_group.data()); + + for(QPointer p : m_text_list) + if(p) + m_element.data()->addTextToGroup(p.data(), m_group.data()); + } } void RemoveTextsGroupCommand::redo() { if(m_element && m_group) + { + for(QPointer p : m_text_list) + if(p) + m_element.data()->removeTextFromGroup(p.data(), m_group.data()); + m_element.data()->removeTextGroup(m_group.data()); + } } @@ -177,7 +192,14 @@ void AddTextToGroupCommand::undo() void AddTextToGroupCommand::redo() { if(m_element && m_group && m_text) + { + if(m_text.data()->isSelected()) + { + m_text.data()->setSelected(false); + m_group.data()->setSelected(true); + } m_element.data()->addTextToGroup(m_text, m_group); + } } /***************************** diff --git a/sources/undocommand/addelementtextcommand.h b/sources/undocommand/addelementtextcommand.h index 4b570e6f2..9ff375cbc 100644 --- a/sources/undocommand/addelementtextcommand.h +++ b/sources/undocommand/addelementtextcommand.h @@ -79,6 +79,7 @@ class RemoveTextsGroupCommand : public QUndoCommand private: QPointer m_element; QPointer m_group; + QList> m_text_list; }; class AddTextToGroupCommand : public QUndoCommand