widget_ptr widget::get_widget_by_id(const std::string& id) { if(id_ == id) { return widget_ptr(this); } return widget_ptr(); }
void selector_widget::init() { left_arrow_ = widget_ptr(new gui_section_widget(selector_left_arrow)); right_arrow_ = widget_ptr(new gui_section_widget(selector_right_arrow)); int width = 16; int height = 16; int n = 0; foreach(const selector_pair& p, list_) { if(p.second->width() > width) { width = p.second->width(); } if(p.second->height() > height) { height = p.second->height(); } if(n != current_selection_) { p.second->enable(false); } else { p.second->enable(); } ++n; } left_arrow_->set_loc(0, (abs(height-left_arrow_->height()))/2); //left_arrow_->set_dim(left_arrow_->width(), height); right_arrow_->set_loc(left_arrow_->width()+10+width, (abs(height-right_arrow_->height()))/2); //right_arrow_->set_dim(right_arrow_->width(), height); set_dim(width + left_arrow_->width() + right_arrow_->width() + 10, height); for(int n = 0; n != list_.size(); ++n) { widget_ptr& w = list_[n].second; w->set_loc((width - w->width())/2 + left_arrow_->width()+5, abs(height - w->height())/2); } }
key_button::key_button(SDLKey key, BUTTON_RESOLUTION button_resolution) : label_(widget_ptr(new graphical_font_label(get_key_name(key), "door_label", 2))), key_(key), button_resolution_(button_resolution), normal_button_image_set_(framed_gui_element::get("regular_button")), depressed_button_image_set_(framed_gui_element::get("regular_button_pressed")), focus_button_image_set_(framed_gui_element::get("regular_button_focus")), current_button_image_set_(normal_button_image_set_), grab_keys_(false) { set_dim(label_->width()+hpadding*2,label_->height()+vpadding*2); }
key_button::key_button(const variant& v, game_logic::formula_callable* e) : widget(v,e), normal_button_image_set_(framed_gui_element::get("regular_button")), depressed_button_image_set_(framed_gui_element::get("regular_button_pressed")), focus_button_image_set_(framed_gui_element::get("regular_button_focus")), current_button_image_set_(normal_button_image_set_), grab_keys_(false) { std::string key = v["key"].as_string(); key_ = get_key_sym(key); label_ = v.has_key("label") ? widget_factory::create(v["label"], e) : widget_ptr(new graphical_font_label(key, "door_label", 2)); button_resolution_ = v["resolution"].as_string_default("normal") == "normal" ? BUTTON_SIZE_NORMAL_RESOLUTION : BUTTON_SIZE_DOUBLE_RESOLUTION; set_dim(label_->width()+hpadding*2,label_->height()+vpadding*2); }
selector_widget::selector_widget(const variant& v, game_logic::formula_callable* e) : widget(v, e), current_selection_(v["selection"].as_int(0)) { if(v.has_key("list") || v.has_key("children")) { const variant& l = v.has_key("list") ? v["list"] : v["children"]; ASSERT_LOG(l.is_list(), "'list'/'children' attribute must be a list"); foreach(const variant& child, l.as_list()) { if(child.is_list()) { ASSERT_LOG(child.num_elements() == 2, "items in the sub-list must have two elements."); widget_ptr w; if(child[1].is_map()) { w = widget_factory::create(child[1], e); } else { w = child[1].try_convert<widget>(); ASSERT_LOG(w != NULL, "Couldn't convert second element to widget."); } list_.push_back(selector_pair(child[0].as_string(), w)); } else if(child.is_string()) { const std::string& s = child.as_string(); list_.push_back(selector_pair(s, widget_ptr(new label(s)))); } else { widget_ptr w; std::string s; if(child.is_map()) { w = widget_factory::create(child, e); ASSERT_LOG(child.has_key("id") || child.has_key("select_string"), "list items must supply 'id' or 'select_string' attribute."); s = child.has_key("id") ? child["id"].as_string() : child["select_string"].as_string(); } else { w = child.try_convert<widget>(); ASSERT_LOG(w != NULL, "Couldn't convert item to widget."); ASSERT_LOG(!w->id().empty(), "list items must have 'id' attribute"); s = w->id(); } list_.push_back(selector_pair(s, w)); } } } if(v.has_key("on_change")) { change_handler_ = get_environment()->create_formula(v["on_change"]); on_change_ = boost::bind(&selector_widget::change_delegate, this, _1); } if(v.has_key("on_select")) { select_handler_ = get_environment()->create_formula(v["on_select"]); on_select_ = boost::bind(&selector_widget::select_delegate, this, _1); } init(); }
void code_editor_widget::select_token(const std::string& row, int& begin_row, int& end_row, int& begin_col, int& end_col) { std::pair<int,int> key(begin_row, begin_col); if(bracket_match_.count(key)) { begin_row = bracket_match_.find(key)->second.front().first; begin_col = bracket_match_.find(key)->second.front().second; end_row = bracket_match_.find(key)->second.back().first; end_col = bracket_match_.find(key)->second.back().second+1; return; } text_editor_widget::select_token(row, begin_row, end_row, begin_col, end_col); std::string token(row.begin() + begin_col, row.begin() + end_col); boost::regex numeric_regex("-?\\d+(\\.\\d+)?", boost::regex::perl); std::cerr << "token: (" << token << ")\n"; if(boost::regex_match(token.c_str(), numeric_regex)) { const decimal current_value(decimal::from_string(token)); if(current_value <= 10000000 && current_value >= -10000000) { slider_.reset(new slider(200, boost::bind(&code_editor_widget::on_slider_move, this, _1))); slider_decimal_ = std::count(token.begin(), token.end(), '.') ? true : false; slider_magnitude_ = (abs(current_value.as_int())+1) * 5; const decimal slider_value = (current_value - decimal::from_int(-slider_magnitude_)) / decimal::from_int(slider_magnitude_*2); slider_->set_position(slider_value.as_float()); slider_range_.clear(); slider_labels_.clear(); if(current_value > 0) { slider_range_.push_back(slider_range(0.0, 0.1, -current_value*5, -current_value)); slider_range_.push_back(slider_range(0.1, 0.2, -current_value, decimal(0))); slider_range_.push_back(slider_range(0.2, 0.3, decimal(0), current_value)); slider_range_.push_back(slider_range(0.3, 0.5, decimal(0), current_value)); slider_range_.push_back(slider_range(0.5, 0.7, current_value, 2*current_value)); slider_range_.push_back(slider_range(0.7, 0.9, 2*current_value, 5*current_value)); slider_range_.push_back(slider_range(0.9, 1.0, 5*current_value, 10*current_value)); slider_range_.push_back(slider_range(1.0, 2.0, 10*current_value, 20*current_value)); slider_->set_position(0.5); } else { slider_range_.push_back(slider_range(0.0, 0.5, current_value*2, decimal(0))); slider_range_.push_back(slider_range(0.5, 1.0, decimal(0), -current_value*2)); slider_range_.push_back(slider_range(1.0, 2.0, -current_value*2, -current_value*4)); slider_->set_position(0.25); } std::pair<int,int> pos = char_position_on_screen(begin_row, (begin_col+end_col)/2); row_slider_ = begin_row; begin_col_slider_ = begin_col; end_col_slider_ = end_col; int x = pos.second - slider_->width()/2; int y = pos.first + 20 - slider_->height(); if(x < 10) { x = 10; } if(x > width() - slider_->width()) { x = width() - slider_->width(); } if(y < 20) { y += 60; } if(y > height() - slider_->height()) { y = height() - slider_->height(); } slider_->set_loc(x, y); foreach(slider_range& r, slider_range_) { slider_labels_.push_back(widget_ptr(new gui::label(formatter() << r.target_begin, 10))); slider_labels_.back()->set_loc(x + slider_->width()*r.begin - slider_labels_.back()->width()/2, y); } }