Çok Sütunlu Menüler

Yukarıdaki örnekte set_menu_format() işlevini nasıl kullanacağınızı gördünüz. Sütun değişkeninin (3. değişken) ne yaptığından bahsetmedim. Aslında, eğer alt menünüz yeterince genişse bir satırda birden fazla öğe gösterimini seçebilirsiniz. Bu, sütun değişkenlerinde tanımlanabilir. İşleri daha basit hale getirmek için, aşağıdaki örnek öğeler için açıklamaları göstermemektedir.

Örnek 5.26. Çok Sütunlu 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",  "Choice 8",  "Choice 9",  "Choice 10",
  "Choice 11", "Choice 12", "Choice 13", "Choice 14", "Choice 15",
  "Choice 16", "Choice 17", "Choice 18", "Choice 19", "Choice 20",
  "Exit",
  (char *)NULL,
};

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

  /* Curses kipini ilklendir */
  initscr();
  start_color();
  cbreak();
  noecho();
  keypad(stdscr, TRUE);
  init_pair(1, COLOR_RED, COLOR_BLACK);
  init_pair(2, COLOR_CYAN, COLOR_BLACK);

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

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

  /* Menü seçeneğini açıklamayı göstermeyecek şekilde ayarla */
  menu_opts_off(my_menu, O_SHOWDESC);

  /* Menü ile ilişiklendirilecek pencereyi oluştur */
  my_menu_win = newwin(10, 70, 4, 4);
  keypad(my_menu_win, TRUE);

  /* Ana ve alt pencereyi oluştur */
  set_menu_win(my_menu, my_menu_win);
  set_menu_sub(my_menu, derwin(my_menu_win, 6, 68, 3, 1));
  set_menu_format(my_menu, 5, 3);
  set_menu_mark(my_menu, " * ");

  /* Ana pencere etrafında bir çerçeve çizer ve bir başlık yazar */
  box(my_menu_win, 0, 0);

  attron(COLOR_PAIR(2));
  mvprintw(LINES - 3, 0,
    "Menüyü kaydırmak için PageUp ve PageDown kullanın");
  mvprintw(LINES - 2, 0,
    "Hareket etmek için ok tuşlarını kullanın (Çıkmak için F1)");
  attroff(COLOR_PAIR(2));
  refresh();

  /* Ekranı yazdır */
  post_menu(my_menu);
  wrefresh(my_menu_win);

  while((c = wgetch(my_menu_win)) != 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 KEY_LEFT:
        menu_driver(my_menu, REQ_LEFT_ITEM);
        break;
      case KEY_RIGHT:
        menu_driver(my_menu, REQ_RIGHT_ITEM);
        break;
      case KEY_NPAGE:
        menu_driver(my_menu, REQ_SCR_DPAGE);
        break;
      case KEY_PPAGE:
        menu_driver(my_menu, REQ_SCR_UPAGE);
        break;
    }
    wrefresh(my_menu_win);
  }

  /* Ekrandan sil ve tahsis edilen belleği geri ver */
  unpost_menu(my_menu);
  free_menu(my_menu);
  for(i = 0; i < n_choices; ++i)
    free_item(my_items[i]);
  endwin();
}

set_menu_format() işlev çağrısına bakın. Olması gereken sütun sayısını 3 olarak tanımlar ve bu yüzden de her satırda 3 öğe gözükür. menu_opts_off() ile de menü açıklamalarını kapatmıştık. Menü seçeneklerini değiştirmek için set_menu_opts(), menu_opts_on() ve menu_opts() gibi birkaç işlev vardır. Aşağıdaki menü seçenekleri belirtilebilir.

    O_ONEVALUE
        Bu menü için sadece tek öğe seçilebilir.

    O_SHOWDESC
        Menü ekrana yazıldığıda öğe açıklamalarını göster.

    O_ROWMAJOR
        Menüyü satır-düzensel sırada göster.

    O_IGNORECASE
        Örüntü eşlemede büyük küçük harfe duyarsız ol.

    O_SHOWMATCH
        Örüntü eşleme sırasında imleci öğe isminin içerisine konumlandır.

    O_NONCYCLIC
       İmleci menünün sonundan başına (veya tersi) aktarma.

Öntanımlı olarak tüm seçenekler etkindir. Belli özellikleri menu_opts_on() ve menu_opts_off() işlevleri ile açıp kapatabilirsiniz. Aynı zamanda doğrudan, bazı özellikleri set_menu_opts() ile belirtebilirsiniz. Bu işleve parametre yukarıdaki sabitlerle VEYA'lanmış bir değer olmalıdır. menu_opts() işlevi menünün halihazırdaki seçeneklerini bulmak için kullanılabilir.