use super::control_builder::ControlBuilder;
use crate::parameter_parser::*;
use proc_macro::*;
static FLAGS: FlagsSignature = FlagsSignature::new(&[
"ScrollBars",
"SearchBar",
"CheckBoxes",
"ShowGroups",
"SmallIcons",
"LargeIcons",
"CustomFilter",
"NoSelection",
]);
static VIEW_MODES: FlagsSignature = FlagsSignature::new(&[
"Details",
"Columns(1)",
"Columns(2)",
"Columns(3)",
"Columns(4)",
"Columns(5)",
"Columns(6)",
"Columns(7)",
"Columns(8)",
"Columns(9)",
"Columns(10)",
]);
static POSILITIONAL_PARAMETERS: &[PositionalParameter] = &[PositionalParameter::new("type", ParamType::String)];
static NAMED_PARAMETERS: &[NamedParameter] = &[
NamedParameter::new("type", "type", ParamType::String),
NamedParameter::new("class", "type", ParamType::String),
NamedParameter::new("columns", "columns", ParamType::List),
NamedParameter::new("view", "view", ParamType::String),
NamedParameter::new("viewmode", "view", ParamType::String),
NamedParameter::new("vm", "view", ParamType::String),
NamedParameter::new("flags", "flags", ParamType::Flags),
NamedParameter::new("left-scroll-margin", "lsm", ParamType::Integer),
NamedParameter::new("lsm", "lsm", ParamType::Integer),
NamedParameter::new("top-scroll-margin", "tsm", ParamType::Integer),
NamedParameter::new("tsm", "tsm", ParamType::Integer),
];
pub(crate) fn create(input: TokenStream) -> TokenStream {
let mut cb = ControlBuilder::new("listvew", input, POSILITIONAL_PARAMETERS, NAMED_PARAMETERS, true);
cb.init_control_with_template("ListView", "new", "type");
cb.add_layout();
cb.add_flags_parameter("flags", "listview::Flags", &FLAGS);
cb.finish_control_initialization();
cb.add_scroll_margin_setup("lsm", "tsm");
if cb.has_parameter("view") {
cb.add("control.set_view_mode(");
cb.add_enum_parameter("view", "listview::ViewMode", &VIEW_MODES, Some("Details"));
cb.add(");\n");
}
if cb.has_parameter("columns") {
let mut s = String::with_capacity(256);
let mut temp_s = String::with_capacity(64);
if let Some(list) = cb.get_list("columns") {
for item in list.iter_mut() {
temp_s.clear();
temp_s.push_str(item.get_string());
if let Some(d) = item.get_dict() {
let res = crate::column::builder::create_from_dict(&temp_s, d);
s.push_str("control.add_column(");
s.push_str(&res);
s.push_str(");\n");
} else {
panic!("A column must be descipted between brackets: {{ and }}. For example: `{{Name,10,Left}}` !");
}
}
} else {
panic!("Parameter `columns` in listview must contains a list a columns: columns=[{{...}},{{...}},{{...}}] !");
}
cb.add_line(&s);
}
cb.add_basecontrol_operations();
cb.into()
}