// 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; }
// Calculate the number of item list names show - depends on window height // and number of grid rows shown // void List_Window::calc_num_show_names(int win_len_y = -1) { // get the actual window height if not specfified if (win_len_y < 0) { if ((win_id < 0) || (win_id >= windows_list.num_windows)) return; win_len_y = (&windows_list.window[win_id])->len_y; } if (win_len_y > window_height-HUD_MARGIN_Y) win_len_y = window_height-HUD_MARGIN_Y; num_show_names_list = static_cast<int> ((win_len_y - get_grid_size()*num_grid_rows) / (get_list_gap() + names_list_height)); }
// 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; }
int get_names_size_y(void) const { return static_cast<int>(num_show_names_list * (get_list_gap() + names_list_height) + get_list_gap()); }
int get_size_x(void) const { return get_grid_size()*6 + ELW_BOX_SIZE + get_list_gap(); }