complex http example fix
[k8lst.git] / modules / x11 / buttons / x11button.st
blob672899075a1b1f580630e7f39535ea747f25b54b
1 Package [
2   X11
6 X11BaseWindow subclass: X11Button [
7   | text hovered wasPress enabled normback hoverback selected |
9   ^new: parent at: xy size: sz text: aText [
10     | obj |
11     obj := self new: parent at: xy size: sz bgColor: (X11Color new: 0 g: 0 b: 0.7).
12     self;
13       in: obj var: #text put: aText;
14       in: obj var: #selected put: false.
15     obj; fontColor: 1.0 g: 1.0 b: 1.0; show.
16     ^obj
17   ]
19   ^new: parent at: xy text: aText [
20     | obj gw gh font |
21     obj := self new: parent at: xy size: 1 @ 1 text: aText.
22     font := obj font.
23     gw := font textWidth: aText.
24     gh := (font textHeight: aText) max: (font textHeight: 'qgldy').
25     obj resize: (gw + 12) @ (gh + 8).
26     ^obj
27   ]
29   text [
30     ^text
31   ]
33   text: aText [
34     text := aText.
35     self isActive ifTrue: [ self redraw ].
36   ]
38   loveKbdFocus [
39     ^true
40   ]
42   init [
43     super init.
44     normback := X11Color new: 0.0 g: 0.0 b: 0.7.
45     hoverback := X11Color new: 0.0 g: 0.0 b: 0.9.
46   ]
48   onClick [
49     ^self action
50   ]
51   onClick: aBlock [
52     ^self action: aBlock
53   ]
54   clicked [
55     ^self doAction
56   ]
58   selected [
59     ^selected
60   ]
61   selected: aFlag [
62     "'button selected: ' print. aFlag printNl."
63     aFlag = selected ifFalse: [
64       selected := aFlag.
65       self redraw.
66     ]
67   ]
69   redraw [
70     | tpt rc tw |
71     self fgColor: (hovered ifNotNil: [ hoverback ] ifNil: [ normback ]).
72     rc := (self clientSizeRect) growX: 1 y: 1.
73     self fillRect: rc.
74     tw := font textWidth: text.
75     tpt := ((self width - tw) / 2) @ 4.
76     wasPress ifNotNil: [ tpt := tpt moveX: 1 y: 1 ].
77     self drawTextAt: tpt text: text.
78     selected ifTrue: [
79       gc lineStyle: gc lineOnOffDash.
80       rc := (self clientRect) growX: -2 y: -2.
81       self fgColor: (X11Color new: 0.4 g: 0.4 b: 0.4).
82       self drawRect: rc.
83       gc lineStyle: gc lineSolid.
84     ].
85   ]
87   keyPressEvent: evt [
88     "'keycode: ' print. (evt at: 8) print. '; keyname: [' print. (evt at: 9) print. ']' printNl."
89     "'key: ' print. evt printNl."
90     (evt at: 9) == $  ifTrue: [ self clicked. ^true ].
91     ^false
92   ]
94   onX11EnterNotify: evt [
95     super onX11EnterNotify: evt.
96     hovered := true.
97     ^self redraw.
98   ]
100   onX11LeaveNotify: evt [
101     super onX11LeaveNotify: evt.
102     hovered := wasPress := nil.
103     ^self redraw.
104   ]
106   onX11ButtonPress: evt [
107     super onX11ButtonPress: evt.
108     (evt at: 8) = 1 ifTrue: [
109       wasPress := true.
110       self focusMe.
111       self redraw.
112     ].
113   ]
115   onX11ButtonRelease: evt [
116     super onX11ButtonRelease: evt.
117     ((wasPress notNil) and: [ (evt at: 8) = 1 ]) ifTrue: [
118       wasPress := nil.
119       self redraw.
120       self clicked.
121     ].
122   ]