Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
6198 leency 1
#ifndef INCLUDE_GUI_H
5598 pavelyakov 2
#define INCLUDE_GUI_H
3107 leency 3
 
5598 pavelyakov 4
#ifndef INCLUDE_KOLIBRI_H
5
#include "../lib/kolibri.h"
6
#endif
7
 
8
#ifndef INCLUDE_STRING_H
9
#include "../lib/strings.h"
10
#endif
11
 
6176 leency 12
#ifndef INCLUDE_RGB_H
13
#include "../lib/patterns/rgb.h"
14
#endif
15
 
4005 leency 16
:void DrawRectangle(dword x,y,w,h,color1)
3067 leency 17
{
3225 leency 18
	if (w<=0) || (h<=0) return;
19
	DrawBar(x,y,w,1,color1);
20
	DrawBar(x,y+h,w,1,color1);
21
	DrawBar(x,y,1,h,color1);
22
	DrawBar(x+w,y,1,h+1,color1);
3067 leency 23
}
24
 
5738 leency 25
:void DrawWideRectangle(dword x,y,w,h,boder,color1)
26
{
27
	if (w<=0) || (h<=0) return;
28
	DrawBar(x, y, w, boder, color1);
29
	DrawBar(x, y+h-boder, w, boder, color1);
30
	DrawBar(x, y+boder, boder, h-boder-boder, color1);
31
	DrawBar(x+w-boder, y+boder, boder, h-boder-boder, color1);
32
}
33
 
4005 leency 34
:void DrawRectangle3D(dword x,y,w,h,color1,color2)
3067 leency 35
{
3225 leency 36
	if (w<=0) || (h<=0) return;
37
	DrawBar(x,y,w+1,1,color1);
38
	DrawBar(x,y+1,1,h-1,color1);
39
	DrawBar(x+w,y+1,1,h,color2);
40
	DrawBar(x,y+h,w,1,color2);
3067 leency 41
}
42
 
4005 leency 43
:void DrawCaptButton(dword x,y,w,h,id,color_b, color_t,text)
3067 leency 44
{
6209 leency 45
	dword tx = -strlen(text)*8+w/2+x;
46
	dword ty = h/2-7+y;
47
 
4846 leency 48
	if (id>0) DefineButton(x,y,w,h,id,color_b);
6198 leency 49
	WriteText(tx+1,ty+1,0x90,MixColors(color_b,0,230),text);
50
	WriteText(tx,ty,0x90,color_t,text);
3067 leency 51
}
52
 
6631 leency 53
:int DrawStandartCaptButton(dword x, y, id, text)
6567 leency 54
{
55
	int padding_v = 5;
56
	int padding_h = 15;
57
	int right_margin = 12;
58
	int tx = x + padding_h;
6678 leency 59
	int ty = y + padding_v+1;
6567 leency 60
	int h = padding_v + padding_v + 16; //16 font height
61
	int w = strlen(text)*8 + padding_h + padding_h;
62
 
6631 leency 63
	if (id>0) DefineButton(x,y,w,h,id,system.color.work_button);
64
	WriteText(tx+1,ty+1,0x90,MixColors(system.color.work_button,0,230),text);
65
	WriteText(tx,ty,0x90,system.color.work_button_text,text);
6567 leency 66
	return w + right_margin;
67
}
68
 
4846 leency 69
:void WriteTextCenter(dword x,y,w,color_t,text)
70
{
71
	WriteText(-strlen(text)*6+w/2+x+1,y,0x80,color_t,text);
72
}
73
 
5519 leency 74
:void DrawCircle(int x, y, r, color)
3067 leency 75
{
76
	int i;
77
	float px=0, py=r, ii = r * 3.1415926 * 2;
78
	FOR (i = 0; i < ii; i++)
79
	{
5519 leency 80
        PutPixel(px + x, y - py, color);
3067 leency 81
        px = py / r + px;
82
        py = -px / r + py;
83
	}
3076 leency 84
}
3106 leency 85
 
6271 leency 86
:unsigned char checkbox_flag[507] = {
6197 leency 87
	0xFC, 0xD4, 0x04, 0xFC, 0xD4, 0x04, 0xFC, 0xD4, 0x04, 0xFC, 0xD4, 0x04, 0xFC, 0xD4, 0x04, 0xFC,
88
	0xD4, 0x04, 0xFC, 0xD4, 0x04, 0xFC, 0xD4, 0x04, 0xFC, 0xD4, 0x04, 0xFC, 0xD4, 0x04, 0xFC, 0xD4,
89
	0x04, 0xFC, 0xD4, 0x04, 0xFC, 0xC8, 0x04, 0xFC, 0xDC, 0x04, 0xFC, 0xC8, 0x04, 0xFC, 0xC8, 0x04,
90
	0xFC, 0xC8, 0x04, 0xFC, 0xC8, 0x04, 0xFC, 0xC8, 0x04, 0xFC, 0xC8, 0x04, 0xFC, 0xC8, 0x04, 0xFC,
91
	0xC8, 0x04, 0xFC, 0xC8, 0x04, 0xFC, 0xC8, 0x04, 0xFC, 0xC8, 0x04, 0xFC, 0xB4, 0x04, 0xFC, 0xDC,
92
	0x04, 0xFC, 0xC8, 0x04, 0xFC, 0xC8, 0x04, 0xFC, 0xC8, 0x04, 0xFC, 0xC8, 0x04, 0xFC, 0xBC, 0x04,
93
	0xFC, 0xBC, 0x04, 0xFC, 0xBC, 0x04, 0xFC, 0xB4, 0x04, 0xFC, 0xA9, 0x04, 0xFC, 0xA9, 0x04, 0xFC,
94
	0xB4, 0x04, 0xFC, 0xB4, 0x04, 0xFC, 0xD4, 0x04, 0xFC, 0xC8, 0x04, 0xFC, 0xC8, 0x04, 0xFC, 0xC8,
95
	0x04, 0xFC, 0xBC, 0x04, 0xFC, 0xBC, 0x04, 0xFC, 0xB4, 0x04, 0xFC, 0xB4, 0x04, 0xF9, 0x98, 0x04,
96
	0xFC, 0xF2, 0xD2, 0xFC, 0xF2, 0xD2, 0xFA, 0xA5, 0x04, 0xFC, 0xB4, 0x04, 0xFC, 0xD4, 0x04, 0xFC,
97
	0xB4, 0x04, 0xFC, 0xA9, 0x04, 0xFC, 0xA9, 0x04, 0xFC, 0xB4, 0x04, 0xFC, 0xB4, 0x04, 0xFC, 0xB4,
98
	0x04, 0xF9, 0x98, 0x04, 0xFF, 0xFF, 0xFF, 0xFD, 0xFD, 0xF6, 0xFC, 0xF9, 0xAF, 0xF9, 0x98, 0x04,
99
	0xFC, 0xB4, 0x04, 0xFC, 0xD4, 0x04, 0xFC, 0xA9, 0x04, 0xFC, 0xF2, 0xD2, 0xFC, 0xF2, 0xD2, 0xF9,
100
	0x98, 0x04, 0xFC, 0xB4, 0x04, 0xF9, 0x98, 0x04, 0xFF, 0xFF, 0xFF, 0xFD, 0xFD, 0xF6, 0xF7, 0xE0,
101
	0x95, 0xBC, 0x64, 0x04, 0xF9, 0x98, 0x04, 0xFC, 0xA9, 0x04, 0xFC, 0xD4, 0x04, 0xF9, 0x98, 0x04,
102
	0xFD, 0xFD, 0xF6, 0xFF, 0xFF, 0xFF, 0xFC, 0xDC, 0x2C, 0xF9, 0x98, 0x04, 0xFF, 0xFF, 0xFF, 0xFD,
103
	0xFD, 0xF6, 0xF7, 0xE0, 0x95, 0xBC, 0x64, 0x04, 0xF9, 0x98, 0x04, 0xFA, 0x9F, 0x04, 0xFC, 0xA9,
104
	0x04, 0xFC, 0xD4, 0x04, 0xF9, 0x98, 0x04, 0xF7, 0xE0, 0x95, 0xFD, 0xFD, 0xF6, 0xFF, 0xFF, 0xFF,
105
	0xFF, 0xFF, 0xFF, 0xFD, 0xFD, 0xF6, 0xF7, 0xE0, 0x95, 0xBC, 0x64, 0x04, 0xF9, 0x98, 0x04, 0xFA,
106
	0x9F, 0x04, 0xFC, 0xA9, 0x04, 0xFC, 0xA9, 0x04, 0xFC, 0xD4, 0x04, 0xF9, 0x98, 0x04, 0xBC, 0x64,
107
	0x04, 0xF7, 0xE0, 0x95, 0xFD, 0xFD, 0xF6, 0xFD, 0xFD, 0xF6, 0xF7, 0xE0, 0x95, 0xBC, 0x64, 0x04,
108
	0xF9, 0x98, 0x04, 0xFA, 0x9F, 0x04, 0xFC, 0xA9, 0x04, 0xFC, 0xA9, 0x04, 0xFC, 0xA9, 0x04, 0xFC,
109
	0xC8, 0x04, 0xFA, 0xA5, 0x04, 0xF9, 0x98, 0x04, 0xBC, 0x64, 0x04, 0xF7, 0xE0, 0x95, 0xF7, 0xE0,
110
	0x95, 0xBC, 0x64, 0x04, 0xF9, 0x98, 0x04, 0xFA, 0x9F, 0x04, 0xFC, 0xA9, 0x04, 0xFC, 0xA9, 0x04,
111
	0xFC, 0xA9, 0x04, 0xFA, 0x9F, 0x04, 0xFC, 0xC8, 0x04, 0xFC, 0xA9, 0x04, 0xFA, 0x9F, 0x04, 0xF9,
112
	0x98, 0x04, 0xBC, 0x64, 0x04, 0xBC, 0x64, 0x04, 0xF9, 0x98, 0x04, 0xFA, 0x9F, 0x04, 0xFC, 0xA9,
113
	0x04, 0xFC, 0xA9, 0x04, 0xFC, 0xA9, 0x04, 0xFA, 0x9F, 0x04, 0xFA, 0x9F, 0x04, 0xFC, 0xC8, 0x04,
114
	0xFC, 0xA9, 0x04, 0xFC, 0xA9, 0x04, 0xFA, 0x9F, 0x04, 0xF9, 0x98, 0x04, 0xF9, 0x98, 0x04, 0xFA,
115
	0x9F, 0x04, 0xFC, 0xA9, 0x04, 0xFC, 0xA9, 0x04, 0xFC, 0xA9, 0x04, 0xFA, 0x9F, 0x04, 0xFA, 0x9F,
116
	0x04, 0xF9, 0x98, 0x04, 0xFC, 0xB4, 0x04, 0xF9, 0x98, 0x04, 0xF9, 0x98, 0x04, 0xF9, 0x98, 0x04,
117
	0xF9, 0x98, 0x04, 0xF9, 0x98, 0x04, 0xF9, 0x98, 0x04, 0xF9, 0x98, 0x04, 0xF9, 0x98, 0x04, 0xF9,
118
	0x98, 0x04, 0xF9, 0x98, 0x04, 0xF9, 0x98, 0x04, 0xF9, 0x98, 0x04
119
};
120
 
6176 leency 121
:void CheckBox(dword x,y,bt_id, text, is_checked)
3106 leency 122
{
6176 leency 123
	byte w=14, h=14;
6197 leency 124
	DefineButton(x-1, y-1, strlen(text)*8 + w + 17, h+2, bt_id+BT_HIDE+BT_NOFRAME, 0);
6278 leency 125
	EDI = system.color.work;
126
	WriteText(x+w+8, h / 2 + y -7, 0xD0, system.color.work_text, text);
6176 leency 127
	DrawRectangle(x, y, w, h, system.color.work_graph);
5477 leency 128
	if (is_checked == 0)
3106 leency 129
	{
5477 leency 130
		DrawRectangle3D(x+1, y+1, w-2, h-2, 0xDDDddd, 0xffffff);
131
		DrawBar(x+2, y+2, w-3, h-3, 0xffffff);
132
	}
133
	else if (is_checked == 1)
134
	{
6176 leency 135
		DrawWideRectangle(x+1, y+1, w-1, h-1, 2, 0xffffff);
6197 leency 136
		_PutImage(x+1, y+1, 13, 13, #checkbox_flag);
3106 leency 137
	}
5477 leency 138
	else if (is_checked == 2) //not active
3106 leency 139
	{
6176 leency 140
		DrawWideRectangle(x+1, y+1, w-1, h-1, 2, 0xffffff);
5526 leency 141
		DrawBar(x+3, y+3, w-5, h-5, 0x888888);
5477 leency 142
	}
6191 leency 143
	DrawRectangle3D(x-1,y-1,w+2,h+2,system.color.work_dark,system.color.work_light);
3114 leency 144
}
145
 
6176 leency 146
:void MoreLessBox(dword x,y, bt_id_more, bt_id_less, value, text)
5477 leency 147
{
6198 leency 148
	#define VALUE_FIELD_W 34
6176 leency 149
	#define SIZE 18
6198 leency 150
	dword value_text = itoa(value);
5542 leency 151
 
6931 leency 152
	DrawRectangle(x, y, VALUE_FIELD_W+1, SIZE, system.color.work_graph);
6176 leency 153
	DrawRectangle3D(x+1, y+1, VALUE_FIELD_W-2, SIZE-2, 0xDDDddd, 0xffffff);
154
	DrawBar(x+2, y+2, VALUE_FIELD_W-3, SIZE-3, 0xffffff);
6649 leency 155
	WriteText( -strlen(value_text)+3*8 + x+6, SIZE / 2 + y -6, 0x90, 0x333333, value_text);
5477 leency 156
 
6931 leency 157
	DrawCaptButton(VALUE_FIELD_W + x + 1,    y, SIZE, SIZE, bt_id_more, system.color.work_button, system.color.work_button_text, "+");
6191 leency 158
	DrawCaptButton(VALUE_FIELD_W + x + SIZE, y, SIZE, SIZE, bt_id_less, system.color.work_button, system.color.work_button_text, "-");
6278 leency 159
	EDI = system.color.work;
160
	WriteText(x+VALUE_FIELD_W+SIZE+SIZE+10, SIZE / 2 + y -7, 0xD0, system.color.work_text, text);
6191 leency 161
	DrawRectangle3D(x-1,y-1,VALUE_FIELD_W+SIZE+SIZE+2,SIZE+2,system.color.work_dark,system.color.work_light);
5477 leency 162
}
163
 
6278 leency 164
:void DrawEditBox(dword edit_box_pointer)
6193 leency 165
{
6278 leency 166
	dword x,y,w,h,bg;
6193 leency 167
	ESI = edit_box_pointer;
168
	x = ESI.edit_box.left;
169
	y = ESI.edit_box.top;
170
	w = ESI.edit_box.width+1;
6278 leency 171
	if (ESI.edit_box.flags & 100000000000b) bg = 0xCACACA; else bg = 0xFFFfff;
6678 leency 172
	edit_box_draw  stdcall (edit_box_pointer);
6708 leency 173
	h = 22;
6649 leency 174
	DrawRectangle(x-1, y-1, w+1, h+1, bg);
175
	DrawRectangle3D(x-2, y-2, w+3, h+3, 0xDDDddd, bg);
176
	DrawRectangle(x-3, y-3, w+5, h+5, system.color.work_graph);
177
	DrawRectangle3D(x-4, y-4, w+7, h+7, system.color.work_dark, system.color.work_light);
6193 leency 178
}
179
 
4686 leency 180
:void DrawProgressBar(dword st_x, st_y, st_w, st_h, col_fon, col_border, col_fill, col_text, progress_percent)
3114 leency 181
{
3225 leency 182
	int progress_w;
3114 leency 183
	static int fill_old;
184
 
3363 leency 185
	//if (progress_percent<=0) {DrawBar(st_x,st_y, st_x + st_w + fill_old + 15,st_h+1, col_fon); fill_old=0; return;}
186
	if (progress_percent<=0) || (progress_percent>=100) return;
3114 leency 187
 
188
	DrawRectangle(st_x, st_y, st_w,st_h, col_border);
189
	DrawRectangle3D(st_x+1, st_y+1, st_w-2,st_h-2, 0xFFFfff, 0xFFFfff);
3225 leency 190
 
191
	if (progress_percent>0) && (progress_percent<=100)
192
	{
193
		progress_w = st_w - 3 * progress_percent / 100;
194
		DrawBar(st_x+2, st_y+2, progress_w, st_h-3, col_fill);
195
		DrawBar(st_x+2+progress_w, st_y+2, st_w-progress_w-3, st_h-3, 0xFFFfff);
196
	}
3363 leency 197
}
198
 
199
:void DrawLink(dword x,y,font_type,btn_id, inscription)
200
{
201
	int w;
202
	WriteText(x,y,font_type,0x4E00E7,inscription);
203
	if (font_type==0x80) w = strlen(inscription)*6; else w = strlen(inscription)*7;
204
	DefineButton(x-1,y-1,w,10,btn_id+BT_HIDE,0);
205
	DrawBar(x,y+8,w,1,0x4E00E7);
206
}
207
 
3991 leency 208
:void PutShadow(dword x,y,w,h,skinned,strength)
3363 leency 209
{
210
	proc_info wForm;
211
	dword shadow_buf, skin_height;
212
	shadow_buf = mem_Alloc(w*h*3);
213
 	GetProcessInfo(#wForm, SelfInfo);
3991 leency 214
	CopyScreen(shadow_buf, 5*skinned+x+wForm.left, GetSkinHeight()*skinned+y+wForm.top, w, h);
3363 leency 215
	ShadowImage(shadow_buf, w, h, strength);
216
	_PutImage(x,y,w,h,shadow_buf);
217
	mem_Free(shadow_buf);
218
}
219
 
3991 leency 220
:void DrawPopup(dword x,y,w,h,skinned, col_work,col_border)
221
{
222
	DrawRectangle(x,y,w,h,col_border);
3992 leency 223
	DrawBar(x+1,y+1,w-1,1,0xFFFfff);
4029 leency 224
	DrawBar(x+1,y+2,1,h-2,0xFFFfff);
3992 leency 225
	if (col_work!=-1) DrawBar(x+2,y+2,w-2,h-2,col_work);
3991 leency 226
	DrawPopupShadow(x,y,w,h-1,skinned);
227
}
228
 
5499 leency 229
:void DrawPopupShadow(dword x,y,w,h,skinned)
230
{
231
	PutShadow(w+x+1,y,1,h+2,skinned,2);
232
	PutShadow(w+x+2,y+1,1,h+2,skinned,1);
233
	PutShadow(x,y+h+2,w+2,1,skinned,2);
234
	PutShadow(x+1,y+h+3,w+1,1,skinned,1);
235
}
236
 
3363 leency 237
:void GrayScaleImage(dword color_image, w, h)
238
{
5761 leency 239
	dword i,gray,to,rr,gg,bb;
240
	to = w*h*3 + color_image;
241
	for (i = color_image; i < to; i+=3)
3363 leency 242
	{
5761 leency 243
		rr = DSBYTE[i];
244
		gg = DSBYTE[i+1];
245
		bb = DSBYTE[i+2];
3363 leency 246
		gray = rr*rr;
247
		gray += gg*gg;
248
		gray += bb*bb;
249
		gray = sqrt(gray) / 3;
5761 leency 250
		DSBYTE[i] = DSBYTE[i+1] = DSBYTE[i+2] = gray;
3363 leency 251
	}
252
}
253
 
254
:void ShadowImage(dword color_image, w, h, strength)
255
{
256
	dword col, to;
257
	strength = 10 - strength;
258
	to = w*h*3 + color_image;
259
	for ( ; color_image < to; color_image++)
260
	{
261
		col = strength * DSBYTE[color_image] / 10;
262
		DSBYTE[color_image] = col;
263
	}
5598 pavelyakov 264
}
265
 
5962 leency 266
:void WriteTextLines(dword x,y,byte fontType, dword color, text_pointer, line_h)
267
{
268
	dword next_word_pointer = strchr(text_pointer, '\n');
269
	if (next_word_pointer) WriteTextLines(dword x, y+line_h, byte fontType, dword color, next_word_pointer+2, line_h);
270
	ESBYTE[next_word_pointer] = NULL;
271
	WriteText(dword x, y, byte fontType, dword color, text_pointer);
272
	ESBYTE[next_word_pointer] = '\n';
273
}
274
 
6631 leency 275
/*
276
We have a long text and need to show it in block.
277
Normal line break '\n' must be applied.
278
Long lines should be breaked by word.
279
TODO: scroll
280
*/
6651 leency 281
:int DrawTextViewArea(int x,y,w,h, dword buf_start, bg_col, text_col)
6631 leency 282
{
283
	dword write_start;
284
	dword buf_end;
6651 leency 285
	int line_h = 15;
6631 leency 286
	int label_length_max;
287
	int write_length;
288
	bool end_found;
289
 
290
	write_start = buf_start;
291
	buf_end = strlen(buf_start) + buf_start;
292
	label_length_max  = w / 8; // 8 big font char width
293
 
294
	loop()
295
	{
296
		if (bg_col!=-1) DrawBar(x, y, w+1, line_h, bg_col);
297
		end_found = false;
298
		write_length = strchr(write_start, '\n') - write_start; //search normal line break
299
		if (write_length > label_length_max) || (write_length<=0) //check its position: exceeds maximum line length or not found
300
		{
301
			if (buf_end - write_start < label_length_max) //check does current line the last
302
			{
303
				write_length = buf_end - write_start;
304
				end_found = true;
305
			}
306
			else
307
			{
308
				for (write_length=label_length_max; write_length>0; write_length--) { //search for white space to make the line break
309
					if (ESBYTE[write_start+write_length] == ' ') {
310
						end_found = true;
311
						break;
312
					}
313
				}
314
			}
315
			if (end_found != true) write_length = label_length_max; //no white space, so we write label_length_max
316
		}
317
		ESI = write_length; //set text length attribute for WriteText()
6662 leency 318
		WriteText(x, y, 0x10, text_col, write_start);
6631 leency 319
		// if (editpos >= write_start-buf_start) && (editpos <= write_start-buf_start + write_length) {
320
		// 	WriteTextB(-write_start+buf_start+editpos * 8 + x - 5 +1, y, 0x90, 0xFF0000, "|");
321
		// }
322
		write_start += write_length + 1;
323
		y += line_h;
324
		if (write_start >= buf_end) break;
325
	}
326
	if (bg_col!=-1) DrawBar(x,y,w+1,h-y+line_h-4,bg_col);
327
	return y+line_h;
328
}
329
 
330
 
6197 leency 331
//this function increase falue and return it
332
//useful for list of controls which goes one after one
333
struct incn
334
{
335
	dword n;
336
	dword inc(dword _addition);
337
};
338
 
339
dword incn::inc(dword _addition)
340
{
341
	n+=_addition;
342
	return n;
343
}
344
 
6264 leency 345
 
346
/*=========================================================
347
==
348
==                   TABS
349
==
350
/========================================================*/
351
 
352
#define TAB_PADDING 25
353
#define TAB_HEIGHT 25
354
 
6271 leency 355
:struct _tabs
6264 leency 356
{
357
	int active_tab;
358
	void draw();
359
	int click();
360
} tabs;
361
 
6271 leency 362
:void _tabs::draw(dword x,y, but_id, text)
6264 leency 363
{
364
	dword col_bg, col_text;
365
	dword w=strlen(text)*8+TAB_PADDING, h=TAB_HEIGHT;
366
	y -= h;
367
 
368
	if (but_id==active_tab)
369
	{
370
		col_bg=system.color.work_button;
371
		col_text=system.color.work_button_text;
372
	}
373
	else
374
	{
375
		col_bg=system.color.work;
376
		col_text=system.color.work_text;
377
	}
378
	DrawCaptButton(x,y, w-1,h+1, but_id, col_bg, col_text, text);
379
}
380
 
6271 leency 381
:int _tabs::click(int N)
6264 leency 382
{
383
	if (N==active_tab) return false;
384
	active_tab = N;
385
	return true;
386
}
387
 
388
 
389
 
5598 pavelyakov 390
#endif