small fixes to X11
[k8lst.git] / modules / x11 / buttons / x11button.st
blob7b9a1df42dbc39cfc40a22f72b65f38ebd816d54
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: 'qgld').
25     obj resize: (gw + 12) @ (gh + 8).
26     ^obj
27   ]
29   loveKbdFocus [
30     ^true
31   ]
33   init [
34     super init.
35     normback := X11Color new: 0.0 g: 0.0 b: 0.7.
36     hoverback := X11Color new: 0.0 g: 0.0 b: 0.9.
37   ]
39   onClick [
40     ^self action
41   ]
42   onClick: aBlock [
43     ^self action: aBlock
44   ]
45   clicked [
46     ^self doAction
47   ]
49   selected [
50     ^selected
51   ]
52   selected: aFlag [
53     "'button selected: ' print. aFlag printNl."
54     aFlag = selected ifFalse: [
55       selected := aFlag.
56       self redraw.
57     ]
58   ]
60   redraw [
61     | tpt rc |
62     self fgColor: (hovered ifNotNil: [ hoverback ] ifNil: [ normback ]).
63     rc := (self clientSizeRect) growX: 1 y: 1.
64     self fillRect: rc.
65     tpt := 6 @ 4.
66     wasPress ifNotNil: [ tpt := tpt moveX: 1 y: 1 ].
67     self drawTextAt: tpt text: text.
68     selected ifTrue: [
69       gc lineStyle: gc lineOnOffDash.
70       rc := (self clientRect) growX: -2 y: -2.
71       self fgColor: (X11Color new: 0.4 g: 0.4 b: 0.4).
72       self drawRect: rc.
73       gc lineStyle: gc lineSolid.
74     ].
75   ]
77   keyPressEvent: evt [
78     "'keycode: ' print. (evt at: 8) print. '; keyname: [' print. (evt at: 9) print. ']' printNl."
79     "'key: ' print. evt printNl."
80     (evt at: 9) == $  ifTrue: [ self clicked. ^true ].
81     ^false
82   ]
84   onX11EnterNotify: evt [
85     super onX11EnterNotify: evt.
86     hovered := true.
87     ^self redraw.
88   ]
90   onX11LeaveNotify: evt [
91     super onX11LeaveNotify: evt.
92     hovered := wasPress := nil.
93     ^self redraw.
94   ]
96   onX11ButtonPress: evt [
97     super onX11ButtonPress: evt.
98     (evt at: 8) = 1 ifTrue: [
99       wasPress := true.
100       self focusMe.
101       self redraw.
102     ].
103   ]
105   onX11ButtonRelease: evt [
106     super onX11ButtonRelease: evt.
107     ((wasPress notNil) and: [ (evt at: 8) = 1 ]) ifTrue: [
108       wasPress := nil.
109       self redraw.
110       self clicked.
111     ].
112   ]