tk 0.1.10

Rust bindings for Tk GUI library
use std::collections::HashMap;

use tk::*;
use tk::cmd::*;

fn main() -> TkResult<()> {
    let tk = make_tk!()?;
    let root = tk.root();

    let c = root.add_ttk_frame( "c" -padding((3,3,12,12)) )?;
    c.add_ttk_frame( "f" -borderwidth(5) -relief("ridge") -width(200) -height(100) )?;
    let c_namelbl = c.add_ttk_label( "namelbl" -text("Name") )?;
    c.add_ttk_entry( "name" )?;
    c.add_ttk_checkbutton( "one"   -text("One")   -variable("one")   -onvalue(1) )?; tk.set( "one"  , 1 );
    c.add_ttk_checkbutton( "two"   -text("Two")   -variable("two")   -onvalue(1) )?; tk.set( "two"  , 0 );
    c.add_ttk_checkbutton( "three" -text("Three") -variable("three") -onvalue(1) )?; tk.set( "three", 1 );
    c.add_ttk_button( "ok" -text("Okay") )?;
    c.add_ttk_button( "cancel" -text("Cancel") )?;

    tk.grid( ".c"         -column(0) -row(0) -sticky("nsew") )?;
    tk.grid( ".c.f"       -column(0) -row(0) -columnspan(3) -rowspan(2) -sticky("nsew") )?;
    tk.grid( ".c.namelbl" -column(3) -row(0) -columnspan(2)             -sticky("nw")  -padx(5) )?;
    tk.grid( ".c.name"    -column(3) -row(1) -columnspan(2)             -sticky("new") -padx(5) -pady(5) )?;
    tk.grid( ".c.one"     -column(0) -row(3) )?;
    tk.grid( ".c.two"     -column(1) -row(3) )?;
    tk.grid( ".c.three"   -column(2) -row(3) )?;
    tk.grid( ".c.ok"      -column(3) -row(3) )?;
    tk.grid( ".c.cancel"  -column(4) -row(3) )?;

    root.grid_columnconfigure( 0, -weight(1) )?;
    root.grid_rowconfigure(    0, -weight(1) )?;
    c.grid_columnconfigure(    0, -weight(3) )?;
    c.grid_columnconfigure(    1, -weight(3) )?;
    c.grid_columnconfigure(    2, -weight(3) )?;
    c.grid_columnconfigure(    3, -weight(1) )?;
    c.grid_columnconfigure(    4, -weight(1) )?;
    c.grid_rowconfigure(       1, -weight(1) )?;

    let got = c.grid_slaves(())?;
    let got = got
        .iter()
        .map( |widget| widget.path() )
        .collect::<Vec<_>>();
    let expected = vec![ ".c.cancel", ".c.ok", ".c.three", ".c.two", ".c.one", ".c.name", ".c.namelbl", ".c.f" ]
        .into_iter()
        .collect::<Vec<_>>();
    assert_eq!( got, expected );

    let got = c.grid_slaves( -row(3) )?;
    let got = got
        .iter()
        .map( |widget| widget.path() )
        .collect::<Vec<_>>();
    let expected = vec![ ".c.cancel", ".c.ok", ".c.three", ".c.two", ".c.one" ]
        .into_iter()
        .collect::<Vec<_>>();
    assert_eq!( got, expected );

    let got = c.grid_slaves( -column(0) )?;
    let got = got
        .iter()
        .map( |widget| widget.path() )
        .collect::<Vec<_>>();
    let expected = vec![ ".c.one", ".c.f" ]
        .into_iter()
        .collect::<Vec<_>>();
    assert_eq!( got, expected );

    let got = c_namelbl.grid_info()?
        .into_iter()
        .map( |(key, val)| (key, val.get_string() ))
        .collect::<HashMap<_,_>>();

    let mut expected = HashMap::new();

    expected.insert( "-in"        .to_owned(), ".c".to_owned() );
    expected.insert( "-column"    .to_owned(), "3" .to_owned() );
    expected.insert( "-row"       .to_owned(), "0" .to_owned() );
    expected.insert( "-columnspan".to_owned(), "2" .to_owned() );
    expected.insert( "-rowspan"   .to_owned(), "1" .to_owned() );
    expected.insert( "-ipadx"     .to_owned(), "0" .to_owned() );
    expected.insert( "-ipady"     .to_owned(), "0" .to_owned() );
    expected.insert( "-padx"      .to_owned(), "5" .to_owned() );
    expected.insert( "-pady"      .to_owned(), "0" .to_owned() );
    expected.insert( "-sticky"    .to_owned(), "nw".to_owned() );

    assert_eq!( got, expected );

    c_namelbl.grid_configure( -sticky("ew") )?;

    let got = c_namelbl.grid_info()?
        .into_iter()
        .map( |(key, val)| (key, val.get_string() ))
        .collect::<HashMap<_,_>>();

    let mut expected = HashMap::new();

    expected.insert( "-in"        .to_owned(), ".c".to_owned() );
    expected.insert( "-column"    .to_owned(), "3" .to_owned() );
    expected.insert( "-row"       .to_owned(), "0" .to_owned() );
    expected.insert( "-columnspan".to_owned(), "2" .to_owned() );
    expected.insert( "-rowspan"   .to_owned(), "1" .to_owned() );
    expected.insert( "-ipadx"     .to_owned(), "0" .to_owned() );
    expected.insert( "-ipady"     .to_owned(), "0" .to_owned() );
    expected.insert( "-padx"      .to_owned(), "5" .to_owned() );
    expected.insert( "-pady"      .to_owned(), "0" .to_owned() );
    expected.insert( "-sticky"    .to_owned(), "ew".to_owned() );

    assert_eq!( got, expected );

    Ok( main_loop() )
}