| |||||||
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.
| ||||||||||