Bez tytułu

z k4be, 5 lata temu, napisane w C, wyświetlone 374 razy.
URL https://pastebin.k4be.pl/view/88beca8f Udostępnij
Pobierz wklejkę lub Pokaż surowy tekst
  1. unsigned char menu(void){
  2.         struct menu_pos *pos;
  3.         unsigned char i;
  4.         unsigned int k;
  5.         struct menu_struct *curr;
  6.         unsigned char have_checkbox = 0;
  7.         unsigned char menu_offset = 0, max_offset = 0;
  8.  
  9.         curr = menu_get();
  10.        
  11.         max_offset = curr->num/9;
  12.  
  13.         for(i=0;i<curr->num;i++){
  14.                 if(curr->list[i].type == M_CHECKBOX){
  15.                         have_checkbox = 1;
  16.                         break;
  17.                 }
  18.         }
  19.  
  20.         if(!curr->notnew) GLCD_Clear(); //jak !ind to duże prawdopodobieństwo że to świeże menu
  21.  
  22.         curr->notnew = 1;
  23.  
  24.         while(curr->list[curr->ind].type == 0 && curr->ind < curr->num-1) curr->ind++; //type==0 czyli to tylko pozycja opisowa i nic w niej nie robimy
  25.  
  26.         tick = 1;
  27.        
  28.         for(;;){
  29.                 k = klawiatura();
  30.  
  31.                 if(!k && !get_tick()) continue; //wyświetl resztę menu tylko co 100 przejść funkcji, albo, gdy coś naciśnięto
  32.                
  33.                 wdt_reset();
  34.                
  35.                 cursor(4, 0); //wyświetlanie tytułu
  36.                 blackbg = 2;
  37.                 putchar(' ');
  38.                 puttext_P(curr->title);
  39.                 putchar(' ');
  40.                 blackbg = 0;
  41.  
  42.                 switch(k){ //naciśnięcia klaw. wspólne dla wszystkich pozycji
  43.                         case K_U:
  44.                                 do { //znajdź najbliższą type!=0 w górę
  45.                                         curr->ind--;
  46.                                         if(curr->ind<0) curr->ind=curr->num-1;
  47.                                 } while(!curr->list[curr->ind].type);
  48.                                 break;
  49.                         case K_D:
  50.                                 do { //... w dół
  51.                                         curr->ind++;
  52.                                         if(curr->ind >= curr->num) curr->ind = 0;
  53.                                  } while(!curr->list[curr->ind].type);
  54.                                 break;
  55.                         case K_ESC: menu_pop(); GLCD_Clear(); tick = 1; return 0;
  56.                 }
  57.                
  58.                 if(max_offset){
  59.                         if(curr->ind > menu_offset*9 + 8){ // nie mieścimy się, wychodzimy poza koniec ekranu
  60.                                 menu_offset++;
  61.                         }
  62.                         if(curr->ind < menu_offset*9){ // poza początek
  63.                                 menu_offset--;
  64.                         }
  65.                 }
  66.  
  67.                 /*cursor(0,8);
  68.                 disp_num(curr->ind); clearline();*/ // pokazuj numer bieżącej pozycji w wierszu 8
  69.  
  70.                 i = menu_offset * 9;
  71.                 pos = curr->list + menu_offset * 9;
  72.                 unsigned char max_i;
  73.                 if(menu_offset < max_offset){
  74.                         max_i = 9;
  75.                 } else {
  76.                         max_i = curr->num;
  77.                 }
  78.                 for(;i < max_i; i++){
  79.                         if(i==curr->ind) switch(k){ //naciśnięcia klaw. dla konkretnej pozycji
  80.                                 case K_L:
  81.                                         if(func_table[pos->type].ch_func){
  82.                                                 func_table[pos->type].ch_func(pos, 0);
  83.                                                 return 1;
  84.                                         }
  85.                                         break;
  86.                                 case K_R:
  87.                                         if(func_table[pos->type].ch_func){
  88.                                                 func_table[pos->type].ch_func(pos, 1);
  89.                                                 return 1;
  90.                                         }
  91.                                         break;
  92.                                 case K_OK:
  93.                                         if(func_table[pos->type].ok_func){
  94.                                                 func_table[pos->type].ok_func(pos);
  95.                                                 return 1;
  96.                                         }
  97.                                         break;
  98.                         }
  99.  
  100.                         unsigned char y_ind = i+1-menu_offset*9;
  101.                         cursor(0, y_ind);
  102.                         if(have_checkbox && pos->type != M_CHECKBOX){ putchar(' '); }
  103.                         if(func_table[pos->type].disp_func) func_table[pos->type].disp_func(pos, i==curr->ind); //funkcja wyświetlająca dla pozycji
  104.                         clear_to(X_MAX-1);
  105.                         if(menu_offset && y_ind == 1){
  106.                                 putchar('^');
  107.                         } else if(menu_offset < max_offset && y_ind == 9){
  108.                                 putchar('\x86');
  109.                         } else {
  110.                                 putchar(' ');
  111.                         }
  112.  
  113.                         pos++;
  114.                 }
  115.                 for(; i<menu_offset*9 + 9; i++){
  116.                         cursor(0, i+1-menu_offset*9);
  117.                         clearline();
  118.                 }
  119.         }
  120. }

odpowiedź "Bez tytułu"

Tutaj możesz odpowiedzieć na wklejkę z góry

captcha