[Kde-pim] Re: State of KReparentingProxymodel

Stephen Kelly steveire at gmail.com
Sat Dec 4 18:36:47 GMT 2010


Christian Mollekopf wrote:

> On Wednesday 10 November 2010 14:04:45 Stephen Kelly wrote:
>> Christian Mollekopf wrote:
>> > Hi,
>> > 
>> > I need to create a treemodel based on the hierarchy of kcalendar todos,
>> > in the same model i have also other items (notes), which should be left
>> > flat.
>> > 
>> > I found KReparentingProxymodel to be exactly what i need, but i wonder
>> > in what state this class is considered. It is not working for me (even
>> > the simplest case, to not build any hierarchy with a flat
>> > kdescendantsproxymodel as input), but i havent been looking into it
>> > yet.
>> > 
>> > I copied the class from kdelibs/kdeui/tests/proxymodeltestapp/ as it
>> > seems to be newer than the one in akonadi_next.
>> > 
>> > If you tell me that this is the latest version, i will start looking
>> > into it.
>> 
>> Hi Chris,
>> 
>> The current state of that class is 'highly experimental'. It can be used
>> for demos, but I know it has some bugs that I'm not certain how should be
>> solved (mostly around new intermediate nodes arriving), but I haven't had
>> time to work on it in a long time.
>> 
>> It looks like the version in proxymodeltestapp is slightly more up to
>> date, but I also noticed a difference wrt mapToSource in the akonadi_next
>> version which should maybe be in the class.
>> 
>> It is surprising that it doesn't work for you in even the simplest case.
>> Did you try running the proxymodeltestapp and trying the 'reparenting PM'
>> tab? That works for me.
>> 
>> All the best,
>> 
>> Steve.
> 
> Hi Steve,
> 
> Sorry for the late reply, I just found your mail, I missed it on the ML =/
> 
> I got it working basically, although not all items are correctly mapped.
> 
> I think the cause for the incorrectly mapped items is in
> KReparentingProxyModel::recreateMappings().
> The qLowerBound algorithm works only as long, as the items in the model
> are already in the correct order according to the targeted tree structure.
> 
> Since we have several items which are on the same level (of tree nesting),
> it is possible that the right parent node is missed and only a remote
> parent node is found.
> 
> Testcase, specified parents, proxmodeltestapp:
> [1, 2],
> [1, 2,3],
> [1, 2, 4],
> [1, 5],
> [1, 2, 6],
> 
> which should add 6 in tree below 2 (just after 4),
> but instead adds it to 1 (after 5).

Thanks for investigating, and for the testcase. I'll keep that in mind when 
I review this class again. I don't have time to try out your testcase this 
evening.

> 
> The second problem is that all slots are in the private class:
> 
> In my subclass i need to build a tree of all items, so i can tell if an
> item is a remote descendant of the given ancestor (otherwise i would have
> go trough
> all sourcemodel items in  each call of isDescendantOf).
> 
> I.e. if the model is reset, i need to rebuild the tree in my subclass
> before endResetProxy rebuilds the internal map. Same for new items which
> are added etc.

For resetting, Qt 4.8 will have a pseudo-virtual slot which you can 
implement for when the proxy is reset:

void resetInternalData();

http://qt.gitorious.org/qt/qt/merge_requests/694

For Qt earlier than 4.8 the workaround is connecting your own slot at the 
correct point of a setSourceModel reimplementation. See the unit test in the 
MR for more details.

> Therfore i propose to make all those private slots protected virtual
> slots.

I think this should be avoided because it exposes too much API which really 
should be internal.

I do see though why you need to update your mappings when source items are 
inserted, moved or removed. We can probably add API specifically for that 
purpose.

> 
> I'll provide a patch for both issues, but i don't know on which version of
> kreparentingproxymodel i should work. Atm. I work on the version in
> kdelibs/kdeui/tests/proxymodeltestapp so i can check the test, but as it
> is not installed, i build it directly in my app where i use it...
> 
> The version in akonadi_next would be installed, but then i can not test it
> with proxymodeltestapp, so I'm not sure what to do...

One option would be to locally link your proxymodeltestapp to akonadi_next. 
As long as akonadi_next is already installed, that should work (although 
akonadi_next doesn't install any headers, so you'd probably have to hack 
that too).

Can I ask what your use-case for this proxy is?

All the best,

Steve.

> 
> 
> Thanks for you help,
> 
> Chris
> 
>> 
>> > Cheers,
>> > 
>> > Chris
>> > _______________________________________________
>> > KDE PIM mailing list kde-pim at kde.org
>> > https://mail.kde.org/mailman/listinfo/kde-pim
>> > KDE PIM home page at http://pim.kde.org/
>> 
>> _______________________________________________
>> KDE PIM mailing list kde-pim at kde.org
>> https://mail.kde.org/mailman/listinfo/kde-pim
>> KDE PIM home page at http://pim.kde.org/
> _______________________________________________
> KDE PIM mailing list kde-pim at kde.org
> https://mail.kde.org/mailman/listinfo/kde-pim
> KDE PIM home page at http://pim.kde.org/


_______________________________________________
KDE PIM mailing list kde-pim at kde.org
https://mail.kde.org/mailman/listinfo/kde-pim
KDE PIM home page at http://pim.kde.org/



More information about the kde-pim mailing list