--- a/ShowMeHowItWorks.st Mon Jul 22 17:37:58 2019 +0200
+++ b/ShowMeHowItWorks.st Tue Jul 23 10:14:34 2019 +0200
@@ -54,29 +54,34 @@
!ShowMeHowItWorks class methodsFor:'running'!
do:specArray
- self doStream:specArray readStream
-
- "Created: / 19-07-2019 / 10:52:59 / Claus Gittinger"
- "Modified: / 19-07-2019 / 14:30:43 / Claus Gittinger"
-!
-
-doStream:specStream
"must run as a separate process;
otherwise - if started by the app itself -
no events will be processed while running"
|appWhichStartedMe|
-
+
appWhichStartedMe := WindowGroup activeMainApplication.
-
+
[
- self new
- application:appWhichStartedMe;
- doStream:specStream
+ Error handle:[:ex |
+ Dialog warn:(self classResources stringWithCRs:'An error was encountered in the show:\\%1' with:ex description)
+ ] do:[
+ self new
+ application:appWhichStartedMe;
+ doStream:(specArray readStream)
+ ].
] fork.
- "Created: / 19-07-2019 / 10:53:07 / Claus Gittinger"
- "Modified: / 19-07-2019 / 16:44:02 / Claus Gittinger"
+ "
+ ShowMeHowItWorks do:
+ #(
+ (show: 'bla bla')
+ (moveTo: NameOfComponent)
+ )
+ "
+
+ "Created: / 19-07-2019 / 10:52:59 / Claus Gittinger"
+ "Modified: / 23-07-2019 / 09:19:40 / Claus Gittinger"
! !
!ShowMeHowItWorks methodsFor:'accessing'!
@@ -257,8 +262,14 @@
component := self componentNamed:componentName.
self movePointerToComponent:component speed:(self pointerMoveSpeedFast).
+ "
+ ShowMeHowItWorks basicNew fastMoveTo:'Classes'
+ ShowMeHowItWorks basicNew fastMoveTo:'Klassen'
+ "
+
"Created: / 19-07-2019 / 15:39:23 / Claus Gittinger"
"Modified: / 20-07-2019 / 08:14:16 / Claus Gittinger"
+ "Modified (comment): / 23-07-2019 / 09:33:31 / Claus Gittinger"
!
moveTo:componentName
@@ -478,111 +489,15 @@
!
talking
+ "/ ^ Expecco::ExpeccoPreferences current speechEffectsEnabled
^ true
"Created: / 19-07-2019 / 14:31:14 / Claus Gittinger"
+ "Modified (comment): / 23-07-2019 / 09:45:35 / Claus Gittinger"
! !
!ShowMeHowItWorks methodsFor:'helper'!
-componentNamed:componentName
- "retrieve a component by name or report an error if not found"
-
- |component|
-
- lastComponentName := componentName.
-
- component := self findComponent:componentName.
- component isNil ifTrue:[
- self error:'no component found for: ',componentName.
- ].
- lastComponent := component.
- ^ component
-
- "Created: / 19-07-2019 / 15:37:35 / Claus Gittinger"
-!
-
-findComponent:componentName
- "find a component by name - in the active and possibly in any app"
-
- |component candidates|
-
- application notNil ifTrue:[
- component := self findComponent:componentName in:application.
- ].
-
- component isNil ifTrue:[
- "/ search through all current applications
- candidates := OrderedCollection new.
- WindowGroup scheduledWindowGroups do:[:eachWG |
- |eachApp|
-
- (eachApp := eachWG application) notNil ifTrue:[
- component := self findComponent:componentName in:eachApp.
- component notNil ifTrue:[
- candidates add:component
- ].
- ].
- ].
-
- candidates size == 1 ifTrue:[
- component := candidates first
- ] ifFalse:[
- candidates notEmpty ifTrue:[
- self error:'multiple components found by name: ',componentName.
- ]
- ].
- ].
- ^ component
-
- "Created: / 19-07-2019 / 12:02:30 / Claus Gittinger"
- "Modified: / 19-07-2019 / 16:44:30 / Claus Gittinger"
-!
-
-findComponent:componentName in:anApplication
- |component componentNameSymbol foundByName foundByTitle foundByLabel|
-
- (component := anApplication componentAt:componentName) notNil ifTrue:[^ component].
- (componentNameSymbol := componentName asSymbolIfInterned) notNil ifTrue:[
- (component := anApplication componentAt:componentNameSymbol) notNil ifTrue:[^ component].
- ].
-
- "/ mhmh - search through all widgets of anApplication;
- "/ maybe it was not created via the builder/spec,
- "/ or it has changed its name.
- "/ look for: widget's name, widget's title, widget's label
- foundByName := OrderedCollection new.
- foundByTitle := OrderedCollection new.
- foundByLabel := OrderedCollection new.
-
- anApplication window allSubViewsDo:[:each |
- [
- each name = componentName ifTrue:[ foundByName add:each ].
- ] on:MessageNotUnderstood do:[:ex | ].
- [
- each title = componentName ifTrue:[ foundByTitle add:each ].
- ] on:MessageNotUnderstood do:[:ex | ].
- [
- each label = componentName ifTrue:[ foundByLabel add:each ].
- ] on:MessageNotUnderstood do:[:ex | ].
- ].
- foundByName notEmpty ifTrue:[
- self assert:(foundByName size == 1) message:'multiple components found by name'.
- ^ foundByName first.
- ].
- foundByTitle notEmpty ifTrue:[
- self assert:(foundByTitle size == 1) message:'multiple components found by title'.
- ^ foundByTitle first.
- ].
- foundByLabel notEmpty ifTrue:[
- self assert:(foundByLabel size == 1) message:'multiple components found by label'.
- ^ foundByLabel first.
- ].
- ^ component
-
- "Created: / 19-07-2019 / 11:36:21 / Claus Gittinger"
-!
-
randomThankYou
^ #(
'thank you, for watching'
@@ -637,17 +552,175 @@
"Created: / 19-07-2019 / 13:14:51 / Claus Gittinger"
! !
+!ShowMeHowItWorks methodsFor:'helpers - component search'!
+
+componentNamed:componentName
+ "retrieve a component by name or report an error if not found.
+ Can return either a view or a menu item"
+
+ |component|
+
+ lastComponentName := componentName.
+
+ component := self findComponent:componentName.
+ component isNil ifTrue:[
+ self error:'no component found for: ',componentName.
+ ].
+ lastComponent := component.
+ ^ component
+
+ "Created: / 19-07-2019 / 15:37:35 / Claus Gittinger"
+ "Modified (comment): / 23-07-2019 / 09:31:53 / Claus Gittinger"
+!
+
+findComponent:componentName
+ "find a component by name - in the active and possibly in any app.
+ Can return either a view or a menu item"
+
+ |component candidates|
+
+ application notNil ifTrue:[
+ component := self findComponent:componentName in:application.
+ ].
+
+ component isNil ifTrue:[
+ "/ search through all current applications
+ candidates := OrderedCollection new.
+ WindowGroup scheduledWindowGroups do:[:eachWG |
+ |eachApp|
+
+ (eachApp := eachWG application) notNil ifTrue:[
+ component := self findComponent:componentName in:eachApp.
+ component notNil ifTrue:[
+ candidates add:component
+ ].
+ ].
+ ].
+
+ candidates size == 1 ifTrue:[
+ component := candidates first
+ ] ifFalse:[
+ candidates notEmpty ifTrue:[
+ self error:'multiple components found by name: ',componentName.
+ ]
+ ].
+ ].
+ ^ component
+
+ "
+ ShowMeHowItWorks basicNew findComponent:'Classes'
+ ShowMeHowItWorks basicNew findComponent:'Klassen'
+ "
+
+ "Created: / 19-07-2019 / 12:02:30 / Claus Gittinger"
+ "Modified: / 19-07-2019 / 16:44:30 / Claus Gittinger"
+ "Modified (comment): / 23-07-2019 / 09:32:44 / Claus Gittinger"
+!
+
+findComponent:componentName in:anApplicationOrView
+ "find a component by name inside an app.
+ Uses the NameKey of the spec, and optionally the label or modelKey.
+ Can return either a view or a menu item"
+
+ |app window component componentNameSymbol foundByName foundByTitle foundByLabel item|
+
+ (app := anApplicationOrView) isView ifTrue:[
+ window := anApplicationOrView.
+ app := anApplicationOrView application
+ ].
+ app notNil ifTrue:[
+ (component := app componentAt:componentName) notNil ifTrue:[^ component].
+ (componentNameSymbol := componentName asSymbolIfInterned) notNil ifTrue:[
+ (component := app componentAt:componentNameSymbol) notNil ifTrue:[^ component].
+ ].
+ window := app window.
+ ].
+
+ "/ mhmh - search through all widgets of anApplication;
+ "/ maybe it was not created via the builder/spec,
+ "/ or it has changed its name.
+ "/ look for: widget's name, widget's title, widget's label
+ foundByName := OrderedCollection new.
+ foundByTitle := OrderedCollection new.
+ foundByLabel := OrderedCollection new.
+
+ window allSubViewsDo:[:each |
+ |foundIt|
+
+ foundIt := false.
+ [
+ each name = componentName ifTrue:[ foundByName add:each. foundIt := true ].
+ ] on:MessageNotUnderstood do:[:ex | ].
+ foundIt ifFalse:[
+ [
+ each title = componentName ifTrue:[ foundByTitle add:each. foundIt := true ].
+ ] on:MessageNotUnderstood do:[:ex | ].
+ foundIt ifFalse:[
+ [
+ each label = componentName ifTrue:[ foundByLabel add:each. foundIt := true ].
+ ] on:MessageNotUnderstood do:[:ex | ].
+ foundIt ifFalse:[
+ each isMenu ifTrue:[
+ (item := each detectItemForNameKey:componentName) notNil ifTrue:[
+ foundByName add:item. foundIt := true
+ ].
+ foundIt ifFalse:[
+ (item := each detectItemForKey:componentName) notNil ifTrue:[
+ foundByName add:item. foundIt := true
+ ].
+ foundIt ifFalse:[
+ (item := each detectItemForLabel:componentName) notNil ifTrue:[
+ foundByLabel add:item. foundIt := true
+ ].
+ ].
+ ].
+ ].
+ ].
+ ]
+ ].
+ ].
+
+ foundByName notEmpty ifTrue:[
+ self assert:(foundByName size == 1) message:'multiple components found by name'.
+ ^ foundByName first.
+ ].
+ foundByTitle notEmpty ifTrue:[
+ self assert:(foundByTitle size == 1) message:'multiple components found by title'.
+ ^ foundByTitle first.
+ ].
+ foundByLabel notEmpty ifTrue:[
+ self assert:(foundByLabel size == 1) message:'multiple components found by label'.
+ ^ foundByLabel first.
+ ].
+ ^ component
+
+ "
+ self basicNew findComponent:'Klassen' in:(Transcript topView)
+ "
+
+ "Created: / 19-07-2019 / 11:36:21 / Claus Gittinger"
+ "Modified (comment): / 23-07-2019 / 09:31:34 / Claus Gittinger"
+! !
+
!ShowMeHowItWorks methodsFor:'helpers - mouse movement'!
-circlePointerAroundComponent:component
+circlePointerAroundComponent:aWidgetOrMenuItem
"circle around it a few times"
+
+ |position|
- self circlePointerAroundPosition:(component screenBounds center rounded)
+ aWidgetOrMenuItem isView ifTrue:[
+ position := aWidgetOrMenuItem screenBounds center rounded
+ ] ifFalse:[
+ self halt.
+ ].
+ self circlePointerAroundScreenPosition:position
"Created: / 19-07-2019 / 13:12:35 / Claus Gittinger"
+ "Modified: / 23-07-2019 / 09:38:12 / Claus Gittinger"
!
-circlePointerAroundPosition:position
+circlePointerAroundScreenPosition:position
"circle around it a few times"
|screen stepDelayTime numCircles circlingSpeed radius|
@@ -684,44 +757,59 @@
Delay waitFor:stepDelayTime.
].
- "Created: / 19-07-2019 / 13:12:40 / Claus Gittinger"
+ "Created: / 23-07-2019 / 09:37:46 / Claus Gittinger"
+!
+
+fastMovePointerToScreenPosition:position
+ self movePointerToScreenPosition:position speed:(self pointerMoveSpeedFast).
+
+ "Created: / 23-07-2019 / 09:36:20 / Claus Gittinger"
!
movePointerToComponent:aWidget
"move the mouse to aWidget's center"
- self movePointerToPosition:(aWidget screenBounds center rounded).
+ self movePointerToScreenPosition:(aWidget screenBounds center rounded).
"Created: / 19-07-2019 / 13:11:33 / Claus Gittinger"
+ "Modified: / 23-07-2019 / 09:37:01 / Claus Gittinger"
!
movePointerToComponent:aWidget offset:offset
"move the mouse to position inside aWidget's"
- self movePointerToPosition:(aWidget screenBounds origin + offset) rounded.
+ self movePointerToScreenPosition:(aWidget screenBounds origin + offset) rounded.
"Created: / 19-07-2019 / 16:18:58 / Claus Gittinger"
+ "Modified: / 23-07-2019 / 09:36:57 / Claus Gittinger"
!
-movePointerToComponent:aWidget speed:pixelsPerSecond
+movePointerToComponent:aWidgetOrMenuItem speed:pixelsPerSecond
"move the mouse to aWidget's center"
+
+ |position|
- self movePointerToPosition:(aWidget screenBounds center rounded) speed:pixelsPerSecond.
+ aWidgetOrMenuItem isView ifTrue:[
+ position := aWidgetOrMenuItem screenBounds center rounded
+ ] ifFalse:[
+ self halt.
+ ].
+ self movePointerToScreenPosition:position speed:pixelsPerSecond.
"Created: / 20-07-2019 / 08:12:49 / Claus Gittinger"
+ "Modified: / 23-07-2019 / 09:37:27 / Claus Gittinger"
!
-movePointerToPosition:newPosition
+movePointerToScreenPosition:newPosition
"move the mouse to newPosition"
- self movePointerToPosition:newPosition speed:self pointerMoveSpeed
+ self movePointerToScreenPosition:newPosition speed:(self pointerMoveSpeed)
- "Created: / 19-07-2019 / 12:57:30 / Claus Gittinger"
- "Modified: / 20-07-2019 / 08:12:34 / Claus Gittinger"
+ "Created: / 23-07-2019 / 09:36:39 / Claus Gittinger"
!
-movePointerToPosition:newPosition speed:pixelsPerSecond
- "move the mouse to newPosition"
+movePointerToScreenPosition:newPosition speed:pixelsPerSecond
+ "move the mouse to newPosition, which is a screen position"
|screen distance start numSteps moveTime stepDelayTime delta|
@@ -749,7 +837,7 @@
Delay waitFor:stepDelayTime.
].
- "Created: / 20-07-2019 / 08:12:07 / Claus Gittinger"
+ "Created: / 23-07-2019 / 09:36:45 / Claus Gittinger"
! !
!ShowMeHowItWorks methodsFor:'menu actions - mouse buttons'!
@@ -791,7 +879,7 @@
x := position x.
y := position y.
- self movePointerToPosition:position.
+ self movePointerToScreenPosition:position.
false "OperatingSystem isOSXlike" ifTrue:[
|osxPos|
@@ -807,6 +895,7 @@
screen flush.
"Created: / 19-07-2019 / 13:52:38 / Claus Gittinger"
+ "Modified: / 23-07-2019 / 09:38:31 / Claus Gittinger"
!
release:buttonNr
@@ -819,7 +908,7 @@
x := position x.
y := position y.
- self movePointerToPosition:position.
+ self movePointerToScreenPosition:position.
false "OperatingSystem isOSXlike" ifTrue:[
|osxPos|
@@ -835,11 +924,14 @@
screen flush.
"Created: / 19-07-2019 / 13:53:05 / Claus Gittinger"
+ "Modified: / 23-07-2019 / 09:38:38 / Claus Gittinger"
! !
!ShowMeHowItWorks methodsFor:'running'!
doCommand:op
+ "execute a single command"
+
|numArgs sel args method|
op isArray ifTrue:[
@@ -896,6 +988,7 @@
END"
"Created: / 19-07-2019 / 15:34:55 / Claus Gittinger"
+ "Modified: / 23-07-2019 / 09:14:26 / Claus Gittinger"
!
doStream:specStream