Author: jghali
Date: Tue Nov 24 18:40:34 2020
New Revision: 24282

URL: http://scribus.net/websvn/listing.php?repname=Scribus&sc=1&rev=24282
Log:
#16350: Undo of ungrouped grouped object crashes Scribus

Modified:
    trunk/Scribus/scribus/scribusdoc.cpp
    trunk/Scribus/scribus/scribusdoc.h

Modified: trunk/Scribus/scribus/scribusdoc.cpp
URL: 
http://scribus.net/websvn/diff.php?repname=Scribus&rev=24282&path=/trunk/Scribus/scribus/scribusdoc.cpp
==============================================================================
--- trunk/Scribus/scribus/scribusdoc.cpp        (original)
+++ trunk/Scribus/scribus/scribusdoc.cpp        Tue Nov 24 18:40:34 2020
@@ -1582,10 +1582,12 @@
 {
        m_docUpdater->beginUpdate();
        m_Selection->delaySignalsOn();
+       ++m_undoRedoOngoing;
 }
 
 void ScribusDoc::undoRedoDone()
 {
+       --m_undoRedoOngoing;
        m_Selection->delaySignalsOff();
        m_docUpdater->endUpdate();
 }
@@ -1872,17 +1874,19 @@
        double x, y, w, h;
        if (isUndo)
        {
-               tempSelect.addItem(select.last());
+               tempSelect.addItem(select.first()->Parent);
                tempSelect.getGroupRect(&x, &y, &w, &h);
                itemSelection_UnGroupObjects(&tempSelect);
        }
        else
        {
-               for (int i = 0; i < select.size()-1; ++i)
+               for (int i = 0; i < select.size() - 1; ++i)
                        tempSelect.addItem(select.at(i));
                tempSelect.getGroupRect(&x, &y, &w, &h);
+               PageItem_Group* oldGroupItem = select.last()->asGroupFrame();
+               PageItem* newGroupItem = itemSelection_GroupObjects(false, 
false, &tempSelect, oldGroupItem);
                select.removeLast();
-               select.append(itemSelection_GroupObjects(false, 
false,&tempSelect));
+               select.append(newGroupItem);
                is->setItem(select);
        }
        QRectF rect(x, y , w, h);
@@ -2305,6 +2309,11 @@
 bool ScribusDoc::isModified() const
 {
        return m_modified;
+}
+
+bool ScribusDoc::isUndoRedoOngoing() const
+{
+       return (m_undoRedoOngoing != 0);
 }
 
 /** sets page properties */
@@ -14903,7 +14912,7 @@
        itemList.append(groupItem);
 }
 
-PageItem * ScribusDoc::itemSelection_GroupObjects(bool changeLock, bool lock, 
Selection* customSelection)
+PageItem * ScribusDoc::itemSelection_GroupObjects(bool changeLock, bool lock, 
Selection* customSelection, PageItem_Group* groupItem)
 {
        Selection* itemSelection = (customSelection != nullptr) ? 
customSelection : m_Selection;
        if (itemSelection->count() < 1)
@@ -14988,8 +14997,11 @@
        double gh = maxy - miny;
 
        m_undoManager->setUndoEnabled(false);
-       int z = itemAdd(PageItem::Group, PageItem::Rectangle, gx, gy, gw, gh, 
0, CommonStrings::None, CommonStrings::None);
-       PageItem *groupItem = Items->takeAt(z);
+       if (!groupItem)
+       {
+               int z = itemAdd(PageItem::Group, PageItem::Rectangle, gx, gy, 
gw, gh, 0, CommonStrings::None, CommonStrings::None);
+               groupItem = Items->takeAt(z)->asGroupFrame();
+       }
        Items->insert(lowestItem, groupItem);
        groupItem->setItemName( tr("Group%1").arg(GroupCounter));
        groupItem->AutoName = false;
@@ -15074,6 +15086,7 @@
                if (d >= 0)
                        list->removeAt(d);
                itemSelection->removeItem(currItem);
+               QList<PageItem*> oldGroupItems = currItem->groupItemList;
                int gcount = currItem->groupItemList.count();
                for (int j = 0; j < gcount; j++)
                {
@@ -15097,6 +15110,7 @@
                        ScItemState<QList<QPointer<PageItem> > > *is = new 
ScItemState<QList<QPointer<PageItem> > >(UndoManager::Ungroup);
                        is->set("UNGROUP");
                        Selection tempSelection(this, false);
+                       tempSelection.addItems(oldGroupItems);
                        tempSelection.addItem(currItem, true);
                        is->setItem(tempSelection.selectionList());
                        m_undoManager->action(this, is);
@@ -15112,7 +15126,7 @@
                currItem = toDelete.at(i);
                if (currItem->isWelded())
                        currItem->unWeld();
-               if (!UndoManager::undoEnabled())
+               if (!UndoManager::undoEnabled() && !isUndoRedoOngoing())
                        delete currItem;
        }
 

Modified: trunk/Scribus/scribus/scribusdoc.h
URL: 
http://scribus.net/websvn/diff.php?repname=Scribus&rev=24282&path=/trunk/Scribus/scribus/scribusdoc.h
==============================================================================
--- trunk/Scribus/scribus/scribusdoc.h  (original)
+++ trunk/Scribus/scribus/scribusdoc.h  Tue Nov 24 18:40:34 2020
@@ -107,6 +107,7 @@
        bool isLoading() const;
        void setModified(bool);
        bool isModified() const;
+       bool isUndoRedoOngoing() const;
 /** Setzt die Seitenattribute */
        void setPage(double w, double h, double t, double l, double r, double 
b, double sp, double ab, bool atf, int fp);
 
@@ -1087,7 +1088,7 @@
        PageItem* groupObjectsSelection(Selection* customSelection = nullptr);
        PageItem* groupObjectsList(QList<PageItem*> &itemList);
        void groupObjectsToItem(PageItem* groupItem, QList<PageItem*> 
&itemList);
-       PageItem * itemSelection_GroupObjects  (bool changeLock, bool lock, 
Selection* customSelection = nullptr);
+       PageItem * itemSelection_GroupObjects  (bool changeLock, bool lock, 
Selection* customSelection = nullptr, PageItem_Group* groupItem = nullptr);
        void itemSelection_UnGroupObjects(Selection* customSelection = nullptr);
        void addToGroup(PageItem* group, PageItem* item);
        void removeFromGroup(PageItem* item);
@@ -1283,6 +1284,7 @@
        UndoManager * const m_undoManager;
        bool m_loading {false};
        bool m_modified {false};
+       int  m_undoRedoOngoing {0};
        int m_ActiveLayer {0};
        double m_docUnitRatio;
        int m_rotMode {0};
@@ -1369,11 +1371,13 @@
        PageItem *DraggedElem {nullptr};
        PageItem *ElemToLink {nullptr};
        QList<PageItem*> DragElements;
+
 private:
        StyleSet<ParagraphStyle> m_docParagraphStyles;
        StyleSet<CharStyle> m_docCharStyles;
        StyleSet<TableStyle> m_docTableStyles;
        StyleSet<CellStyle> m_docCellStyles;
+
 public:
        ScLayers Layers;
        //bool marginColored;


_______________________________________________
scribus-commit mailing list
[email protected]
http://lists.scribus.net/mailman/listinfo/scribus-commit

Reply via email to