use super::grid;
use super::pack;
use super::widget;
use super::wish;
#[derive(Clone, Debug, PartialEq)]
pub struct TkListbox {
pub id: String,
}
pub fn make_listbox(parent: &impl widget::TkWidget, values: &[&str]) -> TkListbox {
let id = wish::next_wid(parent.id());
let msg = format!("listbox {}", id);
wish::tell_wish(&msg);
for value in values {
let msg = format!("{} insert end {{{}}}", id, value);
wish::tell_wish(&msg);
}
let msg = format!("{} selection set 0", id);
wish::tell_wish(&msg);
TkListbox { id }
}
impl widget::TkWidget for TkListbox {
fn id(&self) -> &str {
&self.id
}
}
impl grid::TkGridLayout for TkListbox {}
impl pack::TkPackLayout for TkListbox {}
impl TkListbox {
pub fn append(&self, item: &str) {
let msg = format!("{} insert end {{{}}}", &self.id, item);
wish::tell_wish(&msg);
}
pub fn border_width(&self, width: u64) {
widget::configure(&self.id, "borderwidth", &width.to_string());
}
pub fn delete(&self, index: u64) {
let msg = format!("{} delete {}", &self.id, index);
wish::tell_wish(&msg);
}
pub fn font(&self, definition: &str) {
widget::configure(&self.id, "font", definition);
}
pub fn height(&self, height: u64) {
widget::configure(&self.id, "height", &height.to_string());
}
pub fn insert_at(&self, index: u64, item: &str) {
let msg = format!("{} insert {} {{{}}}", &self.id, index, item);
wish::tell_wish(&msg);
}
pub fn item_configure(&self, index: u64, option: &str, value: &str) {
let msg = format!(
"{} itemconfigure {} -{} {{{}}}",
&self.id, index, option, value
);
wish::tell_wish(&msg);
}
pub fn justify(&self, value: widget::Justify) {
widget::configure(&self.id, "justify", &value.to_string());
}
pub fn relief(&self, value: widget::Relief) {
widget::configure(&self.id, "relief", &value.to_string());
}
pub fn selection_mode(&self, value: widget::Selection) {
let value = if value == widget::Selection::None {
widget::Selection::Single.to_string()
} else {
value.to_string()
};
widget::configure(&self.id, "selectmode", &value);
}
pub fn selected_items(&self) -> Vec<u64> {
let query = format!("puts [{} curselection] ; flush stdout", &self.id);
let values = wish::ask_wish(&query);
let mut result: Vec<u64> = vec![];
for value in values.split_whitespace() {
if let Ok(value) = value.parse::<u64>() {
result.push(value);
}
}
result
}
pub fn state(&self, value: widget::State) {
widget::configure(&self.id, "state", &value.to_string());
}
pub fn width(&self, width: u64) {
widget::configure(&self.id, "width", &width.to_string());
}
}