#![allow(non_snake_case)]
#![allow(non_upper_case_globals)]
#![allow(dead_code)]
use std::any::Any;
use crate::ported::functionbar::FunctionBar_newEnterEsc;
use crate::ported::linux::linuxprocess::IOPriority;
use crate::ported::listitem::{ListItem, ListItem_new};
use crate::ported::panel::{
Panel, Panel_add, Panel_getSelected, Panel_new, Panel_setHeader, Panel_setSelected, Panel_size,
};
const IOPRIO_CLASS_RT: i32 = 1;
const IOPRIO_CLASS_BE: i32 = 2;
const IOPRIO_CLASS_SHIFT: i32 = 13;
const IOPriority_None: IOPriority = 0;
const IOPriority_Idle: IOPriority = (3 << IOPRIO_CLASS_SHIFT) | 7;
pub fn IOPriorityPanel_new(currPrio: IOPriority) -> Panel {
let mut this = Panel_new(
1,
1,
1,
1,
Some(FunctionBar_newEnterEsc("Set ", "Cancel ")),
);
Panel_setHeader(&mut this, "IO Priority:");
Panel_add(
&mut this,
Box::new(ListItem_new("None (based on nice)", IOPriority_None)),
);
if currPrio == IOPriority_None {
Panel_setSelected(&mut this, 0);
}
let classes: [(i32, &str); 2] = [
(IOPRIO_CLASS_RT, "Realtime"),
(IOPRIO_CLASS_BE, "Best-effort"),
];
for (klass, class_name) in classes {
for i in 0..8 {
let suffix = if i == 0 {
"(High)"
} else if i == 7 {
"(Low)"
} else {
""
};
let name = format!("{} {} {}", class_name, i, suffix);
let ioprio: IOPriority = (klass << IOPRIO_CLASS_SHIFT) | i;
Panel_add(&mut this, Box::new(ListItem_new(&name, ioprio)));
if currPrio == ioprio {
let n = Panel_size(&this) - 1;
Panel_setSelected(&mut this, n);
}
}
}
Panel_add(&mut this, Box::new(ListItem_new("Idle", IOPriority_Idle)));
if currPrio == IOPriority_Idle {
let n = Panel_size(&this) - 1;
Panel_setSelected(&mut this, n);
}
this
}
pub fn IOPriorityPanel_getIOPriority(this: &Panel) -> IOPriority {
match Panel_getSelected(this) {
Some(selected) => {
let any: &dyn Any = selected;
let li = any
.downcast_ref::<ListItem>()
.expect("IOPriorityPanel_getIOPriority: selected item is not a ListItem");
li.key
}
None => IOPriority_None,
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn new_builds_all_items() {
let p = IOPriorityPanel_new(IOPriority_None);
assert_eq!(Panel_size(&p), 18);
}
#[test]
fn new_selects_none_by_default() {
let p = IOPriorityPanel_new(IOPriority_None);
assert_eq!(p.selected, 0);
assert_eq!(IOPriorityPanel_getIOPriority(&p), IOPriority_None);
}
#[test]
fn new_preselects_matching_class_level() {
let rt3: IOPriority = (IOPRIO_CLASS_RT << IOPRIO_CLASS_SHIFT) | 3;
let p = IOPriorityPanel_new(rt3);
assert_eq!(p.selected, 4);
assert_eq!(IOPriorityPanel_getIOPriority(&p), rt3);
let be0: IOPriority = IOPRIO_CLASS_BE << IOPRIO_CLASS_SHIFT;
let q = IOPriorityPanel_new(be0);
assert_eq!(q.selected, 9);
assert_eq!(IOPriorityPanel_getIOPriority(&q), be0);
}
#[test]
fn new_preselects_idle_last() {
let p = IOPriorityPanel_new(IOPriority_Idle);
assert_eq!(p.selected, 17); assert_eq!(IOPriorityPanel_getIOPriority(&p), IOPriority_Idle);
}
#[test]
fn item_labels_follow_c_format() {
let p = IOPriorityPanel_new(IOPriority_None);
let a: &dyn Any = crate::ported::panel::Panel_get(&p, 1);
assert_eq!(
a.downcast_ref::<ListItem>().unwrap().value,
"Realtime 0 (High)"
);
let b: &dyn Any = crate::ported::panel::Panel_get(&p, 2);
assert_eq!(b.downcast_ref::<ListItem>().unwrap().value, "Realtime 1 ");
let c: &dyn Any = crate::ported::panel::Panel_get(&p, 8);
assert_eq!(
c.downcast_ref::<ListItem>().unwrap().value,
"Realtime 7 (Low)"
);
}
}