From f39f5f1994c76013a49821cd2e5eaf32a91166dc Mon Sep 17 00:00:00 2001 From: DEMAREY Christophe Date: Tue, 27 Oct 2026 15:03:06 +0100 Subject: [PATCH 1/9] Build the settings browser on the new settings model Requires https://github.com/pharo-project/pharo/pull/20125 --- .../SpColorPickerPresenter.class.st | 37 ++-- .../StSettingsBrowserTest.class.st | 7 + .../AbstractSetting.extension.st | 21 +++ .../ActionSetting.extension.st | 8 + .../Color.extension.st | 8 +- .../LogicalFont.extension.st | 2 +- .../PickOneSetting.extension.st | 8 + .../Setting.extension.st | 22 +++ .../SettingsGroup.extension.st | 14 ++ .../StNewSettingNode.class.st | 158 ++++++++++++++++++ .../StNewSettingsTree.class.st | 126 ++++++++++++++ .../StSettingBooleanPresenterItem.class.st | 16 +- .../StSettingButtonPresenterItem.class.st | 2 +- .../StSettingDropListPresenterItem.class.st | 22 +-- ...tingMultipleDropListPresenterItem.class.st | 2 +- .../StSettingsAbstractPresenter.class.st | 2 +- .../StSettingsBrowser.class.st | 21 ++- .../StSettingsTree.class.st | 16 +- 18 files changed, 431 insertions(+), 61 deletions(-) create mode 100644 src/NewTools-SettingsBrowser/AbstractSetting.extension.st create mode 100644 src/NewTools-SettingsBrowser/ActionSetting.extension.st create mode 100644 src/NewTools-SettingsBrowser/PickOneSetting.extension.st create mode 100644 src/NewTools-SettingsBrowser/Setting.extension.st create mode 100644 src/NewTools-SettingsBrowser/SettingsGroup.extension.st create mode 100644 src/NewTools-SettingsBrowser/StNewSettingNode.class.st create mode 100644 src/NewTools-SettingsBrowser/StNewSettingsTree.class.st diff --git a/src/ColorPicker/SpColorPickerPresenter.class.st b/src/ColorPicker/SpColorPickerPresenter.class.st index fe93a7ff3..65b937921 100644 --- a/src/ColorPicker/SpColorPickerPresenter.class.st +++ b/src/ColorPicker/SpColorPickerPresenter.class.st @@ -6,7 +6,9 @@ Class { #name : 'SpColorPickerPresenter', #superclass : 'SpPresenter', #instVars : [ - 'colorPickerPresenter' + 'colorPickerPresenter', + 'toolbar', + 'colorChangedBlock' ], #category : 'ColorPicker', #package : 'ColorPicker' @@ -25,15 +27,16 @@ SpColorPickerPresenter class >> open [ ^ (self newApplication: StPharoApplication current) open ] -{ #category : 'accessing' } -SpColorPickerPresenter >> color [ +{ #category : 'events' } +SpColorPickerPresenter >> colorChanged [ - ^ colorPickerPresenter color + colorChangedBlock ifNil: [ ^ self ]. + ^ colorChangedBlock value: colorPickerPresenter color ] { #category : 'layout' } SpColorPickerPresenter >> defaultLayout [ - + ^ SpBoxLayout newTopToBottom add: colorPickerPresenter; yourself @@ -42,7 +45,9 @@ SpColorPickerPresenter >> defaultLayout [ { #category : 'initialization' } SpColorPickerPresenter >> initializePresenters [ - colorPickerPresenter := self newColorPicker + colorPickerPresenter := self newColorPicker. + toolbar := self newToolbar. + self toolbarButtons do: [ :button | toolbar addItemRight: button ] ] { #category : 'initialization' } @@ -51,22 +56,28 @@ SpColorPickerPresenter >> toolbarButtons [ buttons := OrderedCollection new. buttons + add: (self newToolbarButton + label: 'Select'; + icon: (self iconNamed: #smallOk); + help: 'Select and close'; + action: [ self colorChanged. self delete ]; + yourself); add: (self newToolbarButton label: 'Cancel'; icon: (self iconNamed: #smallCancel); help: 'Cancel the color selection'; action: [ self delete ]; - yourself); - add: (self newToolbarButton - label: 'Select'; - icon: (self iconNamed: #smallOk); - help: 'Select and close'; - action: [ self delete ]; - yourself). + yourself). ^ buttons ] +{ #category : 'events' } +SpColorPickerPresenter >> whenColorChangedDo: aBlock [ + + colorChangedBlock := aBlock +] + { #category : 'initialization' } SpColorPickerPresenter >> windowIcon [ diff --git a/src/NewTools-SettingsBrowser-Tests/StSettingsBrowserTest.class.st b/src/NewTools-SettingsBrowser-Tests/StSettingsBrowserTest.class.st index 4960e67db..525a4ec01 100644 --- a/src/NewTools-SettingsBrowser-Tests/StSettingsBrowserTest.class.st +++ b/src/NewTools-SettingsBrowser-Tests/StSettingsBrowserTest.class.st @@ -96,6 +96,13 @@ StSettingsBrowserTest >> testNonEmptyCategoryNames [ ] +{ #category : 'tests' } +StSettingsBrowserTest >> testOpening [ + "Non-Regression Test related to https://pharo.manuscript.com/f/cases/16138" + + self openInstance +] + { #category : 'tests' } StSettingsBrowserTest >> testSimulateCategoryPopulation [ diff --git a/src/NewTools-SettingsBrowser/AbstractSetting.extension.st b/src/NewTools-SettingsBrowser/AbstractSetting.extension.st new file mode 100644 index 000000000..bf61627b0 --- /dev/null +++ b/src/NewTools-SettingsBrowser/AbstractSetting.extension.st @@ -0,0 +1,21 @@ +Extension { #name : 'AbstractSetting' } + +{ #category : '*NewTools-SettingsBrowser' } +AbstractSetting >> asPresenterOn: aPresenter [ + "Answer a for the receiver's setting type" + + ^ self asSettingPresenterWithOwner: aPresenter +] + +{ #category : '*NewTools-SettingsBrowser' } +AbstractSetting >> asSettingNode [ + + ^ StNewSettingNode forSetting: self +] + +{ #category : '*NewTools-SettingsBrowser' } +AbstractSetting >> asSettingPresenterWithOwner: aPresenter [ + "Answer an appropriate container for the receiver's value" + + self subclassResponsibility +] diff --git a/src/NewTools-SettingsBrowser/ActionSetting.extension.st b/src/NewTools-SettingsBrowser/ActionSetting.extension.st new file mode 100644 index 000000000..192196efa --- /dev/null +++ b/src/NewTools-SettingsBrowser/ActionSetting.extension.st @@ -0,0 +1,8 @@ +Extension { #name : 'ActionSetting' } + +{ #category : '*NewTools-SettingsBrowser' } +ActionSetting >> asSettingPresenterWithOwner: aPresenter [ + "Answer an appropriate for the receiver" + + ^ aPresenter instantiate: StSettingButtonPresenterItem on: self +] diff --git a/src/NewTools-SettingsBrowser/Color.extension.st b/src/NewTools-SettingsBrowser/Color.extension.st index 975c33493..84b7c1bae 100644 --- a/src/NewTools-SettingsBrowser/Color.extension.st +++ b/src/NewTools-SettingsBrowser/Color.extension.st @@ -15,13 +15,7 @@ Color >> asSettingColorForm [ Color >> asSettingPresenter: aSettingDeclaration owner: aPresenter [ | settingPresenter colorValue | - colorValue := aSettingDeclaration targetSelector - ifNil: [ aSettingDeclaration realTarget perform: aSettingDeclaration name ] - ifNotNil: [ - | settingsTarget | - settingsTarget := aSettingDeclaration realTarget perform: aSettingDeclaration targetSelector. - settingsTarget perform: aSettingDeclaration getSelector ]. - + colorValue := aSettingDeclaration realValue. settingPresenter := (aPresenter instantiate: StSettingSHStyleButtonColorPresenterItem on: aSettingDeclaration). settingPresenter buttonAction: [ aSettingDeclaration getColorFor: settingPresenter ]; diff --git a/src/NewTools-SettingsBrowser/LogicalFont.extension.st b/src/NewTools-SettingsBrowser/LogicalFont.extension.st index 03200451a..a4c570231 100644 --- a/src/NewTools-SettingsBrowser/LogicalFont.extension.st +++ b/src/NewTools-SettingsBrowser/LogicalFont.extension.st @@ -5,7 +5,7 @@ LogicalFont >> asSettingPresenter: aSettingDeclaration owner: aPresenter [ | info currentFont | - currentFont := aSettingDeclaration target perform: aSettingDeclaration name. + currentFont := aSettingDeclaration settingReceiver perform: aSettingDeclaration name. info := String streamContents: [ :stream | stream << currentFont textStyleName; diff --git a/src/NewTools-SettingsBrowser/PickOneSetting.extension.st b/src/NewTools-SettingsBrowser/PickOneSetting.extension.st new file mode 100644 index 000000000..0c68f5141 --- /dev/null +++ b/src/NewTools-SettingsBrowser/PickOneSetting.extension.st @@ -0,0 +1,8 @@ +Extension { #name : 'PickOneSetting' } + +{ #category : '*NewTools-SettingsBrowser' } +PickOneSetting >> asSettingPresenterWithOwner: aPresenter [ + "Answer an appropriate container for the receiver's value" + + ^ aPresenter instantiate: StSettingDropListPresenterItem on: self +] diff --git a/src/NewTools-SettingsBrowser/Setting.extension.st b/src/NewTools-SettingsBrowser/Setting.extension.st new file mode 100644 index 000000000..629eae099 --- /dev/null +++ b/src/NewTools-SettingsBrowser/Setting.extension.st @@ -0,0 +1,22 @@ +Extension { #name : 'Setting' } + +{ #category : '*NewTools-SettingsBrowser' } +Setting >> asSettingPresenterWithOwner: aPresenter [ + "Answer an appropriate container for the receiver's value" + + ^ self + ifPreconditionTrue: [ self realValue asSettingPresenter: self owner: aPresenter ] + ifFalse: [ SpNullPresenter owner: aPresenter ] +] + +{ #category : '*NewTools-SettingsBrowser' } +Setting >> getColorFor: aPresenter [ + | colorPickerPresenter | + + colorPickerPresenter := aPresenter instantiate: SpColorPickerPresenter on: self. + colorPickerPresenter + whenColorChangedDo: [ :color | + self realValue: color value. + aPresenter updateColor: color value ]; + open +] diff --git a/src/NewTools-SettingsBrowser/SettingsGroup.extension.st b/src/NewTools-SettingsBrowser/SettingsGroup.extension.st new file mode 100644 index 000000000..24b17fb7b --- /dev/null +++ b/src/NewTools-SettingsBrowser/SettingsGroup.extension.st @@ -0,0 +1,14 @@ +Extension { #name : 'SettingsGroup' } + +{ #category : '*NewTools-SettingsBrowser' } +SettingsGroup >> asSettingPresenterWithOwner: aPresenter [ + "Answer an appropriate container for the receiver's value" + + ^ self isActivable + ifTrue: [ self realValue asSettingPresenter: self owner: aPresenter ] + ifFalse: [ + aPresenter newLabel + addStyle: 'settingLabel'; + label: self label; + yourself ] +] diff --git a/src/NewTools-SettingsBrowser/StNewSettingNode.class.st b/src/NewTools-SettingsBrowser/StNewSettingNode.class.st new file mode 100644 index 000000000..f896f79e2 --- /dev/null +++ b/src/NewTools-SettingsBrowser/StNewSettingNode.class.st @@ -0,0 +1,158 @@ +Class { + #name : 'StNewSettingNode', + #superclass : 'Object', + #instVars : [ + 'setting', + 'tree', + 'matchBlock' + ], + #category : 'NewTools-SettingsBrowser-Model', + #package : 'NewTools-SettingsBrowser', + #tag : 'Model' +} + +{ #category : 'instance creation' } +StNewSettingNode class >> forSetting: aSetting [ + + ^ self new + setting: aSetting; + yourself +] + +{ #category : 'accessing' } +StNewSettingNode >> allChildren [ + + "Answer a of the settings for which the receiver is set as parent" + + ^ tree + ifNotNil: [ :settingTree | settingTree childrenOf: self ] + ifNil: [ OrderedCollection new ] +] + +{ #category : 'converting' } +StNewSettingNode >> asPresenterOn: aPresenter [ + ^ setting asSettingPresenterWithOwner: aPresenter +] + +{ #category : 'accessing' } +StNewSettingNode >> description [ + "Answer a representing an human-understandable description" + + ^ setting description +] + +{ #category : 'testing' } +StNewSettingNode >> hasChildren [ + + ^ setting isGroup and: [ self allChildren isNotEmpty] +] + +{ #category : 'testing' } +StNewSettingNode >> hasParent [ + + ^ setting hasParent +] + +{ #category : 'accessing' } +StNewSettingNode >> label [ + + ^ setting label +] + +{ #category : 'accessing' } +StNewSettingNode >> level [ + + ^ self path size +] + +{ #category : 'accessing' } +StNewSettingNode >> matchBlock [ + + ^ matchBlock + ifNil: [ + matchBlock := [ : node : pattern | + node label substrings anySatisfy: [ : substr | + substr asLowercase beginsWith: pattern asLowercase ] ] ] +] + +{ #category : 'testing' } +StNewSettingNode >> matches: aString [ + "Recursive search the receiver for aString in its label" + + | result | + result := OrderedCollection new. + self allChildren do: [ :node | + (self matchBlock value: node value: aString) ifTrue: [ + result add: node ]. + + node hasChildren ifTrue: [ + result addAll: (node matches: aString) ] ]. + + ^ result +] + +{ #category : 'accessing' } +StNewSettingNode >> name [ + + ^ setting name +] + +{ #category : 'accessing' } +StNewSettingNode >> nodeForGroup: aSettingGroup [ + + ^ tree nodeForSetting: aSettingGroup +] + +{ #category : 'accessing' } +StNewSettingNode >> order [ + ^ setting order +] + +{ #category : 'accessing' } +StNewSettingNode >> order: anInteger [ + + setting order: anInteger. +] + +{ #category : 'accessing' } +StNewSettingNode >> parentName [ + + ^ setting parent ifNotNil: [ :group | group name ] +] + +{ #category : 'accessing' } +StNewSettingNode >> parentNode [ + + ^ setting parent ifNotNil: [ :group | self nodeForGroup: group ] +] + +{ #category : 'accessing' } +StNewSettingNode >> path [ + + ^ self hasParent + ifTrue: [ self parentNode path, { self } ] + ifFalse: [ { self } ] +] + +{ #category : 'accessing' } +StNewSettingNode >> setting [ + ^ setting +] + +{ #category : 'accessing' } +StNewSettingNode >> setting: aSetting [ + + setting := aSetting +] + +{ #category : 'accessing' } +StNewSettingNode >> settingDeclaration [ + + ^ setting +] + +{ #category : 'accessing' } +StNewSettingNode >> tree: aSettingTree [ + + tree := aSettingTree +] diff --git a/src/NewTools-SettingsBrowser/StNewSettingsTree.class.st b/src/NewTools-SettingsBrowser/StNewSettingsTree.class.st new file mode 100644 index 000000000..923b70017 --- /dev/null +++ b/src/NewTools-SettingsBrowser/StNewSettingsTree.class.st @@ -0,0 +1,126 @@ +Class { + #name : 'StNewSettingsTree', + #superclass : 'SettingTree', + #instVars : [ + 'manager' + ], + #category : 'NewTools-SettingsBrowser-Model', + #package : 'NewTools-SettingsBrowser', + #tag : 'Model' +} + +{ #category : 'opening' } +StNewSettingsTree class >> settingsKeywords [ + + ^ (Pragma allNamed: #systemsettings) collect: [: p | p method selector ] +] + +{ #category : 'checking' } +StNewSettingsTree >> checkForUnknownTarget [ + "check only root because other nodes with unknown target inherits it from its parent" + + self treeRoots do: [ :node | + node item target ifNil: [ node item target: (node pragma ifNotNil: [ :prg | prg methodClass instanceSide ]) ] ]. + self treeRoots do: [ :node | node checkForUnknownTarget ] +] + +{ #category : 'accessing' } +StNewSettingsTree >> defaultCategories [ + "Answer a of representing the default main setting categories in the system" + + ^ self treeRoots +] + +{ #category : 'testing' } +StNewSettingsTree >> hasSettingsFile [ + + ^ manager isNotNil + and: [ manager settingsFile isNotNil + and: [ manager settingsFile exists ] ] +] + +{ #category : 'instance creation' } +StNewSettingsTree >> newSettingTreeBuilderNodes [ + "Walk over the receiver's pragmas. Build and answer an of , each one representing a specific setting" + + manager := SettingsManager forPragmaNamed: #systemsettings. + manager useDefaultPreferencesFile. + + nodeList := manager settings collect: [ :setting | setting asSettingNode ]. + nodeList do: [: node | node tree: self ]. + ^ nodeList +] + +{ #category : 'instance creation' } +StNewSettingsTree >> newTreeHolder [ + "Set the receiver's collector to gather the system setting pragmas" + + ^ self + acceptableKeywords: { #systemsettings }; + nodeList: self nodeList; + yourself +] + +{ #category : 'accessing' } +StNewSettingsTree >> nodeForSetting: aSetting [ + + ^ nodeList detect: [ :node | node setting == aSetting ] +] + +{ #category : 'accessing' } +StNewSettingsTree >> nodeList [ + + ^ nodeList ifNil: [ nodeList := self newSettingTreeBuilderNodes ] +] + +{ #category : 'accessing' } +StNewSettingsTree >> nodeList: aCollection [ + + nodeList := aCollection +] + +{ #category : 'accessing' } +StNewSettingsTree >> persistence [ + + ^ manager +] + +{ #category : 'private - queries' } +StNewSettingsTree >> processSearch: aString [ + "Recursively collect the nodes matching aString in the receiver" + + ^ self treeRoots + flatCollect: [ : settingNode | settingNode matches: aString ] + as: Set +] + +{ #category : 'accessing' } +StNewSettingsTree >> settingsFileDirectory [ + + ^ manager settingsFile parent +] + +{ #category : 'testing' } +StNewSettingsTree >> settingsFileReference [ + "Answer a with the name of the file where settings are stored" + + ^ manager settingsFile +] + +{ #category : 'instance creation' } +StNewSettingsTree >> settingsKeywords [ + + ^ self class settingsKeywords +] + +{ #category : 'accessing' } +StNewSettingsTree >> sortBlock [ + ^ [:a :b | self itemSortBlock value: a setting value: b setting ] +] + +{ #category : 'instance creation' } +StNewSettingsTree >> treeRoots [ + "Answer an array of representing the main setting categories in the system" + + ^ (self nodeList reject: #hasParent) asArray sort: self sortBlock +] diff --git a/src/NewTools-SettingsBrowser/StSettingBooleanPresenterItem.class.st b/src/NewTools-SettingsBrowser/StSettingBooleanPresenterItem.class.st index c2695c4ad..440affc2f 100644 --- a/src/NewTools-SettingsBrowser/StSettingBooleanPresenterItem.class.st +++ b/src/NewTools-SettingsBrowser/StSettingBooleanPresenterItem.class.st @@ -29,21 +29,7 @@ StSettingBooleanPresenterItem >> settingStyle [ StSettingBooleanPresenterItem >> updateSetting: aSettingDeclaration value: aBoolean [ "Private - Callback for updating aSettingDeclaration with the new receiver's selected item" - self model targetSelector - ifNil: [ - | modelTarget realTarget | - modelTarget := self model target. - realTarget := modelTarget isClass - ifTrue: [ modelTarget name ] - ifFalse: [ modelTarget ]. - (self class environment at: realTarget) - perform: self model setSelector - with: aBoolean ] - ifNotNil: [ - (self model target perform: self model targetSelector) - perform: self model setSelector - with: aBoolean ] - + aSettingDeclaration realValue: aBoolean ] { #category : 'accessing' } diff --git a/src/NewTools-SettingsBrowser/StSettingButtonPresenterItem.class.st b/src/NewTools-SettingsBrowser/StSettingButtonPresenterItem.class.st index 8dd853f34..24f2d6277 100644 --- a/src/NewTools-SettingsBrowser/StSettingButtonPresenterItem.class.st +++ b/src/NewTools-SettingsBrowser/StSettingButtonPresenterItem.class.st @@ -13,7 +13,7 @@ Class { StSettingButtonPresenterItem >> initializePresenters [ (setterPresenter := self newButton) - label: self model actionLabel; + label: self model buttonLabel; action: [ self target perform: self model name diff --git a/src/NewTools-SettingsBrowser/StSettingDropListPresenterItem.class.st b/src/NewTools-SettingsBrowser/StSettingDropListPresenterItem.class.st index d694ba60c..eea3663ef 100644 --- a/src/NewTools-SettingsBrowser/StSettingDropListPresenterItem.class.st +++ b/src/NewTools-SettingsBrowser/StSettingDropListPresenterItem.class.st @@ -9,13 +9,14 @@ Class { { #category : 'initialization' } StSettingDropListPresenterItem >> initializePresenters [ + | indexOfCurrentValue | setterPresenter := self newDropList items: self model domainValues; - display: [ : item | item asString ]; - selectIndex: self model index; + display: [ :item | item name asString ]; whenSelectedItemChangedDo: [ :item | self updateSetting: item ]; - yourself. - + yourself. + indexOfCurrentValue := self model domainValues detectIndex: [ :each | each value = self model realValue ]. + setterPresenter selectIndex: indexOfCurrentValue. super initializePresenters ] @@ -26,19 +27,10 @@ StSettingDropListPresenterItem >> settingStyle [ ] { #category : 'initialization' } -StSettingDropListPresenterItem >> updateSetting: aSettingDeclaration [ +StSettingDropListPresenterItem >> updateSetting: aSettingItem [ "Private - Callback for updating aSettingDeclaration with the new receiver's selected item" - self model targetSelector - ifNil: [ - self model target - perform: self model setSelector - with: aSettingDeclaration default ] - ifNotNil: [ - (self model target perform: self model targetSelector) - perform: self model setSelector - with: aSettingDeclaration default ] - + aSettingItem beCurrentValue ] { #category : 'accessing' } diff --git a/src/NewTools-SettingsBrowser/StSettingMultipleDropListPresenterItem.class.st b/src/NewTools-SettingsBrowser/StSettingMultipleDropListPresenterItem.class.st index e5a5f80df..e9bf9aecd 100644 --- a/src/NewTools-SettingsBrowser/StSettingMultipleDropListPresenterItem.class.st +++ b/src/NewTools-SettingsBrowser/StSettingMultipleDropListPresenterItem.class.st @@ -15,7 +15,7 @@ Class { StSettingMultipleDropListPresenterItem >> initializePresenters [ | modelDefault | - modelDefault := self model default. + modelDefault := self model defaultValue. "modelDefault color ifNil: [ modelDefault color: Color transparent ]. colorSettingItemPresenter := modelDefault color diff --git a/src/NewTools-SettingsBrowser/StSettingsAbstractPresenter.class.st b/src/NewTools-SettingsBrowser/StSettingsAbstractPresenter.class.st index 4da011266..da8e33484 100644 --- a/src/NewTools-SettingsBrowser/StSettingsAbstractPresenter.class.st +++ b/src/NewTools-SettingsBrowser/StSettingsAbstractPresenter.class.st @@ -214,5 +214,5 @@ StSettingsAbstractPresenter >> settingsTree [ ^ self application propertyAt: #settingsTree - ifAbsentPut: [ StSettingsTree new ] + ifAbsentPut: [ StNewSettingsTree new ] ] diff --git a/src/NewTools-SettingsBrowser/StSettingsBrowser.class.st b/src/NewTools-SettingsBrowser/StSettingsBrowser.class.st index 0fa22c82d..4554c05bd 100644 --- a/src/NewTools-SettingsBrowser/StSettingsBrowser.class.st +++ b/src/NewTools-SettingsBrowser/StSettingsBrowser.class.st @@ -88,8 +88,8 @@ StSettingsBrowser >> defaultLayout [ { #category : 'initialization' } StSettingsBrowser >> exportSettings [ - self settingsTree persistence storeSettingNodes. - self inform: 'Settings were exported to ' , self settingsTree persistence fileReference fullName. + self settingsTree persistence storeSettings. + self inform: 'Settings were exported to ' , self settingsTree persistence settingsFile fullName. buttonBarPresenter enable ] @@ -145,7 +145,7 @@ StSettingsBrowser >> initializeButtonBar [ icon: (self application iconNamed: #save); label: 'Export'; help: 'Save settings into a file'; - action: [ self exportSettings ]; + action: [ self storeSettings ]; yourself); yourself ] @@ -184,7 +184,8 @@ StSettingsBrowser >> initializePresenters [ { #category : 'loading' } StSettingsBrowser >> loadSettings [ "Load the settings from the system settings file, if exists" - self settingsTree updateSettingNodes. + + self settingsTree persistence loadSettings. self inform: 'Settings loaded' ] @@ -230,12 +231,12 @@ StSettingsBrowser >> select: aString [ ] { #category : 'execution' } -StSettingsBrowser >> selectDialog: fileReferneces [ +StSettingsBrowser >> selectDialog: fileReferences [ ^ SpSelectDialog new title: 'Settings Browser Selector'; message: 'Select a Stored Settings File'; - items: fileReferneces; + items: fileReferences; display: [ :each | each basename ]; displayIcon: [ :each | self iconNamed: each systemIconName ]; openModal @@ -262,6 +263,14 @@ StSettingsBrowser >> sortNodes: aCollection [ ^ aCollection sorted: #order ascending, #label ascending ] +{ #category : 'storing' } +StSettingsBrowser >> storeSettings [ + + self settingsTree persistence storeSettings. + self inform: 'Settings were exported to ' , self settingsTree settingsFileReference fullName. + buttonBarPresenter enable +] + { #category : 'initialization' } StSettingsBrowser >> updatePresenter [ diff --git a/src/NewTools-SettingsBrowser/StSettingsTree.class.st b/src/NewTools-SettingsBrowser/StSettingsTree.class.st index 20ac06146..33283bb6d 100644 --- a/src/NewTools-SettingsBrowser/StSettingsTree.class.st +++ b/src/NewTools-SettingsBrowser/StSettingsTree.class.st @@ -127,6 +127,20 @@ StSettingsTree >> itemSortBlock [ { #category : 'instance creation' } StSettingsTree >> newSettingTreeBuilderNodes [ + "Walk over the receiver's pragmas. Build and answer a of , each one representing a specific setting" + | manager | + + manager := SettingsManager forPragmaNamed: #systemsettings. + + nodeList := manager settings collect: [ :setting | setting asSettingNode ]. + nodeList do: [: node | node tree: self ]. + "self checkForUnknownParent." + "self checkForUnknownTarget." + ^ nodeList +] + +{ #category : 'legacy' } +StSettingsTree >> newSettingTreeBuilderNodesLegacy [ "Walk over the receiver's pragmas. Build and answer a of , each one representing a specific setting" | builder | @@ -218,7 +232,7 @@ StSettingsTree >> settingsKeywords [ { #category : 'accessing' } StSettingsTree >> sortBlock [ - ^ [:a :b | self itemSortBlock value: a declaration value: b declaration ] + ^ [:a :b | self itemSortBlock value: a setting value: b setting ] ] { #category : 'persistence' } From 3502bc8dabf5024d1dbb23bfc6d16cc4e3e6e18c Mon Sep 17 00:00:00 2001 From: DEMAREY Christophe Date: Tue, 27 Oct 2026 15:03:06 +0100 Subject: [PATCH 2/9] Update settings declarations to the new settings model API Rename default: -> defaultValue: and parent: -> parentName: in the declarations --- src/NewTools-Core/StPharoSettings.class.st | 12 ++--- src/NewTools-Debugger/StDebugger.class.st | 22 +++++----- .../StDebuggerClientModel.class.st | 5 ++- .../StDebuggerExtensionSettings.class.st | 35 +++++++-------- .../StDebuggerSettings.class.st | 9 ++-- src/NewTools-Epicea/EpSettings.class.st | 30 +++++++------ .../StFileBrowserSettings.class.st | 41 ++++++++--------- src/NewTools-Finder/StFinderSettings.class.st | 44 +++++++++++-------- .../StInspectorPresenter.class.st | 10 ++--- .../StObjectPrinter.class.st | 6 +-- .../StObjectTranscriptPresenter.class.st | 5 +-- .../StPlaygroundPresenter.class.st | 8 ++-- src/NewTools-Pulse/StPulse.class.st | 22 +++++----- .../StSpotterPragmaBasedProcessor.class.st | 12 ++--- .../StSpotterProcessor.class.st | 12 +++-- src/NewTools-Spotter/StSpotter.class.st | 22 +++++----- .../SpClosedWindowListPresenter.class.st | 5 +-- 17 files changed, 149 insertions(+), 151 deletions(-) diff --git a/src/NewTools-Core/StPharoSettings.class.st b/src/NewTools-Core/StPharoSettings.class.st index e634baa5b..d8905a6ac 100644 --- a/src/NewTools-Core/StPharoSettings.class.st +++ b/src/NewTools-Core/StPharoSettings.class.st @@ -63,24 +63,24 @@ StPharoSettings class >> pharoAboutOn: aBuilder [ { #category : 'settings' } StPharoSettings class >> settingsOn: aBuilder [ - + (aBuilder setting: #codeShowLineNumbers) - parent: #tools; + parentName: #tools; order: 0; - default: self codeShowLineNumbers; + defaultValue: self codeShowLineNumbers; target: self; description: 'If code panels will display line numbers'; label: 'Show line numbers in code panels'. (aBuilder pickOne: #toolbarDisplayMode) - parent: #tools; + parentName: #tools; order: 1; - default: self toolbarDisplayMode; + defaultValue: self toolbarDisplayMode; target: self; domainValues: (SpToolbarDisplayMode all collect: [ :each | each label -> each ]); description: 'Toolbars will be displayed in icon+label, icon, or label mode.'; - label: 'Toolbar display mode' + label: 'Toolbar display mode' ] { #category : 'settings' } diff --git a/src/NewTools-Debugger/StDebugger.class.st b/src/NewTools-Debugger/StDebugger.class.st index 57e05a244..56d947842 100644 --- a/src/NewTools-Debugger/StDebugger.class.st +++ b/src/NewTools-Debugger/StDebugger.class.st @@ -186,13 +186,11 @@ StDebugger class >> debuggerLayoutSettingsOn: aBuilder [ (aBuilder pickOne: #configureLayout) - parent: #debugging; + parentName: #debugging; label: 'Debugger Layout'; target: StDebugger; - default: #beVerticalStackThenCode; - domainValues: - #( #beHorizontalCodeThenStack #beHorizontalStackThenCode - #beVerticalCodeThenStack #beVerticalStackThenCode ); + defaultValue: #beVerticalStackThenCode; + domainValues: #( #beHorizontalCodeThenStack #beHorizontalStackThenCode #beVerticalCodeThenStack #beVerticalStackThenCode ); description: '' ] @@ -277,13 +275,13 @@ StDebugger class >> settings [ StDebugger class >> stackColoringSettingOn: aBuilder [ - (aBuilder setting: #enableStackColoring) - label: 'Enable stack coloring'; - target: self; - parent: #debugging; - default: true; - description: - 'If enable, the debugger will highlight the elements of the stacks that are from the same class and same package as the selected context.'. + (aBuilder setting: #enableStackColoring) + label: 'Enable stack coloring'; + target: self; + parentName: #debugging; + defaultValue: true; + description: + 'If enable, the debugger will highlight the elements of the stacks that are from the same class and same package as the selected context.' ] { #category : 'accessing' } diff --git a/src/NewTools-Debugger/StDebuggerClientModel.class.st b/src/NewTools-Debugger/StDebuggerClientModel.class.st index bfc1723e5..8d508ce20 100644 --- a/src/NewTools-Debugger/StDebuggerClientModel.class.st +++ b/src/NewTools-Debugger/StDebuggerClientModel.class.st @@ -40,12 +40,13 @@ StDebuggerClientModel class >> shouldFilterStack: aBoolean [ { #category : 'settings' } StDebuggerClientModel class >> shouldFilterStackSettingsOn: aBuilder [ + (aBuilder setting: #shouldFilterStack) label: 'Filter the debugger stack'; target: self; - default: true; - parent: #debugging; + defaultValue: true; + parentName: #debugging; description: 'Defines if methods with pragma #debuggerCompleteToSender are filtered (hidden) in the debugger stack' ] diff --git a/src/NewTools-Debugger/StDebuggerExtensionSettings.class.st b/src/NewTools-Debugger/StDebuggerExtensionSettings.class.st index cf32f68d9..619c272dc 100644 --- a/src/NewTools-Debugger/StDebuggerExtensionSettings.class.st +++ b/src/NewTools-Debugger/StDebuggerExtensionSettings.class.st @@ -17,19 +17,18 @@ StDebuggerExtensionSettings class >> debuggerExtensionSettingsForClass: toolClas (aBuilder group: toolName asSymbol) label: toolName; - with: [ - (aBuilder setting: #showInDebugger) - label: 'Show in debugger'; - target: toolClass; - default: toolClass showInDebugger; - description: 'Activate the tool tab in the debugger right column.'. - (aBuilder pickOne: #displayOrder) - label: 'Position'; - target: toolClass; - default: toolClass defaultDisplayOrder; - domainValues: (1 to: 100) asArray; - description: - 'Position of the tool tab in the debugger right column.' ] + with: [ + (aBuilder setting: #showInDebugger) + label: 'Show in debugger'; + target: toolClass; + defaultValue: toolClass showInDebugger; + description: 'Activate the tool tab in the debugger right column.'. + (aBuilder pickOne: #displayOrder) + label: 'Position'; + target: toolClass; + defaultValue: toolClass defaultDisplayOrder; + domainValues: (1 to: 100) asArray; + description: 'Position of the tool tab in the debugger right column.' ] ] { #category : 'settings' } @@ -40,12 +39,8 @@ StDebuggerExtensionSettings class >> debuggerExtensionSettingsOn: aBuilder [ debuggerClass := StDebugger. (aBuilder group: #debuggerExtensions) label: 'Debugger Extensions'; - parent: #debugging; - description: - 'Tools that extend the StDebugger and appear in the right column of the debugger'; + parentName: #debugging; + description: 'Tools that extend the StDebugger and appear in the right column of the debugger'; with: [ - debuggerClass extensionToolsClasses do: [ :toolClass | - self - debuggerExtensionSettingsForClass: toolClass - builder: aBuilder ] ] + debuggerClass extensionToolsClasses do: [ :toolClass | self debuggerExtensionSettingsForClass: toolClass builder: aBuilder ] ] ] diff --git a/src/NewTools-Debugger/StDebuggerSettings.class.st b/src/NewTools-Debugger/StDebuggerSettings.class.st index b105a5326..36353042a 100644 --- a/src/NewTools-Debugger/StDebuggerSettings.class.st +++ b/src/NewTools-Debugger/StDebuggerSettings.class.st @@ -92,12 +92,13 @@ StDebuggerSettings class >> preserveWindowPosition: aBoolean [ { #category : 'initialization' } StDebuggerSettings class >> preserveWindowPositionAndExtentOn: aBuilder [ + - (aBuilder setting: #preserveWindowPosition) label: 'Preserve window position'; target: self; - parent: #debugging; - default: true; - description: 'If enabled, the debugger will preserve the last known window position, and it will open new debugger windows in that configuration'. + parentName: #debugging; + defaultValue: true; + description: + 'If enabled, the debugger will preserve the last known window position, and it will open new debugger windows in that configuration' ] diff --git a/src/NewTools-Epicea/EpSettings.class.st b/src/NewTools-Epicea/EpSettings.class.st index 22ae59d68..5516a9d32 100644 --- a/src/NewTools-Epicea/EpSettings.class.st +++ b/src/NewTools-Epicea/EpSettings.class.st @@ -15,8 +15,9 @@ EpSettings class >> groupSettingsOn: aBuilder [ (aBuilder group: #epicea) label: 'Epicea'; - description: 'Epicea is a tool that records code changes enriched with IDE events. Epicea extends and could replace the traditional .changes logging mechanism, where the recorded code changes are incomplete and are not properly reified and thus it can be difficult to recover lost code after an image crash.'; - parent: #tools + description: + 'Epicea is a tool that records code changes enriched with IDE events. Epicea extends and could replace the traditional .changes logging mechanism, where the recorded code changes are incomplete and are not properly reified and thus it can be difficult to recover lost code after an image crash.'; + parentName: #tools ] { #category : 'accessing' } @@ -37,9 +38,10 @@ EpSettings class >> lostEventsDetectorEnabledSettingOn: aBuilder [ (aBuilder setting: #lostEventsDetectorEnabled) label: 'Detect lost events on start-up'; - default: true; - description: 'Check if current Epicea log has events that were not applied in this image (useful for recovering changes when the image crashed)'; - parent: #epicea; + defaultValue: true; + description: + 'Check if current Epicea log has events that were not applied in this image (useful for recovering changes when the image crashed)'; + parentName: #epicea; target: self ] @@ -61,9 +63,10 @@ EpSettings class >> monitorEnabledSettingOn: aBuilder [ (aBuilder setting: #monitorEnabled) label: 'Monitor enabled'; - default: true; - description: 'The Epicea Monitor listens events in the system such as class added and method modified, and records them to the current Epicea log.'; - parent: #epicea; + defaultValue: true; + description: + 'The Epicea Monitor listens events in the system such as class added and method modified, and records them to the current Epicea log.'; + parentName: #epicea; target: self ] @@ -86,9 +89,9 @@ EpSettings class >> storeNameStrategySettingsOn: aBuilder [ (aBuilder pickOne: #storeNameStrategyClass) label: 'File Naming Strategy'; description: 'Choose how will be the Epicea logs named.'; - parent: #epicea; + parentName: #epicea; target: self; - default: OmTimeStampSuffixStrategy; + defaultValue: OmTimeStampSuffixStrategy; domainValues: OmSessionStoreNamingStrategy availableStrategies ] @@ -110,12 +113,13 @@ EpSettings class >> writingDeferDurationSettingOn: aBuilder [ (aBuilder setting: #writingDeferDuration) label: 'Writing defer duration'; - default: 250; - description: 'Time to wait before write. When Epicea listens new events, it does not write them immediately. Instead, the new events are buffered until there were not new events during the time specified by this setting. The goal is to optimize I/O operations by batching them. + defaultValue: 250; + description: + 'Time to wait before write. When Epicea listens new events, it does not write them immediately. Instead, the new events are buffered until there were not new events during the time specified by this setting. The goal is to optimize I/O operations by batching them. Consecuences of a high defer duration: - Pros: For example, when a project is loaded into the image, many events happen in a small window of time. - Cons: Code changes can be lost if the vm crashes.'; - parent: #epicea; + parentName: #epicea; target: self ] diff --git a/src/NewTools-FileBrowser/StFileBrowserSettings.class.st b/src/NewTools-FileBrowser/StFileBrowserSettings.class.st index 53dbf0dd6..c252ea79e 100644 --- a/src/NewTools-FileBrowser/StFileBrowserSettings.class.st +++ b/src/NewTools-FileBrowser/StFileBrowserSettings.class.st @@ -36,16 +36,15 @@ StFileBrowserSettings class >> defaultDirectory: aFileReference [ { #category : 'settings' } StFileBrowserSettings class >> defaultDirectoryOn: aBuilder [ - + (aBuilder setting: #defaultDirectory) - parent: #fileBrowser; + parentName: #fileBrowser; type: #FilePathEncoder; - default: self defaultDirectory; + defaultValue: self defaultDirectory; label: 'Default directory'; description: 'Set the default directory for opening the file browser and dialogs'; target: self - ] { #category : 'settings' } @@ -56,12 +55,12 @@ StFileBrowserSettings class >> defaultTerminalProgram [ { #category : 'settings' } StFileBrowserSettings class >> groupSettingsOn: aBuilder [ - + (aBuilder group: #fileBrowser) label: 'File Browser'; description: 'Settings for the File Browser'; - parent: #tools + parentName: #tools ] { #category : 'settings' } @@ -92,15 +91,15 @@ StFileBrowserSettings class >> macTerminalProgram: aString [ { #category : 'settings' } StFileBrowserSettings class >> macTerminalProgramOn: aBuilder [ - + (aBuilder setting: #macTerminalProgram) - parent: #fileBrowser; - default: String empty; + parentName: #fileBrowser; + defaultValue: String empty; label: 'Name of the MacOS terminal'; - description: 'Set the name of the MacOS terminal program to run when a shell terminal is requested. It is not necessary to specify the full path'; + description: + 'Set the name of the MacOS terminal program to run when a shell terminal is requested. It is not necessary to specify the full path'; target: self - ] { #category : 'settings' } @@ -122,7 +121,7 @@ StFileBrowserSettings class >> openOnLastDirectoryOn: aBuilder [ (aBuilder setting: #openOnLastDirectory) - parent: #fileBrowser; + parentName: #fileBrowser; label: 'Open on last visited directory'; description: 'Open a new instance on the last visited directory'; target: self @@ -145,15 +144,14 @@ StFileBrowserSettings class >> showAlwaysDefaultBookmarks: aBoolean [ { #category : 'settings' } StFileBrowserSettings class >> showAlwaysDefaultBookmarksOn: aBuilder [ - + (aBuilder setting: #showAlwaysDefaultBookmarks) - parent: #fileBrowser; - default: true; + parentName: #fileBrowser; + defaultValue: true; label: 'Show always default bookmarks'; description: 'If the global bookmarks are deleted, this setting ensures that dialogs will always preserve default bookmarks'; target: self - ] { #category : 'accessing' } @@ -173,8 +171,8 @@ StFileBrowserSettings class >> showHiddenFilesOn: aBuilder [ (aBuilder setting: #showHiddenFiles) - parent: #fileBrowser; - default: false; + parentName: #fileBrowser; + defaultValue: false; label: 'Show hidden files and folders'; description: 'If enabled, shows the hidden files and folders in the file browser.'; target: self @@ -196,15 +194,14 @@ StFileBrowserSettings class >> showPreview: aBoolean [ { #category : 'settings' } StFileBrowserSettings class >> showPreviewOn: aBuilder [ - + (aBuilder setting: #showPreview) - parent: #fileBrowser; - default: true; + parentName: #fileBrowser; + defaultValue: true; label: 'Enable preview'; description: 'File Browser will show a preview file presenter by default'; target: self - ] { #category : 'settings' } diff --git a/src/NewTools-Finder/StFinderSettings.class.st b/src/NewTools-Finder/StFinderSettings.class.st index 291a91405..81711a0fb 100644 --- a/src/NewTools-Finder/StFinderSettings.class.st +++ b/src/NewTools-Finder/StFinderSettings.class.st @@ -40,11 +40,11 @@ StFinderSettings class >> cleanResultsOnEmptyInput: aBoolean [ { #category : 'system settings' } StFinderSettings class >> cleanResultsOnEmptyInputOn: aBuilder [ + - (aBuilder setting: #cleanResultsOnEmptyInput) - parent: #finder; - default: false; + parentName: #finder; + defaultValue: false; label: 'Clean results on clean text input'; description: 'Clean results after text input is cleaned'; target: self @@ -67,12 +67,14 @@ StFinderSettings class >> evaluationTimeout: aNumber [ { #category : 'system settings' } StFinderSettings class >> evaluationTimeoutOn: aBuilder [ + (aBuilder setting: #evaluationTimeout) - parent: #finder; - default: 500; + parentName: #finder; + defaultValue: 500; label: 'Evaluation timeout'; - description: 'Maximum timeout delay for individual calls in Examples search. Expects an integer giving the number of miliseconds. + description: + 'Maximum timeout delay for individual calls in Examples search. Expects an integer giving the number of miliseconds. Setting a value of 0 will set the evaluation to run without timeout'; target: self @@ -102,10 +104,11 @@ StFinderSettings class >> expandResults: aBoolean [ { #category : 'system settings' } StFinderSettings class >> expandResultsOn: aBuilder [ + (aBuilder setting: #expandResults) - parent: #finder; - default: false; + parentName: #finder; + defaultValue: false; label: 'Expand all results by default'; description: 'All results with children will be expanded if true'; target: self @@ -113,12 +116,12 @@ StFinderSettings class >> expandResultsOn: aBuilder [ { #category : 'system settings' } StFinderSettings class >> groupSettingsOn: aBuilder [ - + (aBuilder group: #finder) label: 'Finder'; description: ''; - parent: #tools + parentName: #tools ] { #category : 'system settings' } @@ -160,10 +163,11 @@ StFinderSettings class >> logErrorsToFile: aBoolean [ { #category : 'system settings' } StFinderSettings class >> logErrorsToFileOn: aBuilder [ + (aBuilder setting: #logErrorsToFile) - parent: #finder; - default: false; + parentName: #finder; + defaultValue: false; label: 'Log errors to file'; description: 'Log evaluation errors in the examples search to a file'; target: self @@ -185,10 +189,11 @@ StFinderSettings class >> logErrorsToTranscript: aBoolean [ { #category : 'system settings' } StFinderSettings class >> logErrorsToTranscriptOn: aBuilder [ + (aBuilder setting: #logErrorsToTranscript) - parent: #finder; - default: false; + parentName: #finder; + defaultValue: false; label: 'Log errors to Transcript'; description: 'Log evaluation errors in the examples search to the Transcript'; target: self @@ -211,11 +216,11 @@ StFinderSettings class >> searchAsYouType: aBoolean [ { #category : 'system settings' } StFinderSettings class >> searchAsYouTypeOn: aBuilder [ + - (aBuilder setting: #searchAsYouType) - parent: #finder; - default: false; + parentName: #finder; + defaultValue: false; label: 'Search as you type'; description: 'Present results as you type'; target: self @@ -237,10 +242,11 @@ StFinderSettings class >> useCompletion: aBoolean [ { #category : 'system settings' } StFinderSettings class >> useCompletionOn: aBuilder [ + (aBuilder setting: #useCompletion) - parent: #finder; - default: false; + parentName: #finder; + defaultValue: false; label: 'Use completion'; description: 'Enable or disable autocompletion in finder text field as you type'; target: self diff --git a/src/NewTools-Inspector/StInspectorPresenter.class.st b/src/NewTools-Inspector/StInspectorPresenter.class.st index d980a226d..7874192c9 100644 --- a/src/NewTools-Inspector/StInspectorPresenter.class.st +++ b/src/NewTools-Inspector/StInspectorPresenter.class.st @@ -117,16 +117,16 @@ StInspectorPresenter class >> registerToolsOn: registry [ { #category : 'settings' } StInspectorPresenter class >> settingsOn: aBuilder [ - + (aBuilder group: #inspector) - parent: #tools; + parentName: #tools; label: 'Inspector'; description: 'Inspector'. - + (aBuilder setting: #inspectorDiveOnSingleClick) - parent: #inspector; - default: self inspectorDiveOnSingleClick; + parentName: #inspector; + defaultValue: self inspectorDiveOnSingleClick; target: self; description: 'Whether inspector will dive with single or double click'; label: 'Dive on single click' diff --git a/src/NewTools-Inspector/StObjectPrinter.class.st b/src/NewTools-Inspector/StObjectPrinter.class.st index b59344e8c..71a10af94 100644 --- a/src/NewTools-Inspector/StObjectPrinter.class.st +++ b/src/NewTools-Inspector/StObjectPrinter.class.st @@ -46,11 +46,11 @@ StObjectPrinter class >> displayStringLength: anInteger [ { #category : 'settings' } StObjectPrinter class >> settingsOn: aBuilder [ + - (aBuilder setting: #displayStringLength) - parent: #inspector; - default: 100; + parentName: #inspector; + defaultValue: 100; target: self; description: 'The length of the display string shown in the inspector'; label: 'Display String length in Collection' diff --git a/src/NewTools-ObjectTranscript/StObjectTranscriptPresenter.class.st b/src/NewTools-ObjectTranscript/StObjectTranscriptPresenter.class.st index 9a74274b6..b0458e8c8 100644 --- a/src/NewTools-ObjectTranscript/StObjectTranscriptPresenter.class.st +++ b/src/NewTools-ObjectTranscript/StObjectTranscriptPresenter.class.st @@ -113,11 +113,10 @@ StObjectTranscriptPresenter class >> registerToolsOn: registry [ StObjectTranscriptPresenter class >> settings: aBuilder [ - (aBuilder setting: #objectTranscript) - parent: #tools; + parentName: #tools; selector: #showInspector; - default: true; + defaultValue: true; label: 'Display the inspector part'; description: 'The object transcript supports the in place inspector of log entities. This preference enables it by default'; target: self diff --git a/src/NewTools-Playground/StPlaygroundPresenter.class.st b/src/NewTools-Playground/StPlaygroundPresenter.class.st index 38a0e35ec..f97d5df22 100644 --- a/src/NewTools-Playground/StPlaygroundPresenter.class.st +++ b/src/NewTools-Playground/StPlaygroundPresenter.class.st @@ -120,15 +120,15 @@ StPlaygroundPresenter class >> registerToolsOn: registry [ { #category : 'settings' } StPlaygroundPresenter class >> settingsOn: aBuilder [ - + (aBuilder setting: #cacheDirectory) - parent: #pharoSystem; + parentName: #pharoSystem; type: #Directory; - default: self defaultCacheDirectory; + defaultValue: self defaultCacheDirectory; target: StPlaygroundPresenter; description: 'The path to the local Playground cache that stores all Playground scripts in ph files'; - label: 'Local Playground cache directory'. + label: 'Local Playground cache directory' ] { #category : 'accessing' } diff --git a/src/NewTools-Pulse/StPulse.class.st b/src/NewTools-Pulse/StPulse.class.st index c4cc0e8dd..00891d59d 100644 --- a/src/NewTools-Pulse/StPulse.class.st +++ b/src/NewTools-Pulse/StPulse.class.st @@ -288,37 +288,37 @@ StPulse class >> resetSize [ { #category : 'settings' } StPulse class >> settingsOn: aBuilder [ - + (aBuilder group: #pulse) - parent: #tools; + parentName: #tools; label: 'Pulse'; target: self; description: 'Pulse configuration'. (aBuilder setting: #previewVisible) - parent: #pulse; - default: true; + parentName: #pulse; + defaultValue: true; target: self; description: 'Show the preview panel'; label: 'Show Preview Panel'. - + (aBuilder setting: #insertsSelection) - parent: #pulse; - default: false; + parentName: #pulse; + defaultValue: false; target: self; description: 'When opening pulse, insert the selected content into the search bar'; label: 'Inserts Selection'. - + (aBuilder button: #resetHistory) - parent: #pulse; + parentName: #pulse; target: self; description: 'Resets the history of environmment entries of Pulse'; label: 'Reset history'; buttonLabel: 'Reset'. - + (aBuilder button: #resetSize) - parent: #pulse; + parentName: #pulse; description: 'Resets the stored size of Pulse, which can be changed at any time and will be remembered'; label: 'Reset size'; buttonLabel: 'Reset' diff --git a/src/NewTools-Spotter-Processors/StSpotterPragmaBasedProcessor.class.st b/src/NewTools-Spotter-Processors/StSpotterPragmaBasedProcessor.class.st index 07c09e69d..e302222a8 100644 --- a/src/NewTools-Spotter-Processors/StSpotterPragmaBasedProcessor.class.st +++ b/src/NewTools-Spotter-Processors/StSpotterPragmaBasedProcessor.class.st @@ -40,21 +40,21 @@ StSpotterPragmaBasedProcessor class >> defaultNestedItemsLimit: aValue [ { #category : 'accessing - defaults' } StSpotterPragmaBasedProcessor class >> settingsOn: aBuilder [ - + (aBuilder setting: #defaultItemsLimit) target: self; - parent: #spotter; + parentName: #spotter; label: 'Number of results per category'; - default: 25; + defaultValue: 25; order: 100; description: 'Number of results per category to show in Spotter'. - + (aBuilder setting: #defaultNestedItemsLimit) target: self; - parent: #spotter; + parentName: #spotter; label: 'Number of nested results per category'; - default: 2000; + defaultValue: 2000; order: 101; description: 'Number of total results per of category to show in Spotter' ] diff --git a/src/NewTools-Spotter-Processors/StSpotterProcessor.class.st b/src/NewTools-Spotter-Processors/StSpotterProcessor.class.st index f2af66b69..af3b34194 100644 --- a/src/NewTools-Spotter-Processors/StSpotterProcessor.class.st +++ b/src/NewTools-Spotter-Processors/StSpotterProcessor.class.st @@ -94,19 +94,17 @@ StSpotterProcessor class >> settingsDescription [ { #category : 'settings' } StSpotterProcessor class >> settingsOn: aBuilder [ - + (aBuilder group: #spotterProcessors) - parent: #spotter; + parentName: #spotter; label: 'Sources'; description: 'It configures the sources that are queried when using spotter'. - self allConcreteSubclasses - reject: [ :each | each hideInSettings ] - thenDo: [ :aProcessorClass | + self allConcreteSubclasses reject: [ :each | each hideInSettings ] thenDo: [ :aProcessorClass | (aBuilder setting: aProcessorClass name , '_enabled') - parent: #spotterProcessors; - default: aProcessorClass defaultEnabled; + parentName: #spotterProcessors; + defaultValue: aProcessorClass defaultEnabled; getSelector: #enabled; setSelector: #enabled:; target: aProcessorClass; diff --git a/src/NewTools-Spotter/StSpotter.class.st b/src/NewTools-Spotter/StSpotter.class.st index d6c1a89b2..03c1c9fec 100644 --- a/src/NewTools-Spotter/StSpotter.class.st +++ b/src/NewTools-Spotter/StSpotter.class.st @@ -243,33 +243,33 @@ StSpotter class >> resetHistory [ { #category : 'settings' } StSpotter class >> settingsOn: aBuilder [ - + (aBuilder group: #spotter) - parent: #tools; + parentName: #tools; label: 'Spotter'; description: 'Spotter configuration'. (aBuilder setting: #previewVisible) - parent: #spotter; - default: self isShowingPreview; + parentName: #spotter; + defaultValue: self isShowingPreview; target: self; description: 'If Spotter will show the preview panel on the right of spotter'; label: 'Show Preview Panel'. - + (aBuilder setting: #tipsVisible) - parent: #spotter; - default: self isShowingTips; + parentName: #spotter; + defaultValue: self isShowingTips; target: self; description: 'If Spotter will show the tips at the bottom of spotter'; label: 'Show Tips Panel'. - + (aBuilder setting: #insertsSelection) - parent: #spotter; - default: self insertsSelection; + parentName: #spotter; + defaultValue: self insertsSelection; target: self; description: 'When the Spotter is opened, automatically insert the selected text into the search field'; - label: 'Inserts Selection'. + label: 'Inserts Selection' ] { #category : 'accessing' } diff --git a/src/NewTools-WindowManager/SpClosedWindowListPresenter.class.st b/src/NewTools-WindowManager/SpClosedWindowListPresenter.class.st index 1562736a4..b9605ac8f 100644 --- a/src/NewTools-WindowManager/SpClosedWindowListPresenter.class.st +++ b/src/NewTools-WindowManager/SpClosedWindowListPresenter.class.st @@ -86,12 +86,11 @@ SpClosedWindowListPresenter class >> settingOn: aBuilder [ (aBuilder setting: #useHideForClose) - parent: #tools; + parentName: #tools; order: 1; target: self; selector: #enableCloseWindow; - description: - 'If closed windows will be stored in SpClosedWindowListPresenter'; + description: 'If closed windows will be stored in SpClosedWindowListPresenter'; label: 'Use last closed windows' ] From a9bd21799d2e7e05942f86c19ea658eb49628972 Mon Sep 17 00:00:00 2001 From: DEMAREY Christophe Date: Tue, 27 Oct 2026 15:55:08 +0100 Subject: [PATCH 3/9] Make the settings tree independent from the old SettingTree StNewSettingsTree subclassed SettingTree, the tree of the old Morphic SettingBrowser removed from Pharo. It now subclasses Object and defines what it used from it: its nodeList instance variable, the sort of nodes by order then label, and #childrenOf:, which matches children with their parent setting instead of the parent name (setting names are not unique) and also orders all the children placed before the first ordered one (the old loop only did it for one of them). Methods only needed by the old setting nodes are removed: checkForUnknownTarget, newTreeHolder and settingsKeywords. --- .../StNewSettingsTreeTest.class.st | 76 ++++++++++++++++++ .../StNewSettingsTree.class.st | 79 ++++++++++++------- 2 files changed, 127 insertions(+), 28 deletions(-) create mode 100644 src/NewTools-SettingsBrowser-Tests/StNewSettingsTreeTest.class.st diff --git a/src/NewTools-SettingsBrowser-Tests/StNewSettingsTreeTest.class.st b/src/NewTools-SettingsBrowser-Tests/StNewSettingsTreeTest.class.st new file mode 100644 index 000000000..e0a65ae4f --- /dev/null +++ b/src/NewTools-SettingsBrowser-Tests/StNewSettingsTreeTest.class.st @@ -0,0 +1,76 @@ +" +I test StNewSettingsTree, the model of the settings browser. +" +Class { + #name : 'StNewSettingsTreeTest', + #superclass : 'TestCase', + #category : 'NewTools-SettingsBrowser-Tests', + #package : 'NewTools-SettingsBrowser-Tests' +} + +{ #category : 'helpers' } +StNewSettingsTreeTest >> nodeNamed: aSymbol label: aString order: aNumberOrNil [ + + ^ StNewSettingNode forSetting: (Setting new + name: aSymbol; + label: aString; + order: aNumberOrNil; + yourself) +] + +{ #category : 'tests' } +StNewSettingsTreeTest >> testChildrenOfGroupAreItsSettings [ + + | tree group | + tree := StNewSettingsTree new. + group := tree nodeList detect: [ :each | each name = #'Syntax Highlighting' ]. + + self + assertCollection: ((tree childrenOf: group) collect: [ :each | each name ]) + includesAll: #( #formatIncompleteIdentifiers #activeStyleTable #'Edit Custom Style' ) +] + +{ #category : 'tests' } +StNewSettingsTreeTest >> testChildrenWithoutOrderAreOrderedAroundOrderedChildren [ + + | group tree children | + group := SettingsGroup new + name: #group; + yourself. + tree := StNewSettingsTree new. + tree nodeList: ({ group } , (#( nil nil 5 nil 9 nil ) withIndexCollect: [ :order :index | + Setting new + name: ('setting' , index printString) asSymbol; + order: order; + parentGroup: group; + yourself ]) collect: [ :each | StNewSettingNode forSetting: each ]). + + children := tree childrenOf: tree nodeList first. + + self assert: (children collect: [ :each | each order ]) asArray equals: #( 3 4 5 6 9 10 ) +] + +{ #category : 'tests' } +StNewSettingsTreeTest >> testSortBlockSortsByOrderThenByLabel [ + + | nodes | + nodes := { + (self nodeNamed: #a label: 'a' order: 2). + (self nodeNamed: #b label: 'b' order: 1). + (self nodeNamed: #c label: 'z' order: nil). + (self nodeNamed: #d label: 'y' order: nil) }. + + self + assert: ((nodes asSortedCollection: StNewSettingsTree new sortBlock) collect: [ :each | each name ]) asArray + equals: #( #b #a #d #c ) +] + +{ #category : 'tests' } +StNewSettingsTreeTest >> testTreeRootsHaveNoParent [ + + | roots | + roots := StNewSettingsTree new treeRoots. + + self denyEmpty: roots. + self assert: (roots noneSatisfy: [ :each | each hasParent ]) +] diff --git a/src/NewTools-SettingsBrowser/StNewSettingsTree.class.st b/src/NewTools-SettingsBrowser/StNewSettingsTree.class.st index 923b70017..0a0390340 100644 --- a/src/NewTools-SettingsBrowser/StNewSettingsTree.class.st +++ b/src/NewTools-SettingsBrowser/StNewSettingsTree.class.st @@ -1,27 +1,38 @@ +" +I am the model of the settings browser: I build the settings declared with with a SettingsManager and wrap each of them in a StNewSettingNode. +" Class { #name : 'StNewSettingsTree', - #superclass : 'SettingTree', + #superclass : 'Object', #instVars : [ - 'manager' + 'manager', + 'nodeList' ], #category : 'NewTools-SettingsBrowser-Model', #package : 'NewTools-SettingsBrowser', #tag : 'Model' } -{ #category : 'opening' } -StNewSettingsTree class >> settingsKeywords [ +{ #category : 'accessing' } +StNewSettingsTree >> childrenOf: aNode [ + "Answer the nodes of the settings of the group of aNode" - ^ (Pragma allNamed: #systemsettings) collect: [: p | p method selector ] + | children | + children := self nodeList select: [ :each | each setting parent == aNode setting ]. + self completeOrdersOf: children. + ^ children ] -{ #category : 'checking' } -StNewSettingsTree >> checkForUnknownTarget [ - "check only root because other nodes with unknown target inherits it from its parent" +{ #category : 'private' } +StNewSettingsTree >> completeOrdersOf: nodes [ + "Give an order to the nodes without one, so that they keep their position among the nodes with an order" + + | firstOrderedIndex | + firstOrderedIndex := nodes findFirst: [ :each | each order isNotNil ]. + firstOrderedIndex = 0 ifTrue: [ ^ self ]. - self treeRoots do: [ :node | - node item target ifNil: [ node item target: (node pragma ifNotNil: [ :prg | prg methodClass instanceSide ]) ] ]. - self treeRoots do: [ :node | node checkForUnknownTarget ] + self orderNodesBefore: firstOrderedIndex in: nodes. + self orderUnorderedNodesAfter: firstOrderedIndex in: nodes ] { #category : 'accessing' } @@ -51,16 +62,6 @@ StNewSettingsTree >> newSettingTreeBuilderNodes [ ^ nodeList ] -{ #category : 'instance creation' } -StNewSettingsTree >> newTreeHolder [ - "Set the receiver's collector to gather the system setting pragmas" - - ^ self - acceptableKeywords: { #systemsettings }; - nodeList: self nodeList; - yourself -] - { #category : 'accessing' } StNewSettingsTree >> nodeForSetting: aSetting [ @@ -79,6 +80,23 @@ StNewSettingsTree >> nodeList: aCollection [ nodeList := aCollection ] +{ #category : 'private' } +StNewSettingsTree >> orderNodesBefore: anIndex in: nodes [ + "Each node before the one at anIndex gets the order of the node after it, minus 1" + + anIndex - 1 to: 1 by: -1 do: [ :index | + (nodes at: index) order: (nodes at: index + 1) order - 1 ] +] + +{ #category : 'private' } +StNewSettingsTree >> orderUnorderedNodesAfter: anIndex in: nodes [ + "Each node after the one at anIndex without an order gets the order of the node before it, plus 1" + + anIndex + 1 to: nodes size do: [ :index | + (nodes at: index) order ifNil: [ + (nodes at: index) order: (nodes at: index - 1) order + 1 ] ] +] + { #category : 'accessing' } StNewSettingsTree >> persistence [ @@ -107,15 +125,20 @@ StNewSettingsTree >> settingsFileReference [ ^ manager settingsFile ] -{ #category : 'instance creation' } -StNewSettingsTree >> settingsKeywords [ - - ^ self class settingsKeywords -] - { #category : 'accessing' } StNewSettingsTree >> sortBlock [ - ^ [:a :b | self itemSortBlock value: a setting value: b setting ] + "Sort nodes by setting order, then by label. Nodes with an order come first" + + ^ [ :a :b | + | orderA orderB | + orderA := a setting order. + orderB := b setting order. + (orderA isNotNil and: [ orderB isNotNil and: [ orderA ~= orderB ] ]) + ifTrue: [ orderA < orderB ] + ifFalse: [ + orderA = orderB + ifTrue: [ a setting label < b setting label ] + ifFalse: [ orderA isNotNil ] ] ] ] { #category : 'instance creation' } From b6690b83b781d6f0ed9c3a8177a7255bbfb82927 Mon Sep 17 00:00:00 2001 From: DEMAREY Christophe Date: Tue, 27 Oct 2026 15:55:47 +0100 Subject: [PATCH 4/9] Port Spotter settings extensions to the new settings tree --- ...de.extension.st => StNewSettingNode.extension.st} | 12 ++++++------ ...e.extension.st => StNewSettingsTree.extension.st} | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) rename src/NewTools-Spotter-Extensions/{SettingNode.extension.st => StNewSettingNode.extension.st} (55%) rename src/NewTools-Spotter-Extensions/{SettingTree.extension.st => StNewSettingsTree.extension.st} (70%) diff --git a/src/NewTools-Spotter-Extensions/SettingNode.extension.st b/src/NewTools-Spotter-Extensions/StNewSettingNode.extension.st similarity index 55% rename from src/NewTools-Spotter-Extensions/SettingNode.extension.st rename to src/NewTools-Spotter-Extensions/StNewSettingNode.extension.st index 38da4daa4..0ea0db537 100644 --- a/src/NewTools-Spotter-Extensions/SettingNode.extension.st +++ b/src/NewTools-Spotter-Extensions/StNewSettingNode.extension.st @@ -1,7 +1,7 @@ -Extension { #name : 'SettingNode' } +Extension { #name : 'StNewSettingNode' } { #category : '*NewTools-Spotter-Extensions' } -SettingNode >> spotterForSettingsFor: aStep [ +StNewSettingNode >> spotterForSettingsFor: aStep [ self allChildren isEmpty ifTrue: [ ^ self ]. aStep listProcessor @@ -12,9 +12,9 @@ SettingNode >> spotterForSettingsFor: aStep [ ] { #category : '*NewTools-Spotter-Extensions' } -SettingNode >> spotterLabel [ +StNewSettingNode >> spotterLabel [ - | label | - label := self settingDeclaration label. - ^ self parentNode ifNil: [ label ] ifNotNil: [ self parentNode spotterLabel , '/' , label ] + ^ self parentNode + ifNil: [ self label ] + ifNotNil: [ :parent | parent spotterLabel , '/' , self label ] ] diff --git a/src/NewTools-Spotter-Extensions/SettingTree.extension.st b/src/NewTools-Spotter-Extensions/StNewSettingsTree.extension.st similarity index 70% rename from src/NewTools-Spotter-Extensions/SettingTree.extension.st rename to src/NewTools-Spotter-Extensions/StNewSettingsTree.extension.st index 4a704b755..d45616dce 100644 --- a/src/NewTools-Spotter-Extensions/SettingTree.extension.st +++ b/src/NewTools-Spotter-Extensions/StNewSettingsTree.extension.st @@ -1,7 +1,7 @@ -Extension { #name : 'SettingTree' } +Extension { #name : 'StNewSettingsTree' } { #category : '*NewTools-Spotter-Extensions' } -SettingTree >> spotterForSettingsFor: aStep [ +StNewSettingsTree >> spotterForSettingsFor: aStep [ aStep listProcessor title: 'Settings'; From 076b3012764d8503114156fd37cbb07cea5aa037 Mon Sep 17 00:00:00 2001 From: DEMAREY Christophe Date: Tue, 27 Oct 2026 15:55:54 +0100 Subject: [PATCH 5/9] Remove the settings presenter of shortcut activations CmdShortcutActivation>>#asSettingPresenter:owner: displayed the value of CmdShortcutSetting, which is not used anymore and was removed from Pharo. --- .../CmdShortcutActivation.extension.st | 9 --------- 1 file changed, 9 deletions(-) delete mode 100644 src/NewTools-SettingsBrowser/CmdShortcutActivation.extension.st diff --git a/src/NewTools-SettingsBrowser/CmdShortcutActivation.extension.st b/src/NewTools-SettingsBrowser/CmdShortcutActivation.extension.st deleted file mode 100644 index b7a0aea05..000000000 --- a/src/NewTools-SettingsBrowser/CmdShortcutActivation.extension.st +++ /dev/null @@ -1,9 +0,0 @@ -Extension { #name : 'CmdShortcutActivation' } - -{ #category : '*NewTools-SettingsBrowser' } -CmdShortcutActivation >> asSettingPresenter: aDeclaration owner: aPresenter [ - - ^ (aPresenter instantiate: StSettingTextPresenterItem on: aDeclaration) - value: self keyCombination asString; - yourself -] From 95eac1c20b234d01baf9ac90ac05bb9e0677a4e1 Mon Sep 17 00:00:00 2001 From: DEMAREY Christophe Date: Tue, 27 Oct 2026 15:56:32 +0100 Subject: [PATCH 6/9] Let font settings of the new settings model open the font chooser --- .../{PragmaSetting.extension.st => Setting.extension.st} | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) rename src/NewTools-FontChooser/{PragmaSetting.extension.st => Setting.extension.st} (61%) diff --git a/src/NewTools-FontChooser/PragmaSetting.extension.st b/src/NewTools-FontChooser/Setting.extension.st similarity index 61% rename from src/NewTools-FontChooser/PragmaSetting.extension.st rename to src/NewTools-FontChooser/Setting.extension.st index 59eecbf15..979d53b9a 100644 --- a/src/NewTools-FontChooser/PragmaSetting.extension.st +++ b/src/NewTools-FontChooser/Setting.extension.st @@ -1,7 +1,8 @@ -Extension { #name : 'PragmaSetting' } +Extension { #name : 'Setting' } { #category : '*NewTools-FontChooser' } -PragmaSetting >> getFont [ +Setting >> getFont [ + "Let the user choose a new font value for the receiver" | chooser | chooser := FontChooser @@ -9,6 +10,5 @@ PragmaSetting >> getFont [ initialFont: self realValue onAcceptDo: [ :e | self realValue: e ]. - ^ chooser font. - + ^ chooser font ] From 121b26c957f6067c8e67fbb4977fa01acccfef07 Mon Sep 17 00:00:00 2001 From: DEMAREY Christophe Date: Tue, 27 Oct 2026 15:57:17 +0100 Subject: [PATCH 7/9] Remove the settings tree built on the old settings model The settings browser uses StNewSettingsTree, built on the new settings model of Pharo. Remove the old one and what only served it: StSettingsTree, StSettingNode, StSettingTreeBuilder and StSettingNodeBuilder, the presenter extensions of the old setting classes (PragmaSetting, SettingDeclaration, ActionSettingDeclaration, PickOneSettingDeclaration), SystemSettingsPersistence>>#hasSettingsFile, the Spotter extension of StSettingsTree and the unused StSettingsAbstractPresenter>>#newNodePresenterFrom:level:. --- .../ActionSettingDeclaration.extension.st | 9 - .../PickOneSettingDeclaration.extension.st | 9 - .../PragmaSetting.extension.st | 11 - .../SettingDeclaration.extension.st | 37 --- .../StSettingNode.class.st | 279 ------------------ .../StSettingNodeBuilder.class.st | 178 ----------- .../StSettingTreeBuilder.class.st | 94 ------ .../StSettingsAbstractPresenter.class.st | 12 - .../StSettingsTree.class.st | 269 ----------------- .../SystemSettingsPersistence.extension.st | 8 - .../StSettingsTree.extension.st | 11 - 11 files changed, 917 deletions(-) delete mode 100644 src/NewTools-SettingsBrowser/ActionSettingDeclaration.extension.st delete mode 100644 src/NewTools-SettingsBrowser/PickOneSettingDeclaration.extension.st delete mode 100644 src/NewTools-SettingsBrowser/PragmaSetting.extension.st delete mode 100644 src/NewTools-SettingsBrowser/SettingDeclaration.extension.st delete mode 100644 src/NewTools-SettingsBrowser/StSettingNode.class.st delete mode 100644 src/NewTools-SettingsBrowser/StSettingNodeBuilder.class.st delete mode 100644 src/NewTools-SettingsBrowser/StSettingTreeBuilder.class.st delete mode 100644 src/NewTools-SettingsBrowser/StSettingsTree.class.st delete mode 100644 src/NewTools-SettingsBrowser/SystemSettingsPersistence.extension.st delete mode 100644 src/NewTools-Spotter-Extensions/StSettingsTree.extension.st diff --git a/src/NewTools-SettingsBrowser/ActionSettingDeclaration.extension.st b/src/NewTools-SettingsBrowser/ActionSettingDeclaration.extension.st deleted file mode 100644 index 4b2f72ea3..000000000 --- a/src/NewTools-SettingsBrowser/ActionSettingDeclaration.extension.st +++ /dev/null @@ -1,9 +0,0 @@ -Extension { #name : 'ActionSettingDeclaration' } - -{ #category : '*NewTools-SettingsBrowser' } -ActionSettingDeclaration >> asSettingPresenterWithOwner: aPresenter [ - "Answer an appropriate for the receiver" - - ^ aPresenter instantiate: StSettingButtonPresenterItem on: self - -] diff --git a/src/NewTools-SettingsBrowser/PickOneSettingDeclaration.extension.st b/src/NewTools-SettingsBrowser/PickOneSettingDeclaration.extension.st deleted file mode 100644 index 366a95128..000000000 --- a/src/NewTools-SettingsBrowser/PickOneSettingDeclaration.extension.st +++ /dev/null @@ -1,9 +0,0 @@ -Extension { #name : 'PickOneSettingDeclaration' } - -{ #category : '*NewTools-SettingsBrowser' } -PickOneSettingDeclaration >> asSettingPresenterWithOwner: aPresenter [ - "Answer an appropriate container for the receiver's value" - - ^ aPresenter instantiate: StSettingDropListPresenterItem on: self - -] diff --git a/src/NewTools-SettingsBrowser/PragmaSetting.extension.st b/src/NewTools-SettingsBrowser/PragmaSetting.extension.st deleted file mode 100644 index 6f0cb8a76..000000000 --- a/src/NewTools-SettingsBrowser/PragmaSetting.extension.st +++ /dev/null @@ -1,11 +0,0 @@ -Extension { #name : 'PragmaSetting' } - -{ #category : '*NewTools-SettingsBrowser' } -PragmaSetting >> asSettingPresenterWithOwner: aPresenter [ - "Answer an appropriate container for the receiver's value" - - ^ aPresenter newLabel - addStyle: 'settingLabel'; - label: self label; - yourself -] diff --git a/src/NewTools-SettingsBrowser/SettingDeclaration.extension.st b/src/NewTools-SettingsBrowser/SettingDeclaration.extension.st deleted file mode 100644 index 728d0aa10..000000000 --- a/src/NewTools-SettingsBrowser/SettingDeclaration.extension.st +++ /dev/null @@ -1,37 +0,0 @@ -Extension { #name : 'SettingDeclaration' } - -{ #category : '*NewTools-SettingsBrowser' } -SettingDeclaration >> asSettingPresenterWithOwner: aPresenter [ - "Answer an appropriate container for the receiver's value" - - ^ self precondition value - ifTrue: [ - self hasValue - ifTrue: [ self realValue asSettingPresenter: self owner: aPresenter ] - ifFalse: [ self default asSettingPresenter: self owner: aPresenter ] ] - ifFalse: [ SpNullPresenter owner: aPresenter ] -] - -{ #category : '*NewTools-SettingsBrowser' } -SettingDeclaration >> getColorFor: aPresenter [ - | colorPickerPresenter color changedAspect | - - colorPickerPresenter := aPresenter instantiate: SpColorPickerPresenter on: self. - (colorPickerPresenter asModalWindow - owner: aPresenter window; - open) - isOk - ifFalse: [ ^ self ]. - - color := colorPickerPresenter color. - "First we need to get the setter selector, then apply it" - "Some settings are built 'customized' configuring its setter in a different way than using #targetSelector (see #customSettingsOn:)" - self targetSelector - ifNil: [ - self realTarget perform: self name asMutator with: color. - changedAspect := self realTarget ] - ifNotNil: [ - changedAspect := self realTarget perform: self targetSelector. - changedAspect perform: self setSelector with: color ]. - aPresenter updateColor: color -] diff --git a/src/NewTools-SettingsBrowser/StSettingNode.class.st b/src/NewTools-SettingsBrowser/StSettingNode.class.st deleted file mode 100644 index 24e13544b..000000000 --- a/src/NewTools-SettingsBrowser/StSettingNode.class.st +++ /dev/null @@ -1,279 +0,0 @@ -" -Represents a single setting - -" -Class { - #name : 'StSettingNode', - #superclass : 'Object', - #instVars : [ - 'declaration', - 'pragma', - 'parentName', - 'model', - 'matchBlock', - 'parentNode' - ], - #category : 'NewTools-SettingsBrowser-Model', - #package : 'NewTools-SettingsBrowser', - #tag : 'Model' -} - -{ #category : 'instance creation' } -StSettingNode class >> with: aPragmaSetting [ - - ^ self new declaration: aPragmaSetting -] - -{ #category : 'accessing' } -StSettingNode >> allChildren [ - "Answer a of the settings for which the receiver is set as parent" - - ^ self model - ifNotNil: [ : m | m childrenOf: self ] - ifNil: [ OrderedCollection new ] -] - -{ #category : 'converting' } -StSettingNode >> asPresenterOn: aPresenter [ - "Answer a for the receiver's setting type" - - ^ self declaration asSettingPresenterWithOwner: aPresenter -] - -{ #category : 'checking' } -StSettingNode >> checkForUnknownTarget [ - - self parentNode - ifNotNil: [:p | - self declarationTarget - ifNil: [ self declarationTarget: p declaration target ]. - self declaration targetSelector - ifNil: [ self declaration targetSelector: p declaration targetSelector ] ]. - self allChildren do: [: c | c checkForUnknownTarget ] -] - -{ #category : 'accessing' } -StSettingNode >> declaration [ - - ^ declaration -] - -{ #category : 'initialization' } -StSettingNode >> declaration: aPragmaSetting [ - - declaration := aPragmaSetting -] - -{ #category : 'private' } -StSettingNode >> declarationDescriptions [ - "Answer a of each one a word in the receiver's description" - - ^ self declaration description substrings collect: #asLowercase. -] - -{ #category : 'accessing' } -StSettingNode >> declarationTarget [ - - ^ self declaration target -] - -{ #category : 'accessing' } -StSettingNode >> declarationTarget: anObject [ - - self declaration target: anObject -] - -{ #category : 'private' } -StSettingNode >> description [ - "Answer a representing an human-understandable description" - - ^ self declaration description -] - -{ #category : 'private' } -StSettingNode >> descriptors [ - "Answer a of each representing a receiver's textual description or identifier" - - ^ (OrderedCollection withAll: self declarationDescriptions) - add: self label asLowercase; - yourself -] - -{ #category : 'testing' } -StSettingNode >> hasChildren [ - - ^ self allChildren notEmpty -] - -{ #category : 'testing' } -StSettingNode >> hasParent [ - - ^ parentName notNil -] - -{ #category : 'accessing' } -StSettingNode >> item [ - - ^ declaration -] - -{ #category : 'accessing' } -StSettingNode >> label [ - - ^ self declaration label -] - -{ #category : 'accessing' } -StSettingNode >> label: aString [ - - declaration label: aString. -] - -{ #category : 'accessing' } -StSettingNode >> level [ - - ^ self path size -] - -{ #category : 'accessing' } -StSettingNode >> matchBlock [ - - ^ matchBlock - ifNil: [ - matchBlock := [ : node : pattern | - node label substrings anySatisfy: [ : substr | - substr asLowercase beginsWith: pattern asLowercase ] ] ] -] - -{ #category : 'enumerating' } -StSettingNode >> matches: aString [ - "Recursive search the receiver for aString in its label" - - | result | - result := OrderedCollection new. - self allChildren do: [ :node | - (self matchBlock value: node value: aString) ifTrue: [ - result add: node ]. - - node hasChildren ifTrue: [ - result addAll: (node matches: aString) ] ]. - - ^ result -] - -{ #category : 'accessing' } -StSettingNode >> model [ - - ^ model -] - -{ #category : 'accessing' } -StSettingNode >> model: aStSettingsTree [ - - model := aStSettingsTree -] - -{ #category : 'accessing' } -StSettingNode >> name [ - - ^ self declaration name -] - -{ #category : 'accessing' } -StSettingNode >> order [ - - ^ self declaration order ifNil: [ 1 ] -] - -{ #category : 'accessing' } -StSettingNode >> order: anObject [ - - self declaration order: anObject -] - -{ #category : 'accessing' } -StSettingNode >> parentName [ - ^ parentName -] - -{ #category : 'accessing' } -StSettingNode >> parentName: aSymbol [ - parentName := aSymbol -] - -{ #category : 'accessing' } -StSettingNode >> parentNode [ - - ^ self model nodeNamed: self parentName -] - -{ #category : 'accessing' } -StSettingNode >> path [ - - ^ self hasParent - ifTrue: [ self parentNode path, { self } ] - ifFalse: [ { self } ] -] - -{ #category : 'accessing' } -StSettingNode >> pragma [ - ^ pragma -] - -{ #category : 'initialization' } -StSettingNode >> pragma: aPragma [ - - pragma := aPragma -] - -{ #category : 'converting' } -StSettingNode >> presenterClass [ - - ^ self hasChildren - ifTrue: [ StSettingSectionPresenter ] - ifFalse: [ StSettingNodePresenter ] -] - -{ #category : 'printing' } -StSettingNode >> printOn: aStream [ - "Private - See superimplementor's comment" - - super printOn: aStream. - aStream - nextPutAll: ' ['; - nextPutAll: self parentName asString; - nextPutAll: '] '. - self declaration ifNotNil: [ : decl | decl printOn: aStream ]. - aStream - nextPutAll: ' ('; - nextPutAll: self allChildren size asString; - nextPutAll: ') ' - -] - -{ #category : 'accessing' } -StSettingNode >> realValue: anObject [ - - self settingDeclaration realValue: anObject -] - -{ #category : 'accessing' } -StSettingNode >> settingDeclaration [ - - ^ declaration -] - -{ #category : 'printing' } -StSettingNode >> settingNodeIdentifier [ - ^ String streamContents: [ :aStream | - self settingNodeIdentifierOn: aStream ] -] - -{ #category : 'printing' } -StSettingNode >> settingNodeIdentifierOn: aWriteStream [ - - parentNode - ifNotNil: [ parentName settingNodeIdentifierOn: aWriteStream ] - ifNil: [ parentName ifNotNil: [ aWriteStream print: parentName ] ]. - aWriteStream print: self settingDeclaration name -] diff --git a/src/NewTools-SettingsBrowser/StSettingNodeBuilder.class.st b/src/NewTools-SettingsBrowser/StSettingNodeBuilder.class.st deleted file mode 100644 index e1ff8e4ba..000000000 --- a/src/NewTools-SettingsBrowser/StSettingNodeBuilder.class.st +++ /dev/null @@ -1,178 +0,0 @@ -" -Used to build nodes from the settings framework -" -Class { - #name : 'StSettingNodeBuilder', - #superclass : 'Object', - #instVars : [ - 'node', - 'builder', - 'callback' - ], - #category : 'NewTools-SettingsBrowser', - #package : 'NewTools-SettingsBrowser' -} - -{ #category : 'private - tree building' } -StSettingNodeBuilder >> asParentWhile: aBlock [ - builder parent: self while: aBlock -] - -{ #category : 'accessing' } -StSettingNodeBuilder >> builder: aTreeBuilder [ - builder := aTreeBuilder -] - -{ #category : 'accessing' } -StSettingNodeBuilder >> buttonLabel: aString [ - "Set the current's node declaration button label to aString" - - node item actionLabel: aString -] - -{ #category : 'accessing' } -StSettingNodeBuilder >> callback: aFullBlockClosure [ - - callback := aFullBlockClosure -] - -{ #category : 'declaration accessing' } -StSettingNodeBuilder >> default: anObject [ - node item default: anObject -] - -{ #category : 'declaration accessing' } -StSettingNodeBuilder >> description: aText [ - node item description: aText -] - -{ #category : 'declaration accessing' } -StSettingNodeBuilder >> dialog: aSymbol [ - node item dialog: aSymbol -] - -{ #category : 'declaration accessing' } -StSettingNodeBuilder >> domainValues: aCollection [ - node item domainValues: aCollection -] - -{ #category : 'declaration accessing' } -StSettingNodeBuilder >> getSelector: aSymbol [ - node item getSelector: aSymbol -] - -{ #category : 'declaration accessing' } -StSettingNodeBuilder >> ghostHelp: aString [ - node item ghostHelp: aString -] - -{ #category : 'declaration accessing' } -StSettingNodeBuilder >> icon: aForm [ - node item icon: aForm -] - -{ #category : 'declaration accessing' } -StSettingNodeBuilder >> iconName: aSymbol [ - self icon: (self iconNamed: aSymbol) -] - -{ #category : 'accessing' } -StSettingNodeBuilder >> isTransient: aBoolean [ - - node item isTransient: aBoolean -] - -{ #category : 'declaration accessing' } -StSettingNodeBuilder >> label: aString [ - node item label: aString -] - -{ #category : 'declaration accessing' } -StSettingNodeBuilder >> name [ - ^ node item name -] - -{ #category : 'declaration accessing' } -StSettingNodeBuilder >> name: aString [ - node item name: aString -] - -{ #category : 'declaration accessing' } -StSettingNodeBuilder >> noOrdering [ - node item noOrdering -] - -{ #category : 'accessing' } -StSettingNodeBuilder >> node [ - ^ node -] - -{ #category : 'accessing' } -StSettingNodeBuilder >> node: aSettingTreeNode [ - node := aSettingTreeNode -] - -{ #category : 'declaration accessing' } -StSettingNodeBuilder >> order: aNumber [ - node item order: aNumber -] - -{ #category : 'declaration accessing' } -StSettingNodeBuilder >> parent: aSymbol [ - node parentName: aSymbol -] - -{ #category : 'declaration accessing' } -StSettingNodeBuilder >> parentName [ - ^ node parentName -] - -{ #category : 'declaration accessing' } -StSettingNodeBuilder >> parentName: aSymbol [ - node parentName: aSymbol -] - -{ #category : 'declaration accessing' } -StSettingNodeBuilder >> precondition: aValuable [ - node item precondition: aValuable -] - -{ #category : 'declaration accessing' } -StSettingNodeBuilder >> range: anInterval [ - node item range: anInterval -] - -{ #category : 'declaration accessing' } -StSettingNodeBuilder >> script: aSymbol [ - node item script: aSymbol -] - -{ #category : 'declaration accessing' } -StSettingNodeBuilder >> selector: aSymbol [ - node item selector: aSymbol -] - -{ #category : 'declaration accessing' } -StSettingNodeBuilder >> setSelector: aSymbol [ - node item setSelector: aSymbol -] - -{ #category : 'declaration accessing' } -StSettingNodeBuilder >> target: anObject [ - node item target: anObject -] - -{ #category : 'declaration accessing' } -StSettingNodeBuilder >> targetSelector: aSelector [ - node item targetSelector: aSelector -] - -{ #category : 'declaration accessing' } -StSettingNodeBuilder >> type: anObject [ - node item type: anObject -] - -{ #category : 'tree building' } -StSettingNodeBuilder >> with: aBlock [ - self asParentWhile: aBlock -] diff --git a/src/NewTools-SettingsBrowser/StSettingTreeBuilder.class.st b/src/NewTools-SettingsBrowser/StSettingTreeBuilder.class.st deleted file mode 100644 index 3ae18797d..000000000 --- a/src/NewTools-SettingsBrowser/StSettingTreeBuilder.class.st +++ /dev/null @@ -1,94 +0,0 @@ -" -A builder for the settings tree -" -Class { - #name : 'StSettingTreeBuilder', - #superclass : 'Object', - #instVars : [ - 'nodeList', - 'currentParent', - 'currentPragma' - ], - #category : 'NewTools-SettingsBrowser-Model', - #package : 'NewTools-SettingsBrowser', - #tag : 'Model' -} - -{ #category : 'instance creation' } -StSettingTreeBuilder class >> acceptableKeywords: aCollectionOfRegExps [ - ^ self new acceptableKeywords: aCollectionOfRegExps -] - -{ #category : 'accessing' } -StSettingTreeBuilder >> buildPragma: aPragma [ - currentPragma := aPragma. - self perform: aPragma selector withArguments: aPragma arguments. - ^ nodeList -] - -{ #category : 'accessing - structure variables' } -StSettingTreeBuilder >> button: aSymbol [ - - ^ self nodeClass: ActionSettingDeclaration name: aSymbol -] - -{ #category : 'tree building' } -StSettingTreeBuilder >> group: aSymbol [ - ^ self nodeClass: PragmaSetting name: aSymbol -] - -{ #category : 'accessing' } -StSettingTreeBuilder >> nodeClass [ - - ^ StSettingNode -] - -{ #category : 'private - tree building' } -StSettingTreeBuilder >> nodeClass: aClass name: aSymbol [ - | node | - node := self nodeClass with: aClass new. - node item name: aSymbol. - node pragma: currentPragma. - node parentName: (currentParent ifNotNil: [currentParent name]). - self nodeList add: node. - ^ (StSettingNodeBuilder new) node: node; builder: self; yourself -] - -{ #category : 'accessing' } -StSettingTreeBuilder >> nodeList [ - ^ nodeList ifNil: [nodeList := OrderedCollection new] -] - -{ #category : 'private - tree building' } -StSettingTreeBuilder >> parent: aNode while: aBlock [ - | oldParent | - oldParent := currentParent. - currentParent := aNode. - aBlock value. - currentParent := oldParent -] - -{ #category : 'tree building' } -StSettingTreeBuilder >> pickOne: aSymbol [ - ^ self nodeClass: PickOneSettingDeclaration name: aSymbol -] - -{ #category : 'tree building' } -StSettingTreeBuilder >> range: aSymbol [ - ^ self nodeClass: RangeSettingDeclaration name: aSymbol -] - -{ #category : 'tree building' } -StSettingTreeBuilder >> setting: aSymbol [ - ^ self nodeClass: SettingDeclaration name: aSymbol -] - -{ #category : 'pragmas' } -StSettingTreeBuilder >> systemsettings [ - "Process a pragma" - - - currentPragma methodClass instanceSide - perform: currentPragma methodSelector - with: self -] diff --git a/src/NewTools-SettingsBrowser/StSettingsAbstractPresenter.class.st b/src/NewTools-SettingsBrowser/StSettingsAbstractPresenter.class.st index da8e33484..b420f7285 100644 --- a/src/NewTools-SettingsBrowser/StSettingsAbstractPresenter.class.st +++ b/src/NewTools-SettingsBrowser/StSettingsAbstractPresenter.class.st @@ -190,18 +190,6 @@ StSettingsAbstractPresenter >> currentApplication [ ^ self application ] -{ #category : 'callbacks' } -StSettingsAbstractPresenter >> newNodePresenterFrom: aSettingNode level: anInteger [ - - | nodePresenter | - - nodePresenter := self - instantiate: aSettingNode presenterClass - on: aSettingNode. - nodePresenter sectionTitleStyle: self sectionTitleString , anInteger asString. - ^ nodePresenter -] - { #category : 'callbacks' } StSettingsAbstractPresenter >> sectionTitleString [ diff --git a/src/NewTools-SettingsBrowser/StSettingsTree.class.st b/src/NewTools-SettingsBrowser/StSettingsTree.class.st deleted file mode 100644 index 33283bb6d..000000000 --- a/src/NewTools-SettingsBrowser/StSettingsTree.class.st +++ /dev/null @@ -1,269 +0,0 @@ -Class { - #name : 'StSettingsTree', - #superclass : 'Model', - #instVars : [ - 'collector', - 'nodeList', - 'persistence' - ], - #category : 'NewTools-SettingsBrowser-Model', - #package : 'NewTools-SettingsBrowser', - #tag : 'Model' -} - -{ #category : 'opening' } -StSettingsTree class >> settingsKeywords [ - - ^ (Pragma allNamed: #systemsettings) collect: [: p | p method selector ] -] - -{ #category : 'accessing' } -StSettingsTree >> acceptableKeywords: keywords [ - self collector - selectors: keywords; - filter: [:prg | prg methodClass isMeta]. - nodeList := nil. - self collector reset -] - -{ #category : 'checking' } -StSettingsTree >> checkForUnknownParent [ - self unclassified - ifNotEmpty: [ :nodesWithUnknownParent | - | builder g | - builder := StSettingTreeBuilder new. - g := (builder group: #nodesWithUnknownParent) node. - self nodeList addFirst: g. - g model: self. - g item label: '*** Unclassified ***'. - g item icon: (self iconNamed: #smallDebug). - g item order: 0.0. - nodesWithUnknownParent - do: [ :node | node parentName: #nodesWithUnknownParent ] ] -] - -{ #category : 'checking' } -StSettingsTree >> checkForUnknownTarget [ - "check only root because other nodes with unknown target inherits it from its parent" - self settingTreeRoots do: [:node | node item target ifNil: [node item target: (node pragma ifNotNil: [:prg | prg methodClass instanceSide])]]. - self settingTreeRoots do: [:node | node checkForUnknownTarget] -] - -{ #category : 'querying' } -StSettingsTree >> childrenOf: aNode [ - | children idx order | - "Get aNode children. Assign children order if one child has an order which is not nil" - children := self nodeList select: [ :p | p parentName = aNode settingDeclaration name ]. - children - detect: [ :n | n order isNotNil ] - ifFound: [ :firstWithOrder | - idx := children indexOf: firstWithOrder. - order := firstWithOrder order. - idx > 1 - ifTrue: [ - idx - 1 to: 1 do: [ :pos | - (children at: pos) order: order - 1. - order := order - 1 ] ]. - order := firstWithOrder order. - idx + 1 to: children size do: [ :pos | - (children at: pos) order ifNil: [ (children at: pos) order: order + 1 ] ifNotNil: [ order := (children at: pos) order ]. - order := order + 1 ] ]. - ^ children -] - -{ #category : 'accessing' } -StSettingsTree >> collector [ - ^ collector ifNil: [collector := PragmaCollector new] -] - -{ #category : 'querying' } -StSettingsTree >> deeplyDetect: aBlock [ - self settingTreeRoots - do: [:sub | (sub deeplyDetect: aBlock) - ifNotNil: [:found | ^ found]]. - ^ nil -] - -{ #category : 'querying' } -StSettingsTree >> deeplySelect: aBlock [ - ^ self deeplySelect: aBlock in: OrderedCollection new -] - -{ #category : 'querying' } -StSettingsTree >> deeplySelect: aBlock in: aCollection [ - self settingTreeRoots - do: [:aRoot | aRoot deeplySelect: aBlock in: aCollection]. - ^ aCollection -] - -{ #category : 'accessing' } -StSettingsTree >> defaultCategories [ - "Answer a of representing the default main setting categories in the system" - - ^ self treeRoots. -] - -{ #category : 'private - tree building' } -StSettingsTree >> emptyNodeNamed: aSymbol [ - (self nodeNamed: aSymbol) -] - -{ #category : 'testing' } -StSettingsTree >> hasSettingsFile [ - "Answer if a system settings file exists" - - ^ self persistence hasSettingsFile -] - -{ #category : 'accessing' } -StSettingsTree >> itemSortBlock [ - ^ [:a :b | - ((a order isNotNil and: [b order isNotNil]) and: [a order ~= b order]) - ifTrue: [a order < b order] - ifFalse: [((a order isNil and: [b order isNil]) or: [a order = b order]) - ifTrue: [a label < b label] - ifFalse: [a order ifNil: [false] ifNotNil: [true]]]] -] - -{ #category : 'instance creation' } -StSettingsTree >> newSettingTreeBuilderNodes [ - "Walk over the receiver's pragmas. Build and answer a of , each one representing a specific setting" - | manager | - - manager := SettingsManager forPragmaNamed: #systemsettings. - - nodeList := manager settings collect: [ :setting | setting asSettingNode ]. - nodeList do: [: node | node tree: self ]. - "self checkForUnknownParent." - "self checkForUnknownTarget." - ^ nodeList -] - -{ #category : 'legacy' } -StSettingsTree >> newSettingTreeBuilderNodesLegacy [ - "Walk over the receiver's pragmas. Build and answer a of , each one representing a specific setting" - | builder | - - builder := StSettingTreeBuilder new. - self pragmasDo: [ :p | builder buildPragma: p ]. - nodeList := builder nodeList. - nodeList do: [: n | n model: self ]. - self checkForUnknownParent. - self checkForUnknownTarget. - ^ nodeList -] - -{ #category : 'instance creation' } -StSettingsTree >> newTreeHolder [ - "Set the receiver's collector to gather the system setting pragmas" - - ^ self - acceptableKeywords: { #systemsettings }; - nodeList: self nodeList; - yourself -] - -{ #category : 'accessing' } -StSettingsTree >> nodeList [ - - ^ nodeList ifNil: [ nodeList := self newSettingTreeBuilderNodes ] -] - -{ #category : 'accessing' } -StSettingsTree >> nodeList: aCollection [ - - nodeList := aCollection -] - -{ #category : 'private - tree building' } -StSettingsTree >> nodeNamed: aSymbol [ - ^ self nodeNamed: aSymbol ifAbsent: [] -] - -{ #category : 'private - tree building' } -StSettingsTree >> nodeNamed: aSymbol ifAbsent: aBlock [ - ^ self nodeList detect: [:d | d settingDeclaration name = aSymbol] ifNone: aBlock -] - -{ #category : 'accessing' } -StSettingsTree >> persistence [ - ^ persistence ifNil: [ persistence := SystemSettingsPersistence settingTree: self ] -] - -{ #category : 'querying' } -StSettingsTree >> pragmasDo: aBlock [ - ^ self collector do: aBlock -] - -{ #category : 'private - queries' } -StSettingsTree >> processSearch: aString [ - "Recursively collect the nodes matching aString in the receiver" - - ^ self treeRoots - flatCollect: [ : settingNode | settingNode matches: aString ] - as: Set -] - -{ #category : 'instance creation' } -StSettingsTree >> retainedNodesFromList: aListOfNodes [ - | retained | - retained := OrderedCollection new. - aListOfNodes do: [:n | [n item precondition value ifTrue: [retained add: n]] on: Error do: [retained add: n]]. - ^ retained -] - -{ #category : 'instance creation' } -StSettingsTree >> settingTreeRoots [ - ^ self retainedNodesFromList: ((self nodeList select: [:n | n parentName isNil]) asArray sort: self sortBlock) asOrderedCollection -] - -{ #category : 'testing' } -StSettingsTree >> settingsFileReference [ - "Answer a with the name of the file where settings are stored" - - ^ self persistence fileReference -] - -{ #category : 'instance creation' } -StSettingsTree >> settingsKeywords [ - - ^ self class settingsKeywords -] - -{ #category : 'accessing' } -StSettingsTree >> sortBlock [ - ^ [:a :b | self itemSortBlock value: a setting value: b setting ] -] - -{ #category : 'persistence' } -StSettingsTree >> storeSettingNodes [ - self persistence storeSettingNodes -] - -{ #category : 'instance creation' } -StSettingsTree >> treeRoots [ - "Answer a of representing the main setting categories in the system" - - ^ self newTreeHolder settingTreeRoots -] - -{ #category : 'querying' } -StSettingsTree >> unclassified [ - ^ self nodeList select: [:node | node parentName isNotNil and: [node parentNode isNil]] -] - -{ #category : 'accessing' } -StSettingsTree >> updateList [ - nodeList := nil -] - -{ #category : 'persistence' } -StSettingsTree >> updateSettingNodes [ - self persistence updateSettingNodes -] - -{ #category : 'updating' } -StSettingsTree >> whenChangedSend: aSelector to: aTarget [ - self collector whenChangedSend: aSelector to: aTarget. - self collector whenResetSend: aSelector to: aTarget -] diff --git a/src/NewTools-SettingsBrowser/SystemSettingsPersistence.extension.st b/src/NewTools-SettingsBrowser/SystemSettingsPersistence.extension.st deleted file mode 100644 index 2f53fd1a9..000000000 --- a/src/NewTools-SettingsBrowser/SystemSettingsPersistence.extension.st +++ /dev/null @@ -1,8 +0,0 @@ -Extension { #name : 'SystemSettingsPersistence' } - -{ #category : '*NewTools-SettingsBrowser' } -SystemSettingsPersistence >> hasSettingsFile [ - "Answer if the system settings file exists" - - ^ fileReference exists -] diff --git a/src/NewTools-Spotter-Extensions/StSettingsTree.extension.st b/src/NewTools-Spotter-Extensions/StSettingsTree.extension.st deleted file mode 100644 index 7e375f913..000000000 --- a/src/NewTools-Spotter-Extensions/StSettingsTree.extension.st +++ /dev/null @@ -1,11 +0,0 @@ -Extension { #name : 'StSettingsTree' } - -{ #category : '*NewTools-Spotter-Extensions' } -StSettingsTree >> spotterForSettingsFor: aStep [ - - aStep listProcessor - title: 'Settings'; - allCandidates: [ self nodeList ]; - itemName: [ :each | each spotterLabel ]; - filter: StFilterSubstring -] From 555d3bff6eaea5970d6e299110c8902332a60d41 Mon Sep 17 00:00:00 2001 From: DEMAREY Christophe Date: Tue, 27 Oct 2026 15:57:46 +0100 Subject: [PATCH 8/9] Rename StNewSettingsTree and StNewSettingNode Now that the settings tree of the old settings model is removed, its replacements take back their names: StNewSettingsTree becomes StSettingsTree and StNewSettingNode becomes StSettingNode (with StNewSettingsTreeTest and their Spotter extensions). --- ...t.class.st => StSettingsTreeTest.class.st} | 26 +++++------ .../AbstractSetting.extension.st | 2 +- ...ngNode.class.st => StSettingNode.class.st} | 44 +++++++++---------- .../StSettingsAbstractPresenter.class.st | 2 +- ...sTree.class.st => StSettingsTree.class.st} | 36 +++++++-------- ...xtension.st => StSettingNode.extension.st} | 6 +-- ...tension.st => StSettingsTree.extension.st} | 4 +- 7 files changed, 60 insertions(+), 60 deletions(-) rename src/NewTools-SettingsBrowser-Tests/{StNewSettingsTreeTest.class.st => StSettingsTreeTest.class.st} (65%) rename src/NewTools-SettingsBrowser/{StNewSettingNode.class.st => StSettingNode.class.st} (73%) rename src/NewTools-SettingsBrowser/{StNewSettingsTree.class.st => StSettingsTree.class.st} (81%) rename src/NewTools-Spotter-Extensions/{StNewSettingNode.extension.st => StSettingNode.extension.st} (77%) rename src/NewTools-Spotter-Extensions/{StNewSettingsTree.extension.st => StSettingsTree.extension.st} (70%) diff --git a/src/NewTools-SettingsBrowser-Tests/StNewSettingsTreeTest.class.st b/src/NewTools-SettingsBrowser-Tests/StSettingsTreeTest.class.st similarity index 65% rename from src/NewTools-SettingsBrowser-Tests/StNewSettingsTreeTest.class.st rename to src/NewTools-SettingsBrowser-Tests/StSettingsTreeTest.class.st index e0a65ae4f..facf3a74a 100644 --- a/src/NewTools-SettingsBrowser-Tests/StNewSettingsTreeTest.class.st +++ b/src/NewTools-SettingsBrowser-Tests/StSettingsTreeTest.class.st @@ -1,17 +1,17 @@ " -I test StNewSettingsTree, the model of the settings browser. +I test StSettingsTree, the model of the settings browser. " Class { - #name : 'StNewSettingsTreeTest', + #name : 'StSettingsTreeTest', #superclass : 'TestCase', #category : 'NewTools-SettingsBrowser-Tests', #package : 'NewTools-SettingsBrowser-Tests' } { #category : 'helpers' } -StNewSettingsTreeTest >> nodeNamed: aSymbol label: aString order: aNumberOrNil [ +StSettingsTreeTest >> nodeNamed: aSymbol label: aString order: aNumberOrNil [ - ^ StNewSettingNode forSetting: (Setting new + ^ StSettingNode forSetting: (Setting new name: aSymbol; label: aString; order: aNumberOrNil; @@ -19,10 +19,10 @@ StNewSettingsTreeTest >> nodeNamed: aSymbol label: aString order: aNumberOrNil [ ] { #category : 'tests' } -StNewSettingsTreeTest >> testChildrenOfGroupAreItsSettings [ +StSettingsTreeTest >> testChildrenOfGroupAreItsSettings [ | tree group | - tree := StNewSettingsTree new. + tree := StSettingsTree new. group := tree nodeList detect: [ :each | each name = #'Syntax Highlighting' ]. self @@ -31,19 +31,19 @@ StNewSettingsTreeTest >> testChildrenOfGroupAreItsSettings [ ] { #category : 'tests' } -StNewSettingsTreeTest >> testChildrenWithoutOrderAreOrderedAroundOrderedChildren [ +StSettingsTreeTest >> testChildrenWithoutOrderAreOrderedAroundOrderedChildren [ | group tree children | group := SettingsGroup new name: #group; yourself. - tree := StNewSettingsTree new. + tree := StSettingsTree new. tree nodeList: ({ group } , (#( nil nil 5 nil 9 nil ) withIndexCollect: [ :order :index | Setting new name: ('setting' , index printString) asSymbol; order: order; parentGroup: group; - yourself ]) collect: [ :each | StNewSettingNode forSetting: each ]). + yourself ]) collect: [ :each | StSettingNode forSetting: each ]). children := tree childrenOf: tree nodeList first. @@ -51,7 +51,7 @@ StNewSettingsTreeTest >> testChildrenWithoutOrderAreOrderedAroundOrderedChildren ] { #category : 'tests' } -StNewSettingsTreeTest >> testSortBlockSortsByOrderThenByLabel [ +StSettingsTreeTest >> testSortBlockSortsByOrderThenByLabel [ | nodes | nodes := { @@ -61,15 +61,15 @@ StNewSettingsTreeTest >> testSortBlockSortsByOrderThenByLabel [ (self nodeNamed: #d label: 'y' order: nil) }. self - assert: ((nodes asSortedCollection: StNewSettingsTree new sortBlock) collect: [ :each | each name ]) asArray + assert: ((nodes asSortedCollection: StSettingsTree new sortBlock) collect: [ :each | each name ]) asArray equals: #( #b #a #d #c ) ] { #category : 'tests' } -StNewSettingsTreeTest >> testTreeRootsHaveNoParent [ +StSettingsTreeTest >> testTreeRootsHaveNoParent [ | roots | - roots := StNewSettingsTree new treeRoots. + roots := StSettingsTree new treeRoots. self denyEmpty: roots. self assert: (roots noneSatisfy: [ :each | each hasParent ]) diff --git a/src/NewTools-SettingsBrowser/AbstractSetting.extension.st b/src/NewTools-SettingsBrowser/AbstractSetting.extension.st index bf61627b0..c9aa1e425 100644 --- a/src/NewTools-SettingsBrowser/AbstractSetting.extension.st +++ b/src/NewTools-SettingsBrowser/AbstractSetting.extension.st @@ -10,7 +10,7 @@ AbstractSetting >> asPresenterOn: aPresenter [ { #category : '*NewTools-SettingsBrowser' } AbstractSetting >> asSettingNode [ - ^ StNewSettingNode forSetting: self + ^ StSettingNode forSetting: self ] { #category : '*NewTools-SettingsBrowser' } diff --git a/src/NewTools-SettingsBrowser/StNewSettingNode.class.st b/src/NewTools-SettingsBrowser/StSettingNode.class.st similarity index 73% rename from src/NewTools-SettingsBrowser/StNewSettingNode.class.st rename to src/NewTools-SettingsBrowser/StSettingNode.class.st index f896f79e2..ab329ba4c 100644 --- a/src/NewTools-SettingsBrowser/StNewSettingNode.class.st +++ b/src/NewTools-SettingsBrowser/StSettingNode.class.st @@ -1,5 +1,5 @@ Class { - #name : 'StNewSettingNode', + #name : 'StSettingNode', #superclass : 'Object', #instVars : [ 'setting', @@ -12,7 +12,7 @@ Class { } { #category : 'instance creation' } -StNewSettingNode class >> forSetting: aSetting [ +StSettingNode class >> forSetting: aSetting [ ^ self new setting: aSetting; @@ -20,7 +20,7 @@ StNewSettingNode class >> forSetting: aSetting [ ] { #category : 'accessing' } -StNewSettingNode >> allChildren [ +StSettingNode >> allChildren [ "Answer a of the settings for which the receiver is set as parent" @@ -30,43 +30,43 @@ StNewSettingNode >> allChildren [ ] { #category : 'converting' } -StNewSettingNode >> asPresenterOn: aPresenter [ +StSettingNode >> asPresenterOn: aPresenter [ ^ setting asSettingPresenterWithOwner: aPresenter ] { #category : 'accessing' } -StNewSettingNode >> description [ +StSettingNode >> description [ "Answer a representing an human-understandable description" ^ setting description ] { #category : 'testing' } -StNewSettingNode >> hasChildren [ +StSettingNode >> hasChildren [ ^ setting isGroup and: [ self allChildren isNotEmpty] ] { #category : 'testing' } -StNewSettingNode >> hasParent [ +StSettingNode >> hasParent [ ^ setting hasParent ] { #category : 'accessing' } -StNewSettingNode >> label [ +StSettingNode >> label [ ^ setting label ] { #category : 'accessing' } -StNewSettingNode >> level [ +StSettingNode >> level [ ^ self path size ] { #category : 'accessing' } -StNewSettingNode >> matchBlock [ +StSettingNode >> matchBlock [ ^ matchBlock ifNil: [ @@ -76,7 +76,7 @@ StNewSettingNode >> matchBlock [ ] { #category : 'testing' } -StNewSettingNode >> matches: aString [ +StSettingNode >> matches: aString [ "Recursive search the receiver for aString in its label" | result | @@ -92,42 +92,42 @@ StNewSettingNode >> matches: aString [ ] { #category : 'accessing' } -StNewSettingNode >> name [ +StSettingNode >> name [ ^ setting name ] { #category : 'accessing' } -StNewSettingNode >> nodeForGroup: aSettingGroup [ +StSettingNode >> nodeForGroup: aSettingGroup [ ^ tree nodeForSetting: aSettingGroup ] { #category : 'accessing' } -StNewSettingNode >> order [ +StSettingNode >> order [ ^ setting order ] { #category : 'accessing' } -StNewSettingNode >> order: anInteger [ +StSettingNode >> order: anInteger [ setting order: anInteger. ] { #category : 'accessing' } -StNewSettingNode >> parentName [ +StSettingNode >> parentName [ ^ setting parent ifNotNil: [ :group | group name ] ] { #category : 'accessing' } -StNewSettingNode >> parentNode [ +StSettingNode >> parentNode [ ^ setting parent ifNotNil: [ :group | self nodeForGroup: group ] ] { #category : 'accessing' } -StNewSettingNode >> path [ +StSettingNode >> path [ ^ self hasParent ifTrue: [ self parentNode path, { self } ] @@ -135,24 +135,24 @@ StNewSettingNode >> path [ ] { #category : 'accessing' } -StNewSettingNode >> setting [ +StSettingNode >> setting [ ^ setting ] { #category : 'accessing' } -StNewSettingNode >> setting: aSetting [ +StSettingNode >> setting: aSetting [ setting := aSetting ] { #category : 'accessing' } -StNewSettingNode >> settingDeclaration [ +StSettingNode >> settingDeclaration [ ^ setting ] { #category : 'accessing' } -StNewSettingNode >> tree: aSettingTree [ +StSettingNode >> tree: aSettingTree [ tree := aSettingTree ] diff --git a/src/NewTools-SettingsBrowser/StSettingsAbstractPresenter.class.st b/src/NewTools-SettingsBrowser/StSettingsAbstractPresenter.class.st index b420f7285..a8caaf4bd 100644 --- a/src/NewTools-SettingsBrowser/StSettingsAbstractPresenter.class.st +++ b/src/NewTools-SettingsBrowser/StSettingsAbstractPresenter.class.st @@ -202,5 +202,5 @@ StSettingsAbstractPresenter >> settingsTree [ ^ self application propertyAt: #settingsTree - ifAbsentPut: [ StNewSettingsTree new ] + ifAbsentPut: [ StSettingsTree new ] ] diff --git a/src/NewTools-SettingsBrowser/StNewSettingsTree.class.st b/src/NewTools-SettingsBrowser/StSettingsTree.class.st similarity index 81% rename from src/NewTools-SettingsBrowser/StNewSettingsTree.class.st rename to src/NewTools-SettingsBrowser/StSettingsTree.class.st index 0a0390340..543927f6e 100644 --- a/src/NewTools-SettingsBrowser/StNewSettingsTree.class.st +++ b/src/NewTools-SettingsBrowser/StSettingsTree.class.st @@ -1,8 +1,8 @@ " -I am the model of the settings browser: I build the settings declared with with a SettingsManager and wrap each of them in a StNewSettingNode. +I am the model of the settings browser: I build the settings declared with with a SettingsManager and wrap each of them in a StSettingNode. " Class { - #name : 'StNewSettingsTree', + #name : 'StSettingsTree', #superclass : 'Object', #instVars : [ 'manager', @@ -14,7 +14,7 @@ Class { } { #category : 'accessing' } -StNewSettingsTree >> childrenOf: aNode [ +StSettingsTree >> childrenOf: aNode [ "Answer the nodes of the settings of the group of aNode" | children | @@ -24,7 +24,7 @@ StNewSettingsTree >> childrenOf: aNode [ ] { #category : 'private' } -StNewSettingsTree >> completeOrdersOf: nodes [ +StSettingsTree >> completeOrdersOf: nodes [ "Give an order to the nodes without one, so that they keep their position among the nodes with an order" | firstOrderedIndex | @@ -36,14 +36,14 @@ StNewSettingsTree >> completeOrdersOf: nodes [ ] { #category : 'accessing' } -StNewSettingsTree >> defaultCategories [ +StSettingsTree >> defaultCategories [ "Answer a of representing the default main setting categories in the system" ^ self treeRoots ] { #category : 'testing' } -StNewSettingsTree >> hasSettingsFile [ +StSettingsTree >> hasSettingsFile [ ^ manager isNotNil and: [ manager settingsFile isNotNil @@ -51,7 +51,7 @@ StNewSettingsTree >> hasSettingsFile [ ] { #category : 'instance creation' } -StNewSettingsTree >> newSettingTreeBuilderNodes [ +StSettingsTree >> newSettingTreeBuilderNodes [ "Walk over the receiver's pragmas. Build and answer an of , each one representing a specific setting" manager := SettingsManager forPragmaNamed: #systemsettings. @@ -63,25 +63,25 @@ StNewSettingsTree >> newSettingTreeBuilderNodes [ ] { #category : 'accessing' } -StNewSettingsTree >> nodeForSetting: aSetting [ +StSettingsTree >> nodeForSetting: aSetting [ ^ nodeList detect: [ :node | node setting == aSetting ] ] { #category : 'accessing' } -StNewSettingsTree >> nodeList [ +StSettingsTree >> nodeList [ ^ nodeList ifNil: [ nodeList := self newSettingTreeBuilderNodes ] ] { #category : 'accessing' } -StNewSettingsTree >> nodeList: aCollection [ +StSettingsTree >> nodeList: aCollection [ nodeList := aCollection ] { #category : 'private' } -StNewSettingsTree >> orderNodesBefore: anIndex in: nodes [ +StSettingsTree >> orderNodesBefore: anIndex in: nodes [ "Each node before the one at anIndex gets the order of the node after it, minus 1" anIndex - 1 to: 1 by: -1 do: [ :index | @@ -89,7 +89,7 @@ StNewSettingsTree >> orderNodesBefore: anIndex in: nodes [ ] { #category : 'private' } -StNewSettingsTree >> orderUnorderedNodesAfter: anIndex in: nodes [ +StSettingsTree >> orderUnorderedNodesAfter: anIndex in: nodes [ "Each node after the one at anIndex without an order gets the order of the node before it, plus 1" anIndex + 1 to: nodes size do: [ :index | @@ -98,13 +98,13 @@ StNewSettingsTree >> orderUnorderedNodesAfter: anIndex in: nodes [ ] { #category : 'accessing' } -StNewSettingsTree >> persistence [ +StSettingsTree >> persistence [ ^ manager ] { #category : 'private - queries' } -StNewSettingsTree >> processSearch: aString [ +StSettingsTree >> processSearch: aString [ "Recursively collect the nodes matching aString in the receiver" ^ self treeRoots @@ -113,20 +113,20 @@ StNewSettingsTree >> processSearch: aString [ ] { #category : 'accessing' } -StNewSettingsTree >> settingsFileDirectory [ +StSettingsTree >> settingsFileDirectory [ ^ manager settingsFile parent ] { #category : 'testing' } -StNewSettingsTree >> settingsFileReference [ +StSettingsTree >> settingsFileReference [ "Answer a with the name of the file where settings are stored" ^ manager settingsFile ] { #category : 'accessing' } -StNewSettingsTree >> sortBlock [ +StSettingsTree >> sortBlock [ "Sort nodes by setting order, then by label. Nodes with an order come first" ^ [ :a :b | @@ -142,7 +142,7 @@ StNewSettingsTree >> sortBlock [ ] { #category : 'instance creation' } -StNewSettingsTree >> treeRoots [ +StSettingsTree >> treeRoots [ "Answer an array of representing the main setting categories in the system" ^ (self nodeList reject: #hasParent) asArray sort: self sortBlock diff --git a/src/NewTools-Spotter-Extensions/StNewSettingNode.extension.st b/src/NewTools-Spotter-Extensions/StSettingNode.extension.st similarity index 77% rename from src/NewTools-Spotter-Extensions/StNewSettingNode.extension.st rename to src/NewTools-Spotter-Extensions/StSettingNode.extension.st index 0ea0db537..d72a068ae 100644 --- a/src/NewTools-Spotter-Extensions/StNewSettingNode.extension.st +++ b/src/NewTools-Spotter-Extensions/StSettingNode.extension.st @@ -1,7 +1,7 @@ -Extension { #name : 'StNewSettingNode' } +Extension { #name : 'StSettingNode' } { #category : '*NewTools-Spotter-Extensions' } -StNewSettingNode >> spotterForSettingsFor: aStep [ +StSettingNode >> spotterForSettingsFor: aStep [ self allChildren isEmpty ifTrue: [ ^ self ]. aStep listProcessor @@ -12,7 +12,7 @@ StNewSettingNode >> spotterForSettingsFor: aStep [ ] { #category : '*NewTools-Spotter-Extensions' } -StNewSettingNode >> spotterLabel [ +StSettingNode >> spotterLabel [ ^ self parentNode ifNil: [ self label ] diff --git a/src/NewTools-Spotter-Extensions/StNewSettingsTree.extension.st b/src/NewTools-Spotter-Extensions/StSettingsTree.extension.st similarity index 70% rename from src/NewTools-Spotter-Extensions/StNewSettingsTree.extension.st rename to src/NewTools-Spotter-Extensions/StSettingsTree.extension.st index d45616dce..7e375f913 100644 --- a/src/NewTools-Spotter-Extensions/StNewSettingsTree.extension.st +++ b/src/NewTools-Spotter-Extensions/StSettingsTree.extension.st @@ -1,7 +1,7 @@ -Extension { #name : 'StNewSettingsTree' } +Extension { #name : 'StSettingsTree' } { #category : '*NewTools-Spotter-Extensions' } -StNewSettingsTree >> spotterForSettingsFor: aStep [ +StSettingsTree >> spotterForSettingsFor: aStep [ aStep listProcessor title: 'Settings'; From aa9c04eb36bdab43c29eb4d45d1e19c8f8d220e2 Mon Sep 17 00:00:00 2001 From: DEMAREY Christophe Date: Tue, 27 Oct 2026 16:24:33 +0100 Subject: [PATCH 9/9] Refresh the settings page after a settings button action A button action may change other settings, and the page showing them had to be refreshed by the action itself, which received the Spec button and announced StSettingModelChanged to the presenter of its window, the settings browser, which forwarded it to its page. The settings page now gives the button item it creates its pagePresenter. The button item performs its action as a plain message to its target, then announces StSettingModelChanged to its page (StSettingDetailPresenter), which updates its settings. The settings browser does not need to forward the announcement anymore. --- .../StSettingButtonPresenterItemTest.class.st | 69 +++++++++++++++++++ .../ActionSetting.extension.st | 6 +- .../StSettingButtonPresenterItem.class.st | 14 ++-- .../StSettingsBrowser.class.st | 16 ----- 4 files changed, 83 insertions(+), 22 deletions(-) create mode 100644 src/NewTools-SettingsBrowser-Tests/StSettingButtonPresenterItemTest.class.st diff --git a/src/NewTools-SettingsBrowser-Tests/StSettingButtonPresenterItemTest.class.st b/src/NewTools-SettingsBrowser-Tests/StSettingButtonPresenterItemTest.class.st new file mode 100644 index 000000000..252861b85 --- /dev/null +++ b/src/NewTools-SettingsBrowser-Tests/StSettingButtonPresenterItemTest.class.st @@ -0,0 +1,69 @@ +" +I test StSettingButtonPresenterItem, the presenter of action settings. +" +Class { + #name : 'StSettingButtonPresenterItemTest', + #superclass : 'TestCase', + #instVars : [ + 'actionCount', + 'page', + 'item' + ], + #category : 'NewTools-SettingsBrowser-Tests', + #package : 'NewTools-SettingsBrowser-Tests' +} + +{ #category : 'helpers' } +StSettingButtonPresenterItemTest >> clickButton [ + + item setterPresenter click +] + +{ #category : 'helpers' } +StSettingButtonPresenterItemTest >> recordAction [ + "Action of the tested button" + + actionCount := actionCount + 1 +] + +{ #category : 'running' } +StSettingButtonPresenterItemTest >> setUp [ + + super setUp. + actionCount := 0. + page := StSettingDetailPresenter new. + item := (ActionSetting new + name: #recordAction; + target: self; + buttonLabel: 'Do'; + yourself) asSettingPresenterWithOwner: page +] + +{ #category : 'tests' } +StSettingButtonPresenterItemTest >> testClickPerformsTheAction [ + + self clickButton. + + self assert: actionCount equals: 1 +] + +{ #category : 'tests' } +StSettingButtonPresenterItemTest >> testClickRefreshesTheSettingsPage [ + + | refreshCount | + refreshCount := 0. + page announcer + when: StSettingModelChanged + do: [ refreshCount := refreshCount + 1 ] + for: self. + + self clickButton. + + self assert: refreshCount equals: 1 +] + +{ #category : 'tests' } +StSettingButtonPresenterItemTest >> testItemKnowsItsSettingsPage [ + + self assert: item pagePresenter identicalTo: page +] diff --git a/src/NewTools-SettingsBrowser/ActionSetting.extension.st b/src/NewTools-SettingsBrowser/ActionSetting.extension.st index 192196efa..580b6eabc 100644 --- a/src/NewTools-SettingsBrowser/ActionSetting.extension.st +++ b/src/NewTools-SettingsBrowser/ActionSetting.extension.st @@ -2,7 +2,9 @@ Extension { #name : 'ActionSetting' } { #category : '*NewTools-SettingsBrowser' } ActionSetting >> asSettingPresenterWithOwner: aPresenter [ - "Answer an appropriate for the receiver" + "Answer an appropriate for the receiver, shown on the settings page aPresenter" - ^ aPresenter instantiate: StSettingButtonPresenterItem on: self + ^ (aPresenter instantiate: StSettingButtonPresenterItem on: self) + pagePresenter: aPresenter; + yourself ] diff --git a/src/NewTools-SettingsBrowser/StSettingButtonPresenterItem.class.st b/src/NewTools-SettingsBrowser/StSettingButtonPresenterItem.class.st index 24f2d6277..2211858e2 100644 --- a/src/NewTools-SettingsBrowser/StSettingButtonPresenterItem.class.st +++ b/src/NewTools-SettingsBrowser/StSettingButtonPresenterItem.class.st @@ -14,14 +14,20 @@ StSettingButtonPresenterItem >> initializePresenters [ (setterPresenter := self newButton) label: self model buttonLabel; - action: [ - self target - perform: self model name - withEnoughArguments: { setterPresenter } ]; + action: [ + self target perform: self model name. + self refreshSettingsPage ]; yourself. super initializePresenters ] +{ #category : 'updating' } +StSettingButtonPresenterItem >> refreshSettingsPage [ + "The action may have changed other settings: let the page showing the receiver display their new values" + + self pagePresenter ifNotNil: [ :page | page announcer announce: StSettingModelChanged ] +] + { #category : 'accessing' } StSettingButtonPresenterItem >> settingStyle [ diff --git a/src/NewTools-SettingsBrowser/StSettingsBrowser.class.st b/src/NewTools-SettingsBrowser/StSettingsBrowser.class.st index 4554c05bd..b7f033929 100644 --- a/src/NewTools-SettingsBrowser/StSettingsBrowser.class.st +++ b/src/NewTools-SettingsBrowser/StSettingsBrowser.class.st @@ -118,16 +118,6 @@ StSettingsBrowser >> followPath: aStSettingNode in: aCollection [ ] -{ #category : 'initialization' } -StSettingsBrowser >> initialize [ - - super initialize. - self announcer - when: StSettingModelChanged - send: #resendChange: - to: self -] - { #category : 'initialization' } StSettingsBrowser >> initializeButtonBar [ @@ -195,12 +185,6 @@ StSettingsBrowser >> pagePresenter [ ^ detailsPresenter ] -{ #category : 'private' } -StSettingsBrowser >> resendChange: ann [ - - detailsPresenter announcer announce: ann -] - { #category : 'accessing' } StSettingsBrowser >> resetSearchResult [