void gui_element::draw_cursor_with_information(vertex_triangle_buffer& output_buffer, const viewing_gui_context& context) const { auto gui_cursor = assets::texture_id::GUI_CURSOR; auto gui_cursor_color = cyan; auto gui_cursor_position = get_gui_crosshair_position(); auto get_tooltip_position = [&]() { return get_gui_crosshair_position() + (*gui_cursor).get_size(); }; auto draw_cursor_hint = [&output_buffer, this](const auto& hint_text, const vec2i cursor_position, const vec2i cursor_size) { vec2i bg_sprite_size; augs::gui::text_drawer drop_hint_drawer; drop_hint_drawer.set_text(gui::text::format(std::wstring(hint_text), gui::text::style())); bg_sprite_size.set(drop_hint_drawer.get_bbox()); bg_sprite_size.y = std::max(cursor_size.y, drop_hint_drawer.get_bbox().y); bg_sprite_size.x += cursor_size.x; const auto hint_rect = ltrbi(cursor_position, bg_sprite_size).snap_to_bounds(ltrbi(vec2i(0, 0), get_screen_size())); augs::draw_rect_with_border( output_buffer, hint_rect, { 0, 0, 0, 120 }, slightly_visible_white ); drop_hint_drawer.pos = hint_rect.get_position() + vec2i(cursor_size.x + 2, 0); drop_hint_drawer.draw_stroke(output_buffer, black); drop_hint_drawer.draw(output_buffer); return hint_rect.get_position(); }; const auto& rect_world = context.get_rect_world(); const bool is_dragging = rect_world.is_currently_dragging(); if (!is_dragging) { if (context.alive(rect_world.rect_hovered)) { gui_cursor = assets::texture_id::GUI_CURSOR_HOVER; } draw_tooltip_from_hover_or_world_highlight(output_buffer, context, get_tooltip_position()); } else { const auto drag_result = prepare_drag_and_drop_result(context, rect_world.rect_held_by_lmb, rect_world.rect_hovered); if (drag_result.is<unfinished_drag_of_item>()) { const auto& dragged_item_button = context.dereference_location(item_button_in_item{ drag_result.get<unfinished_drag_of_item>().item_id }); dragged_item_button->draw_complete_dragged_ghost(context, dragged_item_button, output_buffer); dragged_item_button->draw_grid_border_ghost(context, dragged_item_button, output_buffer); auto& item = context.get_step().get_cosmos()[dragged_item_button.get_location().item_id].get<components::item>(); if (item.charges > 1) { const auto gui_cursor_size = (*gui_cursor).get_size(); auto charges_text = to_wstring(dragged_charges); augs::gui::text_drawer dragged_charges_drawer; dragged_charges_drawer.set_text(augs::gui::text::format(charges_text, text::style())); dragged_charges_drawer.pos = get_gui_crosshair_position() + vec2i(0, int(gui_cursor_size.y)); dragged_charges_drawer.draw_stroke(output_buffer, black); dragged_charges_drawer.draw(output_buffer); } } else if (drag_result.is<drop_for_hotbar_assignment>()) { const auto& transfer_data = drag_result.get<drop_for_hotbar_assignment>(); const auto& dragged_item_button = context.dereference_location(item_button_in_item{ transfer_data.item_id }); dragged_item_button->draw_complete_dragged_ghost(context, dragged_item_button, output_buffer); gui_cursor = assets::texture_id::GUI_CURSOR_ADD; gui_cursor_color = green; gui_cursor_position = draw_cursor_hint(transfer_data.hint_text, get_gui_crosshair_position(), (*gui_cursor).get_size()); } else if (drag_result.is<drop_for_item_slot_transfer>()) { const auto& transfer_data = drag_result.get<drop_for_item_slot_transfer>(); const auto& dragged_item_button = context.dereference_location(item_button_in_item{ transfer_data.simulated_transfer.item }); dragged_item_button->draw_complete_dragged_ghost(context, dragged_item_button, output_buffer); const auto& transfer_result = transfer_data.result.result; if (transfer_result == item_transfer_result_type::SUCCESSFUL_DROP) { gui_cursor = assets::texture_id::GUI_CURSOR_MINUS; gui_cursor_color = red; } else if (transfer_result == item_transfer_result_type::SUCCESSFUL_TRANSFER) { gui_cursor = assets::texture_id::GUI_CURSOR_ADD; gui_cursor_color = green; } else if (transfer_result != item_transfer_result_type::THE_SAME_SLOT) { gui_cursor = assets::texture_id::GUI_CURSOR_ERROR; gui_cursor_color = red; } gui_cursor_position = draw_cursor_hint(transfer_data.hint_text, get_gui_crosshair_position(), (*gui_cursor).get_size()); } } augs::draw_rect(output_buffer, gui_cursor_position, gui_cursor, gui_cursor_color); }