Author: jghali
Date: Tue Apr 28 01:02:46 2020
New Revision: 23675

URL: http://scribus.net/websvn/listing.php?repname=Scribus&sc=1&rev=23675
Log:
#14140: Cutting/Pasting then deleting footnote frame results in crash

Modified:
    trunk/Scribus/scribus/pageitem_noteframe.cpp
    trunk/Scribus/scribus/pageitem_noteframe.h
    
trunk/Scribus/scribus/plugins/fileloader/scribus150format/scribus150format.cpp
    trunk/Scribus/scribus/plugins/fileloader/scribus150format/scribus150format.h
    
trunk/Scribus/scribus/plugins/fileloader/scribus150format/scribus150format_save.cpp
    trunk/Scribus/scribus/scribusdoc.h

Modified: trunk/Scribus/scribus/pageitem_noteframe.cpp
URL: 
http://scribus.net/websvn/diff.php?repname=Scribus&rev=23675&path=/trunk/Scribus/scribus/pageitem_noteframe.cpp
==============================================================================
--- trunk/Scribus/scribus/pageitem_noteframe.cpp        (original)
+++ trunk/Scribus/scribus/pageitem_noteframe.cpp        Tue Apr 28 01:02:46 2020
@@ -204,7 +204,7 @@
 
 void PageItem_NoteFrame::layout()
 {
-       if (!invalid || l_notes.isEmpty())
+       if (!invalid || m_notes.isEmpty())
                return;
        if (!m_Doc->flag_layoutNotesFrames)
                return;
@@ -296,7 +296,7 @@
 
 void PageItem_NoteFrame::updateNotes(const QList<TextNote*>& nList, bool clear)
 {
-       if (nList == l_notes && !clear)
+       if (nList == m_notes && !clear)
                return;
        UndoManager::instance()->setUndoEnabled(false);
        m_Doc->setNotesChanged(true);
@@ -306,9 +306,9 @@
        {
                itemText.selectAll();
                deleteSelectedTextFromFrame();
-               l_notes = nList;
-               for (int a=0; a < l_notes.count(); ++a)
-                       insertNote(l_notes.at(a));
+               m_notes = nList;
+               for (int a=0; a < m_notes.count(); ++a)
+                       insertNote(m_notes.at(a));
        }
        else
        {
@@ -319,9 +319,9 @@
                        for (int i=0; i< count; ++i)
                        {
                                TextNote* note = nList.at(i);
-                               if (!l_notes.contains(note))
+                               if (!m_notes.contains(note))
                                {
-                                       l_notes.append(note);
+                                       m_notes.append(note);
                                        insertNote(note);
                                }
                        }
@@ -335,7 +335,7 @@
 void PageItem_NoteFrame::updateNotesText()
 {
        //read texts from notes frame and copy it to note`s data
-       if (l_notes.isEmpty() || (itemText.length() == 0))
+       if (m_notes.isEmpty() || (itemText.length() == 0))
                return;
 
        int oldSelStart = itemText.startOfSelection();

Modified: trunk/Scribus/scribus/pageitem_noteframe.h
URL: 
http://scribus.net/websvn/diff.php?repname=Scribus&rev=23675&path=/trunk/Scribus/scribus/pageitem_noteframe.h
==============================================================================
--- trunk/Scribus/scribus/pageitem_noteframe.h  (original)
+++ trunk/Scribus/scribus/pageitem_noteframe.h  Tue Apr 28 01:02:46 2020
@@ -35,6 +35,11 @@
        //returns Notes Style
        NotesStyle* notesStyle() { return m_nstyle; }
 
+       //return list of notes in noteframe
+       const QList<TextNote*>& notesList() const { return m_notes; }
+       //remove note from list
+       void removeNote(TextNote* note) { m_notes.removeOne(note); }
+
        //insert notes content into notesframe
        void updateNotes(const QList<TextNote*>& nList, bool clear = true);
        //read notes text from notesframe itemText and store it in notes`s 
saxed text field
@@ -47,11 +52,6 @@
        bool isAutoHeight()  const { return m_nstyle->isAutoNotesHeight(); }
        bool isAutoWidth()  const { return m_nstyle->isAutoNotesWidth(); }
 
-       //return list of notes in noteframe
-       QList<TextNote*> notesList() { return l_notes; }
-       //remove note from list
-       void removeNote(TextNote* note) { l_notes.removeOne(note); }
-
        void restoreDeleteNoteText(SimpleState *state, bool isUndo);
        void restoreDeleteNoteParagraph(SimpleState *state, bool isUndo);
        void restoreInsertNoteText(SimpleState *state, bool isUndo);
@@ -60,7 +60,7 @@
        void unWeld(bool doUndo=true);
        
 private:
-       QList<TextNote*> l_notes;
+       QList<TextNote*> m_notes;
        NotesStyle* m_nstyle;
        PageItem_TextFrame *m_masterFrame;
 

Modified: 
trunk/Scribus/scribus/plugins/fileloader/scribus150format/scribus150format.cpp
URL: 
http://scribus.net/websvn/diff.php?repname=Scribus&rev=23675&path=/trunk/Scribus/scribus/plugins/fileloader/scribus150format/scribus150format.cpp
==============================================================================
--- 
trunk/Scribus/scribus/plugins/fileloader/scribus150format/scribus150format.cpp  
    (original)
+++ 
trunk/Scribus/scribus/plugins/fileloader/scribus150format/scribus150format.cpp  
    Tue Apr 28 01:02:46 2020
@@ -499,6 +499,10 @@
                                }
                        }
                }
+
+               //update names to pointers
+               updateNames2Ptr();
+
                if (itemNext.count() != 0)
                {
                        QMap<int,int>::Iterator lc;
@@ -603,6 +607,10 @@
                                }
                        }
                }
+
+               //update names to pointers
+               updateNames2Ptr();
+
                // reestablish textframe links
                if (itemNext.count() != 0)
                {

Modified: 
trunk/Scribus/scribus/plugins/fileloader/scribus150format/scribus150format.h
URL: 
http://scribus.net/websvn/diff.php?repname=Scribus&rev=23675&path=/trunk/Scribus/scribus/plugins/fileloader/scribus150format/scribus150format.h
==============================================================================
--- 
trunk/Scribus/scribus/plugins/fileloader/scribus150format/scribus150format.h    
    (original)
+++ 
trunk/Scribus/scribus/plugins/fileloader/scribus150format/scribus150format.h    
    Tue Apr 28 01:02:46 2020
@@ -24,6 +24,7 @@
 
 class  ColorList;
 class  multiLine;
+class  PageItem_NoteFrame;
 class  ScLayer;
 class  ScribusDoc;
 //struct ScribusDoc::BookMa;
@@ -31,6 +32,7 @@
 class  ScXmlStreamReader;
 class  ScXmlStreamWriter;
 class  StoryText;
+class  TextNote;
 
 class PLUGIN_API Scribus150Format : public LoadSavePlugin
 {
@@ -192,8 +194,11 @@
                void writeTOC(ScXmlStreamWriter& docu);
                void writeMarks(ScXmlStreamWriter & docu);
                void writeNotesStyles(ScXmlStreamWriter & docu);
+               void writeNotesStyles(ScXmlStreamWriter & docu, const 
QStringList& styleSelection);
                void writeNotesFrames(ScXmlStreamWriter & docu);
+               void writeNotesFrames(ScXmlStreamWriter & docu, const 
QList<PageItem_NoteFrame*>& nfList);
                void writeNotes(ScXmlStreamWriter & docu);
+               void writeNotes(ScXmlStreamWriter & docu, const 
QList<TextNote*>& noteList);
                void writePageSets(ScXmlStreamWriter& docu);
                void writeSections(ScXmlStreamWriter& docu);
                void writePatterns(ScXmlStreamWriter& docu, const QString& 
baseDir, bool part = false, Selection* selection = 0);

Modified: 
trunk/Scribus/scribus/plugins/fileloader/scribus150format/scribus150format_save.cpp
URL: 
http://scribus.net/websvn/diff.php?repname=Scribus&rev=23675&path=/trunk/Scribus/scribus/plugins/fileloader/scribus150format/scribus150format_save.cpp
==============================================================================
--- 
trunk/Scribus/scribus/plugins/fileloader/scribus150format/scribus150format_save.cpp
 (original)
+++ 
trunk/Scribus/scribus/plugins/fileloader/scribus150format/scribus150format_save.cpp
 Tue Apr 28 01:02:46 2020
@@ -92,6 +92,7 @@
                }
        }
 
+       // Write paragraph styles
        QList<QString>::Iterator it;
        QList<QString> names = lists.styleNames();
        QList<int> styleList = m_Doc->getSortedStyleList();
@@ -102,6 +103,7 @@
                        putPStyle(writer, paragraphStyle, "STYLE");
        }
 
+       // Write character styles
        names = lists.charStyleNames();
        styleList = m_Doc->getSortedCharStyleList();
        for (int i = 0; i < styleList.count(); ++i)
@@ -115,6 +117,36 @@
        }
 
        writeLineStyles(writer);
+
+       // TODO Write used marks
+       // writeMarks(writer);
+
+       // Write note styles
+       names = lists.noteStyleNames();
+       writeNotesStyles(writer, names);
+
+       // Write note frames
+       QList<PageItem_NoteFrame*> nfList;
+       for (int i = 0; i < selection->count(); ++i)
+       {
+               PageItem* item = selection->itemAt(i);
+               if (!item->isNoteFrame())
+                       continue;
+               nfList.append(dynamic_cast<PageItem_NoteFrame*>(item));
+       }
+       writeNotesFrames(writer, nfList);
+
+       // TODO Write text notes (once marks are also written)
+       // Do not uncomment before otherwise pasting note frame
+       // will trigger a crash
+       /*QList<TextNote*> textNotes;
+       for (int i = 0; i < nfList.count(); ++i)
+       {
+               PageItem_NoteFrame* noteFrame = nfList.at(i);
+               textNotes.append(noteFrame->notesList());
+       }
+       writeNotes(writer, textNotes);*/
+
        writePatterns(writer, fileDir, true, selection);
        if (!emF.isEmpty())
                WriteObjects(m_Doc, writer, fileDir, nullptr, 0, 
ItemSelectionFrame, &emF);
@@ -1302,7 +1334,7 @@
                return;
 
        docu.writeStartElement("Marks");
-       foreach(Mark* mrk, m_Doc->marksList())
+       for (Mark* mrk : m_Doc->marksList())
        {
                if (mrk->isType(MARKNoteFrameType))
                        continue;
@@ -1332,6 +1364,25 @@
 
 void Scribus150Format::writeNotesStyles(ScXmlStreamWriter & docu)
 {
+       if (m_Doc->m_docNotesStylesList.isEmpty())
+               return;
+
+       //write notes styles
+       QStringList noteStyleNames; 
+       QList<NotesStyle*>::ConstIterator end = 
m_Doc->m_docNotesStylesList.constEnd();
+       for (auto itNS = m_Doc->m_docNotesStylesList.constBegin(); itNS != end; 
++itNS)
+       {
+               const NotesStyle* noteStyle = (*itNS);
+               noteStyleNames.append(noteStyle->name());
+       }
+       writeNotesStyles(docu, noteStyleNames);
+}
+
+void  Scribus150Format::writeNotesStyles(ScXmlStreamWriter & docu, const 
QStringList& styleSelection)
+{
+       if (styleSelection.isEmpty())
+               return;
+
        //write notes styles
        docu.writeStartElement("NotesStyles");
        QList<NotesStyle*>::Iterator itNS;
@@ -1339,6 +1390,8 @@
        for (itNS = m_Doc->m_docNotesStylesList.begin(); itNS != end; ++itNS)
        {
                NotesStyle* noteStyle = (*itNS);
+               if (!styleSelection.contains(noteStyle->name()))
+                       continue;
                docu.writeEmptyElement("notesStyle");
                docu.writeAttribute("Name", noteStyle->name());
                docu.writeAttribute("Start", noteStyle->start());
@@ -1399,15 +1452,23 @@
 
 void Scribus150Format::writeNotesFrames(ScXmlStreamWriter &docu)
 {
+       QList<PageItem_NoteFrame*> nfList;
+       for (NotesStyle* noteStyle : m_Doc->m_docNotesStylesList)
+               nfList.append(m_Doc->listNotesFrames(noteStyle));
+
+       writeNotesFrames(docu, nfList);
+}
+
+void Scribus150Format::writeNotesFrames(ScXmlStreamWriter & docu, const 
QList<PageItem_NoteFrame*>& itemList)
+{
+       if (itemList.isEmpty())
+               return;
+
        docu.writeStartElement("NotesFrames");
 
-       QList<PageItem_NoteFrame*> nfList;
-       foreach (NotesStyle* noteStyle, m_Doc->m_docNotesStylesList)
-               nfList.append(m_Doc->listNotesFrames(noteStyle));
-
-       for (int it = 0; it < nfList.count(); ++it)
-       {
-               PageItem_NoteFrame* noteFrame = nfList.at(it);
+       for (int i = 0; i < itemList.count(); ++i)
+       {
+               PageItem_NoteFrame* noteFrame = itemList.at(i);
                NotesStyle* noteStyle = noteFrame->notesStyle();
                if (noteStyle->isEndNotes())
                {
@@ -1415,21 +1476,17 @@
                        docu.writeAttribute("NSname", noteStyle->name());
                        docu.writeAttribute("range", (int) noteStyle->range());
                        docu.writeAttribute("myID", qHash(noteFrame) & 
0x7FFFFFFF);
-                       //docu.writeAttribute("name", noteFrame->itemName());
                        
                        rangeItem rI = 
m_Doc->m_docEndNotesFramesMap.value(noteFrame);
                        if (noteStyle->range() == NSRstory)
                                docu.writeAttribute("ItemID", 
qHash(rI.firstStoryFrame) & 0x7FFFFFFF);
-                               //docu.writeAttribute("item", 
rI.firstStoryFrame->itemName());
                }
                else //footnotes frame
                {
                        docu.writeEmptyElement("FOOTNOTEFRAME");
                        docu.writeAttribute("NSname", noteStyle->name());
                        docu.writeAttribute("myID", qHash(noteFrame) & 
0x7FFFFFFF);
-                       //docu.writeAttribute("name", noteFrame->itemName());
                        docu.writeAttribute("MasterID", 
qHash(noteFrame->masterFrame()) & 0x7FFFFFFF);
-                       //docu.writeAttribute("master", 
noteFrame->masterFrame()->itemName());
                }
        }
        docu.writeEndElement();
@@ -1440,18 +1497,26 @@
        //write notes
        if (m_Doc->notesList().isEmpty())
                return;
+
+       const QList<TextNote*>& noteList = m_Doc->notesList();
+       writeNotes(docu, noteList);
+}
+
+void Scribus150Format::writeNotes(ScXmlStreamWriter & docu, const 
QList<TextNote*>& noteList)
+{
+       if (noteList.isEmpty())
+               return;
+
        docu.writeStartElement("Notes");
-       QList<TextNote*>::const_iterator itTN;
-       QList<TextNote*>::const_iterator end = m_Doc->notesList().end();
-       for (auto itTN = m_Doc->notesList().begin(); itTN != end; ++itTN)
-       {
-               TextNote* TN = (*itTN);
-               if (TN->masterMark() == nullptr)
+       for (int i = 0; i < noteList.count(); ++i)
+       {
+               TextNote* textNote = noteList.at(i);
+               if (textNote->masterMark() == nullptr)
                        continue;
                docu.writeEmptyElement("Note");
-               docu.writeAttribute("Master", TN->masterMark()->label);
-               docu.writeAttribute("NStyle", TN->notesStyle()->name());
-               docu.writeAttribute("Text", TN->saxedText());
+               docu.writeAttribute("Master", textNote->masterMark()->label);
+               docu.writeAttribute("NStyle", textNote->notesStyle()->name());
+               docu.writeAttribute("Text", textNote->saxedText());
        }
        docu.writeEndElement();
 }

Modified: trunk/Scribus/scribus/scribusdoc.h
URL: 
http://scribus.net/websvn/diff.php?repname=Scribus&rev=23675&path=/trunk/Scribus/scribus/scribusdoc.h
==============================================================================
--- trunk/Scribus/scribus/scribusdoc.h  (original)
+++ trunk/Scribus/scribus/scribusdoc.h  Tue Apr 28 01:02:46 2020
@@ -1722,8 +1722,8 @@
        void multipleDuplicateByPage(const ItemMultipleDuplicateData& mdData, 
Selection& selection, QString& tooltip);
 
 public:
-       const QList<Mark*> marksList() { return m_docMarksList; }
-       const QList<TextNote*> notesList() { return m_docNotesList; }
+       const QList<Mark*>& marksList() { return m_docMarksList; }
+       const QList<TextNote*>& notesList() { return m_docNotesList; }
        QList<NotesStyle*> m_docNotesStylesList;
        QMap<PageItem_NoteFrame*, rangeItem> m_docEndNotesFramesMap;
        QList<NotesStyle*> ns2Update; //list of notes styles to update


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

Reply via email to