Subversion Repositories Kolibri OS

Rev

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

  1. #define MEMSIZE 4096*40
  2.  
  3. #include "../lib/gui.h"
  4. #include "../lib/io.h"
  5. #include "../lib/collection.h"
  6. #include "../lib/list_box.h"
  7. #include "../lib/fs.h"
  8.  
  9. #define ITEM_H 19
  10. #define SEP_H 4
  11.  
  12. llist menu1;
  13. collection names;
  14. collection hotkeys;
  15.  
  16. int selected, win_x, win_y;
  17.  
  18. int max_name_len;
  19. int max_hotkey_len;
  20. int menu_w, menu_h;
  21.  
  22. void GetWindowPosition()
  23. {
  24.         int position;
  25.         shared_mem = memopen(#shared_name, 16, SHM_OPEN + SHM_WRITE);
  26.         selected = ESDWORD[shared_mem     ];
  27.         win_x    = ESDWORD[shared_mem +  4];
  28.         win_y    = ESDWORD[shared_mem +  8];
  29.         position = ESDWORD[shared_mem + 12];
  30.         if (position == MENU_ALIGN_TOP_RIGHT) win_x -= menu1.w;
  31.         if (position == MENU_ALIGN_BOT_LEFT) win_y -= menu1.h;
  32.         if (position == MENU_ALIGN_BOT_RIGHT) {
  33.                 win_x -= menu1.w;
  34.                 win_y -= menu1.h;
  35.         }
  36. }
  37.  
  38. void GetMenuWidths()
  39. {
  40.         int i;
  41.         for (i=0; i<names.count; i++) {
  42.                 max_name_len = math.max(max_name_len, strlen(names.get(i)));
  43.         }
  44.         for (i=0; i<hotkeys.count; i++) {
  45.                 max_hotkey_len = math.max(max_hotkey_len, strlen(hotkeys.get(i)));
  46.         }
  47.         max_name_len = max_name_len * 6;
  48.         max_hotkey_len *= 6;
  49.         if (max_hotkey_len) max_name_len += 12;
  50. }
  51.  
  52. void GetMenuItems(dword current_name)
  53. {
  54.         dword next_name = strchr(current_name, '\n');
  55.         dword hotkey = strchr(current_name, '|');
  56.  
  57.         ESBYTE[next_name] = '\0';
  58.  
  59.         if (hotkey) && (hotkey < next_name) {
  60.                 ESBYTE[hotkey] = '\0';
  61.         } else {
  62.                 if (hotkey) && (!next_name) {
  63.                         ESBYTE[hotkey] = '\0';
  64.                 } else {
  65.                         hotkey = " ";
  66.                 }
  67.         }
  68.  
  69.         hotkeys.add(hotkey+1);
  70.         names.add(current_name);
  71.  
  72.         if (next_name) GetMenuItems(next_name+2);
  73. }
  74.  
  75. int GetSeparatorsCount()
  76. {
  77.         int i, count=0;
  78.         for (i=0; i<names.count; i++) {
  79.                 if (streq(names.get(i), "-")) count++;
  80.         }
  81.         return count;
  82. }
  83.  
  84. int MoveMouseToHandleSeparators(int _mouse_y)
  85. {
  86.         int i, item_y=menu1.y;
  87.         int item_i=0;
  88.         for (i=0; i<menu1.count; i++;)
  89.         {
  90.                 if (streq(names.get(i), "-")) {
  91.                         item_y += SEP_H;
  92.                 } else {
  93.                         item_y += ITEM_H;
  94.                         item_i++;
  95.                 }
  96.                 if (_mouse_y >= item_y) && (_mouse_y < item_y + ITEM_H) {
  97.                         return item_i * ITEM_H + menu1.y;
  98.                 }
  99.         }
  100.         return _mouse_y;
  101. }
  102.  
  103. void main()
  104. {
  105.         proc_info Form;
  106.  
  107.         if (!param) die("'Menu component is for developers only' -I");
  108.  
  109.         GetMenuItems(#param);
  110.         GetMenuWidths();
  111.  
  112.         menu_w = max_name_len + max_hotkey_len + 23;
  113.         menu_h = GetSeparatorsCount() * SEP_H
  114.                 + calc(names.count - GetSeparatorsCount() * ITEM_H);
  115.  
  116.         menu1.count = names.count;
  117.         menu1.SetFont(6, 9, 0x80);
  118.         menu1.SetSizes(2,2, menu_w, menu_h, ITEM_H);
  119.         menu1.cur_y = -1;
  120.  
  121.         GetWindowPosition();
  122.  
  123.         SetEventMask(EVM_REDRAW + EVM_KEY + EVM_BUTTON + EVM_MOUSE);
  124.         loop() switch(WaitEvent())
  125.         {
  126.                 case evMouse:                  
  127.                         GetProcessInfo(#Form, SelfInfo);
  128.                         if (!CheckActiveProcess(Form.ID)) exit();
  129.                         mouse.get();
  130.                         if (menu1.MouseOver(mouse.x, mouse.y)) {
  131.                                 mouse.y = MoveMouseToHandleSeparators(mouse.y);
  132.                                 if (menu1.ProcessMouse(mouse.x, mouse.y)) draw_list();
  133.                                 if (mouse.lkm)&&(mouse.up) click();    
  134.                         }
  135.                         break;
  136.  
  137.                 case evKey:
  138.                         GetKeys();
  139.                         ProcessKeys();
  140.                         break;
  141.  
  142.                 case evReDraw:
  143.                         DefineAndDrawWindow(win_x, win_y, menu1.w+4, menu1.h+4, 0x01, 0, 0, 0x01fffFFF);
  144.                         system.color.get();
  145.                         Draw3DPopup(0,0,menu1.w+2,menu1.h+2);
  146.                         draw_list();
  147.         }
  148. }
  149.  
  150. void ProcessKeys()
  151. {
  152.         switch(key_scancode)
  153.         {
  154.                 case SCAN_CODE_ESC:
  155.                         exit();
  156.  
  157.                 case SCAN_CODE_ENTER:
  158.                         click();
  159.  
  160.                 case SCAN_CODE_DOWN:
  161.                         if (!menu1.KeyDown())
  162.                         || (menu1.count - menu1.cur_y - GetSeparatorsCount() -1 < 0) menu1.KeyHome();
  163.                         draw_list();
  164.                         break;
  165.  
  166.                 case SCAN_CODE_UP:
  167.                         if (!menu1.KeyUp()) menu1.KeyEnd();
  168.                         draw_list();
  169.                         break;
  170.  
  171.                 default:
  172.                         if (menu1.ProcessKey(key_scancode)) draw_list();
  173.         }
  174. }
  175.  
  176. void draw_list()
  177. {
  178.         int i, item_y=menu1.y, item_i=0;
  179.         dword name_color;
  180.         dword hotkey_color;
  181.  
  182.         static dword inactive_background_color;
  183.         static dword active_background_color;
  184.         static dword active_top_border_color;
  185.         static dword inactive_text_shadow_color;
  186.         static bool skin_dark;
  187.  
  188.         static bool colors_set;
  189.         if (!colors_set) {
  190.                 colors_set = true;
  191.                 inactive_background_color = MixColors(system.color.work, 0xFFFfff,230);
  192.                 active_background_color = MixColors(system.color.work_button, system.color.work,230);
  193.                 active_top_border_color = MixColors(system.color.work_graph, system.color.work_button,240);
  194.                 inactive_text_shadow_color = MixColors(system.color.work,0xFFFfff,120);
  195.                 skin_dark = skin_is_dark();
  196.         }
  197.  
  198.         for (i=0; i<menu1.count; i++;)
  199.         {
  200.                 if (streq(names.get(i), "-")) {
  201.                         DrawBar(menu1.x, item_y+0, menu1.w, 1, inactive_background_color);
  202.                         DrawBar(menu1.x, item_y+1, menu1.w, 1, system.color.work_dark);
  203.                         DrawBar(menu1.x, item_y+2, menu1.w, 1, system.color.work_light);
  204.                         DrawBar(menu1.x, item_y+3, menu1.w, 1, inactive_background_color);
  205.                         item_y += SEP_H;
  206.                 } else {
  207.                         if (item_i==menu1.cur_y) {
  208.                                 hotkey_color = name_color = system.color.work_button_text;
  209.                                 DrawBar(menu1.x, item_y+1,        menu1.w, ITEM_H-2, active_background_color);
  210.                                 DrawBar(menu1.x, item_y,          menu1.w, 1, active_top_border_color);
  211.                                 DrawBar(menu1.x, item_y+ITEM_H-1, menu1.w, 1, system.color.work_light);
  212.                         } else {
  213.                                 name_color = system.color.work_text;
  214.                                 hotkey_color = system.color.work_graph;
  215.                                 DrawBar(menu1.x, item_y, menu1.w, ITEM_H, inactive_background_color);
  216.                                 if (!skin_dark) WriteText(13+1, item_y + menu1.text_y +1, 0x80,
  217.                                         inactive_text_shadow_color, names.get(i));
  218.                         }
  219.                         WriteText(-strlen(hotkeys.get(i))*6 + 13 + max_name_len + max_hotkey_len,
  220.                                 item_y + menu1.text_y, 0x80, hotkey_color, hotkeys.get(i));
  221.                         WriteText(13, item_y + menu1.text_y, 0x80, name_color, names.get(i));
  222.                         item_y += ITEM_H;
  223.                         item_i++;              
  224.                 }
  225.         }
  226.         if (selected) WriteText(5, selected-1*ITEM_H + menu1.y + menu1.text_y, 0x80, 0xEE0000, "\x10");
  227. }
  228.  
  229. void click()
  230. {
  231.         ESDWORD[shared_mem] = menu1.cur_y + 1;
  232.         ExitProcess();
  233. }
  234.  
  235. void exit()
  236. {
  237.         ESDWORD[shared_mem] = 0;
  238.         ExitProcess();
  239. }
  240.