use eframe::egui;
use nord_usb::{Location, ObjectClass};
use super::drag::{Held, Item, Kind, Onto};
use super::Browser;
use crate::device::Device;
use crate::queue::Queue;
use crate::tabs::Tabs;
use crate::workspace::Workspace;
pub(in crate::browser) const CARRIED: u64 = 1;
pub(in crate::browser) fn local(kind: Kind) -> Held {
Held {
what: Item::Local(CARRIED),
kind,
filed: None,
fits: true,
}
}
pub(in crate::browser) fn slot(class: ObjectClass, bank: u32, slot: u32) -> Held {
Held {
what: Item::Slot {
class,
at: Location { bank, slot },
},
kind: Kind::from_class(class),
filed: None,
fits: true,
}
}
pub(in crate::browser) fn onto(class: ObjectClass, bank: u32, at: u32) -> Onto {
Onto::Slot {
class,
at: Location { bank, slot: at },
}
}
pub(in crate::browser) fn context() -> egui::Context {
let ctx = egui::Context::default();
ctx.all_styles_mut(crate::app::metrics);
ctx
}
pub(crate) fn galleys(output: &egui::FullOutput) -> Vec<std::sync::Arc<egui::Galley>> {
fn walk(shape: &egui::Shape, into: &mut Vec<std::sync::Arc<egui::Galley>>) {
match shape {
egui::Shape::Text(text) => into.push(text.galley.clone()),
egui::Shape::Vec(shapes) => shapes.iter().for_each(|shape| walk(shape, into)),
_ => {}
}
}
let mut painted = Vec::new();
for clipped in &output.shapes {
walk(&clipped.shape, &mut painted);
}
painted
}
pub(crate) fn words(output: &egui::FullOutput) -> Vec<String> {
galleys(output)
.iter()
.map(|galley| galley.text().to_string())
.collect()
}
pub(in crate::browser) fn bench() -> (Browser, Workspace, Device, Tabs, Queue, crate::log::Log) {
let ctx = context();
(
Browser::default(),
Workspace::new(ctx.clone()),
Device::new(ctx),
Tabs::default(),
Queue::default(),
crate::log::Log::default(),
)
}