https://bugs.kde.org/show_bug.cgi?id=438675

nttkde <watisthis...@outlook.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |watisthis...@outlook.com

--- Comment #3 from nttkde <watisthis...@outlook.com> ---
I took a quick look into this couple of months ago, and as far as I understand
it is indeed related to recycling of the placesitemlistwidget objects (which
happens only when part of the places panel is hidden - the scrollbar is there).
Take this with a grain of salt but hopefully it's at least somewhat
readable/helpful. (Zren has mostly seen this already.)



The capacity bar state (m_freeSpaceInfo & m_drawCapacityBar) is stored inside
placesitemlistwidgets and when the widget gets "recycled" into an other index
it still carries the old data with it. ResetCapacityBar() is not called during
recycling.

Other widget parameters are normally reset from
kitemlistview::updateWidgetProperties()
(or initializeItemListWidget) when recycle/reuse happens in
kitemlistview::doLayout().
(doLayout->createWidget->create->popRecycleableWidget and doLayout()
reusableitems [line 1761])

The setData() call in updateCapacityBar() resets widgets' other data but of
course doesn't affect the m_freeSpaceInfo/m_drawCapacityBar since those are
stored in the widget object.


((IIRC for testing purposes, if you create a method in *itemlistwidget classes
that gets called from updateWidgetProperties(), and overload it in
placesitemlistwidget so that it calls resetCapacityBar(), it should fix the
bug.))


First paint will use the wrong data but the next repaint after
updateCapacityBar makes the bar go away

except...



The more annoying aspect is that I can reproduce it on the disk devices too,
and when it appears on an unmounted device the bar won't go away at all in a
following repaint since then url.isEmpty() in placesitemlistwidget.cpp:60 just
returns without recalculating the bar.
('url' is stored in the "model" data externally, and becomes empty for an
unmounted device. 'udi' above exists for unmounted devices too).
Scrolling may make it go away if a different widget gets recycled on its place.

Thus moving the updateCapacityBar() call to the beginning of paint() won't fix
the bug for the disk device items.

----------------------------


If MVC model is to be followed, the placesitemlistwidget (kind of part of the
"view" here, isn't it?) has some tasks that should maybe be rather divided into
the model or controller.

If m_freeSpaceInfo and m_drawCapacityBar could be read and updated from data()
or something similar (from the model that doesn't get recycled) as eg. the url
is read, that would solve the problems, 
but currently there doesn't seem to be a way to access the model directly from
the placesitemlistwidget.

PlacesItemListWidget can only read data() and it's copied from the model to the
widget every time it's recycled/reused in the
updateWidgetProperties()->setData().

-- 
You are receiving this mail because:
You are watching all bug changes.

Reply via email to