// The mouse is over the window // int List_Window::mouseover(window_info *win, int mx, int my) { if ((my < 0) || (cm_window_shown()!=CM_INIT_VALUE)) return 0; if (Vars::lists()->valid_active_list() && mx>=0 && mx<(get_grid_size()*6) && my>=0 && my<(get_grid_size()*num_grid_rows)) { size_t item_number = get_item_number(mx, my); if (item_number < Vars::lists()->get_list().get_num_items()) { Uint16 item_id = Vars::lists()->get_list().get_item_id(item_number); int image_id = Vars::lists()->get_list().get_image_id(item_number); if (show_item_desc_text && item_info_available() && (get_item_count(item_id, image_id) == 1)) desc_str = get_item_description(item_id, image_id); help_str.push_back(item_list_pickup_help_str); help_str.push_back(item_list_use_help_str); help_str.push_back(item_list_edit_help_str); } if ((storage_item_dragged != -1) || (item_dragged != -1)) help_str.push_back(item_list_add_help_str); else help_str.push_back(item_list_drag_help_str); } // check if over the add list button if (my>add_button_y && my<(add_button_y+2*DEFAULT_FONT_Y_LEN) && mx>add_button_x && mx<win->len_x) { help_str.push_back(item_list_create_help_str); mouse_over_add_button = true; } // check if over the list names and get which name int start_names = get_grid_size()*num_grid_rows; if ((my > start_names) && (my < (start_names+get_names_size_y()))) name_under_mouse = vscrollbar_get_pos (win_id, names_scroll_id) + static_cast<int>((my - start_names - get_list_gap()/2) / (get_list_gap() + names_list_height)); // name list context help if ((my > start_names) && (my < (start_names+get_names_size_y()))) { help_str.push_back(cm_help_options_str); if (!strlen(filter)) help_str.push_back(item_list_find_help_str); } return 0; }
/* mouse over slots - show tool tips */ static int mouseover_manufacture_slot_handler(window_info *win, int mx, int my) { int pos; int check_for_eye = 0; int help_line = 0; const char *descp_str = NULL; /* Do nothing when mouse over title bar */ if (my<0) return 0; /* See if we're over a message - and offer clear help if so */ if (show_help_text && *inventory_item_string && (my > manufacture_menu_y_len-text_y_offset) && my < (manufacture_menu_y_len-recipe_y_offset)) { show_help((disable_double_click) ?click_clear_str :double_click_clear_str, 0, win->len_y + 10 + win->small_font_len_y*help_line++, win->current_scale); } /* see if we're over an item in the main category */ pos=get_mouse_pos_in_grid(mx, my, GRID_COLS, GRID_ROWS, 0, 0, SLOT_SIZE, SLOT_SIZE); if (pos >= 0 && manufacture_list[pos].quantity > 0){ if (show_help_text) show_help(manu_add_str, 0, win->len_y + 10 + win->small_font_len_y*help_line++, win->current_scale); if (show_item_desc_text && item_info_available() && (get_item_count(manufacture_list[pos].id, manufacture_list[pos].image_id) == 1)) descp_str = get_item_description(manufacture_list[pos].id, manufacture_list[pos].image_id); check_for_eye = 1; mouse_over_main_pos = pos; } /* see if we're over an item from the "production pipe" */ pos=get_mouse_pos_in_grid(mx, my, NUM_MIX_SLOTS, 1, pipeline_x, manufacture_menu_y_len-recipe_y_offset, SLOT_SIZE, SLOT_SIZE); if (pos >= 0) { if (manufacture_list[MIX_SLOT_OFFSET+pos].quantity > 0){ if (show_help_text) show_help(manu_remove_str, 0, win->len_y + 10 + win->small_font_len_y*help_line++, win->current_scale); check_for_eye = 1; mouse_over_pipe_pos = pos; } else if (pos != last_changed_slot) show_help(recipe_show_hide_str, 0, win->len_y + 10 + win->small_font_len_y*help_line++, win->current_scale); } /*check recipe controls*/ if (pos<0 && show_help_text) recipe_controls_mouseover_handler(win, mx,my,&help_line); // show the recipe search help if (show_help_text && !recipes_shown && !disable_manuwin_keypress) show_help(recipe_find_str, 0, win->len_y + 10 + win->small_font_len_y*help_line++, win->current_scale); /* if set, show the description last */ if (descp_str != NULL) show_help(descp_str, 0, win->len_y + 10 + win->small_font_len_y*help_line++, win->current_scale); /* if we're over an occupied slot and the eye cursor function is active, show the eye cursor */ if (check_for_eye){ if (action_mode == ACTION_LOOK){ elwin_mouse = CURSOR_EYE; return 1; } } return 0; }
int display_storage_handler(window_info * win) { int i; int n=0; int pos; have_storage_list = 0; //We visited storage, so we may have changed something glColor3f(0.77f, 0.57f, 0.39f); glEnable(GL_TEXTURE_2D); for(i=pos=vscrollbar_get_pos(storage_win,STORAGE_SCROLLBAR_CATEGORIES); i<no_storage_categories && storage_categories[i].id!=-1 && i<pos+STORAGE_CATEGORIES_DISPLAY; i++,n++){ draw_string_small(20, 20+n*13, (unsigned char*)storage_categories[i].name,1); } if(storage_text[0]){ if (strcmp(storage_text, last_storage_text) != 0) { safe_strncpy(last_storage_text, storage_text, sizeof(last_storage_text)); put_small_text_in_box ((Uint8 *)storage_text, strlen(storage_text), win->len_x - 18*2, wrapped_storage_text); } draw_string_small(18, 220, (unsigned char*)wrapped_storage_text, 2); } glColor3f(1.0f,1.0f,1.0f); for(i=pos=6*vscrollbar_get_pos(storage_win, STORAGE_SCROLLBAR_ITEMS); i<pos+36 && i<no_storage;i++){ GLfloat u_start, v_start, u_end, v_end; int x_start, x_end, y_start, y_end; int cur_item; GLuint this_texture; if(!storage_items[i].quantity)continue; cur_item=storage_items[i].image_id%25; #ifdef NEW_TEXTURES get_item_uv(cur_item, &u_start, &v_start, &u_end, &v_end); #else /* NEW_TEXTURES */ u_start=0.2f*(cur_item%5); u_end=u_start+(float)50/255; v_start=(1.0f+((float)50/255)/255.0f)-((float)50/255*(cur_item/5)); v_end=v_start-(float)50/255; #endif /* NEW_TEXTURES */ this_texture=get_items_texture(storage_items[i].image_id/25); #ifdef NEW_TEXTURES if (this_texture != -1) { bind_texture(this_texture); } #else /* NEW_TEXTURES */ if(this_texture!=-1) get_and_set_texture_id(this_texture); #endif /* NEW_TEXTURES */ x_start=(i%6)*32+161; x_end=x_start+31; y_start=((i-pos)/6)*32+10; y_end=y_start+31; glBegin(GL_QUADS); draw_2d_thing(u_start,v_start,u_end,v_end,x_start,y_start,x_end,y_end); glEnd(); } if(cur_item_over!=-1 && mouse_in_window(win->window_id, mouse_x, mouse_y) == 1){ char str[20]; Uint16 item_id = storage_items[cur_item_over].id; int image_id = storage_items[cur_item_over].image_id; if (show_item_desc_text && item_info_available() && (get_item_count(item_id, image_id) == 1)) show_help(get_item_description(item_id, image_id), 0, win->len_y + 10); if (active_storage_item!=storage_items[cur_item_over].pos) { safe_snprintf(str, sizeof(str), "%d",storage_items[cur_item_over].quantity); show_help(str,mouse_x-win->pos_x-(strlen(str)/2)*8,mouse_y-win->pos_y-14); } } // Render the grid *after* the images. It seems impossible to code // it such that images are rendered exactly within the boxes on all // cards glDisable(GL_TEXTURE_2D); glColor3f(0.77f, 0.57f, 0.39f); glBegin(GL_LINE_LOOP); glVertex2i(10, 10); glVertex2i(10, 202); glVertex2i(130, 202); glVertex2i(130, 10); glEnd(); glBegin(GL_LINE_LOOP); glVertex2i(10, 212); glVertex2i(10, 262); glVertex2i(392, 262); glVertex2i(392, 212); glEnd(); if (view_only_storage) { Uint32 currentticktime = SDL_GetTicks(); if (currentticktime < drop_fail_time) drop_fail_time = 0; /* trap wrap */ if ((currentticktime - drop_fail_time) < 250) glColor3f(0.8f,0.2f,0.2f); /* flash red if tried to drop into */ else glColor3f(0.37f, 0.37f, 0.39f); /* otherwise draw greyed out */ } rendergrid(6, 6, 160, 10, 32, 32); glEnable(GL_TEXTURE_2D); glColor3f(1.0f,1.0f,1.0f); if(active_storage_item >= 0) { /* Draw the active item's quantity on top of everything else. */ for(i = pos = 6*vscrollbar_get_pos(storage_win, STORAGE_SCROLLBAR_ITEMS); i < pos+36 && i < no_storage; i++) { if(storage_items[i].pos == active_storage_item) { if (storage_items[i].quantity) { char str[20]; int x = (i%6)*32+161; safe_snprintf(str, sizeof(str), "%d", storage_items[i].quantity); if(x > 353) { x = 321; } show_help(str, x, ((i-pos)/6)*32+18); } break; } } } #ifdef OPENGL_TRACE CHECK_GL_ERRORS(); #endif //OPENGL_TRACE return 1; }