0,0 → 1,180 |
#define MEMSIZE 4096*40 |
|
#include "../lib/io.h" |
#include "../lib/gui.h" |
#include "../lib/collection.h" |
#include "../lib/list_box.h" |
#include "../lib/fs.h" |
|
#define ITEM_H 19 |
|
llist menu1; |
collection names; |
collection hotkeys; |
dword shared_mem; |
|
int win_x, win_y; |
|
int max_name_len; |
int max_hotkey_len; |
|
int selected = 0; |
|
dword cur_param = #param; |
int GetNextParam() |
{ |
int result; |
dword next_param = strchr(cur_param, ' '); |
ESBYTE[next_param] = '\0'; |
result = atoi(cur_param); |
cur_param = next_param+1; |
return result; |
} |
|
void GetWindowPosition() |
{ |
int position; |
shared_mem = GetNextParam(); |
debugval("shared_mem", ESDWORD[shared_mem]); |
win_x = GetNextParam(); |
win_y = GetNextParam(); |
selected = GetNextParam(); |
position = GetNextParam(); |
if (position==2) win_x -= menu1.w; |
if (position==3) { |
win_x -= menu1.w; |
win_y -= menu1.h; |
} |
if (position==4) win_y -= menu1.h; |
} |
|
void GetMenuItems(dword current_name) |
{ |
dword next_name = strchr(current_name, '\n'); |
dword hotkey = strchr(current_name, '|'); |
|
ESBYTE[next_name] = '\0'; |
|
if (hotkey) && (hotkey < next_name) { |
ESBYTE[hotkey] = '\0'; |
} else { |
if (hotkey) && (!next_name) { |
ESBYTE[hotkey] = '\0'; |
} else { |
hotkey = " "; |
} |
} |
|
hotkeys.add(hotkey+1); |
names.add(current_name); |
|
if (next_name) GetMenuItems(next_name+2); |
} |
|
void main() |
{ |
proc_info Form; |
|
GetMenuItems(strchr(#param, '\n') + 2); |
max_name_len = strlen(names.get(0)) * 6; |
max_hotkey_len = strlen(hotkeys.get(0)) * 6; |
|
//selected = ESDWORD[shared_mem]; |
|
menu1.count = names.count; |
menu1.SetFont(6, 9, 0x80); |
menu1.SetSizes(2,2, max_name_len + max_hotkey_len + 23, menu1.count*ITEM_H, ITEM_H); |
menu1.cur_y = -1; |
|
GetWindowPosition(); |
|
SetEventMask(EVM_REDRAW + EVM_KEY + EVM_BUTTON + EVM_MOUSE); |
loop() switch(WaitEvent()) |
{ |
case evMouse: |
GetProcessInfo(#Form, SelfInfo); |
if (!CheckActiveProcess(Form.ID)) exit(); |
mouse.get(); |
if (menu1.ProcessMouse(mouse.x, mouse.y)) draw_list(); |
if (mouse.lkm)&&(mouse.up) click(); |
break; |
|
case evKey: |
GetKeys(); |
ProcessKeys(); |
break; |
|
case evReDraw: |
DefineAndDrawWindow(win_x, win_y, menu1.w+4, menu1.h+3, 0x01, 0, 0, 0x01fffFFF); |
system.color.get(); |
Draw3DPopup(0,0,menu1.w+2,menu1.h+2); |
draw_list(); |
} |
} |
|
void ProcessKeys() |
{ |
switch(key_scancode) |
{ |
case SCAN_CODE_ESC: |
exit(); |
|
case SCAN_CODE_ENTER: |
click(); |
|
case SCAN_CODE_DOWN: |
if (!menu1.KeyDown()) menu1.KeyHome(); |
draw_list(); |
break; |
|
case SCAN_CODE_UP: |
if (!menu1.KeyUp()) menu1.KeyEnd(); |
draw_list(); |
break; |
|
default: |
if (menu1.ProcessKey(key_scancode)) draw_list(); |
} |
} |
|
void draw_list() |
{ |
int i, item_y; |
|
dword active_background_color = MixColors(system.color.work_button, system.color.work,230); |
dword active_top_border_color = MixColors(system.color.work_graph, system.color.work_button,240); |
dword inactive_text_shadow_color = MixColors(system.color.work,0xFFFfff,150); |
dword text_color; |
bool skin_dark = is_the_skin_dark(); |
|
for (i=0; i<menu1.count; i++;) |
{ |
item_y = i*ITEM_H+menu1.y; |
if (i==menu1.cur_y) { |
text_color = system.color.work_button_text; |
DrawBar(menu1.x, item_y+1, menu1.w, ITEM_H-2, active_background_color); |
DrawBar(menu1.x, item_y, menu1.w, 1, active_top_border_color); |
DrawBar(menu1.x, item_y+ITEM_H-1, menu1.w, 1, system.color.work_light); |
WriteText(13 + max_name_len, item_y + menu1.text_y, 0x80, text_color, hotkeys.get(i)); |
} else { |
text_color = system.color.work_text; |
DrawBar(menu1.x, item_y, menu1.w, ITEM_H, system.color.work); |
if (!skin_dark) WriteText(13+1, item_y + menu1.text_y +1, 0x80, inactive_text_shadow_color, names.get(i)); |
WriteText(13 + max_name_len, item_y + menu1.text_y, 0x80, system.color.work_graph, hotkeys.get(i)); |
} |
WriteText(13, item_y + menu1.text_y, 0x80, text_color, names.get(i)); |
} |
if (selected) WriteText(5, selected*ITEM_H + menu1.y + menu1.text_y, 0x80, 0xEE0000, "\x10"); |
} |
|
void click() |
{ |
ESDWORD[shared_mem] = menu1.cur_y + 1; |
ExitProcess(); |
} |
|
void exit() |
{ |
ESDWORD[shared_mem] = 0; |
ExitProcess(); |
} |