Menü Seçenekleri

Evet, şimdi artık menünüzde pekçok özellikler ile birtakım farklılıklar oluşturmak için can atıyorsunuzdur. Biliyorum. Renk istiyorsunuz!!! Metin kipinde çalışan şu dos oyunları gibi hoş menüler oluşturmak istiyorsunuz. set_menu_fore() ve set_menu_back() işlevleri seçili öğenin görünüm özelliklerini değiştirmek için kullanılır. İsimleri yanıltıcıdır. Hiçbir işe yaramayacak olan menünün ön ve arka fon renklerini değiştirmezler.

set_menu_grey() işlevi menüdeki seçilemez öğelerinin görünüm özelliklerini değiştirmek için kullanılır. Bu da bizi bir öğe için oldukça ilginç ve tekil olan O_SELECTABLE'a getirmektedir. Bunu item_opts_off() işlevi ile kapatabiliriz ve bundan sonra öğe seçilemez hale gelir. Bu durum şu hoş pencere menülerindeki gri öğe durumuna benzemektedir. Bütün bunları pratiğe bir örnekle dökelim.

Örnek 5.28. Menü Seçenekleri Örneği

#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();
  start_color();
  cbreak();
  noecho();
  keypad(stdscr, TRUE);
  init_pair(1, COLOR_RED, COLOR_BLACK);
  init_pair(2, COLOR_GREEN, COLOR_BLACK);
  init_pair(3, COLOR_MAGENTA, COLOR_BLACK);

  /* Öğ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;
  item_opts_off(my_items[3], O_SELECTABLE);
  item_opts_off(my_items[6], O_SELECTABLE);

  /* Menüyü oluştur */
  my_menu = new_menu((ITEM **)my_items);

  /* Menünün ön ve arka fon rengini ayarla */
  set_menu_fore(my_menu, COLOR_PAIR(1) | A_REVERSE);
  set_menu_back(my_menu, COLOR_PAIR(2));
  set_menu_grey(my_menu, COLOR_PAIR(3));

  /* Menüyü ekrana yaz */
  mvprintw(LINES - 3, 0,
    "Seçilen öğeyi görmek için <ENTER>'a basınd");
  mvprintw(LINES - 2, 0,
    "Hareket etmek için Yukarı ve Aşağı tuşlarını 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 10: /* Enter */
        move(20, 0);
        clrtoeol();
        mvprintw(20, 0, "Seçilen öğe : %s",
                 item_name(current_item(my_menu)));
        pos_menu_cursor(my_menu);
        break;
    }
  }
  unpost_menu(my_menu);
  for(i = 0; i < n_choices; ++i)
    free_item(my_items[i]);
  free_menu(my_menu);
  endwin();
}