static void draw_mark_filter(void) { int screen_x=0; int screen_y=0; // display the Mark filter title glColor3f(1.0f,1.0f,0.0f); screen_x = 25 - 1.5*strlen(label_mark_filter); screen_y = 150 + 22; draw_string_zoomed(screen_x, screen_y, (unsigned char*)label_mark_filter, 1, 0.3); // if filtering marks, display the label and the current filter text if (mark_filter_active) { char * show_mark_filter_text; int max_show_len = 15; if (strlen(mark_filter_text) > max_show_len) show_mark_filter_text = &mark_filter_text[strlen(mark_filter_text)-max_show_len]; else if (strlen(mark_filter_text) == 0) show_mark_filter_text = "_"; else show_mark_filter_text = mark_filter_text; screen_x = 25 - 1.5*strlen(show_mark_filter_text); screen_y = 150 + 29; draw_string_zoomed(screen_x, screen_y, (unsigned char*)show_mark_filter_text, 1, 0.3); } // display which key to activate the filter else { char buf[20]; get_key_string(K_MARKFILTER, buf, sizeof(buf)); draw_string_zoomed(25 - 1.5*strlen(buf), 150 + 29, (const unsigned char *)buf, 1, 0.3); } }
void display_page(book * b, page * p) { char ** l; int i; char str[20]; if(!p) return; set_font(2); if(p->image) { display_image(p->image); } for(i=0, l=p->lines; *l; i++,l++){ glColor3f(0.34f,0.25f, 0.16f); draw_string_zoomed(10,i*18*0.9f,(unsigned char*)*l,0,1.0f); } glColor3f(0.385f,0.285f, 0.19f); safe_snprintf(str,sizeof(str),"%d",p->page_no); if(b->type==1) draw_string_zoomed(140,b->max_lines*18*0.9f+2,(unsigned char*)str,0,1.0); else if(b->type==2) draw_string_zoomed(110,b->max_lines*18*0.9f+2,(unsigned char*)str,0,1.0); set_font(0); }
int draw_string_shadowed_zoomed (int x, int y, const unsigned char * our_string, int max_lines, float fr,float fg,float fb, float br,float bg,float bb, float zoom) { int px,py,r; //set shadow colour glColor3f(br, bg, bb); for(px=-1;px<2;px++) for(py=-1;py<2;py++) if(px!=0 || py!=0) r=draw_string_zoomed(x+px, y+py, our_string, max_lines, zoom); //set foreground colour glColor3f(fr, fg, fb); r=draw_string_zoomed(x, y, our_string, max_lines, zoom); return r; }
int draw_string_shadowed_width (int x, int y, const unsigned char * our_string, int max_width, int max_lines, float fr,float fg,float fb, float br,float bg,float bb) { int px,py,r; float zoom = ((float)max_width*12.0)/((float)get_string_width(our_string)*DEFAULT_FONT_X_LEN); //set shadow colour glColor3f(br, bg, bb); for(px=-1;px<2;px++) for(py=-1;py<2;py++) if(px!=0 || py!=0) r=draw_string_zoomed(x+px, y+py, our_string, max_lines, zoom); //set foreground colour glColor3f(fr, fg, fb); r=draw_string_zoomed(x, y, our_string, max_lines, zoom); return r; }
static void draw_recipe_controls(window_info *win){ int wpx=pipeline_x + SLOT_SIZE*NUM_MIX_SLOTS; int wpy=manufacture_menu_y_len-recipe_y_offset; int lpx=PIPE_CONTROL_X; int lpy=SLOT_SIZE; if (recipes_shown){ /* Up arrow */ glBegin(GL_QUADS); glVertex3i(wpx+lpx/2, wpy+lpy-control_elem_size*2, 0); //top glVertex3i(wpx+control_elem_size, wpy+lpy, 0); //left glVertex3i(wpx+lpx-control_elem_size, wpy+lpy, 0); //right glVertex3i(wpx+lpx/2, wpy+lpy-control_elem_size*2, 0); //top glEnd(); } else { /* Dn arrow */ glBegin(GL_QUADS); glVertex3i(wpx+lpx/2, wpy+lpy, 0); //top glVertex3i(wpx+control_elem_size, wpy+lpy-control_elem_size*2, 0); //left glVertex3i(wpx+lpx-control_elem_size, wpy+lpy-control_elem_size*2, 0); //right glVertex3i(wpx+lpx/2, wpy+lpy, 0); //top glEnd(); } /* Add btn */ glEnable(GL_TEXTURE_2D); draw_string_zoomed(wpx+win->small_font_len_x/2, wpy-2, (unsigned char *)"+", 1, win->current_scale); }
void draw_recipe_controls(){ int wpx=33*6+2; int wpy=manufacture_menu_y_len-37; int lpx=18; int lpy=33; if (recipes_shown){ /* Up arrow */ glBegin(GL_QUADS); glVertex3i(wpx+lpx/2, wpy+lpy-10, 0); //top glVertex3i(wpx+5, wpy+lpy, 0); //left glVertex3i(wpx+lpx-5, wpy+lpy, 0); //right glVertex3i(wpx+lpx/2, wpy+lpy-10, 0); //top glEnd(); } else { /* Dn arrow */ glBegin(GL_QUADS); glVertex3i(wpx+lpx/2, wpy+lpy, 0); //top glVertex3i(wpx+5, wpy+lpy-10, 0); //left glVertex3i(wpx+lpx-5, wpy+lpy-10, 0); //right glVertex3i(wpx+lpx/2, wpy+lpy, 0); //top glEnd(); } /* Add btn */ glEnable(GL_TEXTURE_2D); draw_string_zoomed(wpx+3, wpy-2, (unsigned char *)"+", 1, 1); }
void draw_coordinates(int the_tile_map_size_x, int the_tile_map_size_y) { int screen_x=0; int screen_y=0; int map_x, map_y; // draw coordinates if (pf_get_mouse_position_extended(mouse_x, mouse_y, &map_x, &map_y, the_tile_map_size_x, the_tile_map_size_y)) { // we're pointing on the map, display position char buf[10]; safe_snprintf(buf, sizeof(buf), "%d,%d", map_x, map_y); glColor3f(1.0f,1.0f,0.0f); screen_x = 25 - 1.5*strlen(buf); screen_y = 150 + 8; draw_string_zoomed(screen_x, screen_y, (unsigned char*)buf, 1, 0.3); screen_x = 25 - 1.5*strlen(label_cursor_coords); screen_y = 150 + 1; draw_string_zoomed(screen_x, screen_y, (unsigned char*)label_cursor_coords, 1, 0.3); } }
static void draw_update_interface (window_info *win) { char str[200]; float window_ratio = (float) win->len_y / 480.0f; draw_string_zoomed ((win->len_x - (strlen(update_complete_str) * win->default_font_len_x)) / 2, 200 * window_ratio, (unsigned char*)update_complete_str, 0, win->current_scale); /* Possibly use this box to display the list of files updated? glDisable(GL_TEXTURE_2D); glColor3f(0.77f,0.57f,0.39f); glBegin(GL_LINES); glVertex3i(diff + 30 * window_ratio, 50 * window_ratio, 0); glVertex3i(len_x - (diff + 30 * window_ratio) - 20, 50 * window_ratio, 0); glVertex3i(diff + 30 * window_ratio, 50 * window_ratio, 0); glVertex3i(diff + 30 * window_ratio, 370 * window_ratio, 0); glVertex3i(diff + 30 * window_ratio, 370 * window_ratio, 0); glVertex3i(len_x - (diff + 30 * window_ratio) - 20, 370 * window_ratio, 0); glEnd(); glEnable(GL_TEXTURE_2D); */ if (update_countdown != 0) { safe_snprintf (str, sizeof(str), client_restart_countdown_str, update_countdown); } else { safe_strncpy (str, client_restarting_str, sizeof(str)); exit_now = 1; } draw_string_zoomed ((win->len_x - (strlen (str) * win->default_font_len_x)) / 2, win->len_y - (200 * window_ratio), (unsigned char*)str, 0, win->current_scale); glDisable (GL_ALPHA_TEST); #ifdef OPENGL_TRACE CHECK_GL_ERRORS(); #endif //OPENGL_TRACE }
int display_buddy_handler(window_info *win) { int i=0,x=2,y=2; glEnable(GL_TEXTURE_2D); // Draw budies qsort(buddy_list,MAX_BUDDY,sizeof(_buddy),compare2); for(i=vscrollbar_get_pos(buddy_win,12);i<(vscrollbar_get_pos(buddy_win,12)+19);i++){ switch(buddy_list[i].type){ case 0:glColor3f(1.0,1.0,1.0);break; case 1:glColor3f(1.0,0,0);break; case 2:glColor3f(0,1.0,0);break; case 3:glColor3f(0,0,1.0);break; case 4:glColor3f(1.0,1.0,0);break; } draw_string_zoomed(x,y,buddy_list[i].name,1,0.7); y+=10; } return 1; }
static void draw_marks(marking *the_marks, int the_max_mark, int the_tile_map_size_x, int the_tile_map_size_y) { size_t i; int screen_x=0; int screen_y=0; // crave the markings for(i=0;i<the_max_mark;i++) { int x = the_marks[i].x; int y = the_marks[i].y; if ( x > 0 ) { // if filtering marks, don't display if it doesn't match the current filter if (mark_filter_active && (get_string_occurance(mark_filter_text, the_marks[i].text, strlen(the_marks[i].text), 1) == -1)) continue; screen_x=(51+200*x/(the_tile_map_size_x*6)); screen_y=201-200*y/(the_tile_map_size_y*6); if(!the_marks[i].server_side) glColor3f((float)the_marks[i].r/255,(float)the_marks[i].g/255,(float)the_marks[i].b/255);//glColor3f(0.4f,1.0f,0.0f); else glColor3f(0.33f,0.6f,1.0f); glDisable(GL_TEXTURE_2D); glBegin(GL_LINES); glVertex2i(screen_x-9*mapmark_zoom,screen_y-9*mapmark_zoom); glVertex2i(screen_x+6*mapmark_zoom,screen_y+6*mapmark_zoom); glVertex2i(screen_x+6*mapmark_zoom,screen_y-9*mapmark_zoom); glVertex2i(screen_x-9*mapmark_zoom,screen_y+6*mapmark_zoom); glEnd(); glEnable(GL_TEXTURE_2D); if(!the_marks[i].server_side) glColor3f((float)the_marks[i].r/255,(float)the_marks[i].g/255,(float)the_marks[i].b/255);//glColor3f(0.2f,1.0f,0.0f); else glColor3f(0.33f,0.6f,1.0f); draw_string_zoomed(screen_x, screen_y, (unsigned char*)the_marks[i].text, 1, mapmark_zoom); } } }
// Display the main window. All the players achievemnt icons and the controls. // Handle the mouse over events for the icons and the controls. // int Achievements_Window::display_handler(window_info *win) { Achievements_System *as = Achievements_System::get_instance(); int icon_per = (256 / as->get_size()); int icon_per_texture = icon_per * icon_per; bool another_page = false; glEnable(GL_TEXTURE_2D); glColor3f(1.0f,1.0f,1.0f); for (size_t i=first; i<their_achievements.size(); ++i) { size_t shown_num = i-first; if ((static_cast<int>(shown_num)/as->get_per_row()) >= physical_rows) { another_page = true; break; } int texture = -1; const Achievement * achievement = as->achievement(their_achievements[i]); if (achievement) texture = as->texture(achievement->get_id() / icon_per_texture); if (texture >= 0) { int cur_item = achievement->get_id() % icon_per_texture; float u_start = 1.0f/static_cast<float>(icon_per) * (cur_item % icon_per); float u_end = u_start + static_cast<float>(as->get_size())/256; float v_start = 1.0f/static_cast<float>(icon_per) * (cur_item / icon_per); float v_end = v_start + static_cast<float>(as->get_size()) / 256; int start_x = as->get_border() + as->get_display() * (shown_num % as->get_per_row()); int start_y = as->get_border() + as->get_display() * (shown_num / as->get_per_row()); bind_texture(texture); glEnable(GL_ALPHA_TEST); glAlphaFunc(GL_GREATER, 0.05f); glBegin(GL_QUADS); draw_2d_thing( u_start, v_start, u_end, v_end, start_x, start_y, start_x+as->get_display(), start_y+as->get_display() ); glEnd(); glDisable(GL_ALPHA_TEST); } else { int pos_x = as->get_border() + (shown_num % as->get_per_row()) * as->get_display() + (as->get_display() - win->default_font_len_x) / 2; int pos_y = as->get_border() + (shown_num / as->get_per_row()) * as->get_display() + (as->get_display() - win->default_font_len_y) / 2; draw_string_zoomed(pos_x+gx_adjust, pos_y+gy_adjust, (const unsigned char *)"?", 1, win->current_scale); } } size_t now_over = Achievement::npos; if ((cm_window_shown() == CM_INIT_VALUE) && (win_mouse_x > as->get_border()) && (win_mouse_y > as->get_border())) { int row = (win_mouse_y - as->get_border()) / as->get_display(); int col = (win_mouse_x - as->get_border()) / as->get_display(); if ((row >= 0) && (row < physical_rows) && (col >= 0) && (col < as->get_per_row())) { size_t current_index = first + row * as->get_per_row() + col; if (current_index < their_achievements.size()) now_over = their_achievements[current_index]; } } if (now_over != last_over) { if (last_over != Achievement::npos) hide_window(child_win_id); last_over = now_over; if (last_over != Achievement::npos) open_child(); } int prev_start = gx_adjust + as->get_border(); int prev_end = prev_start + as->get_font_x() * as->get_prev().size(); int next_start = prev_end + 2 * as->get_border(); int next_end = next_start + as->get_font_x() * as->get_next().size(); int close_start = gx_adjust + win->len_x - (as->get_border() + as->get_font_x() * as->get_close().size()); int close_end = gx_adjust + win->len_x - as->get_border(); bool over_controls = (win_mouse_y > (win->len_y - (as->get_font_y() + as->get_border()))); bool over_close = (over_controls && (win_mouse_x > close_start) && (win_mouse_x < close_end)); bool over_prev = (over_controls && (win_mouse_x > prev_start) && (win_mouse_x < prev_end)); bool over_next = (over_controls && (win_mouse_x > next_start) && (win_mouse_x < next_end)); float active_colour[3] = { 1.0f, 1.0f, 1.0f }; float inactive_colour[3] = { 0.5f, 0.5f, 0.5f }; float mouse_over_colour[3] = { 1.0f, 0.5f, 0.0f }; glColor3fv((first) ?((over_prev) ?mouse_over_colour :active_colour) :inactive_colour); draw_string_small_zoomed(prev_start, gy_adjust + win->len_y - (as->get_font_y() + as->get_border()), reinterpret_cast<const unsigned char *>(as->get_prev().c_str()), 1, as->get_current_scale()); glColor3fv((another_page) ?((over_next) ?mouse_over_colour :active_colour) :inactive_colour); draw_string_small_zoomed(next_start, gy_adjust + win->len_y - (as->get_font_y() + as->get_border()), reinterpret_cast<const unsigned char *>(as->get_next().c_str()), 1, as->get_current_scale()); glColor3fv((over_close) ?mouse_over_colour :active_colour); draw_string_small_zoomed(close_start, gy_adjust + win->len_y - (as->get_font_y() + as->get_border()), reinterpret_cast<const unsigned char *>(as->get_close().c_str()), 1, as->get_current_scale()); if (over_close && ctrl_clicked) as->hide_all(); if (over_close && clicked) hide_window(main_win_id); else if (over_prev && first && clicked) first -= physical_rows * as->get_per_row(); else if (over_next && another_page && clicked) first += physical_rows * as->get_per_row(); if (clicked && (over_prev || over_next)) do_click_sound(); if ((ctrl_clicked || clicked) && over_close) do_window_close_sound(); if (over_controls && show_help_text) { if (over_close) show_help(as->get_close_help(), 0, win->len_y + as->get_y_win_offset(), win->current_scale); else if (over_prev) show_help((first)?as->get_prev_help() :as->get_no_prev_help(), 0, win->len_y + as->get_y_win_offset(), win->current_scale); else if (over_next) show_help((another_page)?as->get_next_help() :as->get_no_next_help(), 0, win->len_y + as->get_y_win_offset(), win->current_scale); } win_mouse_x = win_mouse_y = -1; ctrl_clicked = clicked = false; return 1; }
void draw_game_map (int map, int mouse_mini) { int screen_x=0; int screen_y=0; int x=-1,y=-1; float x_size=0,y_size=0; GLuint map_small, map_large; actor *me; static int fallback_text = -1; // if we don't have a continent texture (instance may be), fallback to blank paper if (cont_text < 0) { if (fallback_text < 0) #ifdef NEW_TEXTURES { fallback_text = load_texture_cached("./textures/paper1", tt_gui); } #else /* NEW_TEXTURES */ fallback_text = load_texture_cache ("./textures/paper1.bmp", 0); #endif /* NEW_TEXTURES */ cont_text = fallback_text; } if(map){ #ifdef NEW_TEXTURES map_small = cont_text; #else /* NEW_TEXTURES */ map_small=get_texture_id(cont_text); #endif /* NEW_TEXTURES */ if(inspect_map_text == 0) { map_large=map_text; } else { map_large = inspect_map_text; } } else { map_small=map_text; #ifdef NEW_TEXTURES map_large = cont_text; #else /* NEW_TEXTURES */ map_large=get_texture_id(cont_text); #endif /* NEW_TEXTURES */ if(cur_map!=-1){ x_size = ((float)(continent_maps[cur_map].x_end - continent_maps[cur_map].x_start)) / tile_map_size_x; y_size = ((float)(continent_maps[cur_map].y_end - continent_maps[cur_map].y_start)) / tile_map_size_y; } else { x_size=y_size=0; } } glDisable(GL_DEPTH_TEST); glDisable(GL_LIGHTING); glViewport(0, 0 + hud_y, window_width-hud_x, window_height-hud_y); glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadIdentity(); glOrtho(300, (GLdouble)0, (GLdouble)0, 200, -250.0, 250.0); glMatrixMode(GL_MODELVIEW); glPushMatrix(); glLoadIdentity(); glDisable(GL_TEXTURE_2D); glColor3f(0.0f, 0.0f, 0.0f); glBegin(GL_QUADS); glVertex2i(0, 0); glVertex2i(300, 0); glVertex2i(300, 200); glVertex2i(0, 200); glEnd(); glEnable(GL_TEXTURE_2D); glColor3f(1.0f,1.0f,1.0f); #ifdef NEW_TEXTURES bind_texture(map_large); glBegin(GL_QUADS); glTexCoord2f(1.0f, 1.0f); glVertex3i(50,0,0); glTexCoord2f(1.0f, 0.0f); glVertex3i(50,200,0); glTexCoord2f(0.0f, 0.0f); glVertex3i(250,200,0); glTexCoord2f(0.0f, 1.0f); glVertex3i(250,0,0); glEnd(); #else /* NEW_TEXTURES */ bind_texture_id(map_large); glBegin(GL_QUADS); glTexCoord2f(1.0f,0.0f); glVertex3i(50,0,0); glTexCoord2f(1.0f,1.0f); glVertex3i(50,200,0); glTexCoord2f(0.0f,1.0f); glVertex3i(250,200,0); glTexCoord2f(0.0f,0.0f); glVertex3i(250,0,0); glEnd(); #endif /* NEW_TEXTURES */ if (mouse_mini) glColor4f (1.0f, 1.0f, 1.0f, 1.0f); else glColor4f (0.7f, 0.7f, 0.7f, 0.7f); glEnable(GL_ALPHA_TEST); #ifdef NEW_TEXTURES bind_texture(map_small); glBegin(GL_QUADS); glTexCoord2f(1.0f, 1.0f); glVertex3i(250,150,0); glTexCoord2f(1.0f, 0.0f); glVertex3i(250,200,0); glTexCoord2f(0.0f, 0.0f); glVertex3i(300,200,0); glTexCoord2f(0.0f, 1.0f); glVertex3i(300,150,0); glEnd(); #else /* NEW_TEXTURES */ bind_texture_id(map_small); glBegin(GL_QUADS); glTexCoord2f(1.0f,0.0f); glVertex3i(250,150,0); glTexCoord2f(1.0f,1.0f); glVertex3i(250,200,0); glTexCoord2f(0.0f,1.0f); glVertex3i(300,200,0); glTexCoord2f(0.0f,0.0f); glVertex3i(300,150,0); glEnd(); #endif /* NEW_TEXTURES */ glDisable(GL_ALPHA_TEST); glColor3f(1.0f,1.0f,1.0f); #ifdef NEW_TEXTURES bind_texture(legend_text); glBegin(GL_QUADS); glTexCoord2f(1.0f, 1.0f); glVertex3i(250,50,0); glTexCoord2f(1.0f, 0.0f); glVertex3i(250,150,0); glTexCoord2f(0.0f, 0.0f); glVertex3i(300,150,0); glTexCoord2f(0.0f, 1.0f); glVertex3i(300,50,0); glEnd(); #else /* NEW_TEXTURES */ get_and_set_texture_id(legend_text); glBegin(GL_QUADS); glTexCoord2f(1.0f,0.0f); glVertex3i(250,50,0); glTexCoord2f(1.0f,1.0f); glVertex3i(250,150,0); glTexCoord2f(0.0f,1.0f); glVertex3i(300,150,0); glTexCoord2f(0.0f,0.0f); glVertex3i(300,50,0); glEnd(); #endif /* NEW_TEXTURES */ // this is necessary for the text over map // need to execute this for any map now // because of the coordinate display - Lachesis if(map/*&&(adding_mark||max_mark>0)*/){ glViewport(0, 0 + hud_y, window_width-hud_x, window_height-hud_y); glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadIdentity(); glOrtho((GLdouble)0, (GLdouble)300, (GLdouble)200, (GLdouble)0, -250.0, 250.0); glMatrixMode(GL_MODELVIEW); glPushMatrix(); glLoadIdentity(); // Draw help for toggling the mini-map { char buf[80]; char keybuf[20]; glEnable(GL_TEXTURE_2D); safe_snprintf(buf, sizeof(buf), "%s %s", win_minimap, get_key_string(K_MINIMAP, keybuf, sizeof(keybuf))); glColor3f (1.0f, 1.0f, 0.0f); draw_string_zoomed(25 - 1.5*strlen(buf), 150 + 43, (const unsigned char *)buf, 1, 0.3); } // draw a temporary mark until the text is entered if (adding_mark) { int x = mark_x; int y = mark_y; screen_x=(51+200*x/(tile_map_size_x*6)); screen_y=201-200*y/(tile_map_size_y*6); glColor3f(1.0f,1.0f,0.0f); glDisable(GL_TEXTURE_2D); glBegin(GL_LINES); glVertex2i(screen_x-9*mapmark_zoom,screen_y-9*mapmark_zoom); glVertex2i(screen_x+6*mapmark_zoom,screen_y+6*mapmark_zoom); glVertex2i(screen_x+6*mapmark_zoom,screen_y-9*mapmark_zoom); glVertex2i(screen_x-9*mapmark_zoom,screen_y+6*mapmark_zoom); glEnd(); glEnable(GL_TEXTURE_2D); glColor3f(1.0f,1.0f,0.0f); draw_string_zoomed (screen_x, screen_y, (unsigned char*)input_text_line.data, 1, mapmark_zoom); } draw_mark_filter(); if(inspect_map_text == 0) { draw_marks(marks, max_mark, tile_map_size_x, tile_map_size_y); draw_coordinates(tile_map_size_x, tile_map_size_y); } else { draw_marks(temp_marks, max_temp_mark, temp_tile_map_size_x, temp_tile_map_size_y); draw_coordinates(temp_tile_map_size_x, temp_tile_map_size_y); } } //if we're following a path, draw the destination on the map if (pf_follow_path && inspect_map_text == 0) { int px = pf_dst_tile->x; int py = pf_dst_tile->y; if (!map) { if (cur_map!=-1) { screen_x = 300 - (50 + 200 * ( (px * x_size / 6) + continent_maps[cur_map].x_start) / 512); screen_y = 200 * ( (py * y_size / 6) + continent_maps[cur_map].y_start) / 512; } else { screen_x = screen_y = 0; } } else { screen_x=51 +200*px/(tile_map_size_x*6); screen_y=201-200*py/(tile_map_size_y*6); } glColor3f(1.0f,0.0f,0.0f); glDisable(GL_TEXTURE_2D); glBegin(GL_LINES); glVertex2i(screen_x-9*mapmark_zoom,screen_y-9*mapmark_zoom); glVertex2i(screen_x+6*mapmark_zoom,screen_y+6*mapmark_zoom); glVertex2i(screen_x+6*mapmark_zoom,screen_y-9*mapmark_zoom); glVertex2i(screen_x-9*mapmark_zoom,screen_y+6*mapmark_zoom); glEnd(); } //ok, now let's draw our possition... if ( (me = get_our_actor ()) != NULL && inspect_map_text == 0) { x = me->x_tile_pos; y = me->y_tile_pos; } else { //We don't exist (usually happens when teleporting) x = -1; y = -1; } if (!map) { if (cur_map != -1) { screen_x = 300 - (50 + 200 * ( (x * x_size / 6) + continent_maps[cur_map].x_start) / 512); screen_y = 200 * ( (y * y_size / 6) + continent_maps[cur_map].y_start) / 512; } else { screen_x = screen_y = 0; } } else { screen_x=51 +200*x/(tile_map_size_x*6); screen_y=201-200*y/(tile_map_size_y*6); } if ( (map || !dungeon) && x != -1 ) { glColor3f (0.0f, 0.0f, 1.0f); glDisable (GL_TEXTURE_2D); glBegin (GL_LINES); glVertex2i(screen_x-9*mapmark_zoom,screen_y-9*mapmark_zoom); glVertex2i(screen_x+6*mapmark_zoom,screen_y+6*mapmark_zoom); glVertex2i(screen_x+6*mapmark_zoom,screen_y-9*mapmark_zoom); glVertex2i(screen_x-9*mapmark_zoom,screen_y+6*mapmark_zoom); glEnd(); } if(!map && show_continent_map_boundaries && cont_text!=fallback_text) { int i; /* Convert mouse coordinates to map coordinates (stolen from pf_get_mouse_position()) */ int min_mouse_x = (window_width-hud_x)/6; int min_mouse_y = 0; int max_mouse_x = min_mouse_x+((window_width-hud_x)/1.5); int max_mouse_y = window_height - hud_y; int screen_map_width = max_mouse_x - min_mouse_x; int screen_map_height = max_mouse_y - min_mouse_y; int m_px = ((mouse_x-min_mouse_x) * 512) / screen_map_width; int m_py = 512 - ((mouse_y * 512) / screen_map_height); int mouse_over = -1; glColor3f (0.267f, 0.267f, 0.267f); glDisable (GL_TEXTURE_2D); glBegin(GL_LINES); /* Draw borders for the maps except the one with the mouse over it */ glColor3f (0.267f, 0.267f, 0.267f); for(i = 0; continent_maps[i].name != NULL; i++) { if(continent_maps[i].cont == continent_maps[cur_map].cont) { if(!mouse_mini && mouse_over == -1 && m_px > continent_maps[i].x_start && m_px < continent_maps[i].x_end && m_py > continent_maps[i].y_start && m_py < continent_maps[i].y_end) { /* Mouse over this map */ mouse_over = i; } else { int x_start = 300-(50+200*continent_maps[i].x_start/512); int x_end = 300-(50+200*continent_maps[i].x_end/512); int y_start = 200*continent_maps[i].y_start / 512; int y_end = 200*continent_maps[i].y_end / 512; glVertex2i(x_start, y_start); glVertex2i(x_start, y_end); glVertex2i(x_start, y_end); glVertex2i(x_end, y_end); glVertex2i(x_end, y_end); glVertex2i(x_end, y_start); glVertex2i(x_end, y_start); glVertex2i(x_start, y_start); } } } /* Draw border for the map with the mouse over it */ if(mouse_over >= 0) { float flash_effect_colour = 0.90f - sin((float)SDL_GetTicks()/100.0f) / 10.0f; int x_start = 300-(50+200*continent_maps[mouse_over].x_start/512); int x_end = 300-(50+200*continent_maps[mouse_over].x_end/512); int y_start = 200*continent_maps[mouse_over].y_start / 512; int y_end = 200*continent_maps[mouse_over].y_end / 512; glColor3f(flash_effect_colour, flash_effect_colour, flash_effect_colour); glVertex2i(x_start, y_start); glVertex2i(x_start, y_end); glVertex2i(x_start, y_end); glVertex2i(x_end, y_end); glVertex2i(x_end, y_end); glVertex2i(x_end, y_start); glVertex2i(x_end, y_start); glVertex2i(x_start, y_start); } glEnd(); } #ifdef DEBUG_MAP_SOUND // If we are in map view (not continent view) draw the sound area boundaries if (map) { print_sound_boundaries(cur_tab_map); } #endif // DEBUG_MAP_SOUND if (map) { glMatrixMode(GL_MODELVIEW); glPopMatrix(); glMatrixMode(GL_PROJECTION); glPopMatrix(); glMatrixMode(GL_MODELVIEW); } glEnable (GL_TEXTURE_2D); glColor3f (1.0f, 1.0f, 1.0f); glMatrixMode (GL_MODELVIEW); glPopMatrix (); glMatrixMode (GL_PROJECTION); glPopMatrix (); glMatrixMode (GL_MODELVIEW); glEnable(GL_DEPTH_TEST); glEnable(GL_LIGHTING); #ifdef OPENGL_TRACE CHECK_GL_ERRORS(); #endif //OPENGL_TRACE }
int display_knowledge_handler(window_info *win) { size_t i; int x = text_border; int y = text_border; int scroll = vscrollbar_get_pos (win->window_id, knowledge_scroll_id); char points_string[16]; char *research_string; int points_pos; float font_ratio = win->small_font_len_x/12.0; float max_name_x = (win->len_x - win->box_size - 2*x)/2; int is_researching = 1; int text_width = win->len_x - 2 * text_border; char knowledge_text_buf[TEXTBUFSIZE]; if(your_info.research_total && (your_info.research_completed==your_info.research_total)) safe_snprintf(points_string, sizeof(points_string), "%s", completed_research); else safe_snprintf(points_string, sizeof(points_string), "%i/%i",your_info.research_completed,your_info.research_total); if(your_info.researching < knowledge_count) { research_string = knowledge_list[your_info.researching].name; } else if (your_info.researching < sizeof(knowledge_list)) { research_string = unknown_book_short_str; } else { research_string = not_researching_anything; points_string[0] = '\0'; is_researching = 0; } points_pos = (progress_right_x - progress_left_x - strlen(points_string) * win->small_font_len_x) / 2; glDisable(GL_TEXTURE_2D); glColor3f(0.77f,0.57f,0.39f); glBegin(GL_LINES); // window separators glVertex3i(0,booklist_y_len,0); glVertex3i(win->len_x,booklist_y_len,0); glVertex3i(0,progressbox_y_len,0); glVertex3i(win->len_x,progressbox_y_len,0); //progress bar glVertex3i(progress_left_x,progress_top_y,0); glVertex3i(progress_right_x,progress_top_y,0); glVertex3i(progress_left_x,progress_bot_y,0); glVertex3i(progress_right_x,progress_bot_y,0); glVertex3i(progress_left_x,progress_top_y,0); glVertex3i(progress_left_x,progress_bot_y,0); glVertex3i(progress_right_x,progress_top_y,0); glVertex3i(progress_right_x,progress_bot_y,0); glEnd(); //progress bar if (is_researching) { int progress = (progress_right_x - progress_left_x - 1) * get_research_fraction(); glBegin(GL_QUADS); glColor3f(0.40f,0.40f,1.00f); glVertex3i(progress_left_x+1+gx_adjust,progress_top_y+gy_adjust,0); glVertex3i(progress_left_x+1+progress+gx_adjust,progress_top_y+gy_adjust,0); glColor3f(0.10f,0.10f,0.80f); glVertex3i(progress_left_x+1+progress+gx_adjust,progress_bot_y-1+gy_adjust,0); glVertex3i(progress_left_x+1+gx_adjust,progress_bot_y-1+gy_adjust,0); glColor3f(0.77f,0.57f,0.39f); glEnd(); } glEnable(GL_TEXTURE_2D); //draw text if (selected_book >= 0 && knowledge_list[selected_book].present && knowledge_list[selected_book].has_book) text_width = book_start_x - 2 * text_border; put_small_text_in_box_zoomed((unsigned char *)raw_knowledge_string, strlen((char *)raw_knowledge_string), text_width, (char *)knowledge_text_buf, win->current_scale); draw_string_small_zoomed(text_border,booklist_y_len + text_border,(unsigned char*)knowledge_text_buf, info_lines, win->current_scale); glColor3f(1.0f,1.0f,1.0f); draw_string_small_zoomed(text_border,progress_top_y+3+gy_adjust,(unsigned char*)researching_str,1, win->current_scale); draw_string_small_zoomed(text_border+(strlen(researching_str)+1)*win->small_font_len_x,progress_top_y+3+gy_adjust,(unsigned char*)research_string,1, win->current_scale); draw_string_small_zoomed(progress_left_x+points_pos+gx_adjust,progress_top_y+3+gy_adjust,(unsigned char*)points_string,1, win->current_scale); if (is_researching && mouse_over_progress_bar) { char eta_string[20]; int eta_pos; get_research_eta_str(eta_string, sizeof(eta_string)); eta_pos = (int)(progress_right_x - progress_left_x - strlen(eta_string)*win->small_font_len_x) / 2; draw_string_small_zoomed(progress_left_x + eta_pos, progress_top_y - win->small_font_len_y + 2, (unsigned char*)eta_string, 1, win->current_scale); mouse_over_progress_bar=0; } // Draw knowledges for(i = 2*scroll; y < (booklist_y_len - booklist_y_step); i++) { int highlight = 0; float colour_brightness = (knowledge_list[i].present) ?1.0 : 0.6; if (*highlight_string && (strlen(knowledge_list[i].name) > 0) && (get_string_occurance(highlight_string, knowledge_list[i].name, strlen(knowledge_list[i].name), 1) != -1)) highlight = 1; if (!highlight && (i == selected_book)) { GLfloat cols[3]; elglGetColour3v("global.mouseselected", cols); glColor3f (cols[0]*colour_brightness, cols[1]*colour_brightness, cols[2]*colour_brightness); } else if (knowledge_list[i].mouse_over) elglColourN("global.mousehighlight"); else if (highlight) glColor3f (1.0f*colour_brightness, 0.6f*colour_brightness, 0.0f*colour_brightness); else glColor3f (1.0f*colour_brightness, 1.0f*colour_brightness, 1.0f*colour_brightness); /* truncate the string if it is too long */ if ((get_string_width((unsigned char*)knowledge_list[i].name) * font_ratio) > max_name_x) { const char *append_str = "... "; size_t dest_max_len = strlen(knowledge_list[i].name)+strlen(append_str)+1; char *used_name = (char *)malloc(dest_max_len); truncated_string(used_name, knowledge_list[i].name, dest_max_len, append_str, max_name_x, font_ratio); draw_string_zoomed(x, y, (unsigned char*)used_name,1,font_ratio); /* if the mouse is over this line and its truncated, tooltip to full name */ if (knowledge_list[i].mouse_over) { show_help(knowledge_list[i].name, -TAB_MARGIN, win->len_y+10+TAB_MARGIN, win->current_scale); know_show_win_help = 0; } free(used_name); } else draw_string_zoomed(x,y,(unsigned char*)knowledge_list[i].name,1,font_ratio); x += (win->len_x-win->box_size-2*text_border)/2; if (i % 2 == 1) { y += booklist_y_step; x = text_border; } } if (know_show_win_help) { show_help(cm_help_options_str, -TAB_MARGIN, win->len_y+10+TAB_MARGIN, win->current_scale); know_show_win_help = 0; } #ifdef OPENGL_TRACE CHECK_GL_ERRORS(); #endif //OPENGL_TRACE return 1; }
/* Access the caught url list and display in a scrollable window. */ static int display_url_handler(window_info *win) { #ifdef OPENGL_TRACE CHECK_GL_ERRORS(); #endif //OPENGL_TRACE url_win_hover_url = NULL; /* save current position so K_WINDOWS_ON_TOP restores to where its been moved */ url_win_x = win->cur_x; url_win_y = win->cur_y; glEnable(GL_TEXTURE_2D); set_font(0); /* check for external state change */ if (!have_url_count && !url_win_status) url_win_status = URLW_EMPTY; /* if we have a status message, display it */ if (url_win_status) { char *message[] = { urlcmd_none_str, urlwin_clear_str, urlwin_open_str }; int y_start = (url_win_text_start_y - 0.75 * url_win_text_zoom * DEFAULT_FONT_Y_LEN)/2; glColor3f(1.0f,1.0f,1.0f); draw_string_zoomed(url_win_help_x, y_start, (unsigned char *)message[url_win_status-1], 1, 0.75 * url_win_text_zoom); url_win_status = (have_url_count) ?0 :URLW_EMPTY; } /* display a page of url */ if (have_url_count) { list_node_t *local_head = newest_url; int currenty = url_win_text_start_y; int start_url = 0; int num_url_displayed = 0; /* don't scroll if everything will fit in the window, also catch if the list has been cleared via #url */ if (((url_win_line_step * have_url_count) <= url_win_text_len_y) || (url_win_top_line > have_url_count)) url_win_top_line = 0; /* move to the first url to be displayed - set from the scroll bar */ while (start_url < url_win_top_line && local_head->next != NULL) { local_head = local_head->next; start_url++; } /* loop over the remaining URLs while there is room in the window */ while (local_head != NULL) { char *thetext = ((URLDATA *)local_head->data)->text; int dsp_string_len = 0; float string_width = 0; int highlight_url = 0; /* stop now if the url line will not fit into the window */ if (((currenty - url_win_text_start_y) + url_win_line_step) > url_win_text_len_y) break; /* highlight the active (F2) url */ if (local_head == active_url) glColor3f(0.0f,1.0f,0.0f); else glColor3f(1.0f,1.0f,1.0f); /* calculate the length of string we can display */ while((*thetext != '\0') && (string_width < url_win_max_string_width)) { float char_width = get_char_width(*thetext++) * url_win_text_zoom * DEFAULT_FONT_X_LEN / 12.0; if ((string_width+char_width) < url_win_max_string_width) { dsp_string_len++; string_width += char_width; } } /* if the string length will fit in the window, just draw it */ if (dsp_string_len == strlen(((URLDATA *)local_head->data)->text)) draw_string_zoomed(url_win_sep, currenty, (unsigned char *)((URLDATA *)local_head->data)->text, 1, url_win_text_zoom); /* otherwise, draw a truncated version with "..." at the end */ else { //float toobig_width = (get_char_width('-') + get_char_width('>')) // * url_win_text_zoom * DEFAULT_FONT_X_LEN / 12.0; float toobig_width = (3*get_char_width('.')) * url_win_text_zoom * DEFAULT_FONT_X_LEN / 12.0; draw_string_zoomed_width(url_win_sep, currenty, (unsigned char *)((URLDATA *)local_head->data)->text, url_win_sep + url_win_max_string_width - toobig_width, 1, url_win_text_zoom); draw_string_zoomed(url_win_sep + url_win_max_string_width - toobig_width, currenty, (unsigned char *)"..." , 1, url_win_text_zoom); } /* step down a line, do it now as the maths for mouse over below is easier */ currenty += url_win_line_step; /* if the mouse is over the current line, hightlight it */ if ((mouse_y >= win->cur_y + currenty - url_win_line_step) && (mouse_y < win->cur_y + currenty) && (mouse_x >= win->cur_x + (int)url_win_sep) && (mouse_x - (int)url_win_sep <= win->cur_x + url_win_max_string_width)) { /* remember which url we're over in case it's clicked */ url_win_hover_url = local_head; highlight_url = 1; } /* if a context menu is open, only hightlight the last URL hovered over before the context opened */ if (cm_window_shown() != CM_INIT_VALUE) { if (cm_url == local_head) highlight_url = 1; else highlight_url = 0; } else cm_url = NULL; /* if mouse over or context activated, highlight the current URL */ if (highlight_url) { char *help_substring = NULL; size_t help_substring_len = 0; int dsp_start = 0; int helpline = 0; Uint32 currenttime = SDL_GetTicks(); size_t full_help_len = strlen(((URLDATA *)local_head->data)->text) + 30; char *full_help_text = (char *)malloc(sizeof(char) * full_help_len); /* display the mouse over help next time round */ url_win_status = URLW_OVER; /* underline the text, just clicked links are red, otherwise blue - paler when visited */ if ((currenttime - url_win_clicktime < 500) && (url_win_clicked_url == url_win_hover_url)) glColor3f(1.0f,0.0f,0.3f); else if (((URLDATA *)local_head->data)->visited) glColor3f(0.3f,0.5f,1.0f); else glColor3f(0.1f,0.2f,1.0f); glDisable(GL_TEXTURE_2D); glBegin(GL_LINES); glVertex2i(url_win_sep, currenty-2); glVertex2i(url_win_sep+string_width, currenty-2); glEnd(); glEnable(GL_TEXTURE_2D); /* write the full url as help text at the bottom of the window */ safe_snprintf(full_help_text, full_help_len, "%s (seen %d time%s) (%s)", ((URLDATA *)local_head->data)->text, ((URLDATA *)local_head->data)->seen_count, ((URLDATA *)local_head->data)->seen_count == 1?"":"s", ((((URLDATA *)local_head->data)->visited)?"visited":"unvisited")); thetext = full_help_text; dsp_string_len = 0; string_width = 0; while(*thetext != '\0') { float char_width = get_char_width(*thetext++) * SMALL_FONT_X_LEN / 12.0; if (((string_width+char_width) > (win->len_x - 2*url_win_sep)) || (*thetext == '\0')) { if (*thetext == '\0') /* catch the last line */ dsp_string_len++; if (help_substring_len < dsp_string_len) { if (help_substring != NULL) free(help_substring); help_substring = (char *)malloc(sizeof(char)*(dsp_string_len+1)); help_substring_len = dsp_string_len; } strncpy(help_substring, &full_help_text[dsp_start], dsp_string_len); help_substring[dsp_string_len] = '\0'; show_help(help_substring, url_win_sep, (url_win_y_len - url_win_full_url_y_len) + helpline++ * SMALL_FONT_Y_LEN); dsp_start += dsp_string_len; dsp_string_len = 0; string_width = 0; } dsp_string_len++; string_width += char_width; } free(help_substring); free(full_help_text); } /* end if mouse over url */ /* count how many displayed so we can set the scroll bar properly */ num_url_displayed++; local_head = local_head->next; } /* set the number of steps for the scroll bar */ vscrollbar_set_bar_len(url_win, url_scroll_id, have_url_count - num_url_displayed); } /* end if have url */ /* draw a line below the list of url, above the current url full text */ glColor3f(0.77f,0.59f,0.39f); glDisable(GL_TEXTURE_2D); glBegin(GL_LINES); glVertex2i(0, url_win_url_y_start); glVertex2i(url_win_x_len+1, url_win_url_y_start); glEnd(); glEnable(GL_TEXTURE_2D); #ifdef OPENGL_TRACE CHECK_GL_ERRORS(); #endif //OPENGL_TRACE return 1; } /* end display_url_handler() */
void draw_string(int x, int y,const unsigned char * our_string,int max_lines) { draw_string_zoomed(x, y,our_string,max_lines, 1.0f); }
void draw_smooth_button(char * str, float size, int x, int y, int w, int lines, float r, float g, float b, int highlight, float hr, float hg, float hb, float ha) { int radius=lines*BUTTONRADIUS*size; float width_ratio=(size*DEFAULT_FONT_X_LEN)/12.0f; int xstr=0; if(str){ xstr=x+radius+(w-(get_string_width((unsigned char*)str)*width_ratio))/2.0f; } glDisable(GL_TEXTURE_2D); if(r>=0.0f) glColor3f(r, g, b); #ifdef OSX if (square_buttons) { glBegin(GL_LINE_LOOP); glVertex3i(x,y,0); glVertex3i(x + w + radius*2,y,0); glVertex3i(x + w + radius*2,y + radius*2,0); glVertex3i(x,y + radius*2,0); glEnd(); if(highlight) { if(hr>=0.0f) glColor4f(hr,hg,hb,ha); glBegin(GL_POLYGON); glVertex3i(x+1,y+1,0); glVertex3i(x + w + radius*2 -1,y+1,0); glVertex3i(x + w + radius*2 -1,y + radius*2 -1,0); glVertex3i(x+1,y + radius*2 -1,0); glEnd(); } glEnable(GL_TEXTURE_2D); } else { #endif glBegin(GL_LINE_LOOP); draw_circle_ext(x, y, radius, 10, 90, 270); draw_circle_ext(x+w, y, radius, 10, -90, 90); glEnd(); if(highlight) { if(hr>=0.0f) glColor4f(hr,hg,hb,ha); glBegin(GL_POLYGON); draw_circle_ext(x+1, y+1, radius-1, 10, 90, 270); draw_circle_ext(x+w+1, y+1, radius-1, 10, -90, 90); glEnd(); } glEnable(GL_TEXTURE_2D); #ifdef OSX } // to close off square_buttons conditional #endif if(highlight) { glColor3f(r, g, b); } if(str) { draw_string_zoomed(xstr + gx_adjust, y+radius/2.0f + gy_adjust, (unsigned char*)str, lines, size); } #ifdef OPENGL_TRACE CHECK_GL_ERRORS(); #endif //OPENGL_TRACE }
// Draw the item list window // int List_Window::draw(window_info *win) { Vars::lists()->check_and_timed_save(false); // if resizing wait until we stop if (win->resized) resizing = true; // once we stop, snap the window size to fix nicely else if (resizing) { calc_num_show_names(win->len_y); resizing = false; resize_window (win->window_id, get_size_x(), get_size_y()); } // check if we need to change the number of grid rows shown int new_num_grid_rows = min_grid_rows(); if (Vars::lists()->valid_active_list()) new_num_grid_rows = std::max(static_cast<size_t>(new_num_grid_rows), (Vars::lists()->get_list().get_num_items() +5) / 6); if (num_grid_rows != new_num_grid_rows) { num_grid_rows = new_num_grid_rows; resized_name_panel(win); } glEnable(GL_TEXTURE_2D); // draw the images if (Vars::lists()->valid_active_list()) { glColor3f(1.0f,1.0f,1.0f); for(size_t i=0; i<Vars::lists()->get_list().get_num_items() && i<static_cast<size_t>(6*num_grid_rows); i++) { int x_start, y_start; x_start = get_grid_size() * (i%6) + 1; y_start = get_grid_size() * (i/6); draw_item(Vars::lists()->get_list().get_image_id(i), x_start, y_start, get_grid_size()); } } size_t help_lines_shown = 0; // Display any name search text if (strlen(filter)) { if (SDL_GetTicks() > (last_key_time+5000)) { filter[0] = '\0'; last_key_time = 0; } else { std::string tmp = std::string(item_list_find_str) + std::string("[") + std::string(filter) + std::string("]"); show_help(tmp.c_str(), 0, static_cast<int>(0.5 + win->len_y + 10 + SMALL_FONT_Y_LEN * help_lines_shown++)); } } // draw mouse over window help text if (show_help_text) { if (!resizing) for (size_t i=0; i<help_str.size(); ++i) show_help(help_str[i], 0, static_cast<int>(0.5 + win->len_y + 10 + SMALL_FONT_Y_LEN * help_lines_shown++)); help_str.clear(); } glDisable(GL_TEXTURE_2D); // draw the item grid glColor3f(0.77f,0.57f,0.39f); rendergrid(6, num_grid_rows, 0, 0, get_grid_size(), get_grid_size()); // if an object is selected, draw a green grid around it if (Vars::lists()->valid_active_list() && (quantities.selected == ITEM_EDIT_QUANT) && (selected_item_number < Vars::lists()->get_list().get_num_items())) { int x_start = selected_item_number%6 * get_grid_size(); int y_start = static_cast<int>(selected_item_number/6) * get_grid_size(); if ((SDL_GetTicks() - il_pickup_fail_time) < 250) glColor3f(0.8f,0.2f,0.2f); else glColor3f(0.0f, 1.0f, 0.3f); rendergrid(1, 1, x_start, y_start, get_grid_size(), get_grid_size()); rendergrid(1, 1, x_start-1, y_start-1, get_grid_size()+2, get_grid_size()+2); } glEnable(GL_TEXTURE_2D); // draw the quantities over everything else so they always show if (Vars::lists()->valid_active_list()) { glColor3f(1.0f,1.0f,1.0f); char str[80]; for(size_t i=0; i<Vars::lists()->get_list().get_num_items() && i<static_cast<size_t>(6*num_grid_rows); i++) { int x_start, y_start, y_end; x_start = get_grid_size() * (i%6) + 1; y_start = get_grid_size() * (i/6); y_end = y_start + get_grid_size() - 1; safe_snprintf(str, sizeof(str), "%i", Vars::lists()->get_list().get_quantity(i)); draw_string_small_shadowed(x_start, (i&1)?(y_end-15):(y_end-27), (unsigned char*)str, 1,1.0f,1.0f,1.0f, 0.0f, 0.0f, 0.0f); } } // Drawn the new list button (+) with highlight when mouse over if (mouse_over_add_button) glColor3f(0.99f,0.77f,0.55f); else glColor3f(0.77f,0.57f,0.39f); draw_string_zoomed(add_button_x, add_button_y, (unsigned const char*)"+", 1, 2.0); // draw the item list names glColor3f(1.0f,1.0f,1.0f); int pos_y = get_grid_size()*num_grid_rows + get_list_gap(); int num_shown = 0; const int top_entry = vscrollbar_get_pos (win_id, names_scroll_id); const std::vector<List> lists = Vars::lists()->get_lists(); const int hl_width = static_cast<int>(win->len_x-ELW_BOX_SIZE-3); const int hl_height = static_cast<int>(names_list_height + get_list_gap()); const size_t disp_chars = static_cast<size_t>((win->len_x-ELW_BOX_SIZE-2*get_list_gap()) / SMALL_FONT_X_LEN); for (size_t i = top_entry; i<lists.size() && num_shown<num_show_names_list; ++i) { if (i==Vars::lists()->get_active()) draw_highlight(1, static_cast<int>(pos_y-get_list_gap()/2), hl_width, hl_height, 1); else if (i==name_under_mouse) draw_highlight(1, static_cast<int>(pos_y-get_list_gap()/2), hl_width, hl_height, 0); glColor3f(1.0f,1.0f,1.0f); if (lists[i].get_name().size() > disp_chars) { std::string todisp = lists[i].get_name().substr(0,disp_chars); draw_string_small(get_list_gap(), pos_y, reinterpret_cast<const unsigned char*>(todisp.c_str()), 1); if (i==name_under_mouse) show_help(lists[i].get_name().c_str(), 0, static_cast<int>(0.5 + win->len_y + 10 + SMALL_FONT_Y_LEN * help_lines_shown)); } else draw_string_small(get_list_gap(), pos_y, reinterpret_cast<const unsigned char*>(lists[i].get_name().c_str()), 1); pos_y += static_cast<int>(names_list_height + get_list_gap()); num_shown++; } if (clicked && (name_under_mouse < lists.size())) { do_click_sound(); Vars::lists()->set_active(name_under_mouse); } if (clicked && mouse_over_add_button) { do_click_sound(); new_or_rename_list(true); } name_under_mouse = static_cast<size_t>(-1); mouse_over_add_button = clicked = false; #ifdef OPENGL_TRACE CHECK_GL_ERRORS(); #endif //OPENGL_TRACE return 1; }