Example #1
0
void TabHeader_Impl::on_process_message(std::shared_ptr<GUIMessage> &msg)
{
	if(component->is_enabled())
	{
		std::shared_ptr<GUIMessage_Input> input_msg = std::dynamic_pointer_cast<GUIMessage_Input>(msg);
		if (input_msg)
		{
			
			const InputEvent &e = input_msg->input_event;
			Point pos = e.mouse_pos;

			if (e.type == InputEvent::pressed && e.id == mouse_left)
			{
				std::vector<Handle>::iterator it;
				for (it = tabs.begin(); it != tabs.end(); ++it)
				{
					bool inside = (*it).rect.contains(pos);
					if (inside)
					{
						unselect_all();
						(*it).part.set_pseudo_class(CssStr::selected, true);
						(*it).part.set_pseudo_class(CssStr::normal, false);

						component->request_repaint();
						if (!func_page_selected.is_null())
							func_page_selected.invoke((*it).tab_page);
					}
				}
				msg->consumed = true;
			}
			else if (e.type == InputEvent::pointer_moved)
			{
				std::vector<Handle>::iterator it;
				for (it = tabs.begin(); it != tabs.end(); ++it)
				{
					bool inside = (*it).rect.contains(pos);
					if (inside)
					{
						if ((*it).part.get_pseudo_class(CssStr::selected))
							return;
						(*it).part.set_pseudo_class(CssStr::hover, true);
						(*it).part.set_pseudo_class(CssStr::normal, false);
						component->request_repaint();
						msg->consumed = true;
					}
					else if ((*it).part.get_pseudo_class(CssStr::hover))
					{
						(*it).part.set_pseudo_class(CssStr::hover, false);
						(*it).part.set_pseudo_class(CssStr::normal, true);						
						component->request_repaint();
						msg->consumed = true;
					}
				}
			}
			else if (e.type == InputEvent::pressed && e.id == keycode_left)
			{
				int next_page = selected_page - 1;
				if (next_page < 0)
					next_page = tabs.size()-1;

				unselect_all();
				select_page(next_page);

				if (!func_page_selected.is_null())
					func_page_selected.invoke(tabs[next_page].tab_page);

				component->select_page(next_page);
				msg->consumed = true;
			}
			else if (e.type == InputEvent::pressed && e.id == keycode_right)
			{
				int next_page = selected_page + 1;
				if (next_page >= tabs.size())
					next_page = 0;

				unselect_all();
				select_page(next_page);

				if (!func_page_selected.is_null())
					func_page_selected.invoke(tabs[next_page].tab_page);

				component->request_repaint();
				msg->consumed = true;
			}
			else if (e.type == InputEvent::pressed && (e.id == keycode_up || e.id == keycode_down))
			{
				// block focus switching with up/down when in tab header.
				msg->consumed = true;
			}
		}
		std::shared_ptr<GUIMessage_Pointer> pointer = std::dynamic_pointer_cast<GUIMessage_Pointer>(msg);
		if (pointer)
		{
			
			if (pointer->pointer_type == GUIMessage_Pointer::pointer_leave)
			{
				std::vector<Handle>::iterator it;
				for (it = tabs.begin(); it != tabs.end(); ++it)
				{
					(*it).part.set_pseudo_class(CssStr::hover, false);
					(*it).part.set_pseudo_class(CssStr::normal, true);
				}
				component->request_repaint();
			}
		}
		std::shared_ptr<GUIMessage_FocusChange> focus_change_msg = std::dynamic_pointer_cast<GUIMessage_FocusChange>(msg);
		if (focus_change_msg)
		{
			
			if (focus_change_msg->focus_type == GUIMessage_FocusChange::gained_focus)
			{
				component->set_pseudo_class(CssStr::focused, true);
				component->request_repaint();
			}
			else 
			{
				component->set_pseudo_class(CssStr::focused, false);
				component->request_repaint();
			}
			msg->consumed = true;
		}
	}
}