[prev in list] [next in list] [prev in thread] [next in thread]
List: koffice-devel
Subject: Re: review (flake)
From: Thorsten Zachmann <t.zachmann () zagge ! de>
Date: 2009-11-03 4:48:26
Message-ID: 200911030548.26808.t.zachmann () zagge ! de
[Download RAW message or body]
On Mon November 2 2009, Thomas Zander wrote:
> On Friday 30. October 2009 06.30.37 Thorsten Zachmann wrote:
> > On Thu October 29 2009, Thomas Zander wrote:
> > > could someone please review r1042478 for backporting?
> > >
> > > On add/remove shape make sure we do collision detection
> > > BUG:185342
> > >
> > >
> > > void KoShapeManager::addAdditional(KoShape *shape)
> > > @@ -218,6 +219,8 @@
> > >
> > > void KoShapeManager::remove(KoShape *shape)
> > > {
> > > + notifyShapeChanged(shape);
> > > + d->updateTree();
> >
> > This does do some unnecessary stuff like adding removing the the shape
> > from the tree, and does the shape collision detection twice which is not
> > needed when removing a shape.
>
> I am not sure what you are referring to here, the
> KoShapeManager::Private::updateTree method is only called once inside the
> remove() method.
> I can't see anything being done twice or unnecessary.
The stuff done twice and unnecessary is inside the updateTree method. There 2
times the collision detection is done and also an update of the tree. That is
not necessary when a shape is removed. One collision detection is enough
> > How about not calling updateTree but instead a function that does one
> > shape collision detection when a shape is removed? This will also avoid
> > calling update tree for every shape removed which is wrong as updateTree
> > is specially there to handle aggregated updates of shapes which is
> > circumvented by the patch.
>
> I don't see what difference that would make.
> Calling updateTree 10 times in a row doesn't do more work, the list of
> aggregated shapes doesn't get bigger.
> We need to do the calculation before the remove() returns as the shape will
> likely be deleted later.
Shapes can get notified multiple times when it is done this way which does not
happen when it is called only ones.
>
> I don't see how we could make the patch better.
> If you see it, please let me know.
If you make the DetectCollision accessible inside the KoShapeManager you can
use that directly in remove.
> If you don't have time, would you see any problem with me backporting the
> fix? It solving an often reported user problem that I'd like to see solved
> in 2.1-final.
I have created a patch against head that does what I described above. What do
you think?
Thorsten
["shape_manager.diff" (text/x-patch)]
Index: KoShapeManager.cpp
===================================================================
--- KoShapeManager.cpp (revision 1043217)
+++ KoShapeManager.cpp (working copy)
@@ -65,20 +65,6 @@ public:
*/
void updateTree();
- QList<KoShape *> shapes;
- QList<KoShape *> additionalShapes; // these are shapes that are only handled for updates
- KoSelection * selection;
- KoCanvasBase * canvas;
- KoRTree<KoShape *> tree;
- QSet<KoShape *> aggregate4update;
- QHash<KoShape*, int> shapeIndexesBeforeUpdate;
- KoShapeManagerPaintingStrategy * strategy;
- KoShapeManager *q;
-};
-
-void KoShapeManager::Private::updateTree()
-{
- // for detecting collisions between shapes.
class DetectCollision
{
public:
@@ -88,8 +74,10 @@ void KoShapeManager::Private::updateTree
bool isChild = false;
KoShapeContainer *parent = s->parent();
while (parent && !isChild) {
- if (parent == shape)
+ if (parent == shape) {
isChild = true;
+ break;
+ }
parent = parent->parent();
}
if (isChild)
@@ -110,6 +98,21 @@ void KoShapeManager::Private::updateTree
private:
QList<KoShape*> shapesWithCollisionDetection;
};
+
+ QList<KoShape *> shapes;
+ QList<KoShape *> additionalShapes; // these are shapes that are only handled for updates
+ KoSelection * selection;
+ KoCanvasBase * canvas;
+ KoRTree<KoShape *> tree;
+ QSet<KoShape *> aggregate4update;
+ QHash<KoShape*, int> shapeIndexesBeforeUpdate;
+ KoShapeManagerPaintingStrategy * strategy;
+ KoShapeManager *q;
+};
+
+void KoShapeManager::Private::updateTree()
+{
+ // for detecting collisions between shapes.
DetectCollision detector;
bool selectionModified = false;
foreach(KoShape *shape, aggregate4update) {
@@ -138,7 +141,6 @@ void KoShapeManager::Private::updateTree
}
}
-
KoShapeManager::KoShapeManager(KoCanvasBase *canvas, const QList<KoShape *> &shapes)
: d(new Private(this, canvas))
{
@@ -219,8 +221,10 @@ void KoShapeManager::addAdditional(KoSha
void KoShapeManager::remove(KoShape *shape)
{
- notifyShapeChanged(shape);
- d->updateTree();
+ Private::DetectCollision detector;
+ detector.detect(d->tree, shape, shape->zIndex());
+ detector.fireSignals();
+
shape->update();
shape->removeShapeManager(this);
d->selection->deselect(shape);
_______________________________________________
koffice-devel mailing list
koffice-devel@kde.org
https://mail.kde.org/mailman/listinfo/koffice-devel
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic