/* Terminality - a portable terminal handling library * Copyright (C) 1998-2002, Emil Mikulic. * This is LGPL - look at COPYING.LIB */ /* Project: Terminality/GUI * File: hmenu.cpp * Author: Michal Safranek * Description: Implement the hmenuitem and hmenu classes */ #include const char hmenu_rcsid[] = "$Id: hmenu.cpp,v 1.11 2002/07/26 01:39:40 darkmoon Exp $"; // Initialise menuItem hMenuItem::hMenuItem(char *n, int xx, int i) { name = (char *)xmalloc(strlen(n)+1); strcpy(name, n); id = i; x = xx; }; // Destroy menuItem hMenuItem::~hMenuItem() { xfree(name); }; // Initialise menu list hMenu::hMenu(hMenuItem *i, ...) { va_list va; hMenuItem *curr; int auto_magic = 1; current = 0; active=false; item = NULL; visible = fixed_colors = false; // colors BACKGROUND = COLOR_HMENU_BG; ITEM_BG = COLOR_HMENU_ITEMBG; SELECTED_ITEM_BG = COLOR_HMENU_SITEMBG; ITEM = COLOR_HMENU_ITEM; SELECTED_ITEM = COLOR_HMENU_SITEM; // go through list va_start(va, i); curr = i; // as long as the item isn't a NULL while (curr) { if (!curr->x) curr->x = auto_magic; auto_magic += strlen(curr->name) + 1; // add to queue if (!item) item = tn_list_new((void*)curr); else tn_list_add(item, (void*)curr); // get next item curr = va_arg(va, hMenuItem*); } va_end(va); // get list size count = tn_list_size(item); // make up y coords y = 1; reg_id = register_add(Hmenu, this); } // destroy menu list hMenu::~hMenu() { // first kill all hMenuItems hMenuItem *tmp; for (int i=0; ix; } else setcolor(ITEM,ITEM_BG); gotoxy(tmp->x,y); printw(tmp->name); } if (x) gotoxy(x,y); } // get choice and return menuitem id // returns -1 on abort (ESC) int hMenu::getchoice(void) { key k; hMenuItem *temp; cursor cs = get_cursor(); bool old_vis = visible; visible = true; set_cursor(none); active=true; while(1) { draw(); // draw menu update(); k = readkey(); // read key k = keyhandler(k, Hmenu); k = handle_key(k, Hmenu, this); switch(k) { // handle keypress case KEY_NOTHING: break; case KEY_LEFT: if (current) current--; else current = count - 1; break; case KEY_TAB: case KEY_RIGHT: if (currentid != -1) { active=false; set_cursor(cs); visible = old_vis; return temp->id; } break; case KEY_ESC: active = false; visible = old_vis; set_cursor(cs); return -1; break; default: beep(); } } } // Change color scheme void hMenu::change_scheme(void) { if (fixed_colors) return; BACKGROUND = COLOR_HMENU_BG; ITEM_BG = COLOR_HMENU_ITEMBG; SELECTED_ITEM_BG = COLOR_HMENU_SITEMBG; ITEM = COLOR_HMENU_ITEM; SELECTED_ITEM = COLOR_HMENU_SITEM; }