Çok Değerli Menüler

O_ONEVALUE seçeneğini kapattığımızda ne olur diye merak ediyor olabilirsiniz. Bunun anlamı birden çok öğe seçebilirsiniz demektir. Bu da bizi REQ_TOGGLE_ITEM isteğine getirmektedir. Bir örnekle görelim:

Örnek 5.27. Çok Değerli Menü Örneği

#include <curses.h>
#include <menu.h>

#define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0]))
#define CTRLD   4

char *choices[] = {
  "Choice 1",
  "Choice 2",
  "Choice 3",
  "Choice 4",
  "Choice 5",
  "Choice 6",
  "Choice 7",
  "Exit",
};

int main()
{ ITEM **my_items;
  int c;
  MENU *my_menu;
  int n_choices, i;
  ITEM *cur_item;

  /* Curses kipini ilklendir */
  initscr();
  cbreak();
  noecho();
  keypad(stdscr, TRUE);

  /* Öğeleri ilklendir */
  n_choices = ARRAY_SIZE(choices);
  my_items = (ITEM **)calloc(n_choices + 1, sizeof(ITEM *));
  for(i = 0; i < n_choices; ++i)
    my_items[i] = new_item(choices[i], choices[i]);
  my_items[n_choices] = (ITEM *)NULL;

  my_menu = new_menu((ITEM **)my_items);

  /* Menüyü çok değerli yap */
  menu_opts_off(my_menu, O_ONEVALUE);

  mvprintw(LINES - 3, 0,
    "<SPACE>'i seçmek veya seçileni iptal için kullanın.");
  mvprintw(LINES - 2, 0,
    "<ENTER> 'ı o anki seçileni görmek için kullanın "
    "(Çıkmak için F1)");
  post_menu(my_menu);
  refresh();

  while((c = getch()) != KEY_F(1))
  { switch(c)
    { case KEY_DOWN:
        menu_driver(my_menu, REQ_DOWN_ITEM);
        break;
      case KEY_UP:
        menu_driver(my_menu, REQ_UP_ITEM);
        break;
      case ' ':
        menu_driver(my_menu, REQ_TOGGLE_ITEM);
        break;
      case 10:        /* Enter */
      { char temp[200];
        ITEM **items;

        items = menu_items(my_menu);
        temp[0] = '\0';
        for(i = 0; i < item_count(my_menu); ++i)
          if(item_value(items[i]) == TRUE)
          { strcat(temp, item_name(items[i]));
            strcat(temp, " ");
          }
        move(20, 0);
        clrtoeol();
        mvprintw(20, 0, temp);
        refresh();
      }
      break;
    }
  }

  free_item(my_items[0]);
  free_item(my_items[1]);
  free_menu(my_menu);
  endwin();
}

Vay canına, bir sürü yeni işlev daha. Teker teker her birini ele alalım. İlk olarak REQ_TOGGLE_ITEM ile başlayalım. Çok değerli bir menüde kullanıcı birden fazla öğe seçebilmeli veya seçimi iptal edebilmelidir. REQ_TOGGLE_ITEM isteği o anki seçimi değiştirir (etkinleştirme veya iptal etme). Bu durumda space tuşuna basıldığında REQ_TOGGLE_ITEM isteği menu_driver'a sonucu gerçekleştirmek için gönderilir.

İşte şimdi kullanıcı <ENTER>'a bastığında onun seçtiği öğeleri görürüz. Önce menü ile ilişiklendirilmiş öğeleri menu_items() işlevini kullanarak bulduk. Daha sonra öğenin seçili mi değil mi olduğunu anlamak için öğeler üzerinde gezindik. Eğer öğe seçiliyse item_value() işlevi TRUE döndürür. item_count() işlevi menüdeki öğe sayısını döndürür. Ayrıca öğe açıklamalarını item_description() ile alabilirsiniz.