egui_dnd 0.15.0

A drag and drop library for egui
Documentation
use eframe::{egui, NativeOptions};
use egui::{CentralPanel, Id, ScrollArea};
use egui_dnd::dnd;
use egui_infinite_scroll::InfiniteScroll;

pub fn main() -> eframe::Result<()> {
    let mut infinite_scroll = InfiniteScroll::new().end_loader(|cursor, callback| {
        let start = cursor.unwrap_or(0);
        let end = start + 100;
        callback(Ok(((start..end).collect(), Some(end))));
    });

    eframe::run_ui_native(
        "DnD Infinite Scroll Example",
        NativeOptions::default(),
        move |ui, _frame| {
            CentralPanel::default().show_inside(ui, |ui| {
                ScrollArea::vertical().show(ui, |ui| {
                    let response = dnd(ui, "dnd").show_custom(|ui, iter| {
                        infinite_scroll.ui(ui, 10, |ui, index, item| {
                            iter.next(ui, Id::new(*item), index, true, |ui, item_handle| {
                                item_handle.ui(ui, |ui, handle, state| {
                                    ui.horizontal(|ui| {
                                        handle.ui(ui, |ui| {
                                            if state.dragged {
                                                ui.label("dragging");
                                            } else {
                                                ui.label("drag");
                                            }
                                        });
                                        ui.label(format!("Item {item}"));
                                    });
                                })
                            });
                        });
                    });

                    response.update_vec(&mut infinite_scroll.items);
                });
            });
        },
    )
}