Skip to content

Commit bc96635

Browse files
committed
+ ToCircularMenuLayout to align sub-menu sectors with the parent menu middle angle
1 parent b2c1704 commit bc96635

9 files changed

Lines changed: 128 additions & 67 deletions

src/Toplo-Examples/ToExperiments.class.st

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -825,23 +825,6 @@ ToExperiments class >> example_TextFlowWithBlElements2 [
825825
element openInNewSpace
826826
]
827827

828-
{ #category : #album }
829-
ToExperiments class >> example_TextPane [
830-
831-
| text album space scrollbar |
832-
space := BlSpace new.
833-
text := self methodText asRopedText.
834-
album := ToAlbum new.
835-
album text: text copy.
836-
scrollbar := ToScrollbarElement vertical: true.
837-
scrollbar attachTo: album next.
838-
album addChild: scrollbar.
839-
space root addChild: album.
840-
album infinite vFitContent.
841-
album next next vFitContent.
842-
space show
843-
]
844-
845828
{ #category : #collapse }
846829
ToExperiments class >> example_collapse1 [
847830

src/Toplo-Examples/ToSandBox.class.st

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2214,7 +2214,6 @@ ToSandBox class >> example_CircularMenuPaneWithSubmenus2 [
22142214

22152215
item := ToCircularMenu new icon:
22162216
(iconProvider iconNamed: 'filled_checklist').
2217-
22182217
item layoutRadius: 80.
22192218

22202219
sub := ToMenuItem new labelText: 'Menu item 1'.
@@ -5617,33 +5616,34 @@ ToSandBox class >> example_SkinIsRenewWhenLableTextChange [
56175616
ToSandBox class >> example_Smalltalk_ui_icons [
56185617

56195618
| column root vscrollBar container |
5620-
column := BlElement new
5621-
layout: BlLinearLayout vertical;
5619+
column := ToPane vertical
56225620
constraintsDo: [ :c |
5623-
c horizontal fitContent.
5624-
c vertical fitContent ];
5621+
c horizontal matchParent.
5622+
c vertical fitContent ];
56255623
yourself.
56265624
Smalltalk ui icons allIconNames do: [ :k |
5627-
| lab im node |
5628-
im := ToImage new innerImage: (self iconNamed: k).
5629-
lab := ToLabel new text: k asString.
5630-
node := ToButton new icon: im; label: lab; yourself.
5631-
node width: 600.
5632-
node startFlexible: true.
5633-
column addChild: node ].
5625+
| lab im node |
5626+
im := ToImage new innerImage: (self iconNamed: k).
5627+
lab := ToLabel new text: k asString.
5628+
node := ToButton new
5629+
icon: im;
5630+
label: lab;
5631+
yourself.
5632+
node hMatchParent.
5633+
node startFlexible: true.
5634+
column addChild: node ].
56345635

56355636
root := column asScrollableElement.
5636-
vscrollBar := BlVerticalScrollbarElement new.
5637+
vscrollBar := ToScrollbarElement new.
56375638
vscrollBar constraintsDo: [ :c |
5638-
c ignoreByLayout.
5639-
c margin: (BlInsets right: 2).
5640-
c ignored horizontal alignRight.
5641-
c ignored vertical alignBottom ].
5639+
c ignoreByLayout.
5640+
c ignored horizontal alignRight.
5641+
c ignored vertical alignBottom ].
56425642
vscrollBar attachTo: root.
56435643
container := BlElement new
56445644
constraintsDo: [ :c |
5645-
c horizontal matchParent.
5646-
c vertical matchParent ];
5645+
c horizontal matchParent.
5646+
c vertical matchParent ];
56475647
yourself.
56485648
container
56495649
addChild: root;

src/Toplo-Widget-Circular/TToAnnulusSectorLayoutState.trait.st

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,3 +90,15 @@ TToAnnulusSectorLayoutState >> startAngleOffset: anAngleInDegrees [
9090

9191
startAngleOffset := anAngleInDegrees
9292
]
93+
94+
{ #category : #'t - annulus sector layout state' }
95+
TToAnnulusSectorLayoutState >> startAngleRadians [
96+
97+
^ startAngle degreesToRadians
98+
]
99+
100+
{ #category : #'t - annulus sector layout state' }
101+
TToAnnulusSectorLayoutState >> startAngleRadians: anAngleInRadians [
102+
103+
startAngle := anAngleInRadians radiansToDegrees
104+
]

src/Toplo-Widget-Circular/TToAnnulusSectorLayoutUser.trait.st

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,8 +73,19 @@ TToAnnulusSectorLayoutUser >> startAngle [
7373
TToAnnulusSectorLayoutUser >> startAngle: anAngleInDegrees [
7474

7575
(self startAngle closeTo: anAngleInDegrees) ifTrue: [ ^ self ].
76-
self stateHolder startAngle: anAngleInDegrees.
77-
self requestLayout
76+
self stateHolder startAngle: anAngleInDegrees
77+
]
78+
79+
{ #category : #'t - annulus sector layout user' }
80+
TToAnnulusSectorLayoutUser >> startAngleRadians [
81+
82+
^ self startAngle degreesToRadians
83+
]
84+
85+
{ #category : #'t - annulus sector layout user' }
86+
TToAnnulusSectorLayoutUser >> startAngleRadians: anAngleInRadians [
87+
88+
self startAngle: anAngleInRadians radiansToDegrees
7889
]
7990

8091
{ #category : #'t - annulus sector layout user' }

src/Toplo-Widget-Circular/ToAnnulusCircularLayout.class.st

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -56,10 +56,24 @@ ToAnnulusCircularLayout >> centroidOf: anElement in: aContainer [
5656
{ #category : #layout }
5757
ToAnnulusCircularLayout >> layout: anElement in: aBounds context: aBlElementBoundsUpdateContext [
5858

59+
self
60+
layoutSectors: anElement
61+
in: aBounds
62+
context: aBlElementBoundsUpdateContext.
63+
super
64+
layout: anElement
65+
in: aBounds
66+
context: aBlElementBoundsUpdateContext.
67+
68+
anElement invalidate
69+
]
70+
71+
{ #category : #layout }
72+
ToAnnulusCircularLayout >> layoutSectors: anElement in: aBounds context: aBlElementBoundsUpdateContext [
73+
5974
| radius defaultGap sectorStartAngle remainder sectors numberWithGap |
6075
sectors := anElement children accountedByLayout.
6176
sectors isEmpty ifTrue: [ ^ self ].
62-
6377
radius := aBounds extent x / 2.
6478
remainder := 360.
6579
numberWithGap := 0.
@@ -69,12 +83,10 @@ ToAnnulusCircularLayout >> layout: anElement in: aBounds context: aBlElementBoun
6983
inSectorElement: each) ifNotNil: [ :gap |
7084
remainder := remainder - gap.
7185
numberWithGap := numberWithGap + 1 ] ].
72-
7386
defaultGap := numberWithGap < sectors size
7487
ifTrue: [ remainder / (sectors size - numberWithGap) ]
7588
ifFalse: [ 0 ].
7689
sectorStartAngle := self startAngle + self startAngleOffset.
77-
7890
sectors do: [ :each |
7991
| centroid edgePoint innerEdgePoint sectorGap |
8092
centroid := self centroidOf: each in: anElement.
@@ -86,29 +98,22 @@ ToAnnulusCircularLayout >> layout: anElement in: aBounds context: aBlElementBoun
8698
pointOnInnerPeripheryFromCenter: aBounds center
8799
through: centroid
88100
in: anElement.
89-
90101
each constraints annulusSector centroid: centroid.
91102
each constraints annulusSector edgePoint: edgePoint.
92103
each constraints annulusSector innerEdgePoint: innerEdgePoint.
93104
each extent: anElement measuredExtent.
94-
95105
sectorGap := (each constraints annulus
96106
sectorAngleInDegreesWithRadius: radius
97107
inSectorElement: each)
98108
ifNotNil: [ :gap | gap ]
99109
ifNil: [ defaultGap ].
100-
101110
each
102111
innerRadialRatio: self innerRadialRatio;
103112
outerRadialRatio: self outerRadialRatio;
104113
startAngle: sectorStartAngle;
105114
endAngle: sectorStartAngle + sectorGap.
106-
sectorStartAngle := sectorStartAngle + sectorGap ].
107-
super
108-
layout: anElement
109-
in: aBounds
110-
context: aBlElementBoundsUpdateContext.
111-
anElement invalidate
115+
sectorStartAngle := sectorStartAngle + sectorGap ]
116+
112117
]
113118

114119
{ #category : #private }

src/Toplo-Widget-Circular/ToAnnulusSectorElement.class.st

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ Class {
1212
{ #category : #accessing }
1313
ToAnnulusSectorElement >> arcLength [
1414

15-
^ self outerRadius * self deltaAngleInRadians - (self radialGap * 2)
15+
^ self outerRadius * self deltaAngleRadians - (self radialGap * 2)
1616
]
1717

1818
{ #category : #accessing }
@@ -80,7 +80,7 @@ ToAnnulusSectorElement >> chordLength [
8080

8181
| r |
8282
r := self outerRadius.
83-
^ 2 * r * (self deltaAngleInRadians / 2) sin - (self radialGap * 2)
83+
^ 2 * r * (self deltaAngleRadians / 2) sin - (self radialGap * 2)
8484
]
8585

8686
{ #category : #initialization }
@@ -96,8 +96,9 @@ ToAnnulusSectorElement >> defaultLayout [
9696
]
9797

9898
{ #category : #accessing }
99-
ToAnnulusSectorElement >> deltaAngleInRadians [
100-
^ (self endAngleInRadians - self startAngleInRadians) \\ (2 * Float pi)
99+
ToAnnulusSectorElement >> deltaAngleRadians [
100+
101+
^ (self endAngleRadians - self startAngleRadians) \\ (2 * Float pi)
101102
]
102103

103104
{ #category : #accessing }
@@ -122,16 +123,21 @@ ToAnnulusSectorElement >> endAngle [
122123
ToAnnulusSectorElement >> endAngle: anAngleInDegrees [
123124

124125
(self endAngle closeTo: anAngleInDegrees) ifTrue: [ ^ self ].
125-
layout endAngle: anAngleInDegrees.
126-
self requestLayout
126+
layout endAngle: anAngleInDegrees
127127
]
128128

129129
{ #category : #accessing }
130-
ToAnnulusSectorElement >> endAngleInRadians [
130+
ToAnnulusSectorElement >> endAngleRadians [
131131

132132
^ self endAngle degreesToRadians
133133
]
134134

135+
{ #category : #accessing }
136+
ToAnnulusSectorElement >> endAngleRadians: anAngleInRadians [
137+
138+
self endAngle: anAngleInRadians radiansToDegrees
139+
]
140+
135141
{ #category : #initialization }
136142
ToAnnulusSectorElement >> initialize [
137143

@@ -143,15 +149,15 @@ ToAnnulusSectorElement >> initialize [
143149
{ #category : #accessing }
144150
ToAnnulusSectorElement >> innerArcLength [
145151

146-
^ (self innerRadius * self deltaAngleInRadians) - (self radialGap * 2)
152+
^ (self innerRadius * self deltaAngleRadians) - (self radialGap * 2)
147153
]
148154

149155
{ #category : #accessing }
150156
ToAnnulusSectorElement >> innerChordLength [
151157

152158
| r |
153159
r := self innerRadius.
154-
^ (2 * r * (self deltaAngleInRadians / 2) sin) - (self radialGap * 2)
160+
^ (2 * r * (self deltaAngleRadians / 2) sin) - (self radialGap * 2)
155161
]
156162

157163
{ #category : #accessing }
@@ -167,8 +173,9 @@ ToAnnulusSectorElement >> innerRadius [
167173
]
168174

169175
{ #category : #accessing }
170-
ToAnnulusSectorElement >> midAngleInRadians [
171-
^ self startAngleInRadians + (self deltaAngleInRadians / 2)
176+
ToAnnulusSectorElement >> midAngleRadians [
177+
178+
^ self startAngleRadians + (self deltaAngleRadians / 2)
172179
]
173180

174181
{ #category : #initialization }
@@ -200,12 +207,6 @@ ToAnnulusSectorElement >> radialGap: aNumber [
200207

201208
]
202209

203-
{ #category : #accessing }
204-
ToAnnulusSectorElement >> startAngleInRadians [
205-
206-
^ self startAngle degreesToRadians
207-
]
208-
209210
{ #category : #'t - annulus circular layout user' }
210211
ToAnnulusSectorElement >> stateHolder [
211212

src/Toplo-Widget-Circular/ToCircularMenuInnerElement.class.st

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,12 @@ ToCircularMenuInnerElement >> addNodeContainer: aNodeContainer at: aPosition [
1212
self addChild: aNodeContainer at: aPosition
1313
]
1414

15+
{ #category : #'t - circular element' }
16+
ToCircularMenuInnerElement >> defaultLayout [
17+
18+
^ ToCircularMenuLayout new
19+
]
20+
1521
{ #category : #initialization }
1622
ToCircularMenuInnerElement >> initialize [
1723

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
Class {
2+
#name : #ToCircularMenuLayout,
3+
#superclass : #ToAnnulusCircularLayout,
4+
#category : #'Toplo-Widget-Circular-Menu'
5+
}
6+
7+
{ #category : #layout }
8+
ToCircularMenuLayout >> layoutSectors: anElement in: aBounds context: aBlElementBoundsUpdateContext [
9+
" Align the circular submdenu sectors with the parent menu sector middle angle "
10+
11+
| sectors sectorsStartAngle sectorsEndAngle sectorsMidAngle parentMenu midAngleGap pmStartAngle pmEndAngle pmSector |
12+
super
13+
layoutSectors: anElement
14+
in: aBounds
15+
context: aBlElementBoundsUpdateContext.
16+
anElement listElement menuListOwner isSubmenu ifFalse: [ ^ self ].
17+
18+
sectors := anElement children accountedByLayout.
19+
sectors isEmpty ifTrue: [ ^ self ].
20+
21+
sectorsStartAngle := sectors first startAngleRadians.
22+
sectorsEndAngle := sectors last endAngleRadians.
23+
sectorsMidAngle := sectorsEndAngle - sectorsStartAngle / 2.
24+
25+
sectorsMidAngle < Float pi ifFalse: [ ^ self ].
26+
27+
parentMenu := anElement listElement menuListOwner.
28+
pmSector := parentMenu holder nodeContainer.
29+
pmStartAngle := pmSector startAngleRadians.
30+
pmEndAngle := pmSector endAngleRadians.
31+
midAngleGap := sectorsMidAngle - (pmEndAngle - pmStartAngle / 2).
32+
33+
sectors do: [ :each |
34+
each
35+
startAngleRadians: each startAngleRadians - midAngleGap;
36+
endAngleRadians: each endAngleRadians - midAngleGap ]
37+
]

src/Toplo/TToElement.trait.st

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,3 +23,9 @@ TToElement >> menuPaneDo: aBlock [
2323

2424
self flag: 'Check how to remove that'
2525
]
26+
27+
{ #category : #'instance creation' }
28+
TToElement >> newScrollableParent [
29+
30+
^ ToScrollableElement new
31+
]

0 commit comments

Comments
 (0)