19,17 → 19,21 |
|
MODULE CheckBox; |
|
IMPORT G := Graph, K := KolibriOS; |
IMPORT G := Graph, K := KolibriOS, U := Utils; |
|
|
CONST |
padding = 4; |
fontWidth = K.fontWidth; |
fontHeight = K.fontHeight; |
|
|
TYPE |
tCheckBox* = POINTER TO RECORD |
tCheckBox* = RECORD |
|
left*, top*: INTEGER; |
width, height: INTEGER; |
value*, mouse*: BOOLEAN; |
value*, mouse: BOOLEAN; |
text: ARRAY 32 OF WCHAR; |
canvas: G.tCanvas |
|
36,71 → 40,57 |
END; |
|
|
PROCEDURE mark (canvas: G.tCanvas); |
BEGIN |
G.DLine(canvas, 2, 6, 6, -1); |
G.DLine(canvas, 2, 6, 7, -1); |
G.DLine(canvas, 7, 13, 9, 1); |
G.DLine(canvas, 7, 13, 10, 1); |
END mark; |
|
|
PROCEDURE paint* (chkbox: tCheckBox); |
VAR |
canvas: G.tCanvas; |
fontHeight: INTEGER; |
BEGIN |
canvas := chkbox.canvas; |
fontHeight := canvas.font.height - 1; |
IF canvas # NIL THEN |
G.SetColor(canvas, K.winColor); |
G.clear(canvas); |
G.SetColor(canvas, 0FFFFFFH); |
G.FillRect(canvas, 0, 0, fontHeight, fontHeight); |
G.FillRect(canvas, 0, 0, fontHeight - 1, fontHeight - 1); |
G.SetColor(canvas, K.borderColor); |
G.Rect(canvas, 0, 0, fontHeight, fontHeight); |
G.Rect(canvas, 0, 0, fontHeight - 1, fontHeight - 1); |
IF chkbox.value THEN |
G.SetColor(canvas, 0008000H); |
mark(canvas) |
G.DLine(canvas, 2, 6, 6, -1); |
G.DLine(canvas, 2, 6, 7, -1); |
G.DLine(canvas, 7, 13, 9, 1); |
G.DLine(canvas, 7, 13, 10, 1) |
END; |
G.SetTextColor(canvas, K.textColor); |
G.SetBkColor(canvas, K.winColor); |
G.TextOut2(canvas, canvas.font.height + padding, 0, chkbox.text, LENGTH(chkbox.text)); |
G.TextOut2(canvas, fontHeight + padding, 0, chkbox.text, LENGTH(chkbox.text)); |
G.DrawCanvas(canvas, chkbox.left, chkbox.top) |
END |
END paint; |
|
|
PROCEDURE create* (text: ARRAY OF WCHAR): tCheckBox; |
PROCEDURE create* (text: ARRAY OF WCHAR; VAR chkbox: tCheckBox); |
VAR |
res: tCheckBox; |
font: G.tFont; |
BEGIN |
font := G.CreateFont(1, "", {}); |
NEW(res); |
res.left := 0; |
res.top := 0; |
res.value := FALSE; |
res.mouse := FALSE; |
COPY(text, res.text); |
res.canvas := G.CreateCanvas(font.height + padding + LENGTH(res.text)*font.width, font.height + 1); |
G.SetFont(res.canvas, font); |
res.canvas := G.CreateCanvas(fontHeight + padding + LENGTH(res.text)*fontWidth, fontHeight + 1); |
G.SetFont(res.canvas, G.CreateFont(1, "", {})); |
res.width := res.canvas.width; |
res.height := res.canvas.height; |
RETURN res |
chkbox := res |
END create; |
|
|
PROCEDURE between (a, b, c: INTEGER): BOOLEAN; |
RETURN (a <= b) & (b <= c) |
END between; |
|
|
PROCEDURE MouseDown* (chkbox: tCheckBox; x, y: INTEGER); |
PROCEDURE MouseDown* (VAR chkbox: tCheckBox; x, y: INTEGER); |
BEGIN |
IF (chkbox # NIL) & ~chkbox.mouse THEN |
IF (chkbox.canvas # NIL) & ~chkbox.mouse THEN |
DEC(x, chkbox.left); |
DEC(y, chkbox.top); |
chkbox.mouse := TRUE; |
IF between(0, x, chkbox.width) & between(0, y, chkbox.height) THEN |
IF U.between(0, x, chkbox.width) & U.between(0, y, chkbox.height) THEN |
chkbox.value := ~chkbox.value; |
END; |
paint(chkbox) |
108,9 → 98,9 |
END MouseDown; |
|
|
PROCEDURE MouseUp* (chkbox: tCheckBox); |
PROCEDURE MouseUp* (VAR chkbox: tCheckBox); |
BEGIN |
IF chkbox # NIL THEN |
IF chkbox.canvas # NIL THEN |
chkbox.mouse := FALSE |
END |
END MouseUp; |