static void listbox_layout(widget_t* w) { int i; listbox_t* l = widget_get_instance_data(w); int visible_items = num_visible_items(w); for (i = 0; i < widget_num_children(w); ++i) { int visible_index = i - l->pos; widget_t* child = widget_get_child(w, i); if (visible_index >= 0 && visible_index < visible_items) { rect_t child_rect = widget_get_rect(child); child_rect.y = (visible_index * l->item_height) + ((l->item_height - child_rect.height) / 2); widget_set_rect(child, child_rect); widget_show(child); } else { widget_hide(child); } } widget_enable(l->up_button, (l->pos > 0)); widget_enable(l->dn_button, (l->pos < (widget_num_children(w) - visible_items))); }
bool editor_palette<Item>::scroll_up() { int decrement = item_width_; if (items_start_ + num_visible_items() == num_items() && num_items() % item_width_ != 0) { decrement = num_items() % item_width_; } if(items_start_ >= decrement) { items_start_ -= decrement; draw(); return true; } return false; }
static void down_button_event(button_event_t* event) { widget_t* lb = widget_get_parent(event->widget); listbox_t* l = widget_get_instance_data(lb); if (event->id == EVT_BUTTON_CLICK || event->id == EVT_BUTTON_REPEAT) { if (l->pos < widget_num_children(l->item_container) - num_visible_items(lb)) { l->pos++; widget_invalidate(l->item_container); } } }
void editor_palette<Item>::adjust_size(const SDL_Rect& target) { palette_x_ = target.x; palette_y_ = target.y; const int space_for_items = target.h; const int items_fitting = (space_for_items / item_space_) * item_width_; nitems_ = std::min(items_fitting, nmax_items_); if (num_visible_items() != nitems_) { buttons_.resize(nitems_, gui::tristate_button(gui_.video(), this)); } set_location(target); set_dirty(true); gui_.video().clear_help_string(help_handle_); help_handle_ = gui_.video().set_help_string(get_help_string()); }
void editor_palette<Item>::draw_contents() { toolkit_.set_mouseover_overlay(gui_); std::shared_ptr<gui::button> palette_menu_button = gui_.find_menu_button("menu-editor-terrain"); if (palette_menu_button) { t_string& name = groups_[active_group_index()].name; std::string& icon = groups_[active_group_index()].icon; palette_menu_button->set_tooltip_string(name); palette_menu_button->set_overlay(icon); } unsigned int y = palette_y_; unsigned int x = palette_x_; int starting = items_start_; int ending = std::min<int>(starting + nitems_, num_items()); std::shared_ptr<gui::button> upscroll_button = gui_.find_action_button("upscroll-button-editor"); if (upscroll_button) upscroll_button->enable(starting != 0); std::shared_ptr<gui::button> downscroll_button = gui_.find_action_button("downscroll-button-editor"); if (downscroll_button) downscroll_button->enable(ending != num_items()); int counter = starting; for (int i = 0, size = num_visible_items(); i < size ; ++i) { //TODO check if the conditions still hold for the counter variable //for (unsigned int counter = starting; counter < ending; counter++) gui::tristate_button& tile = buttons_[i]; tile.hide(true); if (i >= ending) continue; const std::string item_id = active_group()[counter]; //typedef std::map<std::string, Item> item_map_wurscht; typename item_map::iterator item = item_map_.find(item_id); surface item_image(nullptr); std::stringstream tooltip_text; draw_item((*item).second, item_image, tooltip_text); bool is_core = non_core_items_.find(get_id((*item).second)) == non_core_items_.end(); if (!is_core) { tooltip_text << " " << font::span_color(font::BAD_COLOR) << _("(non-core)") << "\n" << _("Will not work in game without extra care.") << "</span>"; } const int counter_from_zero = counter - starting; SDL_Rect dstrect; dstrect.x = x + (counter_from_zero % item_width_) * item_space_; dstrect.y = y; dstrect.w = item_size_ + 2; dstrect.h = item_size_ + 2; tile.set_location(dstrect); tile.set_tooltip_string(tooltip_text.str()); tile.set_item_image(item_image); tile.set_item_id(item_id); // if (get_id((*item).second) == selected_bg_item_ // && get_id((*item).second) == selected_fg_item_) { // tile.set_pressed(gui::tristate_button::BOTH); // } else if (get_id((*item).second) == selected_bg_item_) { // tile.set_pressed(gui::tristate_button::RIGHT); // } else if (get_id((*item).second) == selected_fg_item_) { // tile.set_pressed(gui::tristate_button::LEFT); // } else { // tile.set_pressed(gui::tristate_button::NONE); // } if (is_selected_bg_item(get_id(item->second)) && is_selected_fg_item(get_id(item->second))) { tile.set_pressed(gui::tristate_button::BOTH); } else if (is_selected_bg_item(get_id(item->second))) { tile.set_pressed(gui::tristate_button::RIGHT); } else if (is_selected_fg_item(get_id(item->second))) { tile.set_pressed(gui::tristate_button::LEFT); } else { tile.set_pressed(gui::tristate_button::NONE); } tile.set_dirty(true); tile.hide(false); tile.draw(); // Adjust location if (counter_from_zero % item_width_ == item_width_ - 1) y += item_space_; ++counter; } }