Subversion Repositories Kolibri OS

Rev

Rev 8728 | Rev 9174 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
8728 leency 1
(*
2
    Copyright 2021 Anton Krotov
3
 
4
    This file is part of CEdit.
5
 
6
    CEdit is free software: you can redistribute it and/or modify
7
    it under the terms of the GNU General Public License as published by
8
    the Free Software Foundation, either version 3 of the License, or
9
    (at your option) any later version.
10
 
11
    CEdit is distributed in the hope that it will be useful,
12
    but WITHOUT ANY WARRANTY; without even the implied warranty of
13
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
    GNU General Public License for more details.
15
 
16
    You should have received a copy of the GNU General Public License
17
    along with CEdit. If not, see .
18
*)
19
 
20
MODULE Scroll;
21
 
8762 leency 22
IMPORT G := Graph, K := KolibriOS;
8728 leency 23
 
24
TYPE
25
 
26
    tScroll* = POINTER TO RECORD
27
        vertical, mouse: BOOLEAN;
28
        canvas: G.tCanvas;
29
        xSize*, ySize*, pos, mousePos: INTEGER;
30
        value*, maxVal*: INTEGER
31
    END;
32
 
33
 
34
PROCEDURE draw* (scroll: tScroll; x, y: INTEGER);
35
VAR
36
    pos, a, b: INTEGER;
37
    canvas: G.tCanvas;
38
BEGIN
39
    IF scroll.vertical THEN
40
        a := scroll.ySize;
41
        b := scroll.xSize
42
    ELSE
43
        a := scroll.xSize;
44
        b := scroll.ySize
45
    END;
46
    IF scroll.maxVal > 0 THEN
47
        pos := (a - b)*scroll.value DIV scroll.maxVal
48
    ELSE
49
        pos := 0
50
    END;
51
    canvas := scroll.canvas;
8762 leency 52
    G.SetColor(canvas, K.scrollBkColor);
8728 leency 53
    G.clear(canvas);
8762 leency 54
    G.SetColor(canvas, K.borderColor);
8728 leency 55
    G.Rect(canvas, 0, 0, scroll.xSize - 1, scroll.ySize - 1);
8762 leency 56
    G.SetColor(canvas, K.scrollColor);
8728 leency 57
    DEC(b, 2);
58
    IF scroll.vertical THEN
59
        G.FillRect(canvas, 1, pos + 1, b, pos + b);
8762 leency 60
        G.SetColor(canvas, K.borderColor);
61
        G.Rect(canvas, 0, pos, b + 2, pos + b + 1);
62
        G.SetColor(canvas, K.btnTextColor);
8728 leency 63
        G.HLine(canvas, pos + 1 + b DIV 2, 4, b - 4);
64
        G.HLine(canvas, pos + 1 + b DIV 2 - 3, 6, b - 6);
65
        G.HLine(canvas, pos + 1 + b DIV 2 + 3, 6, b - 6);
66
    ELSE
67
        G.FillRect(canvas, pos + 1, 1, pos + b, b);
8762 leency 68
        G.SetColor(canvas, K.borderColor);
69
        G.Rect(canvas, pos, 0, pos + b + 1, b + 2);
70
        G.SetColor(canvas, K.btnTextColor);
8728 leency 71
        G.VLine(canvas, pos + b DIV 2, 4, b - 4);
72
        G.VLine(canvas, pos + b DIV 2 - 3, 6, b - 6);
73
        G.VLine(canvas, pos + b DIV 2 + 3, 6, b - 6);
74
    END;
75
    scroll.pos := pos;
76
    G.DrawCanvas(canvas, x, y);
77
END draw;
78
 
79
 
8762 leency 80
PROCEDURE create* (xSize, ySize: INTEGER): tScroll;
8728 leency 81
VAR
82
    scroll: tScroll;
83
BEGIN
84
    NEW(scroll);
85
    scroll.xSize := xSize;
86
    scroll.ySize := ySize;
87
    scroll.vertical := xSize < ySize;
88
    scroll.maxVal := 30;
89
    scroll.value := 0;
90
    scroll.mouse := FALSE;
91
    scroll.canvas := G.CreateCanvas(xSize, ySize)
92
    RETURN scroll
93
END create;
94
 
95
 
96
PROCEDURE resize* (scroll: tScroll; xSize, ySize: INTEGER);
97
BEGIN
98
    scroll.xSize := xSize;
99
    scroll.ySize := ySize;
100
    scroll.vertical := xSize < ySize;
101
    G.destroy(scroll.canvas);
102
    scroll.canvas := G.CreateCanvas(xSize, ySize);
103
END resize;
104
 
105
 
106
PROCEDURE mouse* (scroll: tScroll; x, y: INTEGER);
107
VAR
108
    pos, b: INTEGER;
109
BEGIN
110
    IF scroll.vertical THEN
111
        pos := y - 1;
112
        b := scroll.xSize - 2
113
    ELSE
114
        pos := x - 1;
115
        b := scroll.ySize - 2
116
    END;
117
    IF ~scroll.mouse THEN
118
        scroll.mouse := TRUE;
119
        IF (scroll.pos <= pos) & (pos <= scroll.pos + b - 1) THEN
120
            scroll.mousePos := pos - scroll.pos
121
        ELSE
122
            scroll.mousePos := b DIV 2;
123
            scroll.value := (pos - scroll.mousePos)*scroll.maxVal DIV ABS(scroll.xSize - scroll.ySize)
124
        END
125
    ELSE
126
        scroll.value := (pos - scroll.mousePos)*scroll.maxVal DIV ABS(scroll.xSize - scroll.ySize)
127
    END;
128
    IF scroll.value < 0 THEN
129
        scroll.value := 0
130
    ELSIF scroll.value > scroll.maxVal THEN
131
        scroll.value := scroll.maxVal
132
    END
133
END mouse;
134
 
135
 
136
PROCEDURE MouseUp* (scroll: tScroll);
137
BEGIN
138
    IF scroll # NIL THEN
139
        scroll.mouse := FALSE
140
    END
141
END MouseUp;
142
 
143
 
144
END Scroll.