Subversion Repositories Kolibri OS

Rev

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