int widget_memory_draw( void *data ) { int x, y; char pbuf[36]; widget_rectangle( LC(0), LR(0), 40 * 8, 16 * 8 + 4, 1 ); widget_rectangle( LC(0), LR(16) + 2, 320, 1, 7 ); for( y = 0; y < 16; ++y ) { libspectrum_word addr = memaddr + y * 8; sprintf( pbuf, "%04X:", addr ); widget_printstring_right( LC(5) - 4, LR(y), 5, pbuf ); for( x = 0; x < 8; ++x ) { libspectrum_byte b = readbyte_internal( addr + x ); widget_printchar_fixed( LC(x + 29) / 8, LR(y) / 8, 7 - (y & 1), b ); sprintf( pbuf + x * 3, "%02X ", b ); } widget_printstring_fixed( LC(5) / 8, LR(y) / 8, 7 - (y & 1), pbuf ); } widget_display_lines( LR(0) / 8, 17 ); return 0; }
void print_items( void ) { int i; char buffer[128]; size_t height = 24; int width = widget_calculate_menu_width(menu); int menu_left_edge_x = (DISPLAY_WIDTH_COLS/2-width/2)*8+1; for( i = 0; i < count; i++ ) { int colour; if( !menu[i+1].text[0] ) { height += 4; continue; } snprintf( buffer, sizeof (buffer), menu[i+1].text ); colour = menu[i+1].inactive ? WIDGET_COLOUR_DISABLED : WIDGET_COLOUR_FOREGROUND; if( i == highlight_line ) { widget_rectangle( menu_left_edge_x, height, width*8-2, 1*8, WIDGET_COLOUR_HIGHLIGHT ); } else { widget_rectangle( menu_left_edge_x, height, width*8-2, 1*8, WIDGET_COLOUR_BACKGROUND ); } widget_printstring( menu_left_edge_x+8, height, colour, buffer ); if( menu[i+1].submenu ) { widget_draw_submenu_arrow(DISPLAY_BORDER_ASPECT_WIDTH+menu_left_edge_x+ width*8-9, i*8+49, colour); } if( menu[i+1].detail ) { size_t detail_width = widget_stringwidth( menu[i+1].detail() ); int x = menu_left_edge_x + (width-1)*8 - detail_width - 2; widget_printstring( x, height, WIDGET_COLOUR_DISABLED, menu[i+1].detail() ); } height += 8; } widget_display_lines( 2, count + 2 ); }
static void widget_query_line_draw( int left_edge, int width, struct widget_query_entry *menu, const char *label ) { int colour = WIDGET_COLOUR_BACKGROUND; int y = (menu->index + num_message_lines) * 8 + 24; if( menu->index == highlight_line ) colour = WIDGET_COLOUR_HIGHLIGHT; widget_rectangle( left_edge*8+1, y, width*8-2, 1*8, colour ); widget_printstring( left_edge*8+8, y, WIDGET_COLOUR_FOREGROUND, menu->text ); widget_display_rasters( y, 8 ); }
static int widget_text_draw_text( void ) { int width; const char *tptr; widget_rectangle( 12, 28, 232, 8, WIDGET_COLOUR_BACKGROUND ); tptr = text - 1; do { width = widget_stringwidth (++tptr); } while (width > 28 * 8 - 4); if( tptr != text ) widget_rectangle( 14, 29, 1, 6, 5 ); widget_printstring( 16, 28, WIDGET_COLOUR_FOREGROUND, tptr ); widget_rectangle( 17 + width, 35, 4, 1, 5 ); widget_display_rasters( 28, 8 ); return 0; }
static void print_rom( int which ) { const char *setting; setting = *( settings_get_rom_setting( widget_settings, which + first_rom, is_peripheral ) ); while( widget_stringwidth( setting ) >= 232 - 68 ) ++setting; widget_rectangle( 68, which * 8 + 24, 232 - 68, 8, WIDGET_COLOUR_BACKGROUND ); widget_printstring (68, which * 8 + 24, WIDGET_COLOUR_FOREGROUND, setting ); widget_display_rasters( which * 8 + 24, 8 ); }
int widget_select_draw( void *data ) { int i; size_t width; int menu_left_edge_x; if( data ) { widget_select_t *ptr = data; title = ptr->title; options = ptr->options; count = ptr->count; result = &( ptr->result ); finish_all = ptr->finish_all; highlight_line = ptr->current; } width = widget_calculate_select_width( title ); menu_left_edge_x = DISPLAY_WIDTH_COLS/2-width/2; /* Blank the main display area */ widget_dialog_with_border( menu_left_edge_x, 2, width, count + 2 ); widget_printstring( menu_left_edge_x*8+2, 16, WIDGET_COLOUR_TITLE, title ); for( i = 0; i < count; i++ ) { if( i == highlight_line ) { widget_rectangle( menu_left_edge_x*8+1, i*8+24, width*8-2, 1*8, WIDGET_COLOUR_HIGHLIGHT ); } print_item( menu_left_edge_x, width, i, WIDGET_COLOUR_FOREGROUND ); } widget_display_lines( 2, count + 2 ); return 0; }
void widget_select_keyhandler( input_key key ) { int new_highlight_line = 0; int cursor_pressed = 0; size_t width = widget_calculate_select_width( title ); int menu_left_edge_x = DISPLAY_WIDTH_COLS/2-width/2; switch( key ) { #if 0 case INPUT_KEY_Resize: /* Fake keypress used on window resize */ widget_select_draw( NULL ); break; #endif case INPUT_KEY_Escape: case INPUT_JOYSTICK_FIRE_2: widget_end_widget( WIDGET_FINISHED_CANCEL ); return; case INPUT_KEY_Return: case INPUT_KEY_KP_Enter: case INPUT_JOYSTICK_FIRE_1: widget_end_widget( WIDGET_FINISHED_OK ); return; case INPUT_KEY_Up: case INPUT_KEY_7: case INPUT_JOYSTICK_UP: if ( highlight_line ) { new_highlight_line = highlight_line - 1; cursor_pressed = 1; } break; case INPUT_KEY_Down: case INPUT_KEY_6: case INPUT_JOYSTICK_DOWN: if ( highlight_line + 1 < (ptrdiff_t)count ) { new_highlight_line = highlight_line + 1; cursor_pressed = 1; } break; case INPUT_KEY_Home: if ( highlight_line ) { new_highlight_line = 0; cursor_pressed = 1; } break; case INPUT_KEY_End: if ( highlight_line + 2 < (ptrdiff_t)count ) { new_highlight_line = (ptrdiff_t)count - 1; cursor_pressed = 1; } break; default: /* Keep gcc happy */ break; } if( cursor_pressed || ( key >= INPUT_KEY_a && key <= INPUT_KEY_z && key - INPUT_KEY_a < (ptrdiff_t)count ) ) { /* Remove the old highlight */ widget_rectangle( menu_left_edge_x * 8 + 1, highlight_line * 8 + 24, width * 8 - 2, 1 * 8, WIDGET_COLOUR_BACKGROUND ); print_item( menu_left_edge_x, width, highlight_line, WIDGET_COLOUR_FOREGROUND ); /* draw the new one */ if( cursor_pressed ) { highlight_line = new_highlight_line; } else { highlight_line = key - INPUT_KEY_a; } widget_rectangle( menu_left_edge_x * 8 + 1, highlight_line * 8 + 24, width * 8 - 2, 1 * 8, WIDGET_COLOUR_HIGHLIGHT ); print_item( menu_left_edge_x, width, highlight_line, WIDGET_COLOUR_FOREGROUND ); widget_display_lines( 2, count + 2 ); } }