Subversion Repositories Kolibri OS

Rev

Rev 6782 | Blame | Last modification | View Log | Download | RSS feed

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