Subversion Repositories Kolibri OS

Rev

Rev 7252 | Rev 7450 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. #ifndef INCLUDE_MENU_H
  2. #define INCLUDE_MENU_H
  3.  
  4. #include "../lib/list_box.h"
  5.  
  6. :dword menu_process_id;
  7.  
  8. :struct _menu
  9. {
  10.         dword appear_x, appear_y, text, identifier, selected;  
  11.         llist list;
  12.         void show();
  13.         char stak[4096];
  14. } menu;
  15.  
  16. void _menu::show(dword _appear_x, _appear_y, _menu_width, _text, _identifier)
  17. {
  18.         #define ITEM_H 21
  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;
  27.         list.SetSizes(2,2,_menu_width,list.count*ITEM_H,ITEM_H);
  28.  
  29.         menu_process_id = CreateThread(#_menu_thread,#stak+4092);
  30. }
  31.  
  32. :void _menu_thread()
  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.  
  58. :void _menu_draw_list()
  59. {
  60.         int N, bgcol;
  61.         for (N=0; N<menu.list.count; 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.         }
  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");
  68. }
  69.  
  70. :void _menu_item_click()
  71. {
  72.         menu.list.cur_y = menu.identifier + menu.list.cur_y;
  73.         KillProcess(menu_process_id);
  74. }
  75.  
  76. :void _menu_no_item_click()
  77. {
  78.         menu.list.cur_y = 0;
  79.         KillProcess(menu_process_id);
  80. }
  81.  
  82. #endif