egui_dnd 0.15.0

A drag and drop library for egui
Documentation
use eframe::NativeOptions;
use egui::{CentralPanel, ScrollArea, Sense};
use std::hash::{Hash, Hasher};

use egui_dnd::dnd;

struct ItemType {
    number: u32,
}

impl Hash for ItemType {
    fn hash<H: Hasher>(&self, state: &mut H) {
        self.number.hash(state);
    }
}

fn main() -> eframe::Result<()> {
    let mut items: Vec<_> = (0..1000).map(|number| ItemType { number }).collect();

    eframe::run_ui_native("dnd scroll demo", NativeOptions::default(), move |ui, _| {
        CentralPanel::default().show_inside(ui, |ui| {
            ScrollArea::vertical().show(ui, |ui| {
                dnd(ui, "dnd").show_vec(&mut items, |ui, item, handle, _dragging| {
                    ui.horizontal(|ui| {
                        let clicked = handle
                            .sense(Sense::click())
                            .ui(ui, |ui| {
                                ui.label("grab");
                            })
                            .clicked();
                        if clicked {
                            println!("clicked {}", item.number);
                        }
                        ui.label(item.number.to_string());
                    });
                });
            })
        });
    })
}