nullPointer a écrit :
I´m continue working on that widget. Now works in design time, integrated in UIBuilder tool.
Adding rows -> http://www.youtube.com/watch?v=Dt0yz0JyBCg
Master detail -> http://www.youtube.com/watch?v=FTW9Byqdgbk
very cool work
My main problem now is the speed. Is very very slow; one minute is needed for load 5000 rows (!!!)
well, not so bad! 5000 rows means a lot of data, maybe Morphic is not the good ui framework for applications that manage such amount of data, at least in its current state. It seems that you're using the stepping mechanism, it is time consuming. also the layout managing and invalid areas redrawing. Cheers Alain
With MessageTally I see the next response...
- 81732 tallies, 82014 msec.
**Tree** -------------------------------- Process: (40s) 3296: nil -------------------------------- 50.3% {41253ms} CLGrid>>dataSource: 44.5% {36496ms} CLGrid>>addRow |21.7% {17797ms} CLScrollPanelContainer(Morph)>>addMorphBack: | |21.7% {17797ms} CLScrollPanelContainer(CLPanel)>>privateAddMorph:atIndex: | | 21.6% {17715ms} CLScrollPanelContainer(Morph)>>privateAddMorph:atIndex: | | 13.8% {11318ms} CLScrollPanelContainer(Morph)>>privateInvalidateMorph: | | |13.5% {11072ms} CLGridRow(Morph)>>fullBounds | | | 13.5% {11072ms} CLGridRow(Morph)>>doLayoutIn: | | | 8.6% {7053ms} TableLayout>>layout:in: | | | |8.6% {7053ms} TableLayout>>layoutLeftToRight:in: | | | | 5.8% {4757ms} CLGridCell(Morph)>>layoutInBounds: | | | | |5.3% {4347ms} CLGridCell(Morph)>>bounds: | | | | | 2.6% {2132ms} CLGridCell(Morph)>>position: | | | | | |1.5% {1230ms} CLGridCell(Morph)>>invalidRect: | | | | | | 1.5% {1230ms} CLGridCell(Morph)>>invalidRect:from: | | | | | | 1.5% {1230ms} CLGridRow(Morph)>>invalidRect:from: | | | | | | 1.1% {902ms} CLScrollPanelContainer(Morph)>>invalidRect:from: | | | | | 2.6% {2132ms} CLGridCell>>extent: | | | | | 2.4% {1968ms} CLGridCell(Morph)>>extent: | | | | | 1.6% {1312ms} CLGridCell(Morph)>>changed | | | | 2.7% {2214ms} CLGridCell(Morph)>>minExtent | | | 4.2% {3445ms} CLGridRow(Morph)>>adjustLayoutBounds | | | 3.9% {3199ms} CLGridRow(Morph)>>submorphBounds | | | 3.9% {3199ms} CLGridCell(Morph)>>fullBounds | | | 3.6% {2953ms} CLGridCell(Morph)>>doLayoutIn: | | | 2.0% {1640ms} TableLayout>>layout:in: | | | 1.8% {1476ms} TableLayout>>layoutTopToBottom:in: | | 7.7% {6315ms} CLGridRow(Morph)>>intoWorld: | | 7.7% {6315ms} CLGridCell(Morph)>>intoWorld: | | 7.6% {6233ms} CLCheckButton(Morph)>>intoWorld: | | 7.4% {6069ms} PasteUpMorph>>startStepping: | | 7.4% {6069ms} PasteUpMorph>>startStepping:at:selector:arguments:stepTime: | | 7.4% {6069ms} WorldState>>startStepping:at:selector:arguments:stepTime: | | 7.4% {6069ms} WorldState>>stopStepping:selector: | | 5.8% {4757ms} Heap(SequenceableCollection)>>select: | | |3.9% {3199ms} Heap>>at: | | |1.8% {1476ms} primitives | | 1.6% {1312ms} primitives |14.8% {12138ms} CLGridRow>>buildCellsStructureFrom: | |14.8% {12138ms} CLGridRow>>addCell: | | 14.8% {12138ms} CLGridRow>>pvtAddCell:ofType: | | 5.7% {4675ms} CLGridCell>>setColumn: | | |5.7% {4675ms} CLGridCell>>pvtBuildValueControl | | | 3.0% {2460ms} CLLabel class(Behavior)>>new | | | 2.0% {1640ms} CLCheckButton(CheckboxButtonMorph)>>initialize | | | |1.1% {902ms} CLCheckButton>>enabled: | | | | 1.1% {902ms} CLCheckButton(CheckboxButtonMorph)>>enabled: | | | 1.0% {820ms} CLLabel>>initialize | | 4.0% {3281ms} CLGridCell class(Behavior)>>new | | |4.0% {3281ms} CLGridCell>>initialize | | 2.4% {1968ms} CLGridCell(Morph)>>width: | | |2.4% {1968ms} CLGridCell>>extent: | | | 2.1% {1722ms} CLGridCell(Morph)>>extent: | | | 1.9% {1558ms} CLGridCell(Morph)>>changed | | | 1.4% {1148ms} CLGridCell(Morph)>>privateFullBounds | | 1.4% {1148ms} CLGridCell(Morph)>>borderColor: | | 1.3% {1066ms} CLGridCell(Morph)>>changed | | 1.3% {1066ms} CLGridCell(Morph)>>privateFullBounds |5.4% {4429ms} CLGridRow(CLPanel)>>color: | |5.4% {4429ms} CLGridRow(Morph)>>color: | | 5.4% {4429ms} CLGridRow(Morph)>>changed | | 5.4% {4429ms} CLGridRow(Morph)>>privateFullBounds | | 5.2% {4265ms} CLGridRow(Morph)>>submorphBounds | | 5.2% {4265ms} CLGridCell(Morph)>>fullBounds | | 4.8% {3937ms} CLGridCell(Morph)>>doLayoutIn: | | 3.3% {2706ms} TableLayout>>layout:in: | | 3.1% {2542ms} TableLayout>>layoutTopToBottom:in: | | 1.8% {1476ms} CLLabel(Morph)>>layoutInBounds: |1.3% {1066ms} CLGridRow class(Behavior)>>new | 1.3% {1066ms} CLGridRow>>initialize 5.6% {4593ms} CLGridRow>>listObject: 5.4% {4429ms} CLGridCell>>value: 4.3% {3527ms} CLLabel>>value: |4.3% {3527ms} CLLabel>>text: | 4.3% {3527ms} CLLabel(StringMorph)>>contents: | 4.3% {3527ms} CLLabel(StringMorph)>>fitContents | 4.1% {3363ms} CLLabel>>extent: | 4.0% {3281ms} CLLabel(Morph)>>extent: | 3.4% {2788ms} CLLabel(Morph)>>changed | 3.2% {2624ms} CLLabel(Morph)>>invalidRect: | 3.2% {2624ms} CLLabel(Morph)>>invalidRect:from: | 3.1% {2542ms} CLGridCell(Morph)>>invalidRect:from: | 2.7% {2214ms} CLGridRow(Morph)>>invalidRect:from: | 2.4% {1968ms} CLScrollPanelContainer(Morph)>>invalidRect:from: | 2.2% {1804ms} TransformMorph>>invalidRect:from: | 1.4% {1148ms} TransformMorph(Morph)>>invalidRect:from: | 1.4% {1148ms} CLScrollpanel(Morph)>>invalidRect:from: | 1.2% {984ms} CLGrid(Morph)>>invalidRect:from: 1.1% {902ms} CLCheckButton>>value: 1.1% {902ms} CLCheckButton(CheckboxButtonMorph)>>state: 30.5% {25014ms} CLGrid(Morph)>>openInWindowLabeled: 30.5% {25014ms} CLGrid(Morph)>>openInWindowLabeled:inWorld: 15.5% {12712ms} PasteUpMorph(Morph)>>addMorph: |15.5% {12712ms} PasteUpMorph>>addMorphFront: | 15.5% {12712ms} PasteUpMorph(Morph)>>addMorphInFrontOfLayer: | 15.5% {12712ms} PasteUpMorph(Morph)>>addMorph:inFrontOf: | 15.5% {12712ms} PasteUpMorph(Morph)>>privateAddMorph:atIndex: | 15.5% {12712ms} SystemWindow(Morph)>>intoWorld: | 15.5% {12712ms} CLGrid(Morph)>>intoWorld: | 15.5% {12712ms} CLGridRowHeader(Morph)>>intoWorld: | 15.5% {12712ms} CLGridCellHeader(Morph)>>intoWorld: | 15.5% {12712ms} CLScrollPanelContainer(Morph)>>intoWorld: | 15.5% {12712ms} CLGridRow(Morph)>>intoWorld: | 15.4% {12630ms} CLGridCell(Morph)>>intoWorld: | 15.4% {12630ms} CLCheckButton(Morph)>>intoWorld: | 15.3% {12548ms} PasteUpMorph>>startStepping: | 15.3% {12548ms} PasteUpMorph>>startStepping:at:selector:arguments:stepTime: | 15.3% {12548ms} WorldState>>startStepping:at:selector:arguments:stepTime: | 15.3% {12548ms} WorldState>>stopStepping:selector: | 9.1% {7463ms} Heap(SequenceableCollection)>>select: | |6.4% {5249ms} Heap>>at: | |2.7% {2214ms} primitives | 3.4% {2788ms} Heap(Collection)>>removeAll: | |3.4% {2788ms} Heap(Collection)>>remove: | | 3.4% {2788ms} Heap>>remove:ifAbsent: | | 1.7% {1394ms} StepMessage(MessageSend)>>= | | |1.7% {1394ms} primitives | | 1.7% {1394ms} primitives | 2.8% {2296ms} primitives 14.8% {12138ms} PasteUpMorph>>startSteppingSubmorphsOf: 14.6% {11974ms} CLCheckButton(Morph)>>arrangeToStartSteppingIn: 14.4% {11810ms} PasteUpMorph>>startStepping: 14.4% {11810ms} PasteUpMorph>>startStepping:at:selector:arguments:stepTime: 14.4% {11810ms} WorldState>>startStepping:at:selector:arguments:stepTime: 14.4% {11810ms} WorldState>>stopStepping:selector: 9.1% {7463ms} Heap(SequenceableCollection)>>select: |6.5% {5331ms} Heap>>at: |2.5% {2050ms} primitives 2.9% {2378ms} Heap(Collection)>>removeAll: |2.9% {2378ms} Heap(Collection)>>remove: | 2.9% {2378ms} Heap>>remove:ifAbsent: | 1.5% {1230ms} primitives | 1.4% {1148ms} StepMessage(MessageSend)>>= 2.4% {1968ms} primitives 7.9% {6479ms} CLGrid>>relocatePanels 7.9% {6479ms} CLScrollPanelContainer(Morph)>>position: 7.4% {6069ms} CLScrollPanelContainer(Morph)>>fullBounds 7.4% {6069ms} CLScrollPanelContainer(Morph)>>doLayoutIn: 7.4% {6069ms} TableLayout>>layout:in: 7.4% {6069ms} TableLayout>>layoutTopToBottom:in: 4.3% {3527ms} CLGridRow(Morph)>>minExtent |4.1% {3363ms} TableLayout>>minExtentOf:in: | 4.1% {3363ms} TableLayout>>minExtentHorizontal: | 4.0% {3281ms} CLGridCell(Morph)>>minExtent | 1.9% {1558ms} CLGridCell(Morph)>>fullBounds | |1.8% {1476ms} CLGridCell(Morph)>>doLayoutIn: | 1.3% {1066ms} TableLayout>>minExtentOf:in: | 1.2% {984ms} TableLayout>>minExtentVertical: | 1.1% {902ms} CLLabel(Morph)>>minExtent 3.1% {2542ms} CLGridRow(Morph)>>layoutInBounds: 2.4% {1968ms} CLGridRow(Morph)>>doLayoutIn: 1.9% {1558ms} TableLayout>>layout:in: 1.9% {1558ms} TableLayout>>layoutLeftToRight:in: 1.7% {1394ms} CLGridCell(Morph)>>minExtent
**Leaves** 16.8% {13778ms} Heap>>at: 7.0% {5741ms} WeakActionSequence(SequenceableCollection)>>select: 6.9% {5659ms} Array(SequenceableCollection)>>identityIndexOf:ifAbsent: 6.8% {5577ms} WorldState>>stopStepping:selector: 3.7% {3035ms} Array(SequenceableCollection)>>identityIndexOf: 3.3% {2706ms} SmallIdentityDictionary(SmallDictionary)>>at:ifAbsent: 3.3% {2706ms} MorphExtension>>valueOfProperty:ifAbsent: 3.2% {2624ms} Heap>>remove:ifAbsent: 3.1% {2542ms} StepMessage(MessageSend)>>= 2.4% {1968ms} SmallIdentityDictionary>>findIndexForKey: 1.7% {1394ms} Rectangle>>setOrigin:corner: 1.6% {1312ms} Point>>+ 1.6% {1312ms} Rectangle class>>origin:corner: 1.4% {1148ms} RectangleMorph(Morph)>>valueOfProperty:ifAbsent: 1.3% {1066ms} Point>>-
**Memory** old +20,789,788 bytes young +112,272 bytes used +20,902,060 bytes free -1,073,416 bytes
**GCs** full 2 totalling 495ms (1.0% uptime), avg 248.0ms incr 45275 totalling 15,800ms (19.0% uptime), avg 0.0ms tenures 715 (avg 63 GCs/tenure) root table 0 overflows
Perhaps I don´t interpret correctly that result. I understand than the more slow is the UI actions, when I add the cells in each row ( #buildCellsStructure ). Exists some way for accelerate the UI moves? Is possible stop the morphs events and only restart when is all builded?
I did try reduce the slow sensation loading the rows in another thread (#fork), but the UI crushes, and appears a red rectangle with a yellow cross. Exists some way for use work with UI in another threads?
Regards