#[derive(Clone, Default, PartialEq, Eq, Debug)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "serde", serde(default))]
pub struct RailOrder {
pub order: Vec<String>,
pub hidden: Vec<String>,
}
#[derive(Clone, Debug)]
pub(crate) struct RailEntry {
pub key: &'static str,
pub icon: egui::ImageSource<'static>,
pub label: &'static str,
pub shown: bool,
}
fn published_id() -> egui::Id {
egui::Id::unique("corundum_rail_entries")
}
fn request_id() -> egui::Id {
egui::Id::unique("corundum_rail_request")
}
pub(crate) fn publish(ctx: &egui::Context, entries: Vec<RailEntry>) {
ctx.data_mut(|d| d.insert_temp(published_id(), entries));
}
pub(crate) fn published(ctx: &egui::Context) -> Option<Vec<RailEntry>> {
ctx.data(|d| d.get_temp(published_id()))
}
pub(crate) fn request(ctx: &egui::Context, order: RailOrder) {
ctx.data_mut(|d| d.insert_temp(request_id(), order));
ctx.request_repaint();
}
pub(crate) fn take_request(ctx: &egui::Context) -> Option<RailOrder> {
ctx.data_mut(|d| d.remove_temp(request_id()))
}
pub(crate) fn move_to<T>(items: &mut Vec<T>, from: usize, to: usize, after: bool) -> bool {
let mut at = to + usize::from(after);
if from < at {
at -= 1;
}
if at == from {
return false;
}
let item = items.remove(from);
items.insert(at, item);
true
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn move_to_puts_it_before_or_after() {
let mut v = vec!['a', 'b', 'c', 'd'];
assert!(move_to(&mut v, 0, 2, true));
assert_eq!(v, ['b', 'c', 'a', 'd']);
assert!(move_to(&mut v, 3, 0, false));
assert_eq!(v, ['d', 'b', 'c', 'a']);
assert!(!move_to(&mut v, 1, 1, false), "onto itself");
assert!(!move_to(&mut v, 1, 0, true), "already after it");
assert!(!move_to(&mut v, 1, 2, false), "already before it");
}
#[test]
fn a_request_is_taken_once() {
let ctx = egui::Context::default();
assert_eq!(take_request(&ctx), None);
let order = RailOrder {
order: vec!["a".into()],
hidden: vec![],
};
request(&ctx, order.clone());
assert_eq!(take_request(&ctx), Some(order));
assert_eq!(take_request(&ctx), None);
}
}