Author: jghali
Date: Thu Jul 30 19:44:38 2020
New Revision: 23968

URL: http://scribus.net/websvn/listing.php?repname=Scribus&sc=1&rev=23968
Log:
Fix a few mark related functions which would not work with items embedded 
inside groups

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

Modified: trunk/Scribus/scribus/pageitemiterator.cpp
URL: 
http://scribus.net/websvn/diff.php?repname=Scribus&rev=23968&path=/trunk/Scribus/scribus/pageitemiterator.cpp
==============================================================================
--- trunk/Scribus/scribus/pageitemiterator.cpp  (original)
+++ trunk/Scribus/scribus/pageitemiterator.cpp  Thu Jul 30 19:44:38 2020
@@ -195,3 +195,29 @@
                m_current = nullptr;
        return m_current;
 }
+
+PageItem* PageItemIterator::moveTo(PageItem* item)
+{
+       if (current() == item)
+               return item;
+
+       PageItem* nextItem = next();
+       while (nextItem)
+       {
+               if (nextItem == item)
+                       break;
+               nextItem = next();
+       }
+       return nextItem;
+}
+
+PageItem* PageItemIterator::movePast(PageItem* item)
+{
+       if (current() == nullptr)
+               return nullptr;
+
+       PageItem* nextItem = moveTo(item);
+       if (nextItem)
+               nextItem = next();
+       return nextItem;
+}

Modified: trunk/Scribus/scribus/pageitemiterator.h
URL: 
http://scribus.net/websvn/diff.php?repname=Scribus&rev=23968&path=/trunk/Scribus/scribus/pageitemiterator.h
==============================================================================
--- trunk/Scribus/scribus/pageitemiterator.h    (original)
+++ trunk/Scribus/scribus/pageitemiterator.h    Thu Jul 30 19:44:38 2020
@@ -42,6 +42,9 @@
        PageItem* begin(const QList<PageItem*>& itemList);
        PageItem* next();
 
+       PageItem* moveTo(PageItem* item);
+       PageItem* movePast(PageItem* item);
+
        inline PageItem*  operator*() const { return m_current; }
        inline PageItem*  operator->() const { return m_current; }
        PageItemIterator& operator++() { next(); return *this; }

Modified: trunk/Scribus/scribus/scribusdoc.cpp
URL: 
http://scribus.net/websvn/diff.php?repname=Scribus&rev=23968&path=/trunk/Scribus/scribus/scribusdoc.cpp
==============================================================================
--- trunk/Scribus/scribus/scribusdoc.cpp        (original)
+++ trunk/Scribus/scribus/scribusdoc.cpp        Thu Jul 30 19:44:38 2020
@@ -3713,7 +3713,7 @@
        QList<PageItem*> allItems;
        QStringList results;
 
-       for (PageItemIterator it(this, 
PageItemIterator::IterateInDocNoPatterns) ; *it; ++it)
+       for (PageItemIterator it(this, 
PageItemIterator::IterateInDocNoPatterns); *it; ++it)
        {
                PageItem* currItem = *it;
                if ((!results.contains(currItem->pattern())) && 
((currItem->GrType == Gradient_Pattern) || (currItem->itemType() == 
PageItem::Symbol)))
@@ -5460,7 +5460,7 @@
                        break;
        }
 
-       if (frameType==PageItem::Rectangle || itemType==PageItem::TextFrame || 
itemType==PageItem::ImageFrame || itemType==PageItem::LatexFrame || 
itemType==PageItem::OSGFrame || itemType==PageItem::Symbol || 
itemType==PageItem::Group || itemType==PageItem::Table || 
itemType==PageItem::NoteFrame)
+       if (frameType == PageItem::Rectangle || itemType == PageItem::TextFrame 
|| itemType == PageItem::ImageFrame || itemType == PageItem::LatexFrame || 
itemType == PageItem::OSGFrame || itemType == PageItem::Symbol || itemType == 
PageItem::Group || itemType == PageItem::Table || itemType == 
PageItem::NoteFrame)
        {
                newItem->SetRectFrame();
                //TODO one day hopefully, if (ScCore->usingGUI())
@@ -5477,7 +5477,7 @@
        }
 
        //ItemType Polygon
-       if (itemType==PageItem::Polygon || itemType==PageItem::PolyLine || 
itemType==PageItem::Spiral || itemType == PageItem::RegularPolygon || itemType 
== PageItem::Arc)
+       if (itemType == PageItem::Polygon || itemType == PageItem::PolyLine || 
itemType == PageItem::Spiral || itemType == PageItem::RegularPolygon || 
itemType == PageItem::Arc)
        {
                newItem->PLineArt = 
Qt::PenStyle(m_docPrefsData.itemToolPrefs.shapeLineStyle);
                
newItem->setFillShade(m_docPrefsData.itemToolPrefs.shapeFillColorShade);
@@ -5511,6 +5511,8 @@
 
 int ScribusDoc::getItemNrfromUniqueID(uint unique)
 {
+       // FIXME : don't work for items inside groups
+       // Needs to fix group/ungroup undo first
        int ret = 0;
        for (int i = 0; i < Items->count(); ++i)
        {
@@ -5525,13 +5527,13 @@
 
 PageItem* ScribusDoc::getItemFromName(const QString& name) const
 {
-       PageItem* ret = nullptr;
-       for (int i = 0; i < Items->count(); ++i)
-       {
-               if (Items->at(i)->itemName() == name)
-                       return Items->at(i);
-       }
-       return ret;
+       PageItemIterator it(*Items, PageItemIterator::IterateInGroups);
+       for (PageItem* currItem = *it; currItem != nullptr; currItem = 
it.next())
+       {
+               if (currItem->itemName() == name)
+                       return currItem;
+       }
+       return nullptr;
 }
 
 void ScribusDoc::rebuildItemLists()
@@ -16708,25 +16710,29 @@
        return newNote;
 }
 
-PageItem* ScribusDoc::findMarkItem(const Mark* mrk, int &lastItem) const
-{
-       PageItem* item = nullptr;
-       for (int i = lastItem + 1; i < DocItems.count(); ++i)
-       {
-               item = DocItems.at(i);
+PageItem* ScribusDoc::findMarkItem(const Mark* mrk, PageItem* &lastItem) const
+{
+       PageItemIterator it(DocItems, PageItemIterator::IterateInGroups);
+       if (lastItem != nullptr)
+               it.movePast(lastItem);
+
+       for (PageItem* item = *it;  item != nullptr; item = it.next())
+       {
                if (!item || !item->isTextFrame() || (item->itemText.length() 
<= 0))
+                       continue;
+               if (item->prevInChain() != nullptr)
                        continue;
        //      for (int j = item->firstInFrame(); j <= item->lastInFrame(); 
++j)
                for (int j = 0; j < item->itemText.length(); ++j)
                {
                        if (item->itemText.hasMark(j, mrk))
                        {
-                               lastItem = i;
+                               lastItem = item;
                                return item;
                        }
                }
        }
-       lastItem = 0;
+       lastItem = nullptr;
        return nullptr;
 }
 
@@ -16736,7 +16742,8 @@
                currItem = findFirstMarkItem(mrk);
        if (currItem == nullptr)
        {
-               for (PageItem* item : DocItems)
+               PageItemIterator it(DocItems, 
PageItemIterator::IterateInGroups);
+               for (PageItem* item = *it;  item != nullptr; item = it.next())
                {
                        if (!item->isTextFrame() || (item->prevInChain() != 
nullptr))
                                continue;
@@ -16757,26 +16764,21 @@
 
 bool ScribusDoc::isMarkUsed(const Mark* mrk, bool visible) const
 {
-       for (const PageItem* currItem : qAsConst(DocItems))
-       {
-               if (currItem->isTextFrame() && (currItem->itemText.length() > 
0))
-               {
-                       if (!visible && currItem->prevInChain() != nullptr)
-                               //check in whole itemText only for first frames 
in chain
-                               continue;
-                       int i = 0;
-                       int end = currItem->itemText.length();
-                       if (visible)
-                       {
-                               //search only in visible text
-                               i = currItem->firstInFrame();
-                               end = currItem->lastInFrame() +1;
-                       }
-                       for (; i < end; ++i)
-                       {
-                               if (currItem->itemText.hasMark(i, mrk))
-                                       return true;
-                       }
+       PageItemIterator it(DocItems, PageItemIterator::IterateInGroups);
+       for (PageItem* currItem = *it;  currItem != nullptr; currItem = 
it.next())
+       {
+               if (!currItem->isTextFrame() || (currItem->itemText.length() <= 
0))
+                       continue;
+               // Check in whole itemText only for first frames in chain
+               if (!visible && currItem->prevInChain() != nullptr)
+                       continue;
+
+               int i = visible ? currItem->firstInFrame() : 0;
+               int end = visible ? (currItem->lastInFrame() + 1) : 
currItem->itemText.length();
+               for (; i < end; ++i)
+               {
+                       if (currItem->itemText.hasMark(i, mrk))
+                               return true;
                }
        }
        return false;
@@ -16826,8 +16828,8 @@
                {
                        //find and delete all mark`s apperences in text
                        int markPos = -1;
-                       int itemIndex = -1;
-                       item = findMarkItem(mrk, itemIndex);
+                       PageItem* lastItem = nullptr;
+                       item = findMarkItem(mrk, lastItem);
                        while (item != nullptr)
                        {
                                markPos = findMarkCPos(mrk, item);
@@ -16838,7 +16840,7 @@
                                }
                                found = true;
                                item->asTextFrame()->invalidateLayout(false);
-                               item = findMarkItem(mrk, itemIndex);
+                               item = findMarkItem(mrk, lastItem);
                        }
                }
        }
@@ -16901,9 +16903,9 @@
                {
                        ims->set("MARK", QString("delNonUnique"));
                        int markPos = -1;
-                       int itemIndex = -1;
+                       PageItem* lastItem = nullptr;
                        //find all mark insertions
-                       PageItem* item = findMarkItem(mrk, itemIndex);
+                       PageItem* item = findMarkItem(mrk, lastItem);
                        while (item != nullptr)
                        {
                                int num = 0; //shift of insertion position for 
undo
@@ -16914,7 +16916,7 @@
                                        //++num;
                                        markPos = findMarkCPos(mrk, item, 
markPos + 1);
                                }
-                               item = findMarkItem(mrk, itemIndex);
+                               item = findMarkItem(mrk, lastItem);
                        }
                }
                ims->set("ETEA", mrk->label);
@@ -16929,16 +16931,16 @@
 {
        if (!mrk->isType(MARKVariableTextType))
                return false;
-       int itemNo = -1;
        bool found = false;
-       PageItem* mItem = findMarkItem(mrk, itemNo);
+       PageItem* lastItem = nullptr;
+       PageItem* mItem = findMarkItem(mrk, lastItem);
        while (mItem != nullptr)
        {
                found = true;
                mItem->asTextFrame()->invalidateLayout(false);
                if (forceUpdate)
                        mItem->layout();
-               mItem = findMarkItem(mrk, itemNo);
+               mItem = findMarkItem(mrk, lastItem);
        }
        return found;
 }

Modified: trunk/Scribus/scribus/scribusdoc.h
URL: 
http://scribus.net/websvn/diff.php?repname=Scribus&rev=23968&path=/trunk/Scribus/scribus/scribusdoc.h
==============================================================================
--- trunk/Scribus/scribus/scribusdoc.h  (original)
+++ trunk/Scribus/scribus/scribusdoc.h  Thu Jul 30 19:44:38 2020
@@ -1819,13 +1819,13 @@
        QList<PageItem_NoteFrame*> m_docEndNotesFramesChanged;
 
        //finds item which holds given mark, start searching from next to 
lastItem index in DocItems
-       PageItem* findMarkItem(const Mark* mrk, int &lastItem) const;
+       PageItem* findMarkItem(const Mark* mrk, PageItem* &lastItem) const;
        
 private:
        //QMap<PageItem_NoteFrame*, QList<TextNote *> > map of notesframes and 
its list of notes
        NotesInFrameMap m_docNotesInFrameMap;
 
-       PageItem* findFirstMarkItem(const Mark* mrk) const { int tmp = -1; 
return findMarkItem(mrk, tmp); }
+       PageItem* findFirstMarkItem(const Mark* mrk) const { PageItem* tmp = 
nullptr; return findMarkItem(mrk, tmp); }
 
        //search for endnotesframe for given notes style and item holding 
master mark or section number
        PageItem_NoteFrame* endNoteFrame(NotesStyle* nStyle, void* item = 
nullptr);


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

Reply via email to