void display_storage_menu() { int i; /* Entropy suggested hack to determine if this is the view only "#sto" opened storage */ view_only_storage = 0; for (i = 0; i < no_storage_categories; i++) { if ((storage_categories[i].id != -1) && (strcmp(&storage_categories[i].name[1], "Quest") == 0)) { view_only_storage = 1; break; } } if(storage_win<=0){ int our_root_win = -1; if (!windows_on_top) { our_root_win = game_root_win; } storage_win=create_window(win_storage, our_root_win, 0, storage_win_x, storage_win_y, storage_win_x_len, storage_win_y_len, ELW_WIN_DEFAULT|ELW_TITLE_NAME); set_window_handler(storage_win, ELW_HANDLER_DISPLAY, &display_storage_handler); set_window_handler(storage_win, ELW_HANDLER_CLICK, &click_storage_handler); set_window_handler(storage_win, ELW_HANDLER_MOUSEOVER, &mouseover_storage_handler); set_window_handler(storage_win, ELW_HANDLER_KEYPRESS, &keypress_storage_handler ); vscrollbar_add_extended(storage_win, STORAGE_SCROLLBAR_CATEGORIES, NULL, 130, 10, 20, 192, 0, 1.0, newcol_r, newcol_g, newcol_b, 0, 1, max2i(no_storage_categories - STORAGE_CATEGORIES_DISPLAY, 0)); vscrollbar_add_extended(storage_win, STORAGE_SCROLLBAR_ITEMS, NULL, 352, 10, 20, 192, 0, 1.0, newcol_r, newcol_g, newcol_b, 0, 1, 28); cm_add(windows_list.window[storage_win].cm_id, cm_storage_menu_str, context_storage_handler); cm_add(windows_list.window[storage_win].cm_id, cm_dialog_options_str, context_storage_handler); cm_bool_line(windows_list.window[storage_win].cm_id, ELW_CM_MENU_LEN+2, &sort_storage_categories, NULL); cm_bool_line(windows_list.window[storage_win].cm_id, ELW_CM_MENU_LEN+3, &disable_storage_filter, NULL); cm_bool_line(windows_list.window[storage_win].cm_id, ELW_CM_MENU_LEN+4, &autoclose_storage_dialogue, NULL); cm_bool_line(windows_list.window[storage_win].cm_id, ELW_CM_MENU_LEN+5, &auto_select_storage_option, NULL); } else { no_storage=0; for(i = 0; i < no_storage_categories; i++) storage_categories[i].name[0] = to_color_char (c_orange1); show_window(storage_win); select_window(storage_win); vscrollbar_set_pos(storage_win, STORAGE_SCROLLBAR_CATEGORIES, 0); vscrollbar_set_pos(storage_win, STORAGE_SCROLLBAR_ITEMS, 0); } storage_text[0] = '\0'; set_window_name("", ""); }
int click_help_handler(window_info *win, int mx, int my, Uint32 flags) { _Text *t=Page[helppage].T.Next; if(flags&ELW_WHEEL_UP) { vscrollbar_scroll_up(help_win, help_menu_scroll_id); } else if(flags&ELW_WHEEL_DOWN) { vscrollbar_scroll_down(help_win, help_menu_scroll_id); } else { int j = vscrollbar_get_pos(help_win, help_menu_scroll_id); while(t) { int xlen=strlen(t->text)*((t->size)?11:8),ylen=(t->size)?18:15; if(t->ref && mx>(t->x) && mx<(t->x+xlen) && my>(t->y-j) && my<(t->y+ylen-j)) { //changing page int i; for(i=0; i<numpage+1; i++) { if(!xmlStrcasecmp((xmlChar*)Page[i].Name,(xmlChar*)t->ref)) { helppage=i; vscrollbar_set_pos(help_win, help_menu_scroll_id, 0); vscrollbar_set_bar_len(help_win, help_menu_scroll_id, Page[helppage].max_y); break; } } break; } t=t->Next; } } return 1; }
/* callback for options window to change the number of recipe entries */ void change_num_recipe_entries(int * var, int value) { if ((value >= 0) && (value < max_num_recipe_entries)) *var = value; else return; if (!recipes_loaded) return; /* never reduce the allocated memory so we can reduce and increase while keeping recipes */ if (wanted_num_recipe_entries > max_prev_num_recipe_entries) { recipes_store = (recipe_entry *)realloc(recipes_store, wanted_num_recipe_entries * sizeof(recipe_entry)); memset(&recipes_store[max_prev_num_recipe_entries], 0, sizeof(recipe_entry)*(wanted_num_recipe_entries-max_prev_num_recipe_entries)); max_prev_num_recipe_entries = wanted_num_recipe_entries; } num_recipe_entries = wanted_num_recipe_entries; /* keep current recipe in range */ if (cur_recipe >= num_recipe_entries) cur_recipe = num_recipe_entries - 1; /* resize the window if its now too big for the number of recipes */ if (num_displayed_recipes > num_recipe_entries) { num_displayed_recipes = num_recipe_entries; resize_window(recipe_win, recipe_win_width, num_displayed_recipes*SLOT_SIZE); } /* reset the scroll length and position to show the new slot */ vscrollbar_set_bar_len(recipe_win, recipe_win_scroll_id, num_recipe_entries - num_displayed_recipes); vscrollbar_set_pos(recipe_win, recipe_win_scroll_id, num_recipe_entries - num_displayed_recipes); }
static void scroll_to_note_button(int nr) { int pos = vscrollbar_get_pos (main_note_tab_id, note_button_scroll_id); int max_nr_rows = note_button_scroll_height / (note_button_height + note_button_y_space); int row = nr / 2; if (row < pos) { vscrollbar_set_pos (main_note_tab_id, note_button_scroll_id, row); note_button_scroll_handler (); } else if (row >= pos + max_nr_rows) { vscrollbar_set_pos (main_note_tab_id, note_button_scroll_id, row - max_nr_rows + 1); note_button_scroll_handler (); } }
/* Handle options selected from the main context menu */ static int cm_encycl_handler(window_info *win, int widget_id, int mx, int my, int option) { switch (option) { case CM_ENCYCL_INDEX: currentpage = page_index[ENCYCLT_ENCYC]; vscrollbar_set_pos(encyclopedia_win, encyclopedia_scroll_id, 0); vscrollbar_set_bar_len(encyclopedia_win, encyclopedia_scroll_id, Page[currentpage].max_y); break; case CM_ENCYCL_SEARCH: close_ipu(&ipu_encycl); init_ipu(&ipu_encycl, encyclopedia_win, DEFAULT_FONT_X_LEN * 20, -1, 40, 1, NULL, find_page_callback); ipu_encycl.x = mx; ipu_encycl.y = my; display_popup_win(&ipu_encycl, encycl_search_propmt); if (ipu_encycl.popup_win >=0 && ipu_encycl.popup_win<windows_list.num_windows) windows_list.window[ipu_encycl.popup_win].opaque = 1; break; case CM_ENCYCL_REPSEARCH: if (last_search != NULL) repeat_search = 1; break; case CM_ENCYCL_BOOKMARK: if (num_bookmarks < MAX_BOOKMARKS) { size_t i; for (i=0; i<num_page_links; i++) if(!xmlStrcasecmp((xmlChar*)Page[currentpage].Name,(xmlChar*)page_links[i].link)) { book_marks[num_bookmarks++] = i; rebuild_cm_encycl(); break; } } break; case CM_ENCYCL_UNBOOKMARK: { size_t i; size_t index = get_page_bookmark_index(); if (index < MAX_BOOKMARKS) { for (i=index+1; i<num_bookmarks; i++) book_marks[i-1] = book_marks[i]; num_bookmarks--; rebuild_cm_encycl(); } break; } case CM_ENCYCL_CLEARBOOKMARKS: num_bookmarks = 0; rebuild_cm_encycl(); break; default: open_page(book_marks[option-CM_ENCYCL_THEBOOKMARKS]); } return 1; }
// Move the names list to make the select list visible // void List_Window::make_active_visable(void) { const size_t top_entry = vscrollbar_get_pos (win_id, names_scroll_id); int new_pos = top_entry; if (Vars::lists()->get_active()<top_entry) new_pos = Vars::lists()->get_active(); else if (Vars::lists()->get_active()>=(top_entry+num_show_names_list)) new_pos = Vars::lists()->get_active() - (num_show_names_list - 1); else return; vscrollbar_set_pos(win_id, names_scroll_id, new_pos); }
//CLICK HANDLERS static int recipe_dropdown_click_handler(window_info *win, int mx, int my, Uint32 flags){ static int last_clicked=0; static int last_recipe=0; int first_displayed_recipe = vscrollbar_get_pos (win->window_id, recipe_win_scroll_id); int rel_curr; if (flags & ELW_WHEEL_UP) { cur_recipe=(cur_recipe-1+num_recipe_entries)%num_recipe_entries; rel_curr = cur_recipe - first_displayed_recipe; if ((rel_curr < 0) || (rel_curr >= num_displayed_recipes)) vscrollbar_set_pos(win->window_id, recipe_win_scroll_id, cur_recipe); } else if (flags & ELW_WHEEL_DOWN) { cur_recipe=(cur_recipe+1)%num_recipe_entries; rel_curr = cur_recipe - first_displayed_recipe; if ((rel_curr < 0) || (rel_curr >= num_displayed_recipes)) { first_displayed_recipe = cur_recipe; if (cur_recipe > 0) first_displayed_recipe -= num_displayed_recipes - 1; vscrollbar_set_pos(win->window_id, recipe_win_scroll_id, first_displayed_recipe); } } else { //normal click select_window(recipe_win); cur_recipe=first_displayed_recipe + my/(SLOT_SIZE+1); //double click on the same recipe to select it and close the dropdown if ( ((SDL_GetTicks() - last_clicked) < 400)&& last_recipe==cur_recipe) select_recipe(cur_recipe); last_clicked = SDL_GetTicks(); do_click_sound(); } last_recipe = cur_recipe; return 1; }
/* Find the specified page then open it. */ static void open_page(size_t index) { size_t i; if (index>=num_page_links) return; for (i=0; i<numpage; ++i) if(!xmlStrcasecmp((xmlChar*)Page[i].Name,(xmlChar*)page_links[index].link)) { currentpage = i; vscrollbar_set_pos(encyclopedia_win, encyclopedia_scroll_id, 0); vscrollbar_set_bar_len(encyclopedia_win, encyclopedia_scroll_id, Page[currentpage].max_y); return; } fprintf(stderr, "Weird, open_page(%lu) not found. [%s]\n", (unsigned long)index, page_links[index].title); }
/* key presses in the window used for a recipe name search string */ static int keypress_recipe_handler(window_info *win, int mx, int my, Uint32 key, Uint32 unikey) { char keychar = tolower(key_to_char(unikey)); last_recipe_key_time = SDL_GetTicks(); if ((keychar == SDLK_RETURN) && (key & ELW_CTRL)) { select_recipe(cur_recipe); return 1; } if ((keychar == '`') || (key & ELW_CTRL) || (key & ELW_ALT)) return 0; if (keychar == SDLK_ESCAPE) { clear_recipe_filter(); return 1; } if (string_input(recipe_name_filter, sizeof(recipe_name_filter), keychar) || (keychar == SDLK_RETURN)) { if (strlen(recipe_name_filter)) { size_t i; for (i=cur_recipe+1; i<cur_recipe+num_recipe_entries; i++) { size_t check = i % num_recipe_entries; if (recipes_store[check].name != NULL && safe_strcasestr(recipes_store[check].name, strlen(recipes_store[check].name), recipe_name_filter, strlen(recipe_name_filter)) != NULL) { /* have matching name so set as the current and make sure visible */ int first_displayed_recipe = vscrollbar_get_pos (win->window_id, recipe_win_scroll_id); int new_pos = first_displayed_recipe; cur_recipe = check; if (cur_recipe < first_displayed_recipe) new_pos = cur_recipe; else if (cur_recipe >= (first_displayed_recipe+num_displayed_recipes)) new_pos = cur_recipe - (num_displayed_recipes - 1); else break; vscrollbar_set_pos(win->window_id, recipe_win_scroll_id, new_pos); break; } } } return 1; } return 0; }
int click_encyclopedia_handler(window_info *win, int mx, int my, Uint32 flags) { _Text *t=Page[currentpage].T.Next; if(flags&ELW_WHEEL_UP) { vscrollbar_scroll_up(encyclopedia_win, encyclopedia_scroll_id); } else if(flags&ELW_WHEEL_DOWN) { vscrollbar_scroll_down(encyclopedia_win, encyclopedia_scroll_id); } else { int j = vscrollbar_get_pos(encyclopedia_win, encyclopedia_scroll_id); while(t){ int xlen=strlen(t->text)*((t->size)?11:8),ylen=(t->size)?18:15; if(t->ref && mx>(t->x) && mx<(t->x+xlen) && my>(t->y-j) && my<(t->y+ylen-j)){ // check if its a webpage if (!strncasecmp(t->ref, "http://", 7)) { open_web_link(t->ref); } else { //changing page int i; for(i=0;i<numpage+1;i++){ if(!xmlStrcasecmp((xmlChar*)Page[i].Name,(xmlChar*)t->ref)){ currentpage=i; vscrollbar_set_pos(encyclopedia_win, encyclopedia_scroll_id, 0); vscrollbar_set_bar_len(encyclopedia_win, encyclopedia_scroll_id, Page[currentpage].max_y); break; } } } break; } t=t->Next; } } return 1; }
void get_storage_items (const Uint8 *in_data, int len) { int i; int cat, pos; int idx; int plen; if (item_uid_enabled) plen=10; else plen=8; if (in_data[0] == 255) { // It's just an update - make sure we're in the right category idx = 2; active_storage_item = SDL_SwapLE16(*((Uint16*)(&in_data[idx+6]))); for (i = 0; i < STORAGE_ITEMS_SIZE; i++) { if ((storage_items[i].pos == SDL_SwapLE16(*((Uint16*)(&in_data[idx+6])))) && (storage_items[i].quantity > 0)) { storage_items[i].image_id = SDL_SwapLE16(*((Uint16*)(&in_data[idx]))); storage_items[i].quantity = SDL_SwapLE32(*((Uint32*)(&in_data[idx+2]))); if (item_uid_enabled) storage_items[i].id = SDL_SwapLE16(*((Uint16*)(&in_data[idx+8]))); else storage_items[i].id = unset_item_uid; return; } } for (i = 0; i < STORAGE_ITEMS_SIZE; i++) { if (storage_items[i].quantity == 0) { if (item_uid_enabled) storage_items[i].id = SDL_SwapLE16(*((Uint16*)(&in_data[idx+8]))); else storage_items[i].id = unset_item_uid; storage_items[i].pos = SDL_SwapLE16(*((Uint16*)(&in_data[idx+6]))); storage_items[i].image_id = SDL_SwapLE16(*((Uint16*)(&in_data[idx]))); storage_items[i].quantity = SDL_SwapLE32(*((Uint32*)(&in_data[idx+2]))); no_storage++; return; } } } no_storage = (len - 2) / plen; cat = find_category(in_data[1]); if (cat >= 0) { storage_categories[cat].name[0] = to_color_char (c_red3); if (selected_category != -1 && cat != selected_category) storage_categories[selected_category].name[0] = to_color_char (c_orange1); set_window_name(" - ", storage_categories[cat].name+1); selected_category = cat; } idx = 2; for (i = 0; i < no_storage && i < STORAGE_ITEMS_SIZE; i++, idx += plen) { storage_items[i].image_id = SDL_SwapLE16(*((Uint16*)(&in_data[idx]))); storage_items[i].quantity = SDL_SwapLE32(*((Uint32*)(&in_data[idx+2]))); storage_items[i].pos = SDL_SwapLE16(*((Uint16*)(&in_data[idx+6]))); if (item_uid_enabled) storage_items[i].id = SDL_SwapLE16(*((Uint16*)(&in_data[idx+8]))); else storage_items[i].id = unset_item_uid; } for ( ; i < STORAGE_ITEMS_SIZE; i++) { storage_items[i].quantity=0; } vscrollbar_set_pos(storage_win, STORAGE_SCROLLBAR_ITEMS, 0); pos = vscrollbar_get_pos(storage_win, STORAGE_SCROLLBAR_CATEGORIES); if (cat < pos) { vscrollbar_set_pos(storage_win, STORAGE_SCROLLBAR_CATEGORIES, cat); } else if (cat >= pos + STORAGE_CATEGORIES_DISPLAY) { vscrollbar_set_pos(storage_win, STORAGE_SCROLLBAR_CATEGORIES, cat - STORAGE_CATEGORIES_DISPLAY + 1); } if (selected_category != -1) category_updated(); }