Skip to content

Commit 727a34b

Browse files
authored
Merge branch 'pharo-spec:Pharo13' into p13-settings-browser-support
2 parents 79e30d2 + f16af73 commit 727a34b

9 files changed

+413
-324
lines changed

src/NewTools-SettingsBrowser/StSettingNode.class.st

Lines changed: 32 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@ Class {
99
'declaration',
1010
'pragma',
1111
'parentName',
12-
'model'
12+
'model',
13+
'matchBlock'
1314
],
1415
#category : 'NewTools-SettingsBrowser-Model',
1516
#package : 'NewTools-SettingsBrowser',
@@ -103,6 +104,12 @@ StSettingNode >> hasChildren [
103104
^ self allChildren notEmpty
104105
]
105106

107+
{ #category : 'testing' }
108+
StSettingNode >> hasParent [
109+
110+
^ parentName notNil
111+
]
112+
106113
{ #category : 'accessing' }
107114
StSettingNode >> item [
108115

@@ -121,11 +128,30 @@ StSettingNode >> label: aString [
121128
declaration label: aString.
122129
]
123130

124-
{ #category : 'testing' }
125-
StSettingNode >> matches: aString [
126-
"Answer <true> if aString matches any of the receiver's descriptors"
127-
128-
^ self label asLowercase beginsWithAnyOf: self descriptors
131+
{ #category : 'accessing' }
132+
StSettingNode >> matchBlock [
133+
134+
^ matchBlock
135+
ifNil: [
136+
matchBlock := [ : node : pattern |
137+
node label substrings anySatisfy: [ : substr |
138+
substr asLowercase beginsWith: pattern asLowercase ] ] ]
139+
]
140+
141+
{ #category : 'enumerating' }
142+
StSettingNode >> matches: aString [
143+
"Recursive search the receiver for aString in its label"
144+
145+
| result |
146+
result := OrderedCollection new.
147+
self allChildren do: [ :node |
148+
(self matchBlock value: node value: aString) ifTrue: [
149+
result add: node ].
150+
151+
node hasChildren ifTrue: [
152+
result addAll: (node matches: aString) ] ].
153+
154+
^ result
129155
]
130156

131157
{ #category : 'accessing' }

src/NewTools-SettingsBrowser/StSettingTreeBuilder.class.st

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,3 @@ StSettingTreeBuilder >> nodeClass [
1111

1212
^ StSettingNode
1313
]
14-
15-
{ #category : 'private - tree building' }
16-
StSettingTreeBuilder >> nodeClass: aClass name: aSymbol [
17-
| node |
18-
node := self nodeClass with: aClass new.
19-
node item name: aSymbol.
20-
node pragma: currentPragma.
21-
node parentName: (currentParent ifNotNil: [currentParent name]).
22-
self nodeList add: node.
23-
^ (SettingNodeBuilder new) node: node; builder: self; yourself
24-
]

src/NewTools-SettingsBrowser/StSettingsAbstractPresenter.class.st

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,24 @@ Class {
66
#tag : 'UI'
77
}
88

9+
{ #category : 'callbacks' }
10+
StSettingsAbstractPresenter >> newNodePresenterFrom: aSettingNode level: anInteger [
11+
12+
| nodePresenter |
13+
14+
nodePresenter := self
15+
instantiate: aSettingNode presenterClass
16+
on: aSettingNode.
17+
nodePresenter sectionTitleStyle: self sectionTitleString , anInteger asString.
18+
^ nodePresenter
19+
]
20+
21+
{ #category : 'callbacks' }
22+
StSettingsAbstractPresenter >> sectionTitleString [
23+
24+
^ 'sectionTitleL'
25+
]
26+
927
{ #category : 'accessing' }
1028
StSettingsAbstractPresenter >> settingsTree [
1129
"Answer the receiver's <StSettingsTree>, the settings model"
Lines changed: 297 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,297 @@
1+
"
2+
It represents a setting category page with setting sections and settings. The page was selected from `StSettingsCategoriesPresenter` and it matches a `StSettingsCategoryItemPresenter`.
3+
4+
"
5+
Class {
6+
#name : 'StSettingsDetailsPresenter',
7+
#superclass : 'StSettingsAbstractPresenter',
8+
#instVars : [
9+
'pageTitle',
10+
'settingDocPresenter',
11+
'settingDocLabel',
12+
'notebook',
13+
'settingTree'
14+
],
15+
#category : 'NewTools-SettingsBrowser-UI',
16+
#package : 'NewTools-SettingsBrowser',
17+
#tag : 'UI'
18+
}
19+
20+
{ #category : 'private' }
21+
StSettingsDetailsPresenter >> activePage [
22+
23+
| selectedPage |
24+
25+
selectedPage := notebook selectedPage.
26+
selectedPage activePresenter
27+
ifNil: [ selectedPage retrievePresenter ].
28+
^ selectedPage activePresenter
29+
]
30+
31+
{ #category : 'callbacks - tabs' }
32+
StSettingsDetailsPresenter >> addDefaultGeneralTabFrom: aStSettingNode [
33+
"Private - Add General Settings default"
34+
35+
| generalSettingNode |
36+
37+
generalSettingNode := self newSettingNode.
38+
generalSettingNode item name: self generalTitle.
39+
generalSettingNode parentName: aStSettingNode name.
40+
notebook addPage: (SpNotebookPage new
41+
icon: (self iconNamed: #smallQuestion);
42+
presenterProvider: [ StSettingsNotebookPageContentPresenter on: generalSettingNode ];
43+
title: self generalTitle;
44+
yourself).
45+
]
46+
47+
{ #category : 'callbacks - tabs' }
48+
StSettingsDetailsPresenter >> addHeaderForSettingsWithoutParent: aSpNotebookPage [
49+
"Private - We add a 'General' header (2nd level) for those nodes without parent other than the root"
50+
51+
| generalSettingNode generalNodePresenter |
52+
53+
generalSettingNode := self newGeneralSetting: aSpNotebookPage.
54+
generalNodePresenter := self
55+
newSectionNodePresenterFrom: generalSettingNode
56+
level: 2.
57+
self activePage
58+
add: generalNodePresenter
59+
expand: false
60+
]
61+
62+
{ #category : 'callbacks - tabs' }
63+
StSettingsDetailsPresenter >> addSearchResultTabFrom: resultStSettingNodes [
64+
"Private - Add a tab with search results from resultStSettingNodes in the receiver's notebook"
65+
66+
| rootSearchResultNode rsSettingNodes rsRootResultNode |
67+
68+
notebook hasPages ifTrue: [ notebook removeAll ].
69+
70+
rsSettingNodes := resultStSettingNodes copy asOrderedCollection.
71+
"Create a new settings tree with the results"
72+
rsRootResultNode := StSettingsTree new nodeList: rsSettingNodes; yourself.
73+
"Create a new parent node "
74+
rootSearchResultNode := self newSettingNode
75+
parentName: 'Results';
76+
model: rsRootResultNode;
77+
yourself.
78+
79+
"Set the model of each result node"
80+
rsSettingNodes do: [ : snc |
81+
snc
82+
parentName: rootSearchResultNode name;
83+
model: rsRootResultNode ].
84+
85+
notebook addPage: (self newResultPageOn: rootSearchResultNode).
86+
self selectFirstPage.
87+
88+
89+
]
90+
91+
{ #category : 'callbacks - tabs' }
92+
StSettingsDetailsPresenter >> addTabsFrom: aStSettingNode [
93+
94+
aStSettingNode allChildren do: [ :aSettingNode |
95+
| nodePresenter |
96+
(nodePresenter := self
97+
instantiate: aSettingNode presenterClass
98+
on: aSettingNode) hasChildren
99+
ifTrue: [
100+
nodePresenter sectionTitleStyle: self sectionTitleString.
101+
notebook addPage: (SpNotebookPage new
102+
icon: (self iconNamed: #smallQuestion);
103+
presenterProvider: [ StSettingsNotebookPageContentPresenter on: aSettingNode ];
104+
title: aSettingNode label;
105+
yourself) ] ]
106+
]
107+
108+
{ #category : 'initialization' }
109+
StSettingsDetailsPresenter >> defaultInputPort [
110+
111+
^ SpModelPort newPresenter: self
112+
113+
]
114+
115+
{ #category : 'layout' }
116+
StSettingsDetailsPresenter >> defaultLayout [
117+
118+
^ SpBoxLayout newTopToBottom
119+
add: pageTitle expand: false;
120+
add: (SpPanedLayout newVertical
121+
positionOfSlider: 0.85;
122+
add: notebook;
123+
add: (SpBoxLayout newTopToBottom
124+
spacing: 5;
125+
add: settingDocLabel expand: false;
126+
add: settingDocPresenter;
127+
yourself);
128+
yourself);
129+
yourself
130+
]
131+
132+
{ #category : 'callbacks - tabs' }
133+
StSettingsDetailsPresenter >> generalTitle [
134+
135+
^ 'General'
136+
]
137+
138+
{ #category : 'initialization' }
139+
StSettingsDetailsPresenter >> initializePresenters [
140+
141+
pageTitle := self newLabel.
142+
notebook := self newNotebook
143+
whenSelectedPageChangedDo: [ :presenter | self updateSelectedPage: presenter ];
144+
yourself.
145+
settingDocLabel := self newLabel
146+
addStyle: 'settingDocTitle';
147+
yourself.
148+
settingDocPresenter := self newText
149+
]
150+
151+
{ #category : 'callbacks - tabs' }
152+
StSettingsDetailsPresenter >> newGeneralSetting: aSpNotebookPage [
153+
154+
| currentParent generalSettingNode |
155+
156+
currentParent := aSpNotebookPage activePresenter parentNode.
157+
generalSettingNode := StSettingNode with: PragmaSetting new.
158+
generalSettingNode item name: self generalTitle.
159+
generalSettingNode parentName: (currentParent ifNotNil: [ currentParent name ]).
160+
^ generalSettingNode
161+
]
162+
163+
{ #category : 'TOREMOVE' }
164+
StSettingsDetailsPresenter >> newResultPageOn: aStSettingNode [
165+
166+
^ SpNotebookPage new
167+
icon: (self iconNamed: #smallQuestion);
168+
presenterProvider: [ self instantiate: StSettingsNotebookPageContentPresenter on: aStSettingNode ];
169+
beCloseable;
170+
title: self resultsTitle;
171+
yourself
172+
]
173+
174+
{ #category : 'callbacks' }
175+
StSettingsDetailsPresenter >> newSectionNodePresenterFrom: aSettingNode level: anInteger [
176+
"Private - This is a temporary method until finding a proper solution for 'hand-wired' sections, since some settings declarations are not grouped"
177+
178+
| nodePresenter |
179+
nodePresenter := self
180+
instantiate: StSettingSectionPresenter
181+
on: aSettingNode.
182+
nodePresenter sectionTitleStyle: self sectionTitleString , anInteger asString.
183+
^ nodePresenter
184+
]
185+
186+
{ #category : 'callbacks - tabs' }
187+
StSettingsDetailsPresenter >> newSettingNode [
188+
189+
^ StSettingNode with: PragmaSetting new.
190+
]
191+
192+
{ #category : 'initialization' }
193+
StSettingsDetailsPresenter >> notebook [
194+
195+
^ notebook
196+
197+
]
198+
199+
{ #category : 'callbacks - tabs' }
200+
StSettingsDetailsPresenter >> resultsTitle [
201+
202+
^ 'Results'
203+
]
204+
205+
{ #category : 'callbacks' }
206+
StSettingsDetailsPresenter >> selectFirstPage [
207+
208+
self notebook selectPageIndex: 1.
209+
self updateSelectedPage: self notebook selectedPage.
210+
]
211+
212+
{ #category : 'accessing - model' }
213+
StSettingsDetailsPresenter >> setModel: aNode [
214+
"Private - Set the receiver's content iterating recursively starting from aNode"
215+
216+
settingTree := aNode model childrenOf: aNode.
217+
pageTitle
218+
label: aNode label;
219+
addStyle: 'pageTitle'.
220+
notebook removeAll.
221+
self updatePages: aNode.
222+
223+
]
224+
225+
{ #category : 'callbacks - tabs' }
226+
StSettingsDetailsPresenter >> updatePages: aStSettingNode [
227+
"Private - Recursively iterate aStSettingNode children using anInteger as 'level' indicator for title styling purposes"
228+
229+
self addDefaultGeneralTabFrom: aStSettingNode.
230+
self addTabsFrom: aStSettingNode.
231+
]
232+
233+
{ #category : 'callbacks' }
234+
StSettingsDetailsPresenter >> updatePresenterGeneralNodes: aCollection [
235+
236+
| nodePresenter |
237+
aCollection do: [ :settingNode |
238+
nodePresenter := self newNodePresenterFrom: settingNode level: 2.
239+
"Here the owner of each node presenter will be updated to a StSettingsNotebookPageContentPresenter"
240+
self activePage add: nodePresenter expand: false ]
241+
]
242+
243+
{ #category : 'callbacks' }
244+
StSettingsDetailsPresenter >> updatePresenterTree: aStSettingNode level: anInteger [
245+
"Private - Recursively iterate aStSettingNode children using anInteger as 'level' indicator for title styling purposes"
246+
247+
aStSettingNode allChildren do: [ :aSettingNode |
248+
| nodePresenter |
249+
nodePresenter := self
250+
newNodePresenterFrom: aSettingNode
251+
level: anInteger.
252+
"The activePage here should be a StSettingsNotebookPageContentPresenter"
253+
self activePage add: nodePresenter expand: false.
254+
self updatePresenterTree: aSettingNode level: anInteger + 1 ].
255+
256+
257+
]
258+
259+
{ #category : 'callbacks - tabs' }
260+
StSettingsDetailsPresenter >> updateSelectedPage: aSpNotebookPage [
261+
"Private - Update the receiver's notebook with aSpNotebookPage. The first time the notebook is opened, a #selectedPage event is triggered and aSpNotebookPage will be nil"
262+
263+
aSpNotebookPage ifNotNil: [
264+
aSpNotebookPage activePresenter ifNotNil: [ : activePresenter | activePresenter removeAll ].
265+
self updateSelectedSpecialCases: aSpNotebookPage.
266+
self updateSelectedPageTree: aSpNotebookPage ]
267+
]
268+
269+
{ #category : 'private' }
270+
StSettingsDetailsPresenter >> updateSelectedPageTree: aSpNotebookPage [
271+
272+
| updatedPage |
273+
274+
updatedPage := aSpNotebookPage activePresenter
275+
ifNil: [ aSpNotebookPage retrievePresenter ]
276+
ifNotNil: [ aSpNotebookPage activePresenter ].
277+
278+
self updatePresenterTree: updatedPage parentNode level: 2
279+
]
280+
281+
{ #category : 'callbacks - tabs' }
282+
StSettingsDetailsPresenter >> updateSelectedSpecialCases: aSpNotebookPage [
283+
"Do not add a 'General' header if we are already in the General tab"
284+
285+
aSpNotebookPage title = self resultsTitle
286+
ifFalse: [
287+
aSpNotebookPage title = self generalTitle
288+
ifFalse: [ self addHeaderForSettingsWithoutParent: aSpNotebookPage ]
289+
ifTrue: [ self updatePresenterGeneralNodes: (settingTree reject: [ : node | node hasChildren ]) ] ]
290+
]
291+
292+
{ #category : 'callbacks' }
293+
StSettingsDetailsPresenter >> updateSetting: labelString helpText: settingHelpString [
294+
295+
settingDocLabel label: labelString.
296+
settingDocPresenter text: settingHelpString.
297+
]

0 commit comments

Comments
 (0)