コード例 #1
0
	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);
	}