From d49190ea0979134b9934068916e2341f6c82d96f Mon Sep 17 00:00:00 2001 From: Soufyane Labsari <75275113+LABSARI@users.noreply.github.com> Date: Tue, 26 Sep 2023 16:19:39 +0200 Subject: [PATCH] Optimize expand all children. Was taking too much time. --- .../HExpandChildrenEvent.class.st | 8 +++++ src/Hierarchical-Model/HNode.class.st | 9 +++++- .../HExpandCanvasChildrenMenuItem.class.st | 2 +- .../HExportasPDF.class.st | 30 ------------------- .../HDefaultStyle.class.st | 1 + .../HSimpleVisualizationBuilder.class.st | 28 +++++++++++++---- .../RSCanvas.extension.st | 11 ------- 7 files changed, 40 insertions(+), 49 deletions(-) create mode 100644 src/Hierarchical-Model-Events/HExpandChildrenEvent.class.st delete mode 100644 src/Hierarchical-Roassal3-Menu/HExportasPDF.class.st delete mode 100644 src/Hierarchical-Roassal3/RSCanvas.extension.st diff --git a/src/Hierarchical-Model-Events/HExpandChildrenEvent.class.st b/src/Hierarchical-Model-Events/HExpandChildrenEvent.class.st new file mode 100644 index 0000000..f653915 --- /dev/null +++ b/src/Hierarchical-Model-Events/HExpandChildrenEvent.class.st @@ -0,0 +1,8 @@ +" +Event signaling that all chidren in the canvas. +" +Class { + #name : #HExpandChildrenEvent, + #superclass : #HEvent, + #category : #'Hierarchical-Model-Events' +} diff --git a/src/Hierarchical-Model/HNode.class.st b/src/Hierarchical-Model/HNode.class.st index 43ed05c..8514efb 100644 --- a/src/Hierarchical-Model/HNode.class.st +++ b/src/Hierarchical-Model/HNode.class.st @@ -269,7 +269,8 @@ HNode >> expand [ { #category : #public } HNode >> expandChildren [ - children do: [ :child | child expand ]. + children do: [ :child | child isExpanded: true ]. + self announce: HExpandChildrenEvent new ] { #category : #public } @@ -381,6 +382,12 @@ HNode >> isExpanded [ ^ isExpanded ] +{ #category : #testing } +HNode >> isExpanded: aBoolean [ + + isExpanded := aBoolean +] + { #category : #testing } HNode >> isLinksExpanded [ ^ isLinksExpanded diff --git a/src/Hierarchical-Roassal3-Menu/HExpandCanvasChildrenMenuItem.class.st b/src/Hierarchical-Roassal3-Menu/HExpandCanvasChildrenMenuItem.class.st index 1fc5d98..df99391 100644 --- a/src/Hierarchical-Roassal3-Menu/HExpandCanvasChildrenMenuItem.class.st +++ b/src/Hierarchical-Roassal3-Menu/HExpandCanvasChildrenMenuItem.class.st @@ -9,7 +9,7 @@ Class { { #category : #execution } HExpandCanvasChildrenMenuItem >> execute [ - visualization rootNode expandChildren + [visualization rootNode expandChildren] timeProfile ] { #category : #accessing } diff --git a/src/Hierarchical-Roassal3-Menu/HExportasPDF.class.st b/src/Hierarchical-Roassal3-Menu/HExportasPDF.class.st deleted file mode 100644 index 72cca18..0000000 --- a/src/Hierarchical-Roassal3-Menu/HExportasPDF.class.st +++ /dev/null @@ -1,30 +0,0 @@ -" -this menu item allows export to PDF -" -Class { - #name : #HCollapseCanvasChildrenMenuItem, - #superclass : #HCanvasMenuItem, - #category : #'Hierarchical-Roassal3-Menu' -} - - -{ #category : #execution } -HCollapseCanvasChildrenMenuItem >> execute [ - |destinationDir timestamp| - timestamp := DateAndTime now asUnixTime asString. - destinationDir := ('image', timestamp, '.pdf') asFileReference. - RSPDFCairoExporter new - canvas: visualization container; - exportToFile: destinationDir. - GrowlMorph openWithLabel: 'Information' contents: 'Saved ', destinationDir asAbsolute asString. -] - -{ #category : #accessing } -HCollapseCanvasChildrenMenuItem >> label [ - ^ 'Export as PDF' -] - -{ #category : #accessing } -HCollapseCanvasChildrenMenuItem >> order [ - ^ 1 -] \ No newline at end of file diff --git a/src/Hierarchical-Roassal3/HDefaultStyle.class.st b/src/Hierarchical-Roassal3/HDefaultStyle.class.st index c1dd69b..930774a 100644 --- a/src/Hierarchical-Roassal3/HDefaultStyle.class.st +++ b/src/Hierarchical-Roassal3/HDefaultStyle.class.st @@ -61,6 +61,7 @@ HDefaultStyle >> buildCompositeFullNodeIn: shape [ shape schildren: childrenShapes. childrenShapes do: [ :child | child sparent: shape ]. children := childrenShapes asShape padding: 10. + children useRTree. childrenShapes do: [ :child | child model position: child position ]. title width < children width ifTrue: [ diff --git a/src/Hierarchical-Roassal3/HSimpleVisualizationBuilder.class.st b/src/Hierarchical-Roassal3/HSimpleVisualizationBuilder.class.st index f054eb9..d87046d 100644 --- a/src/Hierarchical-Roassal3/HSimpleVisualizationBuilder.class.st +++ b/src/Hierarchical-Roassal3/HSimpleVisualizationBuilder.class.st @@ -277,6 +277,13 @@ HSimpleVisualizationBuilder >> elasticBoxFor: aRSCanvas [ ^ elastic ] +{ #category : #hooks } +HSimpleVisualizationBuilder >> expandChildren [ + + self container shapes do: #remove. + self renderIn: self container +] + { #category : #hooks } HSimpleVisualizationBuilder >> fixShadowForSelectedShape: shape and: newShape [ | canvas selectedShapes border | @@ -487,35 +494,44 @@ HSimpleVisualizationBuilder >> removeShapeWithAllChildren: shape [ ] -{ #category : #hooks } +{ #category : #rendering } HSimpleVisualizationBuilder >> renderIn: aCanvas [ | rootShapes | aCanvas color: Smalltalk ui theme backgroundColor. - + rootShapes := self childrenShapes: aCanvas. shapes := rootShapes flatCollect: [ :s | s withAllSChildren ]. self addInteractions: shapes. aCanvas schildren: rootShapes. aCanvas addAll: rootShapes. - aCanvas @ self menuInteraction. - rootNode when: HNodeAddedEvent send: #addNewNode: to: self. + + aCanvas useRTree. + (aCanvas hasInteraction: RSMenuActivable) ifFalse: [ + aCanvas @ self menuInteraction ]. + (aCanvas hasInteraction: self) ifFalse: [ + rootNode + when: HNodeAddedEvent send: #addNewNode: to: self; + when: HExpandChildrenEvent + do: [ :evt | self expandChildren ] + for: self] . self renderLinesIn: aCanvas. self layoutOn: rootShapes parent: rootNode ] { #category : #hooks } HSimpleVisualizationBuilder >> renderLinesIn: aCanvas [ + | announcer high | self lineBuilder canvas: aCanvas; shapes: shapes; - connectFromAll: #dependentsFromLinks. + connectFromAll: [ :n | n dependentsFromLinks ]. announcer := Announcer new. high := RSHighlightable red. high onShape: announcer. self menuInteraction onShape: announcer. - aCanvas lines do: [ :line| line announcer: announcer ]. + aCanvas lines do: [ :line | line announcer: announcer ] ] { #category : #accessing } diff --git a/src/Hierarchical-Roassal3/RSCanvas.extension.st b/src/Hierarchical-Roassal3/RSCanvas.extension.st deleted file mode 100644 index 9a560d8..0000000 --- a/src/Hierarchical-Roassal3/RSCanvas.extension.st +++ /dev/null @@ -1,11 +0,0 @@ -Extension { #name : #RSCanvas } - -{ #category : #'*Hierarchical-Roassal3' } -RSCanvas >> selectedShapes [ - ^ self propertyAt: #selectedShapes ifAbsent: [ #() ] -] - -{ #category : #'*Hierarchical-Roassal3' } -RSCanvas >> selectedShapes: aGroupOfShapes [ - self propertyAt: #selectedShapes put: aGroupOfShapes. -]