Line 1: |
Line 1: |
| <noinclude> | | <noinclude> |
− | [[Category:Feature Page Incomplete]] | + | [[Category:FeatureLanded|Optimize TreeViews]] |
− | [[Category:Feature|.]]
| |
| </noinclude> | | </noinclude> |
| | | |
Line 14: |
Line 13: |
| | | |
| == Current status == | | == Current status == |
− | * Targeted release: 0.102 | + | * Targeted release: 0.104 |
− | * Last updated: Feb 24, 2014 | + | * Last updated: Nov 17, 2014 |
− | * Percentage of completion: 60% | + | * Percentage of completion: 90% |
| | | |
| == Detailed Description == | | == Detailed Description == |
Line 25: |
Line 24: |
| | | |
| * Sugar CellRendererIcon has too much logic inside. It should only handle how to render itself. | | * Sugar CellRendererIcon has too much logic inside. It should only handle how to render itself. |
| + | In particular, a CellRenderer is not a Widget, then do not have event to know when the mouse interact, |
| + | then needed attach to the events on the treeview [https://github.com/sugarlabs/sugar-toolkit-gtk3/blob/master/src/sugar3/graphics/icon.py#L826] |
| | | |
| * Sugar CellRendererIcon is connected to many signals. Just detaching them while scrolling provides a performance boost. | | * Sugar CellRendererIcon is connected to many signals. Just detaching them while scrolling provides a performance boost. |
Line 30: |
Line 31: |
| * Sugar CellRendererIcon could benefit from caching values instead of calculating them on each render. | | * Sugar CellRendererIcon could benefit from caching values instead of calculating them on each render. |
| | | |
− | We couldn't find what's wrong with the Journal. We guess there is a DBus blocking call, but we could't confirm that.
| + | * There are a additional block in the Journal. That is not addressed by this feature, we guess there is a DBus blocking call, |
| + | but we could't confirm that. |
| + | |
| + | === Implementation === |
| + | |
| + | * ScrollingDetector: A new class ScrollingDetector allow simplify slow operations while the treeview is scrolling. |
| + | To use it, just do: |
| + | |
| + | scrolling_detector = ScrollingDetector(self._scrolled_window) |
| + | scrolling_detector.connect_treeview(self._tree_view) |
| + | |
| + | * CellRendererIcon changes: |
| + | |
| + | The CellRendererIcon is not a widget, then, do not receive events when the mouse |
| + | enter or leaves, and all the logic in the CellRendererInvoker is more complex than should be. |
| + | Worst, we had 6 different CellRendererIcons in the Journal, then we simplified (and solved issues) implementing a |
| + | TreeViewInvoker. The TreeView knows where is every cell then the code is much more simple. |
| + | |
| + | The ObjectPalettes was created in the mouse enter callback, then if a user moved |
| + | the mouse cursor over the activity icons, many palettes were created, and that palette creation is expensive [http://bugs.sugarlabs.org/ticket/4343]. |
| + | Moving the palette creation to the treeview, we can create the palette when the mouse was in a cell for a specified timeout and not before. |
| | | |
| === GTK+ concepts === | | === GTK+ concepts === |
Line 39: |
Line 60: |
| | | |
| * GtkCellRenderer — An object for rendering a single cell https://developer.gnome.org/gtk3/stable/GtkCellRenderer | | * GtkCellRenderer — An object for rendering a single cell https://developer.gnome.org/gtk3/stable/GtkCellRenderer |
− |
| |
| | | |
| == Benefit to Sugar == | | == Benefit to Sugar == |
Line 51: |
Line 71: |
| | | |
| == How To Test == | | == How To Test == |
− | We did a test program that has a list (treeview) with many rows. Each row has a cellrenderer icon. The program automatically starts scrolling until the end of the list is reached. Then we can get profiling information using Python cProfile http://docs.python.org/2/library/profile.html . We ran the test like this inside a Sugar shell:
| |
| | | |
− | python -m cProfile test_treeview.py > profile.txt | + | To test the changes in the journal we used a python program to start the journal window from a terminal. |
| + | You can download it here [http://dev.laptop.org/~gonzalo/start_journal.py] |
| + | |
| + | To use it do: |
| + | |
| + | python -m cProfile start_journal.py > profile.txt |
| + | |
| + | After run it in a Sugar terminal, the view jump to the Home, but in the frame you can see two journal icons. |
| + | The second is the profiled version. In the toolbar have a Stop button. |
| + | After stop, you can check the profile.txt file. |
| | | |
| == User Experience == | | == User Experience == |
Line 72: |
Line 100: |
| == Comments and Discussion == | | == Comments and Discussion == |
| Your comments are very welcome. Please discuss through the mailing list. | | Your comments are very welcome. Please discuss through the mailing list. |
| + | |
| + | The initial announcement in the mailing list is here [http://lists.sugarlabs.org/archive/sugar-devel/2014-February/047236.html] |