use super::grid;
use super::image;
use super::pack;
use super::widget;
use super::wish;
#[derive(Clone, Debug, PartialEq)]
pub struct TkTreeview {
pub id: String,
}
#[derive(Clone, Debug, PartialEq)]
pub struct TkTreeviewItem {
pub treeview: String,
pub id: String,
}
pub fn make_treeview(parent: &impl widget::TkWidget) -> TkTreeview {
let id = wish::next_wid(parent.id());
let msg = format!("ttk::treeview {}", id);
wish::tell_wish(&msg);
TkTreeview { id }
}
impl widget::TkWidget for TkTreeview {
fn id(&self) -> &str {
&self.id
}
}
impl grid::TkGridLayout for TkTreeview {}
impl pack::TkPackLayout for TkTreeview {}
impl TkTreeview {
pub fn columns(&self, columns: &[&str]) {
let mut columns_str = String::new();
for column in columns {
columns_str.push('{');
columns_str.push_str(column);
columns_str.push('}');
columns_str.push(' ');
}
let msg = format!("{} configure -columns {{{}}}", &self.id, columns_str);
wish::tell_wish(&msg);
}
pub fn column_anchor(&self, column: &str, value: widget::Anchor) {
let msg = format!("{} column {} -anchor {}", &self.id, column, value);
wish::tell_wish(&msg);
}
pub fn column_stretch(&self, column: &str, value: bool) {
let msg = format!(
"{} column {} -stretch {}",
&self.id,
column,
if value { "1" } else { "0" }
);
wish::tell_wish(&msg);
}
pub fn column_min_width(&self, column: &str, value: u64) {
let msg = format!("{} column {} -minwidth {}", &self.id, column, value);
wish::tell_wish(&msg);
}
pub fn column_width(&self, column: &str, value: u64) {
let msg = format!("{} column {} -width {}", &self.id, column, value);
wish::tell_wish(&msg);
}
pub fn focus(&self) -> TkTreeviewItem {
let msg = format!("puts [{} focus] ; flush stdout ", &self.id);
let result = wish::ask_wish(&msg);
TkTreeviewItem {
treeview: self.id.clone(),
id: result,
}
}
pub fn heading_text(&self, column: &str, title: &str) {
let msg = format!("{} heading {} -text {{{}}}", &self.id, column, title);
wish::tell_wish(&msg);
}
pub fn heading_image(&self, column: &str, image: &image::TkImage) {
let msg = format!("{} heading {} -image {}", &self.id, column, &image.id);
wish::tell_wish(&msg);
}
pub fn heading_anchor(&self, column: &str, value: widget::Anchor) {
let msg = format!("{} heading {} -anchor {}", &self.id, column, value);
wish::tell_wish(&msg);
}
pub fn height(&self, value: u64) {
widget::configure(&self.id, "height", &value.to_string());
}
pub fn insert_item(&self) -> TkTreeviewItem {
let msg = format!("puts [{} insert {{}} end] ; flush stdout", &self.id);
let result = wish::ask_wish(&msg);
TkTreeviewItem {
treeview: self.id.clone(),
id: result,
}
}
pub fn insert_item_at(&self, index: u64) -> TkTreeviewItem {
let msg = format!("puts [{} insert {{}} {}] ; flush stdout", &self.id, index);
let result = wish::ask_wish(&msg);
TkTreeviewItem {
treeview: self.id.clone(),
id: result,
}
}
pub fn move_item(&self, child: &TkTreeviewItem, parent: &TkTreeviewItem, index: u64) {
let msg = format!("{} move {} {} {}", &self.id, &child.id, &parent.id, index);
wish::tell_wish(&msg);
}
pub fn select_mode(&self, value: widget::Selection) {
widget::configure(&self.id, "selectmode", &value.to_string());
}
pub fn selected_items(&self) -> Vec<TkTreeviewItem> {
let query = format!("puts [{} selection] ; flush stdout", &self.id);
let values = wish::ask_wish(&query);
let mut result: Vec<TkTreeviewItem> = vec![];
for value in values.split_whitespace() {
result.push(TkTreeviewItem {
treeview: self.id.clone(),
id: String::from(value),
});
}
result
}
pub fn show_all(&self) {
widget::configure(&self.id, "show", "tree headings");
}
pub fn show_headings(&self) {
widget::configure(&self.id, "show", "headings");
}
pub fn show_tree(&self) {
widget::configure(&self.id, "show", "tree");
}
pub fn tag_bind(
&self,
tag: &str,
pattern: &str,
command: impl Fn(widget::TkEvent) + Send + 'static,
) {
let tag_pattern = format!("{}{}{}", &self.id, tag, pattern);
wish::add_callback1_event(&tag_pattern, wish::mk_callback1_event(command));
let msg = format!(
"{} tag bind {} {} {{ puts cb1e:{}:%x:%y:%X:%Y:%h:%w:%k:%K:%b ; flush stdout }}",
&self.id, tag, pattern, tag_pattern
);
wish::tell_wish(&msg);
}
pub fn tag_configure(&self, tag: &str, option: &str, value: &str) {
let msg = format!("{} tag configure {} -{} {}", &self.id, tag, option, value);
wish::tell_wish(&msg);
}
pub fn tag_names(&self) -> Vec<String> {
let msg = format!("puts [{} tag names] ; flush stdout", &self.id);
let result = wish::ask_wish(&msg);
wish::split_items(&result)
}
}
impl TkTreeviewItem {
pub fn delete(&self) {
let msg = format!("{} delete {}", &self.treeview, &self.id);
wish::tell_wish(&msg);
}
pub fn text(&self, value: &str) {
let msg = format!("{} item {} -text {{{}}}", &self.treeview, &self.id, value);
wish::tell_wish(&msg);
}
pub fn image(&self, image: &image::TkImage) {
let msg = format!("{} item {} -image {}", &self.treeview, &self.id, &image.id);
wish::tell_wish(&msg);
}
pub fn values(&self, values: &[&str]) {
let mut values_str = String::new();
for value in values {
values_str.push('{');
values_str.push_str(value);
values_str.push('}');
values_str.push(' ');
}
let msg = format!(
"{} item {} -values {{{}}}",
&self.treeview, &self.id, values_str
);
wish::tell_wish(&msg);
}
pub fn open(&self, value: bool) {
let msg = format!(
"{} item {} -open {}",
&self.treeview,
&self.id,
if value { "1" } else { "0" }
);
wish::tell_wish(&msg);
}
pub fn is_open(&self) -> bool {
let msg = format!(
"puts [{} item {} -open] ; flush stdout",
&self.treeview, &self.id
);
let result = wish::ask_wish(&msg);
result == "1"
}
pub fn insert_item(&self) -> TkTreeviewItem {
let msg = format!(
"puts [{} insert {} end] ; flush stdout ",
&self.treeview, &self.id
);
let result = wish::ask_wish(&msg);
TkTreeviewItem {
treeview: self.treeview.clone(),
id: result,
}
}
pub fn insert_item_at(&self, index: u64) -> TkTreeviewItem {
let msg = format!(
"puts [{} insert {} {}] ; flush stdout",
&self.treeview, &self.id, index
);
let result = wish::ask_wish(&msg);
TkTreeviewItem {
treeview: self.treeview.clone(),
id: result,
}
}
pub fn parent(&self) -> Option<TkTreeviewItem> {
let msg = format!(
"puts [{} parent {}] ; flush stdout",
&self.treeview, &self.id
);
let result = wish::ask_wish(&msg);
if result.is_empty() || result == "{}" {
None
} else {
Some(TkTreeviewItem {
treeview: self.treeview.clone(),
id: result,
})
}
}
pub fn previous(&self) -> Option<TkTreeviewItem> {
let msg = format!("puts [{} prev {}] ; flush stdout", &self.treeview, &self.id);
let result = wish::ask_wish(&msg);
if result.is_empty() || result == "{}" {
None
} else {
Some(TkTreeviewItem {
treeview: self.treeview.clone(),
id: result,
})
}
}
pub fn next(&self) -> Option<TkTreeviewItem> {
let msg = format!("puts [{} next {}] ; flush stdout", &self.treeview, &self.id);
let result = wish::ask_wish(&msg);
if result.is_empty() || result == "{}" {
None
} else {
Some(TkTreeviewItem {
treeview: self.treeview.clone(),
id: result,
})
}
}
pub fn children(&self) -> Vec<TkTreeviewItem> {
let msg = format!(
"puts [{} children {}] ; flush stdout",
&self.treeview, &self.id
);
let result = wish::ask_wish(&msg);
let mut children: Vec<TkTreeviewItem> = vec![];
for child in result.split_whitespace() {
children.push(TkTreeviewItem {
treeview: self.treeview.clone(),
id: String::from(child),
});
}
children
}
pub fn tag_add(&self, tag: &str) {
let msg = format!("{} tag add {{{}}} {}", &self.treeview, tag, &self.id);
wish::tell_wish(&msg);
}
pub fn tag_has(&self, tag: &str) -> bool {
let msg = format!(
"puts [{} tag has {{{}}} {}] ; flush stdout",
&self.treeview, tag, &self.id
);
let result = wish::ask_wish(&msg);
result == "1"
}
pub fn tag_remove(&self, tag: &str) {
let msg = format!("{} tag remove {{{}}} {}", &self.treeview, tag, &self.id);
wish::tell_wish(&msg);
}
}