grid::grid(const variant& v, game_logic::formula_callable* e) : scrollable_widget(v, e), row_height_(v["row_height"].as_int(0)), selected_row_(-1), allow_selection_(false), must_select_(false), swallow_clicks_(false), hpad_(0), show_background_(false), max_height_(-1), allow_highlight_(true), set_h_(0), set_w_(0), default_selection_(v["default_select"].as_int(-1)), draw_selection_highlight_(v["draw_selection_highlighted"].as_bool(false)) { ASSERT_LOG(get_environment() != 0, "You must specify a callable environment"); if(v.has_key("on_select")) { const variant on_select_value = v["on_select"]; if(on_select_value.is_function()) { ASSERT_LOG(on_select_value.min_function_arguments() <= 1 && on_select_value.max_function_arguments() >= 1, "on_select grid function should take 1 argument: " << v.debug_location()); static const variant fml("fn(selection)"); ffl_on_select_.reset(new game_logic::formula(fml)); game_logic::map_formula_callable* callable = new game_logic::map_formula_callable; callable->add("fn", on_select_value); select_arg_.reset(callable); } else { ffl_on_select_ = get_environment()->create_formula(on_select_value); } on_select_ = boost::bind(&grid::select_delegate, this, _1); } if(v.has_key("on_mouseover")) { allow_selection_ = true; on_mouseover_ = boost::bind(&grid::mouseover_delegate, this, _1); const variant on_mouseover_value = v["on_mouseover"]; if(on_mouseover_value.is_function()) { ASSERT_LOG(on_mouseover_value.min_function_arguments() <= 1 && on_mouseover_value.max_function_arguments() >= 1, "on_mouseover grid function should take 1 argument: " << v.debug_location()); static const variant fml("fn(selection)"); ffl_on_mouseover_.reset(new game_logic::formula(fml)); game_logic::map_formula_callable* callable = new game_logic::map_formula_callable; callable->add("fn", on_mouseover_value); mouseover_arg_.reset(callable); } else { ffl_on_mouseover_ = get_environment()->create_formula(v["on_mouseover"]); } } ncols_ = v["columns"].as_int(1); if(v.has_key("column_widths")) { if(v["column_widths"].is_list()) { ASSERT_LOG(v["column_widths"].num_elements() == ncols_, "List of column widths must have " << ncols_ << " elements"); std::vector<int> li = v["column_widths"].as_list_int(); col_widths_.assign(li.begin(), li.end()); } else if(v["column_widths"].is_int()) { col_widths_.assign(ncols_, v["column_widths"].as_int()); } else { ASSERT_LOG(false, "grid: column_widths must be an int or list of ints"); } } else { col_widths_.assign(ncols_, 0); } col_aligns_.resize(ncols_); if(v.has_key("column_alignments")) { if(v["column_alignments"].is_list()) { // XXX this could be a list of strings as well. int col = 0; foreach(const variant& c, v["column_alignments"].as_list()) { if(c.is_int()) { set_align(col, static_cast<COLUMN_ALIGN>(c.as_int())); } else if(c.is_string()) { const std::string& s = c.as_string(); if(s == "center" || s == "centre") { set_align(col, ALIGN_CENTER); } else if(s == "right") { set_align(col, ALIGN_RIGHT); } else if(s == "left") { set_align(col, ALIGN_LEFT); } else { ASSERT_LOG(false, "grid: column_alignments must be \"left\", \"right\" or \"center\""); } } else { ASSERT_LOG(false, "grid: column alignment members must be an integer or a string."); } col++; } } else if(v["column_alignments"].is_int()) {
dialog::dialog(const variant& v, game_logic::formula_callable* e) : widget(v,e), opened_(false), cancelled_(false), add_x_(0), add_y_(0), last_draw_(-1) { forced_dimensions_ = rect(x(), y(), width(), height()); padding_ = v["padding"].as_int(10); if(v.has_key("background_frame")) { background_framed_gui_element_ = v["background_frame"].as_string(); } if(v.has_key("background_draw")) { std::string scene = v["background_draw"].as_string(); if(scene == "last_scene") { draw_background_fn_ = boost::bind(&dialog::draw_last_scene); } // XXX could make this FFL callable. Or could allow any of the background scenes to be drawn. or both. } clear_bg_ = v["clear_background_alpha"].as_int(196); bg_alpha_ = v["background_alpha"].as_int(255) / GLfloat(255.0); if(v.has_key("cursor")) { std::vector<int> vi = v["cursor"].as_list_int(); set_cursor(vi[0], vi[1]); } if(v.has_key("on_quit")) { on_quit_ = boost::bind(&dialog::quit_delegate, this); ASSERT_LOG(get_environment() != NULL, "environment not set"); const variant on_quit_value = v["on_quit"]; if(on_quit_value.is_function()) { ASSERT_LOG(on_quit_value.min_function_arguments() == 0, "on_quit_value dialog function should take 0 arguments: " << v.debug_location()); static const variant fml("fn()"); ffl_on_quit_.reset(new game_logic::formula(fml)); game_logic::map_formula_callable* callable = new game_logic::map_formula_callable; callable->add("fn", on_quit_value); quit_arg_.reset(callable); } else { ffl_on_quit_ = get_environment()->create_formula(v["on_quit"]); } } if(v.has_key("on_close")) { on_close_ = boost::bind(&dialog::close_delegate, this, _1); ASSERT_LOG(get_environment() != NULL, "environment not set"); const variant on_close_value = v["on_close"]; if(on_close_value.is_function()) { ASSERT_LOG(on_close_value.min_function_arguments() <= 1 && on_close_value.max_function_arguments() >= 1, "on_close dialog function should take 1 argument: " << v.debug_location()); static const variant fml("fn(selection)"); ffl_on_close_.reset(new game_logic::formula(fml)); game_logic::map_formula_callable* callable = new game_logic::map_formula_callable; callable->add("fn", on_close_value); close_arg_.reset(callable); } else { ffl_on_close_ = get_environment()->create_formula(v["on_close"]); } } std::vector<variant> children = v["children"].as_list(); foreach(const variant& child, children) { widget_ptr w = widget_factory::create(child, e); if(w->x() != 0 || w->y() != 0) { //if(child.has_key("add_xy")) { // std::vector<int> addxy = child["add_xy"].as_list_int(); // add_widget(widget_factory::create(child, e), addxy[0], addxy[1]); add_widget(w, w->x(), w->y()); } else { add_widget(w); } }