Subversion Repositories Kolibri OS

Rev

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