diff --git a/src/GToolkit-Pharo-Coder-UI/GtPharoBehaviorCoderElement.class.st b/src/GToolkit-Pharo-Coder-UI/GtPharoBehaviorCoderElement.class.st index c2399a1a..47625904 100644 --- a/src/GToolkit-Pharo-Coder-UI/GtPharoBehaviorCoderElement.class.st +++ b/src/GToolkit-Pharo-Coder-UI/GtPharoBehaviorCoderElement.class.st @@ -35,21 +35,12 @@ GtPharoBehaviorCoderElement >> actOnPackageUpdated: ann [ { #category : #callbacks } GtPharoBehaviorCoderElement >> actOnSelectMethod: aGtClassCoderMethodNavigationAnnouncement [ - | aMethod tab selectTabBlock selectMethodBlock | - + | aMethod aTask | aMethod := aGtClassCoderMethodNavigationAnnouncement method. - - tab := contentTabs viewModel tabs - detect: [ :each | each widget label asString = 'Methods' ] - ifNone: [ ^ self ]. - - tab isSelected - ifFalse: [ - selectTabBlock := [ tab select ]. - self executeTask: selectTabBlock ]. - - selectMethodBlock := [ self selectAndScrollToMethod: aMethod ]. - self executeTask: selectMethodBlock + aTask := GtPharoSelectAndScrollToMethodRepeatedTask new + method: aMethod; + contentTabs: contentTabs. + self enqueueTask: aTask. ] { #category : #accessing } @@ -269,18 +260,6 @@ GtPharoBehaviorCoderElement >> removeContentTabs [ contentTabs := nil ] ] -{ #category : #'updating ui' } -GtPharoBehaviorCoderElement >> selectAndScrollToMethod: aMethod [ - - contentTabs content - allChildrenBreadthFirstDetect: [ :eachElement | eachElement isKindOf: GtPharoStreamingMethodsCoderElement ] - ifFound: [ :theElement | - theElement streamingCodersViewModel - expandAndFocusCompiledMethod: aMethod; - scrollToCompiledMethod: aMethod ] - ifNone: [ "ignore" ] -] - { #category : #'building ui' } GtPharoBehaviorCoderElement >> streamingMethodCodersElement [ ^ contentTabs content diff --git a/src/GToolkit-Pharo-Coder-UI/GtPharoSelectAndScrollToMethodRepeatedTask.class.st b/src/GToolkit-Pharo-Coder-UI/GtPharoSelectAndScrollToMethodRepeatedTask.class.st new file mode 100644 index 00000000..7b6bc1ba --- /dev/null +++ b/src/GToolkit-Pharo-Coder-UI/GtPharoSelectAndScrollToMethodRepeatedTask.class.st @@ -0,0 +1,112 @@ +" +I wait for `Methods` tab provided by a given {{gtMethod: GtPharoSelectAndScrollToMethodRepeatedTask >> #contentTabs}}. +Then I wait for a {{gtClass:GtPharoStreamingMethodsCoderElement}} element. +Once that element is available, I expand, focus and scroll to a given {{gtMethod: GtPharoSelectAndScrollToMethodRepeatedTask>>#method | label=#selector}}. +I am used in {{gtMethod:GtPharoBehaviorCoderElement>>#actOnSelectMethod:}}. +" +Class { + #name : #GtPharoSelectAndScrollToMethodRepeatedTask, + #superclass : #BlRepeatedTask, + #instVars : [ + 'method', + 'contentTabs', + 'maxRepetitions', + 'counter' + ], + #category : #'GToolkit-Pharo-Coder-UI-Utilities' +} + +{ #category : #accessing } +GtPharoSelectAndScrollToMethodRepeatedTask >> contentTabs [ + + ^ contentTabs +] + +{ #category : #accessing } +GtPharoSelectAndScrollToMethodRepeatedTask >> contentTabs: aBrTabGroup [ + self + assert: [ aBrTabGroup isNotNil ] + description: [ 'Tab group must be non-nil' ]. + self + assert: [ contentTabs isNil ] + description: [ 'Tab group can be initialized only once' ]. + + contentTabs := aBrTabGroup +] + +{ #category : #initialization } +GtPharoSelectAndScrollToMethodRepeatedTask >> initialize [ + super initialize. + + "Wait delay * maxRepetitions time, + which is approximately 500ms * 144 = 72 seconds" + maxRepetitions := 144. + counter := 0. +] + +{ #category : #accessing } +GtPharoSelectAndScrollToMethodRepeatedTask >> maxRepetitions [ + ^ maxRepetitions +] + +{ #category : #accessing } +GtPharoSelectAndScrollToMethodRepeatedTask >> maxRepetitions: anInteger [ + maxRepetitions := anInteger +] + +{ #category : #accessing } +GtPharoSelectAndScrollToMethodRepeatedTask >> method [ + + ^ method +] + +{ #category : #accessing } +GtPharoSelectAndScrollToMethodRepeatedTask >> method: aCompiledMethod [ + self + assert: [ aCompiledMethod isNotNil ] + description: [ 'Method must be non-nil' ]. + self + assert: [ method isNil ] + description: [ 'Method can be initialized only once' ]. + + method := aCompiledMethod +] + +{ #category : #hooks } +GtPharoSelectAndScrollToMethodRepeatedTask >> onEnqueuedInElement: anElement [ + element == anElement + ifFalse: [ counter := 0 ]. + + super onEnqueuedInElement: anElement. +] + +{ #category : #'api - running' } +GtPharoSelectAndScrollToMethodRepeatedTask >> onRun [ + | aTab | + method ifNil: [ self stop. ^ self ]. + contentTabs ifNil: [ self stop. ^ self ]. + counter > maxRepetitions ifTrue: [ self stop. ^ self ]. + counter := counter + 1. + + aTab := contentTabs viewModel tabs + detect: [ :each | each widget label asString = 'Methods' ] + ifNone: [ ^ self ]. + + aTab isSelected ifFalse: [ aTab select ]. + + contentTabs content + allChildrenBreadthFirstDetect: [ :eachElement | + eachElement isKindOf: GtPharoStreamingMethodsCoderElement ] + ifFound: [ :theElement | + theElement streamingCodersViewModel + expandAndFocusCompiledMethod: method; + scrollToCompiledMethod: method. + self stop ] + ifNone: [ "ignore" ] +] + +{ #category : #'api - running' } +GtPharoSelectAndScrollToMethodRepeatedTask >> stop [ + super stop. + counter := 0. +]