Subversion Repositories Kolibri OS

Rev

Rev 7779 | Rev 7781 | 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. #ifndef INCLUDE_LIST_BOX
  5. #include "../lib/list_box.h"
  6. #endif
  7.  
  8. :dword menu_process_id;
  9.  
  10. :struct _menu : llist
  11. {
  12.         dword appear_x, appear_y, text, identifier, selected;  
  13.         void show();
  14.         char stak[4096];
  15. } menu;
  16.  
  17. :void _menu::show(dword _appear_x, _appear_y, _menu_width, _menu_text, _identifier)
  18. {
  19.         #define ITEM_H 21
  20.         appear_x = _appear_x;
  21.         appear_y = _appear_y;
  22.         text = _menu_text;
  23.         identifier = _identifier;
  24.  
  25.         cur_y = -1;
  26.         ClearList();
  27.         count = chrnum(text, '\n')+1;
  28.         SetSizes(2,2,_menu_width,count*ITEM_H,ITEM_H);
  29.  
  30.         menu_process_id = CreateThread(#_menu_thread,#stak+4092);
  31. }
  32.  
  33. :void _menu_thread()
  34. {
  35.         MOUSE m;
  36.         DefineAndDrawWindow(menu.appear_x,menu.appear_y,menu.w+2,menu.h+4,0x01, 0, 0, 0x01fffFFF);
  37.         DrawPopup(0,0,menu.w,menu.h+3,0, 0xE4DFE1,0x9098B0);
  38.         _menu_draw_list();                             
  39.         SetEventMask(EVM_REDRAW + EVM_KEY + EVM_MOUSE + EVM_MOUSE_FILTER);
  40.         loop() switch(WaitEvent())
  41.         {
  42.                 case evMouse:
  43.                         m.get();
  44.                         if (menu.ProcessMouse(m.x, m.y)) _menu_draw_list();
  45.                         if (m.lkm)&&(m.up) _menu_item_click();
  46.                         break;         
  47.                 case evKey:
  48.                         GetKeys();
  49.                         if (key_scancode==SCAN_CODE_ESC) _menu_exit();
  50.                         if (key_scancode==SCAN_CODE_ENTER) _menu_item_click();
  51.                         if (menu.ProcessKey(key_scancode)) _menu_draw_list();
  52.                         break;
  53.                 case evReDraw:
  54.                         _menu_exit();
  55.         }
  56. }
  57.  
  58. :void _menu_draw_list()
  59. {
  60.         int N, bgcol;
  61.         for (N=0; N<menu.count; N++;)
  62.         {
  63.                 if (N==menu.cur_y) bgcol=0xFFFfff; else bgcol=0xE4DFE1;
  64.                 DrawBar(menu.x, N*menu.item_h+menu.y, menu.w-3, menu.item_h, bgcol);
  65.         }
  66.         WriteTextLines(13, menu.item_h-8/2+menu.y, 0x80, 0, menu.text, menu.item_h);
  67.         if (menu.selected) WriteText(5, menu.selected-1*menu.item_h+8, 0x80, 0xEE0000, "\x10");
  68. }
  69.  
  70. :void _menu_item_click()
  71. {
  72.         menu.cur_y = menu.identifier + menu.cur_y;
  73.         KillProcess(menu_process_id);
  74. }
  75.  
  76. :void _menu_exit()
  77. {
  78.         menu.cur_y = 0;
  79.         KillProcess(menu_process_id);
  80. }
  81.  
  82. #define MENU_ALIGN_TOP_LEFT  0
  83. #define MENU_ALIGN_TOP_RIGHT 1
  84. #define MENU_ALIGN_BOT_LEFT  2
  85. #define MENU_ALIGN_BOT_RIGHT 3
  86.  
  87. :dword shared_mem = NULL;
  88. :char shared_name[] = "LMENU";
  89. :void open_lmenu(dword _x, _y, _position, _selected, _text)
  90. {
  91.         if (!shared_mem) {
  92.                 shared_mem = memopen(#shared_name, 16, SHM_CREATE + SHM_WRITE);
  93.                 if (EDX) shared_mem = memopen(#shared_name, 16, SHM_WRITE);
  94.         }
  95.         ESDWORD[shared_mem     ] = _selected;
  96.         ESDWORD[shared_mem +  4] = _x;
  97.         ESDWORD[shared_mem +  8] = _y;
  98.         ESDWORD[shared_mem + 12] = _position;
  99.         menu_process_id = RunProgram("/sys/develop/menu", _text);
  100. }
  101.  
  102. :dword get_menu_click()
  103. {
  104.         if (menu_process_id) && (GetProcessSlot(menu_process_id)) {
  105.                 return NULL;
  106.         } else {
  107.                 menu_process_id = NULL;
  108.                 return ESDWORD[shared_mem];            
  109.         }
  110. }
  111.  
  112. #endif