Exemplo n.º 1
0
widget_ptr widget::get_widget_by_id(const std::string& id)
{
	if(id_ == id) {
		return widget_ptr(this);
	}
	return widget_ptr();
}
Exemplo n.º 2
0
	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);
		}
	}
Exemplo n.º 3
0
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);
}
Exemplo n.º 4
0
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);
}
Exemplo n.º 5
0
	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();
	}
Exemplo n.º 6
0
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);
			}
		}