Subversion Repositories Kolibri OS

Rev

Rev 7784 | Rev 7797 | 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. }
  101.  
  102. void main()
  103. {
  104.         proc_info Form;
  105.  
  106.         if (!param) die("'Menu component is for developers only' -I");
  107.  
  108.         GetMenuItems(#param);
  109.         GetMenuWidths();
  110.  
  111.         menu_w = max_name_len + max_hotkey_len + 23;
  112.         menu_h = GetSeparatorsCount() * SEP_H
  113.                 + calc(names.count - GetSeparatorsCount() * ITEM_H);
  114.  
  115.         menu1.count = names.count;
  116.         menu1.SetFont(6, 9, 0x80);
  117.         menu1.SetSizes(2,2, menu_w, menu_h, ITEM_H);
  118.         menu1.cur_y = -1;
  119.  
  120.         GetWindowPosition();
  121.  
  122.         SetEventMask(EVM_REDRAW + EVM_KEY + EVM_BUTTON + EVM_MOUSE);
  123.         loop() switch(WaitEvent())
  124.         {
  125.                 case evMouse:                  
  126.                         GetProcessInfo(#Form, SelfInfo);
  127.                         if (!CheckActiveProcess(Form.ID)) exit();
  128.                         mouse.get();
  129.                         if (menu1.MouseOver(mouse.x, mouse.y)) {
  130.                                 mouse.y = MoveMouseToHandleSeparators(mouse.y);
  131.                                 if (menu1.ProcessMouse(mouse.x, mouse.y)) draw_list();
  132.                                 if (mouse.lkm)&&(mouse.up) click();    
  133.                         }
  134.                         break;
  135.  
  136.                 case evKey:
  137.                         GetKeys();
  138.                         ProcessKeys();
  139.                         break;
  140.  
  141.                 case evReDraw:
  142.                         DefineAndDrawWindow(win_x, win_y, menu1.w+4, menu1.h+4, 0x01, 0, 0, 0x01fffFFF);
  143.                         system.color.get();
  144.                         Draw3DPopup(0,0,menu1.w+2,menu1.h+2);
  145.                         draw_list();
  146.         }
  147. }
  148.  
  149. void ProcessKeys()
  150. {
  151.         switch(key_scancode)
  152.         {
  153.                 case SCAN_CODE_ESC:
  154.                         exit();
  155.  
  156.                 case SCAN_CODE_ENTER:
  157.                         click();
  158.  
  159.                 case SCAN_CODE_DOWN:
  160.                         if (!menu1.KeyDown())
  161.                         || (menu1.count - menu1.cur_y - GetSeparatorsCount() -1 < 0) menu1.KeyHome();
  162.                         draw_list();
  163.                         break;
  164.  
  165.                 case SCAN_CODE_UP:
  166.                         if (!menu1.KeyUp()) menu1.KeyEnd();
  167.                         draw_list();
  168.                         break;
  169.  
  170.                 default:
  171.                         if (menu1.ProcessKey(key_scancode)) draw_list();
  172.         }
  173. }
  174.  
  175. void draw_list()
  176. {
  177.         int i, item_y=menu1.y, item_i=0;
  178.         dword name_color;
  179.         dword hotkey_color;
  180.  
  181.         static dword inactive_background_color;
  182.         static dword active_background_color;
  183.         static dword active_top_border_color;
  184.         static dword inactive_text_shadow_color;
  185.         static bool skin_dark;
  186.  
  187.         static bool colors_set;
  188.         if (!colors_set) {
  189.                 colors_set = true;
  190.                 inactive_background_color = MixColors(system.color.work, 0xFFFfff,230);
  191.                 active_background_color = MixColors(system.color.work_button, system.color.work,230);
  192.                 active_top_border_color = MixColors(system.color.work_graph, system.color.work_button,240);
  193.                 inactive_text_shadow_color = MixColors(system.color.work,0xFFFfff,120);
  194.                 skin_dark = skin_is_dark();
  195.         }
  196.  
  197.         for (i=0; i<menu1.count; i++;)
  198.         {
  199.                 if (streq(names.get(i), "-")) {
  200.                         DrawBar(menu1.x, item_y+0, menu1.w, 1, inactive_background_color);
  201.                         DrawBar(menu1.x, item_y+1, menu1.w, 1, system.color.work_dark);
  202.                         DrawBar(menu1.x, item_y+2, menu1.w, 1, system.color.work_light);
  203.                         DrawBar(menu1.x, item_y+3, menu1.w, 1, inactive_background_color);
  204.                         item_y += SEP_H;
  205.                 } else {
  206.                         if (item_i==menu1.cur_y) {
  207.                                 hotkey_color = name_color = system.color.work_button_text;
  208.                                 DrawBar(menu1.x, item_y+1,        menu1.w, ITEM_H-2, active_background_color);
  209.                                 DrawBar(menu1.x, item_y,          menu1.w, 1, active_top_border_color);
  210.                                 DrawBar(menu1.x, item_y+ITEM_H-1, menu1.w, 1, system.color.work_light);
  211.                         } else {
  212.                                 name_color = system.color.work_text;
  213.                                 hotkey_color = system.color.work_graph;
  214.                                 DrawBar(menu1.x, item_y, menu1.w, ITEM_H, inactive_background_color);
  215.                                 if (!skin_dark) WriteText(13+1, item_y + menu1.text_y +1, 0x80,
  216.                                         inactive_text_shadow_color, names.get(i));
  217.                         }
  218.                         WriteText(-strlen(hotkeys.get(i))*6 + 13 + max_name_len + max_hotkey_len,
  219.                                 item_y + menu1.text_y, 0x80, hotkey_color, hotkeys.get(i));
  220.                         WriteText(13, item_y + menu1.text_y, 0x80, name_color, names.get(i));
  221.                         item_y += ITEM_H;
  222.                         item_i++;              
  223.                 }
  224.         }
  225.         if (selected) WriteText(5, selected-1*ITEM_H + menu1.y + menu1.text_y, 0x80, 0xEE0000, "\x10");
  226. }
  227.  
  228. void click()
  229. {
  230.         ESDWORD[shared_mem] = menu1.cur_y + 1;
  231.         ExitProcess();
  232. }
  233.  
  234. void exit()
  235. {
  236.         ESDWORD[shared_mem] = 0;
  237.         ExitProcess();
  238. }
  239.