void CL_GUIComponent::render(CL_GraphicContext &gc, const CL_Rect &clip_rect, bool include_children)
{
	if (!impl->visible)
		return;

	if (!impl->css_layout.is_null())
	{
		impl->css_layout.layout(gc, get_size());
		impl->css_layout.render(gc, this);
	}

	if (impl->func_render.is_null() == false)
	{
		impl->func_render.invoke(gc, clip_rect);
	}
	else
	{
		CL_GUIThemePart part(this);
		CL_Rect geometry = get_size();
		part.render_box(gc, CL_RectPS(0, 0, geometry.get_width(), geometry.get_height()), clip_rect);
	}

	if (include_children)
	{
		if (impl->clip_children)
		{
			push_cliprect(gc, impl->clip_children_rect);
		}

		CL_GUIComponent *cur = impl->first_child;
		while (cur)
		{
			CL_Rect cur_geometry = cur->get_geometry();

			CL_Rect update_rect = component_to_window_coords(clip_rect);
			update_rect.overlap(component_to_window_coords(cur_geometry));
			if (update_rect.get_width() > 0 && update_rect.get_height() > 0)
			{
				CL_Rect child_dirty_rect = cur->window_to_component_coords(update_rect);

				gc.push_translate((float)cur_geometry.left, (float)cur_geometry.top);
				cur->render(gc, child_dirty_rect, true);
				gc.pop_modelview();
			}
			cur = cur->impl->next_sibling;
		}

		if (impl->clip_children)
		{
			pop_cliprect(gc);
		}
	}
}
void CL_GUIComponent::push_cliprect(CL_GraphicContext &gc, const CL_Rect &rect)
{
	CL_Rect windcliprect = component_to_window_coords(rect);
	CL_GUIComponent *toplevel = get_top_level_component();
	CL_GUITopLevelWindow *window = impl->gui_manager_impl->get_toplevel_window(toplevel);
	impl->gui_manager_impl->window_manager.push_cliprect(window, gc, windcliprect);
}
Example #3
0
void GUIComponent::push_cliprect(Canvas &canvas, const Rect &rect)
{
	Rect windcliprect = component_to_window_coords(rect);
	GUIComponent *toplevel = get_top_level_component();
	GUITopLevelWindow *window = impl->gui_manager_impl->get_toplevel_window(toplevel);
	impl->gui_manager_impl->window_manager.push_cliprect(window, canvas, windcliprect);
}
void CL_GUIComponent::paint(const CL_Rect &clip_rect)
{
	CL_Rect update_region = component_to_window_coords(clip_rect);
	CL_GUIComponent *toplevel_component = get_top_level_component();
	CL_GUITopLevelWindow *toplevel_window = impl->gui_manager.lock()->get_toplevel_window(this);

	CL_GraphicContext gc = impl->gui_manager.lock()->window_manager.begin_paint(toplevel_window, update_region);
	toplevel_component->render(gc, update_region, true);
	impl->gui_manager.lock()->window_manager.end_paint(toplevel_window, update_region);
}
Example #5
0
void GUIComponent::paint(const Rect &clip_rect)
{
	Rect update_region = component_to_window_coords(clip_rect);
	GUIComponent *toplevel_component = get_top_level_component();
	GUITopLevelWindow *toplevel_window = impl->gui_manager.lock()->get_toplevel_window(this);

	Canvas canvas = impl->gui_manager.lock()->window_manager.begin_paint(toplevel_window, update_region);
	toplevel_component->render(canvas, update_region, true);
	impl->gui_manager.lock()->window_manager.end_paint(canvas, toplevel_window, update_region);
}
Example #6
0
bool GridComponent::deliver_input_to_tab(const clan::InputEvent &e)
{
	clan::GUIComponent *child = component_container->get_component_at(e.mouse_pos);
	if (child && child->get_tag_name() == "tabheader")
	{
		clan::InputEvent e_child = e;
		e_child.mouse_pos = child->window_to_component_coords(component_to_window_coords(e.mouse_pos));
		std::shared_ptr<clan::GUIMessage> message(new clan::GUIMessage_Input(e_child));
		message->target = child;
		get_gui_manager().dispatch_message(message);
		return true;
	}
	else
	{
		return false;
	}
}
CL_Point CL_GUIComponent::component_to_screen_coords(const CL_Point &component_point) const
{
	CL_GUITopLevelWindow *toplevel_window = impl->gui_manager.lock()->get_toplevel_window(this);
	CL_Point client_point = component_to_window_coords(component_point);
	return impl->gui_manager.lock()->window_manager.window_to_screen(toplevel_window, client_point, true);
}
CL_Rect CL_GUIComponent::component_to_window_coords(const CL_Rect &rect) const
{
	CL_Point tl = component_to_window_coords(rect.get_top_left());
	CL_Point br = component_to_window_coords(rect.get_bottom_right());
	return CL_Rect(tl.x, tl.y, br.x, br.y);
}
void CL_GUIComponent::request_repaint(CL_Rect request_repaint)
{
	get_gui_manager().request_repaint(component_to_window_coords(request_repaint), get_top_level_component());
}
Example #10
0
void GUIComponent::render(Canvas &canvas, const Rect &clip_rect, bool include_children)
{
	if (!impl->visible)
		return;

	Rect viewport = get_top_level_component()->get_size();
	CSSResourceCache *resource_cache = &impl->gui_manager_impl->resource_cache;
	CSSLayoutGraphics graphics(canvas, resource_cache, viewport, 0);

	Rect border_box = get_size();
	Rect padding_box = Rect(border_box).shrink(impl->css_used_values.border.left, impl->css_used_values.border.top, impl->css_used_values.border.right, impl->css_used_values.border.bottom);
	Rect content_box = Rect(padding_box).shrink(impl->css_used_values.padding.left, impl->css_used_values.padding.top, impl->css_used_values.padding.right, impl->css_used_values.padding.bottom);

	CSSBackgroundRenderer background(&graphics, resource_cache, impl->element.get_css_values().get_background());
	background.set_border_box(border_box);
	background.set_padding_box(padding_box);
	background.set_content_box(content_box);
	background.set_initial_containing_box(get_top_level_component()->get_viewport());
	background.render();

	CSSBorderRenderer border(&graphics, resource_cache, impl->element.get_css_values().get_border());
	border.set_border_box(border_box);
	border.set_border_values(impl->css_used_values.border.left, impl->css_used_values.border.top, impl->css_used_values.border.right, impl->css_used_values.border.bottom);
	border.render();

	if (impl->func_render.is_null() == false)
	{
		impl->func_render.invoke(canvas, clip_rect);
	}
	else
	{
		//GUIThemePart part(this);
		//Rect geometry = get_size();
		//part.render_box(canvas, RectPS(0, 0, geometry.get_width(), geometry.get_height()), clip_rect);
	}

	if (include_children)
	{
		if (impl->clip_children)
		{
			push_cliprect(canvas, impl->clip_children_rect);
		}

		GUIComponent *cur = impl->first_child;
		while (cur)
		{
			Rect cur_geometry = cur->get_geometry();

			Rect update_rect = component_to_window_coords(clip_rect);
			update_rect.overlap(component_to_window_coords(cur_geometry));
			if (update_rect.get_width() > 0 && update_rect.get_height() > 0)
			{
				Rect child_dirty_rect = cur->window_to_component_coords(update_rect);

				canvas.push_translate((float)cur_geometry.left, (float)cur_geometry.top);
				cur->render(canvas, child_dirty_rect, true);
				canvas.pop_modelview();
			}
			cur = cur->impl->next_sibling;
		}

		if (impl->clip_children)
		{
			pop_cliprect(canvas);
		}
	}
}