[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#775114: [libkdeui5] KRecursiveFilterProxyModel: The model was not working properly



Package: libkdeui5
Version: 4:4.14.2-4
Severity: important
Tags: patch

While testing the new kontact, we found a bug in kdeui, that makes randomly 
crash kmail,kaddressbook while starting. We created an patch [0] to solve this 
problem. It would be great if that patch can be part of the stable relase of 
debian. For us it would make our life easier to to ship kdelibs on our own.

If there is anything I can do making this patch entering debian, please give 
me feedback.

Regads,

sandro

[0] https://github.com/kolab-groupware/kdelibs/commit/42bd1a3e7af9d896c5c3f697a23bd7ed0b2314b8

The git commit message:

The model was not working properly and didn't include all items under
some circumstances.
This patch fixes the following scenarios in particular:

* The change in sourceDataChanged is required to fix the shortcut condition.
The idea is that if the parent is already part of the model (it must be if 
acceptRow returns true),
we can directly invoke dataChanged on the parent, resulting in the changed 
index
getting reevaluated. However, because the recursive filterAcceptsRow version 
was used
the shortcut was also used when only the current index matches the filter and
the parent index is in fact not yet in the model. In this case we failed to 
call
dataChanged on the right index and thus the complete branch was never added to 
the model.

* The change in refreshAscendantMapping is required to include indexes that 
were
included by descendants. The intended way how this was supposed to work is 
that we
traverse the tree upwards and find the last index that is not yet part of the 
model.
We would then call dataChanged on that index causing it and its descendants to 
get reevaluated.
However, acceptRow does not reflect wether an index is already in the model or 
not.
Consider the following model:

- A
  - B
    - C
    - D

If C is include in the model by default but D not and A & B only gets included 
due to C, we have the following model:
- A
  - B
    - C
    - D

If we then call refreshAscendantsMapping on D it will not consider B as 
already being part of the model.
This results in the toplevel index A being considered lastAscendant, and a 
call to dataChanged on A results in
a reevaluation of A only, which is already in the model. Thus D never gets 
added to the model.

Unfortunately there is no way to probe QSortFilterProxyModel for indexes that 
are
already part of the model. Even the const mapFromSource internally creates a 
mapping when called,
and thus instead of revealing indexes that are not yet part of the model, it 
silently
creates a mapping (without issuing the relevant signals!).

As the only possible workaround we have to issues dataChanged for all 
ancestors
which is ignored for indexes that are not yet mapped, and results in a 
rowsInserted
signal for the correct indexes. It also results in superfluous dataChanged 
signals,
since we don't know when to stop, but at least we have a properly behaving 
model
this way.
-- 
Sandro Knauß
Software Developer

Kolab Systems AG
Zürich, Switzerland

e: knauss@kolabsys.com
t: +41 43 501 66 91
w: http://kolabsys.com

pgp: CE81539E Sandro Knauß

Attachment: signature.asc
Description: This is a digitally signed message part.


Reply to: