Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
7447 leency 1
#ifndef INCLUDE_MENU_H
2
#define INCLUDE_MENU_H
6041 leency 3
 
7450 leency 4
#ifndef INCLUDE_LIST_BOX
7447 leency 5
#include "../lib/list_box.h"
7450 leency 6
#endif
7447 leency 7
 
8
:dword menu_process_id;
9
 
7450 leency 10
:struct _menu : llist
6041 leency 11
{
12
	dword appear_x, appear_y, text, identifier, selected;
13
	void show();
14
	char stak[4096];
7447 leency 15
} menu;
6041 leency 16
 
7450 leency 17
:void _menu::show(dword _appear_x, _appear_y, _menu_width, _menu_text, _identifier)
6041 leency 18
{
7447 leency 19
	#define ITEM_H 21
6041 leency 20
	appear_x = _appear_x;
21
	appear_y = _appear_y;
7450 leency 22
	text = _menu_text;
6041 leency 23
	identifier = _identifier;
24
 
7450 leency 25
	cur_y = -1;
26
	ClearList();
27
	count = chrnum(text, '\n')+1;
28
	SetSizes(2,2,_menu_width,count*ITEM_H,ITEM_H);
6041 leency 29
 
7252 leency 30
	menu_process_id = CreateThread(#_menu_thread,#stak+4092);
6041 leency 31
}
32
 
7447 leency 33
:void _menu_thread()
6041 leency 34
{
35
	proc_info MenuForm;
36
	SetEventMask(100111b);
37
	loop() switch(WaitEvent())
38
	{
39
		case evMouse:
40
			GetProcessInfo(#MenuForm, SelfInfo);
41
			if (!CheckActiveProcess(MenuForm.ID)) _menu_no_item_click();
42
			mouse.get();
7450 leency 43
			if (menu.ProcessMouse(mouse.x, mouse.y)) _menu_draw_list();
6041 leency 44
			if (mouse.lkm)&&(mouse.up) _menu_item_click();
45
			break;
46
		case evKey:
47
			GetKeys();
48
			if (key_scancode==SCAN_CODE_ESC) _menu_no_item_click();
49
			if (key_scancode==SCAN_CODE_ENTER) _menu_item_click();
7450 leency 50
			if (menu.ProcessKey(key_scancode)) _menu_draw_list();
6041 leency 51
			break;
52
		case evReDraw:
7450 leency 53
			DefineAndDrawWindow(menu.appear_x,menu.appear_y,menu.w+2,menu.h+4,0x01, 0, 0, 0x01fffFFF);
54
			DrawPopup(0,0,menu.w,menu.h+3,0, 0xE4DFE1,0x9098B0);
6041 leency 55
			_menu_draw_list();
56
	}
57
}
58
 
7447 leency 59
:void _menu_draw_list()
6041 leency 60
{
61
	int N, bgcol;
7450 leency 62
	for (N=0; N
6041 leency 63
	{
7450 leency 64
		if (N==menu.cur_y) bgcol=0xFFFfff; else bgcol=0xE4DFE1;
65
		DrawBar(menu.x, N*menu.item_h+menu.y, menu.w-3, menu.item_h, bgcol);
6041 leency 66
	}
7450 leency 67
	WriteTextLines(13, menu.item_h-8/2+menu.y, 0x80, 0, menu.text, menu.item_h);
68
	if (menu.selected) WriteText(5, menu.selected-1*menu.item_h+8, 0x80, 0xEE0000, "\x10");
6041 leency 69
}
70
 
7447 leency 71
:void _menu_item_click()
6041 leency 72
{
7450 leency 73
	menu.cur_y = menu.identifier + menu.cur_y;
7252 leency 74
	KillProcess(menu_process_id);
6041 leency 75
}
76
 
7447 leency 77
:void _menu_no_item_click()
6041 leency 78
{
7450 leency 79
	menu.cur_y = 0;
7252 leency 80
	KillProcess(menu_process_id);
7447 leency 81
}
82
 
83
#endif