function ncurses_show_screen($showHelp) { // basic settings ncurses_noecho(); ncurses_curs_set(0); // set app title $title = "Red Ventures Selenium Runner"; // commands to be listed in help $commands = array('q' => 'quit', 'r' => 'run selected tests', 'space' => 'toggle test selection', 'enter' => 'run highlighted tests', 'up' => 'move up', 'down' => 'move down', 'pgUp' => 'scroll description up', 'pgDown' => 'scroll description down', '?/h' => 'show this help panel'); // create a fullscreen window $fullscreen = ncurses_newwin(0, 0, 0, 0); ncurses_getmaxyx($fullscreen, $max_y, $max_x); // enter the main event loop $do_loop = 1; while ($do_loop) { // calculate width of help window columns $c = $t = 0; foreach ($commands as $cmd => $txt) { $c = strlen($cmd) > $c ? strlen($cmd) : $c; $t = strlen($txt) > $t ? strlen($txt) : $t; } $h = count($commands); // calculate the help windows height if ($showHelp) { if (!empty($helpWin)) { ncurses_delwin($helpWin); } $helpWin = ncurses_newwin($h + 4, $c + $t + 5, ($max_y - $h - 4) / 2, ($max_x - $c - $t - 5) / 2); ncurses_wborder($helpWin, 0, 0, 0, 0, 0, 0, 0, 0); $i = 0; foreach ($commands as $cmd => $txt) { ncurses_mvwaddstr($helpWin, 2 + $i, 2, $cmd); ncurses_mvwaddstr($helpWin, 2 + $i, 2 + $c + 1, $txt); } if (!empty($helpWin)) { ncurses_wrefresh($helpWin); } else { ncurses_refresh(); } } if (empty($helpWin)) { $key = ncurses_getch(); } else { $key = ncurses_wgetch($helpWin); } switch ($key) { case 27: ncurses_flushinp(); $do_loop = 0; break; default: $showHelp = $showHelp === true ? false : true; ncurses_show_screen($showHelp); } } }
function dialog($params) { ############################################################################################### if (empty($params) || !is_array($params)) { trigger_error('params must be non-empty array'); return NULL; } $message = isset($params['message']) ? $params['message'] : ''; $buttons = !empty($params['buttons']) && is_array($params['buttons']) ? $params['buttons'] : array('OK'); $n_buttons = count($buttons); for ($i = 0; $i < $n_buttons; $i++) { $buttons[$i] = ' ' . $buttons[$i] . ' '; } $parent_rows = isset($params['rows']) && $params['rows'] > 0 ? (int) $params['rows'] : 25; $parent_cols = isset($params['cols']) && $params['cols'] > 0 ? (int) $params['cols'] : 80; if (empty($message) || empty($buttons) || $parent_rows <= 0 || $parent_cols <= 0) { trigger_error('wrong params'); return NULL; } $message_lines = split("\n", $message); $message_width = 0; $n_message_lines = count($message_lines); for ($i = 0; $i < $n_message_lines; $i++) { $message_width = max(strlen($message_lines[$i]), $message_width); } $buttons_delim = ' '; $buttons_delim_len = strlen($buttons_delim); $buttons_len = strlen(implode($buttons_delim, $buttons)); $width = 4 + max($buttons_len + 2 * $buttons_delim_len, $message_width); $height = 4 + $n_message_lines; $dlg_y = $parent_rows > $height ? $parent_rows - $height >> 1 : 1; $dlg_x = $parent_cols > $width ? $parent_cols - $width >> 1 : 1; $window = ncurses_newwin($height, $width, $dlg_y, $dlg_x); if (empty($window)) { trigger_error('unable to create window'); return NULL; } ncurses_wborder($window, 0, 0, 0, 0, 0, 0, 0, 0); $i_x = 0; $i_y = 0; for ($i = 0; $i < $n_message_lines; $i++) { $i_y = 1 + $i; $i_x = 1 + ($width - 2 - strlen($message_lines[$i]) >> 1); ncurses_mvwaddstr($window, $i_y, $i_x, rtrim($message_lines[$i])); } $buttons_data = array(); $buttons_shift_x = 1 + ($width - 1 - $buttons_len >> 1); $buttons_shift_y = 2 + $n_message_lines; $i_title = ''; $i_x = $buttons_shift_x; for ($i = 0; $i < $n_buttons; $i++) { $i_title = $buttons[$i]; $buttons_data[] = array('x' => $i_x, 's' => $i_title); if (0 == $i) { ncurses_wattron($window, NCURSES_A_REVERSE); } ncurses_mvwaddstr($window, $buttons_shift_y, $i_x, $i_title); if (0 == $i) { ncurses_wattroff($window, NCURSES_A_REVERSE); } $i_x += strlen($i_title) + $buttons_delim_len; } ncurses_wrefresh($window); ncurses_keypad($window, TRUE); ncurses_curs_set(0); ncurses_noecho(); $result = -1; $do_loop = 1; $move = 0; $current = 0; while ($do_loop) { $key = ncurses_wgetch($window); $move = 0; switch ($key) { case NCURSES_KEY_LEFT: if ($current > 0) { $move = -1; } break; case NCURSES_KEY_RIGHT: if ($current < $n_buttons - 1) { $move = 1; } break; case XCURSES_KEY_LF: case XCURSES_KEY_CR: $result = $current; $do_loop = 0; break; case XCURSES_KEY_ESC: $do_loop = 0; break; } if (0 == $do_loop) { ncurses_flushinp(); } elseif ($move) { ncurses_mvwaddstr($window, $buttons_shift_y, $buttons_data[$current]['x'], $buttons_data[$current]['s']); $current += $move; ncurses_wattron($window, NCURSES_A_REVERSE); ncurses_mvwaddstr($window, $buttons_shift_y, $buttons_data[$current]['x'], $buttons_data[$current]['s']); ncurses_wattroff($window, NCURSES_A_REVERSE); ncurses_wrefresh($window); } } ncurses_delwin($window); return $result; }
function menu_select($params) { ################################################################################################### if (!is_array($params) || empty($params)) { trigger_error('wrong params'); return NULL; } $menu = isset($params['items']) ? $params['items'] : NULL; $rows = isset($params['rows']) ? (int) $params['rows'] : 0; $cols = isset($params['cols']) ? (int) $params['cols'] : 0; $selected = isset($params['selected']) ? (int) $params['selected'] : 0; $centered = empty($params['centered']) ? 0 : 1; $y_menu = isset($params['y']) ? (int) $params['y'] : 0; $x_menu = isset($params['x']) ? (int) $params['x'] : 0; if (!is_array($menu) || empty($menu) || $rows <= 0 || $cols <= 0 || $y_menu < 0 || $x_menu < 0) { trigger_error('wrong params'); return NULL; } $keys = array_keys($menu); $values = array(); $current = 0; $width = 0; $height = count($menu) + 2; foreach ($menu as $value) { $width = max($width, strlen($value)); } $i = 0; foreach ($menu as $k => $v) { $values[$i] = ' ' . $v . str_repeat(' ', 1 + $width - strlen($v)); if ($k == $selected) { $current = $i; } $i++; } $width += 4; if ($centered) { $y_menu = $rows - $height >> 1; $x_menu = $cols - $width >> 1; } $window = ncurses_newwin($height, $width, $y_menu, $x_menu); if (empty($window)) { trigger_error('unable to create window'); return NULL; } ncurses_wborder($window, 0, 0, 0, 0, 0, 0, 0, 0); for ($a = 0; $a < count($values); $a++) { if ($a == $current) { ncurses_wattron($window, NCURSES_A_REVERSE); } ncurses_mvwaddstr($window, 1 + $a, 1, $values[$a]); if ($a == $current) { ncurses_wattroff($window, NCURSES_A_REVERSE); } } ncurses_wrefresh($window); ncurses_keypad($window, TRUE); ncurses_curs_set(0); do { $key = ncurses_wgetch($window); $move = 0; switch ($key) { case NCURSES_KEY_UP: if ($current > 0) { $move = -1; } break; case NCURSES_KEY_DOWN: if ($current < count($values) - 1) { $move = 1; } break; case XCURSES_KEY_LF: case XCURSES_KEY_CR: $result = $keys[$current]; break; case XCURSES_KEY_ESC: ncurses_flushinp(); $result = ''; break; } if ($move) { ncurses_mvwaddstr($window, 1 + $current, 1, $values[$current]); $current += $move; ncurses_wattron($window, NCURSES_A_REVERSE); ncurses_mvwaddstr($window, 1 + $current, 1, $values[$current]); ncurses_wattroff($window, NCURSES_A_REVERSE); ncurses_wrefresh($window); } } while (!isset($result)); ncurses_delwin($window); return $result; }
function menu_check_list($params) { ############################################################################################### if (!is_array($params) || empty($params)) { trigger_error('wrong_params'); return NULL; } $menu = isset($params['items']) ? $params['items'] : NULL; $rows = isset($params['rows']) ? (int) $params['rows'] : 0; $cols = isset($params['cols']) ? (int) $params['cols'] : 0; $centered = empty($params['centered']) ? 0 : 1; $y_menu = isset($params['y']) ? (int) $params['y'] : 0; $x_menu = isset($params['x']) ? (int) $params['x'] : 0; if (!is_array($menu) || empty($menu) || $rows <= 0 || $cols <= 0 || $y_menu < 0 || $x_menu < 0) { trigger_error('wrong params'); return NULL; } $keys = array_keys($menu); $n_menu = count($keys); $items = array(); $checked = array(); $current = 0; $width = 0; $height = $n_menu + 2; $i = 0; $k = NULL; $i_checked = NULL; for ($i = 0; $i < $n_menu; $i++) { $k = $keys[$i]; $i_checked = isset($menu[$k][1]) && $menu[$k][1] == 1 ? 1 : 0; $items[$i] = ' [' . ($i_checked ? '*' : ' ') . '] ' . $menu[$k][0]; $width = max($width, strlen($items[$i])); $checked[$i] = $i_checked; } for ($i = 0; $i < $n_menu; $i++) { $items[$i] = $items[$i] . str_repeat(' ', 2 + $width - strlen($items[$i])); } $width += 4; if ($centered) { $r = $rows - $height >> 1; $c = $cols - $width >> 1; } $window = ncurses_newwin($height, $width, $r, $c); if (empty($window)) { trigger_error('unable to create window'); return NULL; } ncurses_wborder($window, 0, 0, 0, 0, 0, 0, 0, 0); $n_items = count($items); for ($i = 0; $i < $n_items; $i++) { if ($i == $current) { ncurses_wattron($window, NCURSES_A_REVERSE); } ncurses_mvwaddstr($window, 1 + $i, 1, $items[$i]); if ($i == $current) { ncurses_wattroff($window, NCURSES_A_REVERSE); } } ncurses_wrefresh($window); ncurses_keypad($window, TRUE); ncurses_noecho(); ncurses_curs_set(0); $do_loop = 1; $save_result = 0; while ($do_loop) { $key = ncurses_wgetch($window); $move = 0; switch ($key) { case NCURSES_KEY_UP: if ($current > 0) { $move = -1; } break; case NCURSES_KEY_DOWN: if ($current < $n_menu - 1) { $move = 1; } break; case XCURSES_KEY_LF: case XCURSES_KEY_CR: $do_loop = 0; $save_result = 1; break; case XCURSES_KEY_SPACE: if ($checked[$current]) { $checked[$current] = 0; $items[$current] = ' [ ] ' . substr($items[$current], 5); } else { $checked[$current] = 1; $items[$current] = ' [*] ' . substr($items[$current], 5); } ncurses_wattron($window, NCURSES_A_REVERSE); ncurses_mvwaddstr($window, 1 + $current, 1, $items[$current]); ncurses_wattroff($window, NCURSES_A_REVERSE); ncurses_wrefresh($window); break; case XCURSES_KEY_ESC: ncurses_flushinp(); $do_loop = 0; break; } if ($move) { ncurses_mvwaddstr($window, 1 + $current, 1, $items[$current]); $current += $move; ncurses_wattron($window, NCURSES_A_REVERSE); ncurses_mvwaddstr($window, 1 + $current, 1, $items[$current]); ncurses_wattroff($window, NCURSES_A_REVERSE); ncurses_wrefresh($window); } } ncurses_delwin($window); $result = NULL; if ($save_result) { for ($i = 0; $i < $n_menu; $i++) { $result[$keys[$i]] = $checked[$i]; } } return $result; }